Revision: 201021
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 11 Jun 2010 14:24:45 +0300
changeset 25 e24348a560a6
parent 23 89e065397ea6
child 29 b72c6db6890b
Revision: 201021 Kit: 2010123
.gitignore
VERSION.SHA1
configure_symbian
demos/demos.pro
demos/embedded/fluidlauncher/config_s60/config.xml
demos/embedded/fluidlauncher/fluidlauncher.pro
demos/embedded/fluidlauncher/screenshots/spectrum.png
demos/qtdemo/xml/examples.xml
demos/spectrum/3rdparty/fftreal/Array.h
demos/spectrum/3rdparty/fftreal/Array.hpp
demos/spectrum/3rdparty/fftreal/DynArray.h
demos/spectrum/3rdparty/fftreal/DynArray.hpp
demos/spectrum/3rdparty/fftreal/FFTReal.dsp
demos/spectrum/3rdparty/fftreal/FFTReal.dsw
demos/spectrum/3rdparty/fftreal/FFTReal.h
demos/spectrum/3rdparty/fftreal/FFTReal.hpp
demos/spectrum/3rdparty/fftreal/FFTRealFixLen.h
demos/spectrum/3rdparty/fftreal/FFTRealFixLen.hpp
demos/spectrum/3rdparty/fftreal/FFTRealFixLenParam.h
demos/spectrum/3rdparty/fftreal/FFTRealPassDirect.h
demos/spectrum/3rdparty/fftreal/FFTRealPassDirect.hpp
demos/spectrum/3rdparty/fftreal/FFTRealPassInverse.h
demos/spectrum/3rdparty/fftreal/FFTRealPassInverse.hpp
demos/spectrum/3rdparty/fftreal/FFTRealSelect.h
demos/spectrum/3rdparty/fftreal/FFTRealSelect.hpp
demos/spectrum/3rdparty/fftreal/FFTRealUseTrigo.h
demos/spectrum/3rdparty/fftreal/FFTRealUseTrigo.hpp
demos/spectrum/3rdparty/fftreal/OscSinCos.h
demos/spectrum/3rdparty/fftreal/OscSinCos.hpp
demos/spectrum/3rdparty/fftreal/TestAccuracy.h
demos/spectrum/3rdparty/fftreal/TestAccuracy.hpp
demos/spectrum/3rdparty/fftreal/TestHelperFixLen.h
demos/spectrum/3rdparty/fftreal/TestHelperFixLen.hpp
demos/spectrum/3rdparty/fftreal/TestHelperNormal.h
demos/spectrum/3rdparty/fftreal/TestHelperNormal.hpp
demos/spectrum/3rdparty/fftreal/TestSpeed.h
demos/spectrum/3rdparty/fftreal/TestSpeed.hpp
demos/spectrum/3rdparty/fftreal/TestWhiteNoiseGen.h
demos/spectrum/3rdparty/fftreal/TestWhiteNoiseGen.hpp
demos/spectrum/3rdparty/fftreal/bwins/fftrealu.def
demos/spectrum/3rdparty/fftreal/def.h
demos/spectrum/3rdparty/fftreal/eabi/fftrealu.def
demos/spectrum/3rdparty/fftreal/fftreal.pas
demos/spectrum/3rdparty/fftreal/fftreal.pro
demos/spectrum/3rdparty/fftreal/fftreal_wrapper.cpp
demos/spectrum/3rdparty/fftreal/fftreal_wrapper.h
demos/spectrum/3rdparty/fftreal/license.txt
demos/spectrum/3rdparty/fftreal/readme.txt
demos/spectrum/3rdparty/fftreal/stopwatch/ClockCycleCounter.cpp
demos/spectrum/3rdparty/fftreal/stopwatch/ClockCycleCounter.h
demos/spectrum/3rdparty/fftreal/stopwatch/ClockCycleCounter.hpp
demos/spectrum/3rdparty/fftreal/stopwatch/Int64.h
demos/spectrum/3rdparty/fftreal/stopwatch/StopWatch.cpp
demos/spectrum/3rdparty/fftreal/stopwatch/StopWatch.h
demos/spectrum/3rdparty/fftreal/stopwatch/StopWatch.hpp
demos/spectrum/3rdparty/fftreal/stopwatch/def.h
demos/spectrum/3rdparty/fftreal/stopwatch/fnc.h
demos/spectrum/3rdparty/fftreal/stopwatch/fnc.hpp
demos/spectrum/3rdparty/fftreal/test.cpp
demos/spectrum/3rdparty/fftreal/test_fnc.h
demos/spectrum/3rdparty/fftreal/test_fnc.hpp
demos/spectrum/3rdparty/fftreal/test_settings.h
demos/spectrum/3rdparty/fftreal/testapp.dpr
demos/spectrum/README.txt
demos/spectrum/TODO.txt
demos/spectrum/app/app.pro
demos/spectrum/app/engine.cpp
demos/spectrum/app/engine.h
demos/spectrum/app/frequencyspectrum.cpp
demos/spectrum/app/frequencyspectrum.h
demos/spectrum/app/images/record.png
demos/spectrum/app/images/settings.png
demos/spectrum/app/levelmeter.cpp
demos/spectrum/app/levelmeter.h
demos/spectrum/app/main.cpp
demos/spectrum/app/mainwidget.cpp
demos/spectrum/app/mainwidget.h
demos/spectrum/app/progressbar.cpp
demos/spectrum/app/progressbar.h
demos/spectrum/app/settingsdialog.cpp
demos/spectrum/app/settingsdialog.h
demos/spectrum/app/spectrograph.cpp
demos/spectrum/app/spectrograph.h
demos/spectrum/app/spectrum.h
demos/spectrum/app/spectrum.qrc
demos/spectrum/app/spectrum.sh
demos/spectrum/app/spectrumanalyser.cpp
demos/spectrum/app/spectrumanalyser.h
demos/spectrum/app/tonegenerator.cpp
demos/spectrum/app/tonegenerator.h
demos/spectrum/app/tonegeneratordialog.cpp
demos/spectrum/app/tonegeneratordialog.h
demos/spectrum/app/utils.cpp
demos/spectrum/app/utils.h
demos/spectrum/app/waveform.cpp
demos/spectrum/app/waveform.h
demos/spectrum/app/wavfile.cpp
demos/spectrum/app/wavfile.h
demos/spectrum/spectrum.pri
demos/spectrum/spectrum.pro
examples/multimedia/audiodevices/audiodevices.cpp
examples/multimedia/audiodevices/audiodevices.h
examples/multimedia/audiodevices/audiodevicesbase.ui
examples/multimedia/audiodevices/main.cpp
mkspecs/features/symbian/qt.prf
projects.pro
src/3rdparty/phonon/mmf/audioplayer.cpp
src/3rdparty/phonon/qt7/audiodevice.mm
src/corelib/io/qiodevice.cpp
src/corelib/io/qurl.cpp
src/corelib/kernel/qeventdispatcher_symbian.cpp
src/corelib/kernel/qfunctions_wince.cpp
src/corelib/tools/qlocale_symbian.cpp
src/corelib/tools/qscopedpointer.cpp
src/dbus/qdbusinterface.cpp
src/dbus/qdbusmacros.h
src/gui/dialogs/qprintdialog_unix.cpp
src/gui/graphicsview/qgraphicsitem.cpp
src/gui/graphicsview/qgraphicsscene.cpp
src/gui/graphicsview/qgraphicswidget.cpp
src/gui/graphicsview/qgraphicswidget_p.cpp
src/gui/graphicsview/qgraphicswidget_p.h
src/gui/inputmethod/qcoefepinputcontext_s60.cpp
src/gui/inputmethod/qinputcontextfactory.cpp
src/gui/kernel/qapplication.cpp
src/gui/kernel/qapplication_s60.cpp
src/gui/kernel/qapplication_win.cpp
src/gui/kernel/qwidget_s60.cpp
src/gui/painting/qpainter.cpp
src/gui/painting/qpdf.cpp
src/gui/styles/qs60style.cpp
src/gui/styles/qs60style_p.h
src/gui/styles/qs60style_s60.cpp
src/gui/styles/qwindowsmobilestyle.cpp
src/gui/text/qfont.cpp
src/gui/text/qfontdatabase.cpp
src/gui/text/qfontdatabase_s60.cpp
src/gui/text/qfontengine_s60.cpp
src/gui/text/qfontengine_s60_p.h
src/gui/text/qtextdocument.cpp
src/gui/util/qsystemtrayicon_win.cpp
src/gui/util/qsystemtrayicon_wince.cpp
src/gui/util/util.pri
src/gui/widgets/qcombobox.cpp
src/gui/widgets/qcombobox_p.h
src/gui/widgets/qmenu.cpp
src/gui/widgets/qmenu.h
src/gui/widgets/qmenu_p.h
src/gui/widgets/qmenu_symbian.cpp
src/gui/widgets/qmenu_wince.cpp
src/gui/widgets/qmenubar.cpp
src/gui/widgets/qmenubar.h
src/gui/widgets/qtabbar.cpp
src/multimedia/audio/qaudio_symbian_p.cpp
src/multimedia/audio/qaudio_symbian_p.h
src/multimedia/audio/qaudiodeviceinfo_symbian_p.cpp
src/multimedia/audio/qaudiodeviceinfo_symbian_p.h
src/multimedia/audio/qaudioinput.cpp
src/multimedia/audio/qaudioinput_symbian_p.cpp
src/multimedia/audio/qaudioinput_symbian_p.h
src/multimedia/audio/qaudiooutput.cpp
src/multimedia/audio/qaudiooutput_symbian_p.cpp
src/multimedia/audio/qaudiooutput_symbian_p.h
src/network/access/qhttpnetworkconnection.cpp
src/network/access/qhttpnetworkconnectionchannel.cpp
src/network/access/qhttpnetworkreply.cpp
src/network/kernel/qhostinfo.cpp
src/network/kernel/qhostinfo_unix.cpp
src/network/kernel/qhostinfo_win.cpp
src/network/socket/qlocalserver_win.cpp
src/network/socket/qnativesocketengine_unix.cpp
src/opengl/gl2paintengineex/qglengineshadermanager.cpp
src/opengl/gl2paintengineex/qglengineshadersource_p.h
src/opengl/qglpixmapfilter.cpp
src/opengl/qpaintengine_opengl.cpp
src/openvg/qpaintengine_vg.cpp
src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreen.cpp
src/qt3support/widgets/q3spinwidget.cpp
src/s60installs/deviceconfiguration/qtconfig.flm
src/testlib/qplaintestlogger.cpp
tests/auto/dbus.pro
tests/auto/qbuffer/tst_qbuffer.cpp
tests/auto/qdbusinterface/tst_qdbusinterface.cpp
tests/auto/qdbusserver/.gitignore
tests/auto/qdbusserver/qdbusserver.pro
tests/auto/qdbusserver/server.cpp
tests/auto/qdbusserver/tst_qdbusserver.cpp
tests/auto/qgraphicsview/tst_qgraphicsview.cpp
tests/auto/qgraphicswidget/tst_qgraphicswidget.cpp
tests/auto/qhostinfo/qhostinfo.pro
tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp
tests/auto/qnetworkreply/tst_qnetworkreply.cpp
tests/auto/qurl/tst_qurl.cpp
tests/auto/selftests/expected_assert.lightxml
tests/auto/selftests/expected_assert.xml
tests/auto/selftests/expected_assert.xunitxml
tests/auto/selftests/expected_badxml.lightxml
tests/auto/selftests/expected_badxml.xml
tests/auto/selftests/expected_badxml.xunitxml
tests/auto/selftests/expected_benchlibcallgrind.lightxml
tests/auto/selftests/expected_benchlibcallgrind.xml
tests/auto/selftests/expected_benchlibcallgrind.xunitxml
tests/auto/selftests/expected_benchlibeventcounter.lightxml
tests/auto/selftests/expected_benchlibeventcounter.xml
tests/auto/selftests/expected_benchlibeventcounter.xunitxml
tests/auto/selftests/expected_benchliboptions.lightxml
tests/auto/selftests/expected_benchliboptions.xml
tests/auto/selftests/expected_benchliboptions.xunitxml
tests/auto/selftests/expected_benchlibtickcounter.lightxml
tests/auto/selftests/expected_benchlibtickcounter.xml
tests/auto/selftests/expected_benchlibtickcounter.xunitxml
tests/auto/selftests/expected_benchlibwalltime.lightxml
tests/auto/selftests/expected_benchlibwalltime.xml
tests/auto/selftests/expected_benchlibwalltime.xunitxml
tests/auto/selftests/expected_cmptest.lightxml
tests/auto/selftests/expected_cmptest.xml
tests/auto/selftests/expected_cmptest.xunitxml
tests/auto/selftests/expected_commandlinedata.lightxml
tests/auto/selftests/expected_commandlinedata.xml
tests/auto/selftests/expected_commandlinedata.xunitxml
tests/auto/selftests/expected_crashes.lightxml
tests/auto/selftests/expected_crashes.xml
tests/auto/selftests/expected_crashes.xunitxml
tests/auto/selftests/expected_datatable.lightxml
tests/auto/selftests/expected_datatable.xml
tests/auto/selftests/expected_datatable.xunitxml
tests/auto/selftests/expected_datetime.lightxml
tests/auto/selftests/expected_datetime.xml
tests/auto/selftests/expected_datetime.xunitxml
tests/auto/selftests/expected_exceptionthrow.lightxml
tests/auto/selftests/expected_exceptionthrow.xml
tests/auto/selftests/expected_exceptionthrow.xunitxml
tests/auto/selftests/expected_expectfail.lightxml
tests/auto/selftests/expected_expectfail.xml
tests/auto/selftests/expected_expectfail.xunitxml
tests/auto/selftests/expected_failinit.lightxml
tests/auto/selftests/expected_failinit.xml
tests/auto/selftests/expected_failinit.xunitxml
tests/auto/selftests/expected_failinitdata.lightxml
tests/auto/selftests/expected_failinitdata.xml
tests/auto/selftests/expected_failinitdata.xunitxml
tests/auto/selftests/expected_fetchbogus.lightxml
tests/auto/selftests/expected_fetchbogus.xml
tests/auto/selftests/expected_fetchbogus.xunitxml
tests/auto/selftests/expected_globaldata.lightxml
tests/auto/selftests/expected_globaldata.xml
tests/auto/selftests/expected_globaldata.xunitxml
tests/auto/selftests/expected_longstring.lightxml
tests/auto/selftests/expected_longstring.xml
tests/auto/selftests/expected_longstring.xunitxml
tests/auto/selftests/expected_maxwarnings.lightxml
tests/auto/selftests/expected_maxwarnings.xml
tests/auto/selftests/expected_maxwarnings.xunitxml
tests/auto/selftests/expected_multiexec.lightxml
tests/auto/selftests/expected_multiexec.xml
tests/auto/selftests/expected_multiexec.xunitxml
tests/auto/selftests/expected_singleskip.lightxml
tests/auto/selftests/expected_singleskip.xml
tests/auto/selftests/expected_singleskip.xunitxml
tests/auto/selftests/expected_skip.lightxml
tests/auto/selftests/expected_skip.xml
tests/auto/selftests/expected_skip.xunitxml
tests/auto/selftests/expected_skipglobal.lightxml
tests/auto/selftests/expected_skipglobal.xml
tests/auto/selftests/expected_skipglobal.xunitxml
tests/auto/selftests/expected_skipinit.lightxml
tests/auto/selftests/expected_skipinit.xml
tests/auto/selftests/expected_skipinit.xunitxml
tests/auto/selftests/expected_skipinitdata.lightxml
tests/auto/selftests/expected_skipinitdata.xml
tests/auto/selftests/expected_skipinitdata.xunitxml
tests/auto/selftests/expected_sleep.lightxml
tests/auto/selftests/expected_sleep.xml
tests/auto/selftests/expected_sleep.xunitxml
tests/auto/selftests/expected_strcmp.lightxml
tests/auto/selftests/expected_strcmp.xml
tests/auto/selftests/expected_strcmp.xunitxml
tests/auto/selftests/expected_subtest.lightxml
tests/auto/selftests/expected_subtest.xml
tests/auto/selftests/expected_subtest.xunitxml
tests/auto/selftests/expected_warnings.lightxml
tests/auto/selftests/expected_warnings.xml
tests/auto/selftests/expected_warnings.xunitxml
tests/auto/selftests/expected_xunit.lightxml
tests/auto/selftests/expected_xunit.xml
tests/auto/selftests/expected_xunit.xunitxml
tests/auto/selftests/tst_selftests.cpp
tests/auto/xmlpatterns.pro
translations/qt_he.ts
translations/qt_iw.ts
translations/translations.pri
util/s60pixelmetrics/pixel_metrics.cpp
--- a/.gitignore	Thu May 27 13:40:48 2010 +0300
+++ b/.gitignore	Fri Jun 11 14:24:45 2010 +0300
@@ -6,6 +6,8 @@
 !examples/*/*/README
 examples/*/*/*[.]app
 demos/*/*
+!demos/spectrum/*
+demos/spectrum/bin
 !demos/*/*[.]*
 demos/*/*[.]app
 config.tests/*/*/*
--- a/VERSION.SHA1	Thu May 27 13:40:48 2010 +0300
+++ b/VERSION.SHA1	Fri Jun 11 14:24:45 2010 +0300
@@ -1,1 +1,1 @@
-a87cc46ed4f6c9f77c756ffdf9858bfb28bbf493
+964a601ba47b2f1baa92e5e0263a1b12d0f9a691
--- a/configure_symbian	Thu May 27 13:40:48 2010 +0300
+++ b/configure_symbian	Fri Jun 11 14:24:45 2010 +0300
@@ -668,9 +668,9 @@
 CFG_QWS_FREETYPE=no
 CFG_LIBFREETYPE=no
 CFG_SQL_AVAILABLE=
-QT_DEFAULT_BUILD_PARTS="libs tools examples demos docs translations"
+QT_DEFAULT_BUILD_PARTS="libs tools examples demos"
 #QTP change for lRelease app. Need for Symbian
-CFG_BUILD_PARTS="translations"
+CFG_BUILD_PARTS=""
 CFG_NOBUILD_PARTS=""
 CFG_RELEASE_QMAKE=no
 CFG_PHONON=yes
@@ -4346,7 +4346,7 @@
 
     #mkspecs/default is used as a (gasp!) default mkspec so QMAKESPEC needn't be set once configured
     rm -rf mkspecs/default
-    cp -a `echo $XQMAKESPEC | sed "s,^${relpath}/mkspecs/,,"` mkspecs/default
+    cp -a mkspecs/`echo $XQMAKESPEC | sed "s,^${relpath}/mkspecs/,,"` mkspecs/default
 
     # fix makefiles
     for mkfile in GNUmakefile Makefile; do
@@ -7566,6 +7566,11 @@
     esac
 done
 
+#For symbian release we need add translations to PRT_ROOTS
+if [ "$PLATFORM_SYMBIAN" != "$XPLATFORM" ]; then
+    PART_ROOTS="$PART_ROOTS tools/linguist/lrelease"
+fi
+
 if [ "$CFG_DEV" = "yes" ]; then
     PART_ROOTS="$PART_ROOTS tests"
 fi
--- a/demos/demos.pro	Thu May 27 13:40:48 2010 +0300
+++ b/demos/demos.pro	Fri Jun 11 14:24:45 2010 +0300
@@ -55,6 +55,7 @@
 }
 contains(QT_CONFIG, phonon):!static:SUBDIRS += demos_mediaplayer
 contains(QT_CONFIG, webkit):contains(QT_CONFIG, svg):!symbian:SUBDIRS += demos_browser
+contains(QT_CONFIG, multimedia):SUBDIRS += demos_spectrum
 
 # install
 sources.files = README *.pro
@@ -87,6 +88,7 @@
 
 demos_boxes.subdir = boxes
 demos_sub-attaq.subdir = sub-attaq
+demos_spectrum.subdir = spectrum
 
 #CONFIG += ordered
 !ordered {
--- a/demos/embedded/fluidlauncher/config_s60/config.xml	Thu May 27 13:40:48 2010 +0300
+++ b/demos/embedded/fluidlauncher/config_s60/config.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -20,6 +20,7 @@
     <example filename="flickable" name="Kinetic Scrolling" image="screenshots/flickable.png"/>
     <example filename="digiflip" name="Flipping Clock" image="screenshots/digiflip.png"/>
     <example filename="qmediaplayer" name="Media Player" image="screenshots/mediaplayer.png" args="-small-screen"/>
+    <example filename="spectrum" name="Spectrum Analyzer" image="screenshots/spectrum.png" args="-small-screen"/>
   </demos>
   <slideshow timeout="60000" interval="10000">
     <imagedir dir="slides"/>
--- a/demos/embedded/fluidlauncher/fluidlauncher.pro	Thu May 27 13:40:48 2010 +0300
+++ b/demos/embedded/fluidlauncher/fluidlauncher.pro	Fri Jun 11 14:24:45 2010 +0300
@@ -99,6 +99,10 @@
         reg_resource.sources += $${EPOCROOT}$$HW_ZDIR$$REG_RESOURCE_IMPORT_DIR/qmediaplayer_reg.rsc
     }
 
+    contains(QT_CONFIG, multimedia) {
+        reg_resource.sources += $${EPOCROOT}$$HW_ZDIR$$REG_RESOURCE_IMPORT_DIR/spectrum_reg.rsc
+    }
+
 
     reg_resource.path = $$REG_RESOURCE_IMPORT_DIR
 
@@ -179,6 +183,13 @@
             $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/qmediaplayer.mif
     }
 
+    contains(QT_CONFIG, multimedia) {
+        executables.sources += spectrum.exe fftreal.dll
+        resource.sources += $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/spectrum.rsc
+        mifs.sources += \
+            $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/spectrum.mif
+    }
+
     contains(QT_CONFIG, script) {
         executables.sources += context2d.exe
         reg_resource.sources += $${EPOCROOT}$$HW_ZDIR$$REG_RESOURCE_IMPORT_DIR/context2d_reg.rsc
Binary file demos/embedded/fluidlauncher/screenshots/spectrum.png has changed
--- a/demos/qtdemo/xml/examples.xml	Thu May 27 13:40:48 2010 +0300
+++ b/demos/qtdemo/xml/examples.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -19,6 +19,7 @@
     <example filename="qmediaplayer" name="Media Player" />
     <example filename="boxes" name="Boxes" />
     <example filename="sub-attaq" name="Sub-attaq" />
+    <example filename="spectrum" name="Spectrum Analyzer" />
   </demos>
   <category dirname="animation" name="Animation Framework">
     <example filename="animatedtiles" name="Animated Tiles" />
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/Array.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,97 @@
+/*****************************************************************************
+
+        Array.h
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if ! defined (Array_HEADER_INCLUDED)
+#define	Array_HEADER_INCLUDED
+
+#if defined (_MSC_VER)
+	#pragma once
+	#pragma warning (4 : 4250) // "Inherits via dominance."
+#endif
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+template <class T, long LEN>
+class Array
+{
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+public:
+
+	typedef	T	DataType;
+
+						Array ();
+
+	inline const DataType &
+						operator [] (long pos) const;
+	inline DataType &
+						operator [] (long pos);
+
+	static inline long
+						size ();
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+protected:
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+	DataType			_data_arr [LEN];
+
+
+
+/*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+						Array (const Array &other);
+	Array &			operator = (const Array &other);
+	bool				operator == (const Array &other);
+	bool				operator != (const Array &other);
+
+};	// class Array
+
+
+
+#include	"Array.hpp"
+
+
+
+#endif	// Array_HEADER_INCLUDED
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/Array.hpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,98 @@
+/*****************************************************************************
+
+        Array.hpp
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if defined (Array_CURRENT_CODEHEADER)
+	#error Recursive inclusion of Array code header.
+#endif
+#define	Array_CURRENT_CODEHEADER
+
+#if ! defined (Array_CODEHEADER_INCLUDED)
+#define	Array_CODEHEADER_INCLUDED
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+#include	<cassert>
+
+
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+template <class T, long LEN>
+Array <T, LEN>::Array ()
+{
+	// Nothing
+}
+
+
+
+template <class T, long LEN>
+const typename Array <T, LEN>::DataType &	Array <T, LEN>::operator [] (long pos) const
+{
+	assert (pos >= 0);
+	assert (pos < LEN);
+
+	return (_data_arr [pos]);
+}
+
+
+
+template <class T, long LEN>
+typename Array <T, LEN>::DataType &	Array <T, LEN>::operator [] (long pos)
+{
+	assert (pos >= 0);
+	assert (pos < LEN);
+
+	return (_data_arr [pos]);
+}
+
+
+
+template <class T, long LEN>
+long	Array <T, LEN>::size ()
+{
+	return (LEN);
+}
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+#endif	// Array_CODEHEADER_INCLUDED
+
+#undef Array_CURRENT_CODEHEADER
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/DynArray.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,100 @@
+/*****************************************************************************
+
+        DynArray.h
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if ! defined (DynArray_HEADER_INCLUDED)
+#define	DynArray_HEADER_INCLUDED
+
+#if defined (_MSC_VER)
+	#pragma once
+	#pragma warning (4 : 4250) // "Inherits via dominance."
+#endif
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+template <class T>
+class DynArray
+{
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+public:
+
+	typedef	T	DataType;
+
+						DynArray ();
+	explicit			DynArray (long size);
+						~DynArray ();
+
+	inline long		size () const;
+	inline void		resize (long size);
+
+	inline const DataType &
+						operator [] (long pos) const;
+	inline DataType &
+						operator [] (long pos);
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+protected:
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+	DataType *		_data_ptr;
+	long				_len;
+
+
+
+/*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+						DynArray (const DynArray &other);
+	DynArray &		operator = (const DynArray &other);
+	bool				operator == (const DynArray &other);
+	bool				operator != (const DynArray &other);
+
+};	// class DynArray
+
+
+
+#include	"DynArray.hpp"
+
+
+
+#endif	// DynArray_HEADER_INCLUDED
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/DynArray.hpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,143 @@
+/*****************************************************************************
+
+        DynArray.hpp
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if defined (DynArray_CURRENT_CODEHEADER)
+	#error Recursive inclusion of DynArray code header.
+#endif
+#define	DynArray_CURRENT_CODEHEADER
+
+#if ! defined (DynArray_CODEHEADER_INCLUDED)
+#define	DynArray_CODEHEADER_INCLUDED
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+#include	<cassert>
+
+
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+template <class T>
+DynArray <T>::DynArray ()
+:	_data_ptr (0)
+,	_len (0)
+{
+	// Nothing
+}
+
+
+
+template <class T>
+DynArray <T>::DynArray (long size)
+:	_data_ptr (0)
+,	_len (0)
+{
+	assert (size >= 0);
+	if (size > 0)
+	{
+		_data_ptr = new DataType [size];
+		_len = size;
+	}
+}
+
+
+
+template <class T>
+DynArray <T>::~DynArray ()
+{
+	delete [] _data_ptr;
+	_data_ptr = 0;
+	_len = 0;
+}
+
+
+
+template <class T>
+long	DynArray <T>::size () const
+{
+	return (_len);
+}
+
+
+
+template <class T>
+void	DynArray <T>::resize (long size)
+{
+	assert (size >= 0);
+	if (size > 0)
+	{
+		DataType *		old_data_ptr = _data_ptr;
+		DataType *		tmp_data_ptr = new DataType [size];
+
+		_data_ptr = tmp_data_ptr;
+		_len = size;
+
+		delete [] old_data_ptr;
+	}
+}
+
+
+
+template <class T>
+const typename DynArray <T>::DataType &	DynArray <T>::operator [] (long pos) const
+{
+	assert (pos >= 0);
+	assert (pos < _len);
+
+	return (_data_ptr [pos]);
+}
+
+
+
+template <class T>
+typename DynArray <T>::DataType &	DynArray <T>::operator [] (long pos)
+{
+	assert (pos >= 0);
+	assert (pos < _len);
+
+	return (_data_ptr [pos]);
+}
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+#endif	// DynArray_CODEHEADER_INCLUDED
+
+#undef DynArray_CURRENT_CODEHEADER
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/FFTReal.dsp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,273 @@
+# Microsoft Developer Studio Project File - Name="FFTReal" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=FFTReal - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "FFTReal.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "FFTReal.mak" CFG="FFTReal - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "FFTReal - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "FFTReal - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "FFTReal - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GR /GX /O2 /Ob2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x40c /d "NDEBUG"
+# ADD RSC /l 0x40c /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+
+!ELSEIF  "$(CFG)" == "FFTReal - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /G6 /MTd /W3 /Gm /GR /GX /Zi /Od /Gf /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /c
+# ADD BASE RSC /l 0x40c /d "_DEBUG"
+# ADD RSC /l 0x40c /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+
+!ENDIF 
+
+# Begin Target
+
+# Name "FFTReal - Win32 Release"
+# Name "FFTReal - Win32 Debug"
+# Begin Group "Library"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=.\Array.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\Array.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\def.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\DynArray.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\DynArray.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\FFTReal.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\FFTReal.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\FFTRealFixLen.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\FFTRealFixLen.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\FFTRealFixLenParam.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\FFTRealPassDirect.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\FFTRealPassDirect.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\FFTRealPassInverse.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\FFTRealPassInverse.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\FFTRealSelect.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\FFTRealSelect.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\FFTRealUseTrigo.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\FFTRealUseTrigo.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\OscSinCos.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\OscSinCos.hpp
+# End Source File
+# End Group
+# Begin Group "Test"
+
+# PROP Default_Filter ""
+# Begin Group "stopwatch"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=.\stopwatch\ClockCycleCounter.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\stopwatch\ClockCycleCounter.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\stopwatch\ClockCycleCounter.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\stopwatch\def.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\stopwatch\fnc.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\stopwatch\fnc.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\stopwatch\Int64.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\stopwatch\StopWatch.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\stopwatch\StopWatch.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\stopwatch\StopWatch.hpp
+# End Source File
+# End Group
+# Begin Source File
+
+SOURCE=.\test.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\test_fnc.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\test_fnc.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\test_settings.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\TestAccuracy.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\TestAccuracy.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\TestHelperFixLen.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\TestHelperFixLen.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\TestHelperNormal.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\TestHelperNormal.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\TestSpeed.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\TestSpeed.hpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\TestWhiteNoiseGen.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\TestWhiteNoiseGen.hpp
+# End Source File
+# End Group
+# End Target
+# End Project
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/FFTReal.dsw	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "FFTReal"=.\FFTReal.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/FFTReal.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,142 @@
+/*****************************************************************************
+
+        FFTReal.h
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if ! defined (FFTReal_HEADER_INCLUDED)
+#define	FFTReal_HEADER_INCLUDED
+
+#if defined (_MSC_VER)
+	#pragma once
+	#pragma warning (4 : 4250) // "Inherits via dominance."
+#endif
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+#include	"def.h"
+#include	"DynArray.h"
+#include	"OscSinCos.h"
+
+
+
+template <class DT>
+class FFTReal
+{
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+public:
+
+	enum {			MAX_BIT_DEPTH	= 30	};	// So length can be represented as long int
+
+	typedef	DT	DataType;
+
+	explicit			FFTReal (long length);
+	virtual			~FFTReal () {}
+
+	long				get_length () const;
+	void				do_fft (DataType f [], const DataType x []) const;
+	void				do_ifft (const DataType f [], DataType x []) const;
+	void				rescale (DataType x []) const;
+	DataType *		use_buffer () const;
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+protected:
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+   // Over this bit depth, we use direct calculation for sin/cos
+   enum {	      TRIGO_BD_LIMIT	= 12  };
+
+	typedef	OscSinCos <DataType>	OscType;
+
+	void				init_br_lut ();
+	void				init_trigo_lut ();
+	void				init_trigo_osc ();
+
+	FORCEINLINE const long *
+						get_br_ptr () const;
+	FORCEINLINE const DataType	*
+						get_trigo_ptr (int level) const;
+	FORCEINLINE long
+						get_trigo_level_index (int level) const;
+
+	inline void		compute_fft_general (DataType f [], const DataType x []) const;
+	inline void		compute_direct_pass_1_2 (DataType df [], const DataType x []) const;
+	inline void		compute_direct_pass_3 (DataType df [], const DataType sf []) const;
+	inline void		compute_direct_pass_n (DataType df [], const DataType sf [], int pass) const;
+	inline void		compute_direct_pass_n_lut (DataType df [], const DataType sf [], int pass) const;
+	inline void		compute_direct_pass_n_osc (DataType df [], const DataType sf [], int pass) const;
+
+	inline void		compute_ifft_general (const DataType f [], DataType x []) const;
+	inline void		compute_inverse_pass_n (DataType df [], const DataType sf [], int pass) const;
+	inline void		compute_inverse_pass_n_osc (DataType df [], const DataType sf [], int pass) const;
+	inline void		compute_inverse_pass_n_lut (DataType df [], const DataType sf [], int pass) const;
+	inline void		compute_inverse_pass_3 (DataType df [], const DataType sf []) const;
+	inline void		compute_inverse_pass_1_2 (DataType x [], const DataType sf []) const;
+
+	const long		_length;
+	const int		_nbr_bits;
+	DynArray <long>
+						_br_lut;
+	DynArray <DataType>
+						_trigo_lut;
+	mutable DynArray <DataType>
+						_buffer;
+   mutable DynArray <OscType>
+						_trigo_osc;
+
+
+
+/*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+						FFTReal ();
+						FFTReal (const FFTReal &other);
+	FFTReal &		operator = (const FFTReal &other);
+	bool				operator == (const FFTReal &other);
+	bool				operator != (const FFTReal &other);
+
+};	// class FFTReal
+
+
+
+#include	"FFTReal.hpp"
+
+
+
+#endif	// FFTReal_HEADER_INCLUDED
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/FFTReal.hpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,916 @@
+/*****************************************************************************
+
+        FFTReal.hpp
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if defined (FFTReal_CURRENT_CODEHEADER)
+	#error Recursive inclusion of FFTReal code header.
+#endif
+#define	FFTReal_CURRENT_CODEHEADER
+
+#if ! defined (FFTReal_CODEHEADER_INCLUDED)
+#define	FFTReal_CODEHEADER_INCLUDED
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+#include	<cassert>
+#include	<cmath>
+
+
+
+static inline bool	FFTReal_is_pow2 (long x)
+{
+	assert (x > 0);
+
+	return  ((x & -x) == x);
+}
+
+
+
+static inline int	FFTReal_get_next_pow2 (long x)
+{
+	--x;
+
+	int				p = 0;
+	while ((x & ~0xFFFFL) != 0)
+	{
+		p += 16;
+		x >>= 16;
+	}
+	while ((x & ~0xFL) != 0)
+	{
+		p += 4;
+		x >>= 4;
+	}
+	while (x > 0)
+	{
+		++p;
+		x >>= 1;
+	}
+
+	return (p);
+}
+
+
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+/*
+==============================================================================
+Name: ctor
+Input parameters:
+	- length: length of the array on which we want to do a FFT. Range: power of
+		2 only, > 0.
+Throws: std::bad_alloc
+==============================================================================
+*/
+
+template <class DT>
+FFTReal <DT>::FFTReal (long length)
+:	_length (length)
+,	_nbr_bits (FFTReal_get_next_pow2 (length))
+,	_br_lut ()
+,	_trigo_lut ()
+,	_buffer (length)
+,	_trigo_osc ()
+{
+	assert (FFTReal_is_pow2 (length));
+	assert (_nbr_bits <= MAX_BIT_DEPTH);
+
+	init_br_lut ();
+	init_trigo_lut ();
+	init_trigo_osc ();
+}
+
+
+
+/*
+==============================================================================
+Name: get_length
+Description:
+	Returns the number of points processed by this FFT object.
+Returns: The number of points, power of 2, > 0.
+Throws: Nothing
+==============================================================================
+*/
+
+template <class DT>
+long	FFTReal <DT>::get_length () const
+{
+	return (_length);
+}
+
+
+
+/*
+==============================================================================
+Name: do_fft
+Description:
+	Compute the FFT of the array.
+Input parameters:
+	- x: pointer on the source array (time).
+Output parameters:
+	- f: pointer on the destination array (frequencies).
+		f [0...length(x)/2] = real values,
+		f [length(x)/2+1...length(x)-1] = negative imaginary values of
+		coefficents 1...length(x)/2-1.
+Throws: Nothing
+==============================================================================
+*/
+
+template <class DT>
+void	FFTReal <DT>::do_fft (DataType f [], const DataType x []) const
+{
+	assert (f != 0);
+	assert (f != use_buffer ());
+	assert (x != 0);
+	assert (x != use_buffer ());
+	assert (x != f);
+
+	// General case
+	if (_nbr_bits > 2)
+	{
+		compute_fft_general (f, x);
+	}
+
+	// 4-point FFT
+	else if (_nbr_bits == 2)
+	{
+		f [1] = x [0] - x [2];
+		f [3] = x [1] - x [3];
+
+		const DataType	b_0 = x [0] + x [2];
+		const DataType	b_2 = x [1] + x [3];
+		
+		f [0] = b_0 + b_2;
+		f [2] = b_0 - b_2;
+	}
+
+	// 2-point FFT
+	else if (_nbr_bits == 1)
+	{
+		f [0] = x [0] + x [1];
+		f [1] = x [0] - x [1];
+	}
+
+	// 1-point FFT
+	else
+	{
+		f [0] = x [0];
+	}
+}
+
+
+
+/*
+==============================================================================
+Name: do_ifft
+Description:
+	Compute the inverse FFT of the array. Note that data must be post-scaled:
+	IFFT (FFT (x)) = x * length (x).
+Input parameters:
+	- f: pointer on the source array (frequencies).
+		f [0...length(x)/2] = real values
+		f [length(x)/2+1...length(x)-1] = negative imaginary values of
+		coefficents 1...length(x)/2-1.
+Output parameters:
+	- x: pointer on the destination array (time).
+Throws: Nothing
+==============================================================================
+*/
+
+template <class DT>
+void	FFTReal <DT>::do_ifft (const DataType f [], DataType x []) const
+{
+	assert (f != 0);
+	assert (f != use_buffer ());
+	assert (x != 0);
+	assert (x != use_buffer ());
+	assert (x != f);
+
+	// General case
+	if (_nbr_bits > 2)
+	{
+		compute_ifft_general (f, x);
+	}
+
+	// 4-point IFFT
+	else if (_nbr_bits == 2)
+	{
+		const DataType	b_0 = f [0] + f [2];
+		const DataType	b_2 = f [0] - f [2];
+
+		x [0] = b_0 + f [1] * 2;
+		x [2] = b_0 - f [1] * 2;
+		x [1] = b_2 + f [3] * 2;
+		x [3] = b_2 - f [3] * 2;
+	}
+
+	// 2-point IFFT
+	else if (_nbr_bits == 1)
+	{
+		x [0] = f [0] + f [1];
+		x [1] = f [0] - f [1];
+	}
+
+	// 1-point IFFT
+	else
+	{
+		x [0] = f [0];
+	}
+}
+
+
+
+/*
+==============================================================================
+Name: rescale
+Description:
+	Scale an array by divide each element by its length. This function should
+	be called after FFT + IFFT.
+Input parameters:
+	- x: pointer on array to rescale (time or frequency).
+Throws: Nothing
+==============================================================================
+*/
+
+template <class DT>
+void	FFTReal <DT>::rescale (DataType x []) const
+{
+	const DataType	mul = DataType (1.0 / _length);
+
+	if (_length < 4)
+	{
+		long				i = _length - 1;
+		do
+		{
+			x [i] *= mul;
+			--i;
+		}
+		while (i >= 0);
+	}
+
+	else
+	{
+		assert ((_length & 3) == 0);
+
+		// Could be optimized with SIMD instruction sets (needs alignment check)
+		long				i = _length - 4;
+		do
+		{
+			x [i + 0] *= mul;
+			x [i + 1] *= mul;
+			x [i + 2] *= mul;
+			x [i + 3] *= mul;
+			i -= 4;
+		}
+		while (i >= 0);
+	}
+}
+
+
+
+/*
+==============================================================================
+Name: use_buffer
+Description:
+	Access the internal buffer, whose length is the FFT one.
+	Buffer content will be erased at each do_fft() / do_ifft() call!
+	This buffer cannot be used as:
+		- source for FFT or IFFT done with this object
+		- destination for FFT or IFFT done with this object
+Returns:
+	Buffer start address
+Throws: Nothing
+==============================================================================
+*/
+
+template <class DT>
+typename FFTReal <DT>::DataType *	FFTReal <DT>::use_buffer () const
+{
+	return (&_buffer [0]);
+}
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+template <class DT>
+void	FFTReal <DT>::init_br_lut ()
+{
+	const long		length = 1L << _nbr_bits;
+	_br_lut.resize (length);
+
+	_br_lut [0] = 0;
+	long				br_index = 0;
+	for (long cnt = 1; cnt < length; ++cnt)
+	{
+		// ++br_index (bit reversed)
+		long				bit = length >> 1;
+		while (((br_index ^= bit) & bit) == 0)
+		{
+			bit >>= 1;
+		}
+
+		_br_lut [cnt] = br_index;
+	}
+}
+
+
+
+template <class DT>
+void	FFTReal <DT>::init_trigo_lut ()
+{
+	using namespace std;
+
+	if (_nbr_bits > 3)
+	{
+		const long		total_len = (1L << (_nbr_bits - 1)) - 4;
+		_trigo_lut.resize (total_len);
+
+		for (int level = 3; level < _nbr_bits; ++level)
+		{
+			const long		level_len = 1L << (level - 1);
+			DataType	* const	level_ptr =
+				&_trigo_lut [get_trigo_level_index (level)];
+			const double	mul = PI / (level_len << 1);
+
+			for (long i = 0; i < level_len; ++ i)
+			{
+				level_ptr [i] = static_cast <DataType> (cos (i * mul));
+			}
+		}
+	}
+}
+
+
+
+template <class DT>
+void	FFTReal <DT>::init_trigo_osc ()
+{
+	const int		nbr_osc = _nbr_bits - TRIGO_BD_LIMIT;
+	if (nbr_osc > 0)
+	{
+		_trigo_osc.resize (nbr_osc);
+
+		for (int osc_cnt = 0; osc_cnt < nbr_osc; ++osc_cnt)
+		{
+			OscType &		osc = _trigo_osc [osc_cnt];
+
+			const long		len = 1L << (TRIGO_BD_LIMIT + osc_cnt);
+			const double	mul = (0.5 * PI) / len;
+			osc.set_step (mul);
+		}
+	}
+}
+
+
+
+template <class DT>
+const long *	FFTReal <DT>::get_br_ptr () const
+{
+	return (&_br_lut [0]);
+}
+
+
+
+template <class DT>
+const typename FFTReal <DT>::DataType *	FFTReal <DT>::get_trigo_ptr (int level) const
+{
+	assert (level >= 3);
+
+	return (&_trigo_lut [get_trigo_level_index (level)]);
+}
+
+
+
+template <class DT>
+long	FFTReal <DT>::get_trigo_level_index (int level) const
+{
+	assert (level >= 3);
+
+	return ((1L << (level - 1)) - 4);
+}
+
+
+
+// Transform in several passes
+template <class DT>
+void	FFTReal <DT>::compute_fft_general (DataType f [], const DataType x []) const
+{
+	assert (f != 0);
+	assert (f != use_buffer ());
+	assert (x != 0);
+	assert (x != use_buffer ());
+	assert (x != f);
+
+	DataType *		sf;
+	DataType *		df;
+
+	if ((_nbr_bits & 1) != 0)
+	{
+		df = use_buffer ();
+		sf = f;
+	}
+	else
+	{
+		df = f;
+		sf = use_buffer ();
+	}
+
+	compute_direct_pass_1_2 (df, x);
+	compute_direct_pass_3 (sf, df);
+
+	for (int pass = 3; pass < _nbr_bits; ++ pass)
+	{
+		compute_direct_pass_n (df, sf, pass);
+
+		DataType * const	temp_ptr = df;
+		df = sf;
+		sf = temp_ptr;
+	}
+}
+
+
+
+template <class DT>
+void	FFTReal <DT>::compute_direct_pass_1_2 (DataType df [], const DataType x []) const
+{
+	assert (df != 0);
+	assert (x != 0);
+	assert (df != x);
+
+	const long * const	bit_rev_lut_ptr = get_br_ptr ();
+	long				coef_index = 0;
+	do
+	{
+		const long		rev_index_0 = bit_rev_lut_ptr [coef_index];
+		const long		rev_index_1 = bit_rev_lut_ptr [coef_index + 1];
+		const long		rev_index_2 = bit_rev_lut_ptr [coef_index + 2];
+		const long		rev_index_3 = bit_rev_lut_ptr [coef_index + 3];
+
+		DataType	* const	df2 = df + coef_index;
+		df2 [1] = x [rev_index_0] - x [rev_index_1];
+		df2 [3] = x [rev_index_2] - x [rev_index_3];
+
+		const DataType	sf_0 = x [rev_index_0] + x [rev_index_1];
+		const DataType	sf_2 = x [rev_index_2] + x [rev_index_3];
+
+		df2 [0] = sf_0 + sf_2;
+		df2 [2] = sf_0 - sf_2;
+		
+		coef_index += 4;
+	}
+	while (coef_index < _length);
+}
+
+
+
+template <class DT>
+void	FFTReal <DT>::compute_direct_pass_3 (DataType df [], const DataType sf []) const
+{
+	assert (df != 0);
+	assert (sf != 0);
+	assert (df != sf);
+
+	const DataType	sqrt2_2 = DataType (SQRT2 * 0.5);
+	long				coef_index = 0;
+	do
+	{
+		DataType			v;
+
+		df [coef_index] = sf [coef_index] + sf [coef_index + 4];
+		df [coef_index + 4] = sf [coef_index] - sf [coef_index + 4];
+		df [coef_index + 2] = sf [coef_index + 2];
+		df [coef_index + 6] = sf [coef_index + 6];
+
+		v = (sf [coef_index + 5] - sf [coef_index + 7]) * sqrt2_2;
+		df [coef_index + 1] = sf [coef_index + 1] + v;
+		df [coef_index + 3] = sf [coef_index + 1] - v;
+
+		v = (sf [coef_index + 5] + sf [coef_index + 7]) * sqrt2_2;
+		df [coef_index + 5] = v + sf [coef_index + 3];
+		df [coef_index + 7] = v - sf [coef_index + 3];
+
+		coef_index += 8;
+	}
+	while (coef_index < _length);
+}
+
+
+
+template <class DT>
+void	FFTReal <DT>::compute_direct_pass_n (DataType df [], const DataType sf [], int pass) const
+{
+	assert (df != 0);
+	assert (sf != 0);
+	assert (df != sf);
+	assert (pass >= 3);
+	assert (pass < _nbr_bits);
+
+	if (pass <= TRIGO_BD_LIMIT)
+	{
+		compute_direct_pass_n_lut (df, sf, pass);
+	}
+	else
+	{
+		compute_direct_pass_n_osc (df, sf, pass);
+	}
+}
+
+
+
+template <class DT>
+void	FFTReal <DT>::compute_direct_pass_n_lut (DataType df [], const DataType sf [], int pass) const
+{
+	assert (df != 0);
+	assert (sf != 0);
+	assert (df != sf);
+	assert (pass >= 3);
+	assert (pass < _nbr_bits);
+
+	const long		nbr_coef = 1 << pass;
+	const long		h_nbr_coef = nbr_coef >> 1;
+	const long		d_nbr_coef = nbr_coef << 1;
+	long				coef_index = 0;
+	const DataType	* const	cos_ptr = get_trigo_ptr (pass);
+	do
+	{
+		const DataType	* const	sf1r = sf + coef_index;
+		const DataType	* const	sf2r = sf1r + nbr_coef;
+		DataType			* const	dfr = df + coef_index;
+		DataType			* const	dfi = dfr + nbr_coef;
+
+		// Extreme coefficients are always real
+		dfr [0] = sf1r [0] + sf2r [0];
+		dfi [0] = sf1r [0] - sf2r [0];	// dfr [nbr_coef] =
+		dfr [h_nbr_coef] = sf1r [h_nbr_coef];
+		dfi [h_nbr_coef] = sf2r [h_nbr_coef];
+
+		// Others are conjugate complex numbers
+		const DataType * const	sf1i = sf1r + h_nbr_coef;
+		const DataType * const	sf2i = sf1i + nbr_coef;
+		for (long i = 1; i < h_nbr_coef; ++ i)
+		{
+			const DataType	c = cos_ptr [i];					// cos (i*PI/nbr_coef);
+			const DataType	s = cos_ptr [h_nbr_coef - i];	// sin (i*PI/nbr_coef);
+			DataType	 		v;
+
+			v = sf2r [i] * c - sf2i [i] * s;
+			dfr [i] = sf1r [i] + v;
+			dfi [-i] = sf1r [i] - v;	// dfr [nbr_coef - i] =
+
+			v = sf2r [i] * s + sf2i [i] * c;
+			dfi [i] = v + sf1i [i];
+			dfi [nbr_coef - i] = v - sf1i [i];
+		}
+
+		coef_index += d_nbr_coef;
+	}
+	while (coef_index < _length);
+}
+
+
+
+template <class DT>
+void	FFTReal <DT>::compute_direct_pass_n_osc (DataType df [], const DataType sf [], int pass) const
+{
+	assert (df != 0);
+	assert (sf != 0);
+	assert (df != sf);
+	assert (pass > TRIGO_BD_LIMIT);
+	assert (pass < _nbr_bits);
+
+	const long		nbr_coef = 1 << pass;
+	const long		h_nbr_coef = nbr_coef >> 1;
+	const long		d_nbr_coef = nbr_coef << 1;
+	long				coef_index = 0;
+	OscType &		osc = _trigo_osc [pass - (TRIGO_BD_LIMIT + 1)];
+	do
+	{
+		const DataType	* const	sf1r = sf + coef_index;
+		const DataType	* const	sf2r = sf1r + nbr_coef;
+		DataType			* const	dfr = df + coef_index;
+		DataType			* const	dfi = dfr + nbr_coef;
+
+		osc.clear_buffers ();
+
+		// Extreme coefficients are always real
+		dfr [0] = sf1r [0] + sf2r [0];
+		dfi [0] = sf1r [0] - sf2r [0];	// dfr [nbr_coef] =
+		dfr [h_nbr_coef] = sf1r [h_nbr_coef];
+		dfi [h_nbr_coef] = sf2r [h_nbr_coef];
+
+		// Others are conjugate complex numbers
+		const DataType * const	sf1i = sf1r + h_nbr_coef;
+		const DataType * const	sf2i = sf1i + nbr_coef;
+		for (long i = 1; i < h_nbr_coef; ++ i)
+		{
+			osc.step ();
+			const DataType	c = osc.get_cos ();
+			const DataType	s = osc.get_sin ();
+			DataType	 		v;
+
+			v = sf2r [i] * c - sf2i [i] * s;
+			dfr [i] = sf1r [i] + v;
+			dfi [-i] = sf1r [i] - v;	// dfr [nbr_coef - i] =
+
+			v = sf2r [i] * s + sf2i [i] * c;
+			dfi [i] = v + sf1i [i];
+			dfi [nbr_coef - i] = v - sf1i [i];
+		}
+
+		coef_index += d_nbr_coef;
+	}
+	while (coef_index < _length);
+}
+
+
+
+// Transform in several pass
+template <class DT>
+void	FFTReal <DT>::compute_ifft_general (const DataType f [], DataType x []) const
+{
+	assert (f != 0);
+	assert (f != use_buffer ());
+	assert (x != 0);
+	assert (x != use_buffer ());
+	assert (x != f);
+
+	DataType *		sf = const_cast <DataType *> (f);
+	DataType *		df;
+	DataType *		df_temp;
+
+	if (_nbr_bits & 1)
+	{
+		df = use_buffer ();
+		df_temp = x;
+	}
+	else
+	{
+		df = x;
+		df_temp = use_buffer ();
+	}
+
+	for (int pass = _nbr_bits - 1; pass >= 3; -- pass)
+	{
+		compute_inverse_pass_n (df, sf, pass);
+
+		if (pass < _nbr_bits - 1)
+		{
+			DataType	* const	temp_ptr = df;
+			df = sf;
+			sf = temp_ptr;
+		}
+		else
+		{
+			sf = df;
+			df = df_temp;
+		}
+	}
+
+	compute_inverse_pass_3 (df, sf);
+	compute_inverse_pass_1_2 (x, df);
+}
+
+
+
+template <class DT>
+void	FFTReal <DT>::compute_inverse_pass_n (DataType df [], const DataType sf [], int pass) const
+{
+	assert (df != 0);
+	assert (sf != 0);
+	assert (df != sf);
+	assert (pass >= 3);
+	assert (pass < _nbr_bits);
+
+	if (pass <= TRIGO_BD_LIMIT)
+	{
+		compute_inverse_pass_n_lut (df, sf, pass);
+	}
+	else
+	{
+		compute_inverse_pass_n_osc (df, sf, pass);
+	}
+}
+
+
+
+template <class DT>
+void	FFTReal <DT>::compute_inverse_pass_n_lut (DataType df [], const DataType sf [], int pass) const
+{
+	assert (df != 0);
+	assert (sf != 0);
+	assert (df != sf);
+	assert (pass >= 3);
+	assert (pass < _nbr_bits);
+
+	const long		nbr_coef = 1 << pass;
+	const long		h_nbr_coef = nbr_coef >> 1;
+	const long		d_nbr_coef = nbr_coef << 1;
+	long				coef_index = 0;
+	const DataType * const	cos_ptr = get_trigo_ptr (pass);
+	do
+	{
+		const DataType	* const	sfr = sf + coef_index;
+		const DataType	* const	sfi = sfr + nbr_coef;
+		DataType			* const	df1r = df + coef_index;
+		DataType			* const	df2r = df1r + nbr_coef;
+
+		// Extreme coefficients are always real
+		df1r [0] = sfr [0] + sfi [0];		// + sfr [nbr_coef]
+		df2r [0] = sfr [0] - sfi [0];		// - sfr [nbr_coef]
+		df1r [h_nbr_coef] = sfr [h_nbr_coef] * 2;
+		df2r [h_nbr_coef] = sfi [h_nbr_coef] * 2;
+
+		// Others are conjugate complex numbers
+		DataType * const	df1i = df1r + h_nbr_coef;
+		DataType * const	df2i = df1i + nbr_coef;
+		for (long i = 1; i < h_nbr_coef; ++ i)
+		{
+			df1r [i] = sfr [i] + sfi [-i];		// + sfr [nbr_coef - i]
+			df1i [i] = sfi [i] - sfi [nbr_coef - i];
+
+			const DataType	c = cos_ptr [i];					// cos (i*PI/nbr_coef);
+			const DataType	s = cos_ptr [h_nbr_coef - i];	// sin (i*PI/nbr_coef);
+			const DataType	vr = sfr [i] - sfi [-i];		// - sfr [nbr_coef - i]
+			const DataType	vi = sfi [i] + sfi [nbr_coef - i];
+
+			df2r [i] = vr * c + vi * s;
+			df2i [i] = vi * c - vr * s;
+		}
+
+		coef_index += d_nbr_coef;
+	}
+	while (coef_index < _length);
+}
+
+
+
+template <class DT>
+void	FFTReal <DT>::compute_inverse_pass_n_osc (DataType df [], const DataType sf [], int pass) const
+{
+	assert (df != 0);
+	assert (sf != 0);
+	assert (df != sf);
+	assert (pass > TRIGO_BD_LIMIT);
+	assert (pass < _nbr_bits);
+
+	const long		nbr_coef = 1 << pass;
+	const long		h_nbr_coef = nbr_coef >> 1;
+	const long		d_nbr_coef = nbr_coef << 1;
+	long				coef_index = 0;
+	OscType &		osc = _trigo_osc [pass - (TRIGO_BD_LIMIT + 1)];
+	do
+	{
+		const DataType	* const	sfr = sf + coef_index;
+		const DataType	* const	sfi = sfr + nbr_coef;
+		DataType			* const	df1r = df + coef_index;
+		DataType			* const	df2r = df1r + nbr_coef;
+
+		osc.clear_buffers ();
+
+		// Extreme coefficients are always real
+		df1r [0] = sfr [0] + sfi [0];		// + sfr [nbr_coef]
+		df2r [0] = sfr [0] - sfi [0];		// - sfr [nbr_coef]
+		df1r [h_nbr_coef] = sfr [h_nbr_coef] * 2;
+		df2r [h_nbr_coef] = sfi [h_nbr_coef] * 2;
+
+		// Others are conjugate complex numbers
+		DataType * const	df1i = df1r + h_nbr_coef;
+		DataType * const	df2i = df1i + nbr_coef;
+		for (long i = 1; i < h_nbr_coef; ++ i)
+		{
+			df1r [i] = sfr [i] + sfi [-i];		// + sfr [nbr_coef - i]
+			df1i [i] = sfi [i] - sfi [nbr_coef - i];
+
+			osc.step ();
+			const DataType	c = osc.get_cos ();
+			const DataType	s = osc.get_sin ();
+			const DataType	vr = sfr [i] - sfi [-i];		// - sfr [nbr_coef - i]
+			const DataType	vi = sfi [i] + sfi [nbr_coef - i];
+
+			df2r [i] = vr * c + vi * s;
+			df2i [i] = vi * c - vr * s;
+		}
+
+		coef_index += d_nbr_coef;
+	}
+	while (coef_index < _length);
+}
+
+
+
+template <class DT>
+void	FFTReal <DT>::compute_inverse_pass_3 (DataType df [], const DataType sf []) const
+{
+	assert (df != 0);
+	assert (sf != 0);
+	assert (df != sf);
+
+	const DataType	sqrt2_2 = DataType (SQRT2 * 0.5);
+	long				coef_index = 0;
+	do
+	{
+		df [coef_index] = sf [coef_index] + sf [coef_index + 4];
+		df [coef_index + 4] = sf [coef_index] - sf [coef_index + 4];
+		df [coef_index + 2] = sf [coef_index + 2] * 2;
+		df [coef_index + 6] = sf [coef_index + 6] * 2;
+
+		df [coef_index + 1] = sf [coef_index + 1] + sf [coef_index + 3];
+		df [coef_index + 3] = sf [coef_index + 5] - sf [coef_index + 7];
+
+		const DataType	vr = sf [coef_index + 1] - sf [coef_index + 3];
+		const DataType	vi = sf [coef_index + 5] + sf [coef_index + 7];
+
+		df [coef_index + 5] = (vr + vi) * sqrt2_2;
+		df [coef_index + 7] = (vi - vr) * sqrt2_2;
+
+		coef_index += 8;
+	}
+	while (coef_index < _length);
+}
+
+
+
+template <class DT>
+void	FFTReal <DT>::compute_inverse_pass_1_2 (DataType x [], const DataType sf []) const
+{
+	assert (x != 0);
+	assert (sf != 0);
+	assert (x != sf);
+
+	const long *	bit_rev_lut_ptr = get_br_ptr ();
+	const DataType *	sf2 = sf;
+	long				coef_index = 0;
+	do
+	{
+		{
+			const DataType	b_0 = sf2 [0] + sf2 [2];
+			const DataType	b_2 = sf2 [0] - sf2 [2];
+			const DataType	b_1 = sf2 [1] * 2;
+			const DataType	b_3 = sf2 [3] * 2;
+
+			x [bit_rev_lut_ptr [0]] = b_0 + b_1;
+			x [bit_rev_lut_ptr [1]] = b_0 - b_1;
+			x [bit_rev_lut_ptr [2]] = b_2 + b_3;
+			x [bit_rev_lut_ptr [3]] = b_2 - b_3;
+		}
+		{
+			const DataType	b_0 = sf2 [4] + sf2 [6];
+			const DataType	b_2 = sf2 [4] - sf2 [6];
+			const DataType	b_1 = sf2 [5] * 2;
+			const DataType	b_3 = sf2 [7] * 2;
+
+			x [bit_rev_lut_ptr [4]] = b_0 + b_1;
+			x [bit_rev_lut_ptr [5]] = b_0 - b_1;
+			x [bit_rev_lut_ptr [6]] = b_2 + b_3;
+			x [bit_rev_lut_ptr [7]] = b_2 - b_3;
+		}
+
+		sf2 += 8;
+		coef_index += 8;
+		bit_rev_lut_ptr += 8;
+	}
+	while (coef_index < _length);
+}
+
+
+
+#endif	// FFTReal_CODEHEADER_INCLUDED
+
+#undef FFTReal_CURRENT_CODEHEADER
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/FFTRealFixLen.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,130 @@
+/*****************************************************************************
+
+        FFTRealFixLen.h
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if ! defined (FFTRealFixLen_HEADER_INCLUDED)
+#define	FFTRealFixLen_HEADER_INCLUDED
+
+#if defined (_MSC_VER)
+	#pragma once
+	#pragma warning (4 : 4250) // "Inherits via dominance."
+#endif
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+#include	"Array.h"
+#include	"DynArray.h"
+#include	"FFTRealFixLenParam.h"
+#include	"OscSinCos.h"
+
+
+
+template <int LL2>
+class FFTRealFixLen
+{
+	typedef	int	CompileTimeCheck1 [(LL2 >=  0) ? 1 : -1];
+	typedef	int	CompileTimeCheck2 [(LL2 <= 30) ? 1 : -1];
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+public:
+
+   typedef	FFTRealFixLenParam::DataType   DataType;
+	typedef	OscSinCos <DataType>	OscType;
+
+	enum {			FFT_LEN_L2	= LL2	};
+	enum {			FFT_LEN		= 1 << FFT_LEN_L2	};
+
+						FFTRealFixLen ();
+
+	inline long		get_length () const;
+	void				do_fft (DataType f [], const DataType x []);
+	void				do_ifft (const DataType f [], DataType x []);
+	void				rescale (DataType x []) const;
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+protected:
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+	enum {			TRIGO_BD_LIMIT	= FFTRealFixLenParam::TRIGO_BD_LIMIT	};
+
+	enum {			BR_ARR_SIZE_L2	= ((FFT_LEN_L2 - 3) < 0) ? 0 : (FFT_LEN_L2 - 2)	};
+	enum {			BR_ARR_SIZE		= 1 << BR_ARR_SIZE_L2	};
+
+   enum {			TRIGO_BD			=   ((FFT_LEN_L2 - TRIGO_BD_LIMIT) < 0)
+											  ? (int)FFT_LEN_L2
+											  : (int)TRIGO_BD_LIMIT };
+	enum {			TRIGO_TABLE_ARR_SIZE_L2	= (LL2 < 4) ? 0 : (TRIGO_BD - 2)	};
+	enum {			TRIGO_TABLE_ARR_SIZE	= 1 << TRIGO_TABLE_ARR_SIZE_L2	};
+
+	enum {			NBR_TRIGO_OSC			= FFT_LEN_L2 - TRIGO_BD	};
+	enum {			TRIGO_OSC_ARR_SIZE	=	(NBR_TRIGO_OSC > 0) ? NBR_TRIGO_OSC : 1	};
+
+	void				build_br_lut ();
+	void				build_trigo_lut ();
+	void				build_trigo_osc ();
+
+	DynArray <DataType>
+						_buffer;
+	DynArray <long>
+						_br_data;
+	DynArray <DataType>
+						_trigo_data;
+   Array <OscType, TRIGO_OSC_ARR_SIZE>
+						_trigo_osc;
+
+
+
+/*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+						FFTRealFixLen (const FFTRealFixLen &other);
+	FFTRealFixLen&	operator = (const FFTRealFixLen &other);
+	bool				operator == (const FFTRealFixLen &other);
+	bool				operator != (const FFTRealFixLen &other);
+
+};	// class FFTRealFixLen
+
+
+
+#include	"FFTRealFixLen.hpp"
+
+
+
+#endif	// FFTRealFixLen_HEADER_INCLUDED
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/FFTRealFixLen.hpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,322 @@
+/*****************************************************************************
+
+        FFTRealFixLen.hpp
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if defined (FFTRealFixLen_CURRENT_CODEHEADER)
+	#error Recursive inclusion of FFTRealFixLen code header.
+#endif
+#define	FFTRealFixLen_CURRENT_CODEHEADER
+
+#if ! defined (FFTRealFixLen_CODEHEADER_INCLUDED)
+#define	FFTRealFixLen_CODEHEADER_INCLUDED
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+#include	"def.h"
+#include	"FFTRealPassDirect.h"
+#include	"FFTRealPassInverse.h"
+#include	"FFTRealSelect.h"
+
+#include	<cassert>
+#include	<cmath>
+
+namespace std { }
+
+
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+template <int LL2>
+FFTRealFixLen <LL2>::FFTRealFixLen ()
+:	_buffer (FFT_LEN)
+,	_br_data (BR_ARR_SIZE)
+,	_trigo_data (TRIGO_TABLE_ARR_SIZE)
+,	_trigo_osc ()
+{
+	build_br_lut ();
+	build_trigo_lut ();
+	build_trigo_osc ();
+}
+
+
+
+template <int LL2>
+long	FFTRealFixLen <LL2>::get_length () const
+{
+	return (FFT_LEN);
+}
+
+
+
+// General case
+template <int LL2>
+void	FFTRealFixLen <LL2>::do_fft (DataType f [], const DataType x [])
+{
+	assert (f != 0);
+	assert (x != 0);
+	assert (x != f);
+	assert (FFT_LEN_L2 >= 3);
+
+	// Do the transform in several passes
+	const DataType	*	cos_ptr = &_trigo_data [0];
+	const long *	br_ptr = &_br_data [0];
+
+	FFTRealPassDirect <FFT_LEN_L2 - 1>::process (
+		FFT_LEN,
+		f,
+		&_buffer [0],
+		x,
+		cos_ptr,
+		TRIGO_TABLE_ARR_SIZE,
+		br_ptr,
+		&_trigo_osc [0]
+	);
+}
+
+// 4-point FFT
+template <>
+void	FFTRealFixLen <2>::do_fft (DataType f [], const DataType x [])
+{
+	assert (f != 0);
+	assert (x != 0);
+	assert (x != f);
+
+	f [1] = x [0] - x [2];
+	f [3] = x [1] - x [3];
+
+	const DataType	b_0 = x [0] + x [2];
+	const DataType	b_2 = x [1] + x [3];
+	
+	f [0] = b_0 + b_2;
+	f [2] = b_0 - b_2;
+}
+
+// 2-point FFT
+template <>
+void	FFTRealFixLen <1>::do_fft (DataType f [], const DataType x [])
+{
+	assert (f != 0);
+	assert (x != 0);
+	assert (x != f);
+
+	f [0] = x [0] + x [1];
+	f [1] = x [0] - x [1];
+}
+
+// 1-point FFT
+template <>
+void	FFTRealFixLen <0>::do_fft (DataType f [], const DataType x [])
+{
+	assert (f != 0);
+	assert (x != 0);
+
+	f [0] = x [0];
+}
+
+
+
+// General case
+template <int LL2>
+void	FFTRealFixLen <LL2>::do_ifft (const DataType f [], DataType x [])
+{
+	assert (f != 0);
+	assert (x != 0);
+	assert (x != f);
+	assert (FFT_LEN_L2 >= 3);
+
+	// Do the transform in several passes
+	DataType *		s_ptr =
+		FFTRealSelect <FFT_LEN_L2 & 1>::sel_bin (&_buffer [0], x);
+	DataType *		d_ptr =
+		FFTRealSelect <FFT_LEN_L2 & 1>::sel_bin (x, &_buffer [0]);
+	const DataType	*	cos_ptr = &_trigo_data [0];
+	const long *	br_ptr = &_br_data [0];
+
+	FFTRealPassInverse <FFT_LEN_L2 - 1>::process (
+		FFT_LEN,
+		d_ptr,
+		s_ptr,
+		f,
+		cos_ptr,
+		TRIGO_TABLE_ARR_SIZE,
+		br_ptr,
+		&_trigo_osc [0]
+	);
+}
+
+// 4-point IFFT
+template <>
+void	FFTRealFixLen <2>::do_ifft (const DataType f [], DataType x [])
+{
+	assert (f != 0);
+	assert (x != 0);
+	assert (x != f);
+
+	const DataType	b_0 = f [0] + f [2];
+	const DataType	b_2 = f [0] - f [2];
+
+	x [0] = b_0 + f [1] * 2;
+	x [2] = b_0 - f [1] * 2;
+	x [1] = b_2 + f [3] * 2;
+	x [3] = b_2 - f [3] * 2;
+}
+
+// 2-point IFFT
+template <>
+void	FFTRealFixLen <1>::do_ifft (const DataType f [], DataType x [])
+{
+	assert (f != 0);
+	assert (x != 0);
+	assert (x != f);
+
+	x [0] = f [0] + f [1];
+	x [1] = f [0] - f [1];
+}
+
+// 1-point IFFT
+template <>
+void	FFTRealFixLen <0>::do_ifft (const DataType f [], DataType x [])
+{
+	assert (f != 0);
+	assert (x != 0);
+	assert (x != f);
+
+	x [0] = f [0];
+}
+
+
+
+
+template <int LL2>
+void	FFTRealFixLen <LL2>::rescale (DataType x []) const
+{
+	assert (x != 0);
+
+	const DataType	mul = DataType (1.0 / FFT_LEN);
+
+	if (FFT_LEN < 4)
+	{
+		long				i = FFT_LEN - 1;
+		do
+		{
+			x [i] *= mul;
+			--i;
+		}
+		while (i >= 0);
+	}
+
+	else
+	{
+		assert ((FFT_LEN & 3) == 0);
+
+		// Could be optimized with SIMD instruction sets (needs alignment check)
+		long				i = FFT_LEN - 4;
+		do
+		{
+			x [i + 0] *= mul;
+			x [i + 1] *= mul;
+			x [i + 2] *= mul;
+			x [i + 3] *= mul;
+			i -= 4;
+		}
+		while (i >= 0);
+	}
+}
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+template <int LL2>
+void	FFTRealFixLen <LL2>::build_br_lut ()
+{
+	_br_data [0] = 0;
+	for (long cnt = 1; cnt < BR_ARR_SIZE; ++cnt)
+	{
+		long				index = cnt << 2;
+		long				br_index = 0;
+
+		int				bit_cnt = FFT_LEN_L2;
+		do
+		{
+			br_index <<= 1;
+			br_index += (index & 1);
+			index >>= 1;
+
+			-- bit_cnt;
+		}
+		while (bit_cnt > 0);
+
+		_br_data [cnt] = br_index;
+	}
+}
+
+
+
+template <int LL2>
+void	FFTRealFixLen <LL2>::build_trigo_lut ()
+{
+	const double	mul = (0.5 * PI) / TRIGO_TABLE_ARR_SIZE;
+	for (long i = 0; i < TRIGO_TABLE_ARR_SIZE; ++ i)
+	{
+		using namespace std;
+
+		_trigo_data [i] = DataType (cos (i * mul));
+	}
+}
+
+
+
+template <int LL2>
+void	FFTRealFixLen <LL2>::build_trigo_osc ()
+{
+	for (int i = 0; i < NBR_TRIGO_OSC; ++i)
+	{
+		OscType &		osc = _trigo_osc [i];
+
+		const long		len = static_cast <long> (TRIGO_TABLE_ARR_SIZE) << (i + 1);
+		const double	mul = (0.5 * PI) / len;
+		osc.set_step (mul);
+	}
+}
+
+
+
+#endif	// FFTRealFixLen_CODEHEADER_INCLUDED
+
+#undef FFTRealFixLen_CURRENT_CODEHEADER
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/FFTRealFixLenParam.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,93 @@
+/*****************************************************************************
+
+        FFTRealFixLenParam.h
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if ! defined (FFTRealFixLenParam_HEADER_INCLUDED)
+#define	FFTRealFixLenParam_HEADER_INCLUDED
+
+#if defined (_MSC_VER)
+	#pragma once
+	#pragma warning (4 : 4250) // "Inherits via dominance."
+#endif
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+class FFTRealFixLenParam
+{
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+public:
+
+   // Over this bit depth, we use direct calculation for sin/cos
+   enum {	      TRIGO_BD_LIMIT	= 12  };
+
+	typedef	float	DataType;
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+protected:
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+
+
+/*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+#if 0	// To avoid GCC warning:
+		// All member functions in class 'FFTRealFixLenParam' are private
+						FFTRealFixLenParam ();
+						~FFTRealFixLenParam ();
+						FFTRealFixLenParam (const FFTRealFixLenParam &other);
+	FFTRealFixLenParam &
+						operator = (const FFTRealFixLenParam &other);
+	bool				operator == (const FFTRealFixLenParam &other);
+	bool				operator != (const FFTRealFixLenParam &other);
+#endif
+
+};	// class FFTRealFixLenParam
+
+
+
+//#include	"FFTRealFixLenParam.hpp"
+
+
+
+#endif	// FFTRealFixLenParam_HEADER_INCLUDED
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/FFTRealPassDirect.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,96 @@
+/*****************************************************************************
+
+        FFTRealPassDirect.h
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if ! defined (FFTRealPassDirect_HEADER_INCLUDED)
+#define	FFTRealPassDirect_HEADER_INCLUDED
+
+#if defined (_MSC_VER)
+	#pragma once
+	#pragma warning (4 : 4250) // "Inherits via dominance."
+#endif
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+#include	"def.h"
+#include	"FFTRealFixLenParam.h"
+#include	"OscSinCos.h"
+
+
+
+template <int PASS>
+class FFTRealPassDirect
+{
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+public:
+
+   typedef	FFTRealFixLenParam::DataType	DataType;
+	typedef	OscSinCos <DataType>	OscType;
+
+	FORCEINLINE static void
+						process (long len, DataType dest_ptr [], DataType src_ptr [], const DataType x_ptr [], const DataType cos_ptr [], long cos_len, const long br_ptr [], OscType osc_list []);
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+protected:
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+
+
+/*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+						FFTRealPassDirect ();
+						~FFTRealPassDirect ();
+						FFTRealPassDirect (const FFTRealPassDirect &other);
+	FFTRealPassDirect &
+						operator = (const FFTRealPassDirect &other);
+	bool				operator == (const FFTRealPassDirect &other);
+	bool				operator != (const FFTRealPassDirect &other);
+
+};	// class FFTRealPassDirect
+
+
+
+#include	"FFTRealPassDirect.hpp"
+
+
+
+#endif	// FFTRealPassDirect_HEADER_INCLUDED
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/FFTRealPassDirect.hpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,204 @@
+/*****************************************************************************
+
+        FFTRealPassDirect.hpp
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if defined (FFTRealPassDirect_CURRENT_CODEHEADER)
+	#error Recursive inclusion of FFTRealPassDirect code header.
+#endif
+#define	FFTRealPassDirect_CURRENT_CODEHEADER
+
+#if ! defined (FFTRealPassDirect_CODEHEADER_INCLUDED)
+#define	FFTRealPassDirect_CODEHEADER_INCLUDED
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+#include	"FFTRealUseTrigo.h"
+
+
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+template <>
+void	FFTRealPassDirect <1>::process (long len, DataType dest_ptr [], DataType src_ptr [], const DataType x_ptr [], const DataType cos_ptr [], long cos_len, const long br_ptr [], OscType osc_list [])
+{
+	// First and second pass at once
+	const long		qlen = len >> 2;
+
+	long				coef_index = 0;
+	do
+	{
+		// To do: unroll the loop (2x).
+		const long		ri_0 = br_ptr [coef_index >> 2];
+		const long		ri_1 = ri_0 + 2 * qlen;	// bit_rev_lut_ptr [coef_index + 1];
+		const long		ri_2 = ri_0 + 1 * qlen;	// bit_rev_lut_ptr [coef_index + 2];
+		const long		ri_3 = ri_0 + 3 * qlen;	// bit_rev_lut_ptr [coef_index + 3];
+
+		DataType	* const	df2 = dest_ptr + coef_index;
+		df2 [1] = x_ptr [ri_0] - x_ptr [ri_1];
+		df2 [3] = x_ptr [ri_2] - x_ptr [ri_3];
+
+		const DataType	sf_0 = x_ptr [ri_0] + x_ptr [ri_1];
+		const DataType	sf_2 = x_ptr [ri_2] + x_ptr [ri_3];
+
+		df2 [0] = sf_0 + sf_2;
+		df2 [2] = sf_0 - sf_2;
+
+		coef_index += 4;
+	}
+	while (coef_index < len);
+}
+
+template <>
+void	FFTRealPassDirect <2>::process (long len, DataType dest_ptr [], DataType src_ptr [], const DataType x_ptr [], const DataType cos_ptr [], long cos_len, const long br_ptr [], OscType osc_list [])
+{
+	// Executes "previous" passes first. Inverts source and destination buffers
+	FFTRealPassDirect <1>::process (
+		len,
+		src_ptr,
+		dest_ptr,
+		x_ptr,
+		cos_ptr,
+		cos_len,
+		br_ptr,
+		osc_list
+	);
+
+	// Third pass
+	const DataType	sqrt2_2 = DataType (SQRT2 * 0.5);
+
+	long				coef_index = 0;
+	do
+	{
+		dest_ptr [coef_index    ] = src_ptr [coef_index] + src_ptr [coef_index + 4];
+		dest_ptr [coef_index + 4] = src_ptr [coef_index] - src_ptr [coef_index + 4];
+		dest_ptr [coef_index + 2] = src_ptr [coef_index + 2];
+		dest_ptr [coef_index + 6] = src_ptr [coef_index + 6];
+
+		DataType			v;
+
+		v = (src_ptr [coef_index + 5] - src_ptr [coef_index + 7]) * sqrt2_2;
+		dest_ptr [coef_index + 1] = src_ptr [coef_index + 1] + v;
+		dest_ptr [coef_index + 3] = src_ptr [coef_index + 1] - v;
+
+		v = (src_ptr [coef_index + 5] + src_ptr [coef_index + 7]) * sqrt2_2;
+		dest_ptr [coef_index + 5] = v + src_ptr [coef_index + 3];
+		dest_ptr [coef_index + 7] = v - src_ptr [coef_index + 3];
+
+		coef_index += 8;
+	}
+	while (coef_index < len);
+}
+
+template <int PASS>
+void	FFTRealPassDirect <PASS>::process (long len, DataType dest_ptr [], DataType src_ptr [], const DataType x_ptr [], const DataType cos_ptr [], long cos_len, const long br_ptr [], OscType osc_list [])
+{
+	// Executes "previous" passes first. Inverts source and destination buffers
+	FFTRealPassDirect <PASS - 1>::process (
+		len,
+		src_ptr,
+		dest_ptr,
+		x_ptr,
+		cos_ptr,
+		cos_len,
+		br_ptr,
+		osc_list
+	);
+
+	const long		dist = 1L << (PASS - 1);
+	const long		c1_r = 0;
+	const long		c1_i = dist;
+	const long		c2_r = dist * 2;
+	const long		c2_i = dist * 3;
+	const long		cend = dist * 4;
+	const long		table_step = cos_len >> (PASS - 1);
+
+   enum {	TRIGO_OSC		= PASS - FFTRealFixLenParam::TRIGO_BD_LIMIT	};
+	enum {	TRIGO_DIRECT	= (TRIGO_OSC >= 0) ? 1 : 0	};
+
+	long				coef_index = 0;
+	do
+	{
+		const DataType	* const	sf = src_ptr + coef_index;
+		DataType			* const	df = dest_ptr + coef_index;
+
+		// Extreme coefficients are always real
+		df [c1_r] = sf [c1_r] + sf [c2_r];
+		df [c2_r] = sf [c1_r] - sf [c2_r];
+		df [c1_i] = sf [c1_i];
+		df [c2_i] = sf [c2_i];
+
+		FFTRealUseTrigo <TRIGO_DIRECT>::prepare (osc_list [TRIGO_OSC]);
+
+		// Others are conjugate complex numbers
+		for (long i = 1; i < dist; ++ i)
+		{
+			DataType			c;
+			DataType			s;
+			FFTRealUseTrigo <TRIGO_DIRECT>::iterate (
+				osc_list [TRIGO_OSC],
+				c,
+				s,
+				cos_ptr,
+				i * table_step,
+				(dist - i) * table_step
+			);
+
+			const DataType	sf_r_i = sf [c1_r + i];
+			const DataType	sf_i_i = sf [c1_i + i];
+
+			const DataType	v1 = sf [c2_r + i] * c - sf [c2_i + i] * s;
+			df [c1_r + i] = sf_r_i + v1;
+			df [c2_r - i] = sf_r_i - v1;
+
+			const DataType	v2 = sf [c2_r + i] * s + sf [c2_i + i] * c;
+			df [c2_r + i] = v2 + sf_i_i;
+			df [cend - i] = v2 - sf_i_i;
+		}
+
+		coef_index += cend;
+	}
+	while (coef_index < len);
+}
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+#endif	// FFTRealPassDirect_CODEHEADER_INCLUDED
+
+#undef FFTRealPassDirect_CURRENT_CODEHEADER
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/FFTRealPassInverse.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,101 @@
+/*****************************************************************************
+
+        FFTRealPassInverse.h
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if ! defined (FFTRealPassInverse_HEADER_INCLUDED)
+#define	FFTRealPassInverse_HEADER_INCLUDED
+
+#if defined (_MSC_VER)
+	#pragma once
+	#pragma warning (4 : 4250) // "Inherits via dominance."
+#endif
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+#include	"def.h"
+#include	"FFTRealFixLenParam.h"
+#include	"OscSinCos.h"
+
+
+
+
+template <int PASS>
+class FFTRealPassInverse
+{
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+public:
+
+   typedef	FFTRealFixLenParam::DataType	DataType;
+	typedef	OscSinCos <DataType>	OscType;
+
+	FORCEINLINE static void
+						process (long len, DataType dest_ptr [], DataType src_ptr [], const DataType f_ptr [], const DataType cos_ptr [], long cos_len, const long br_ptr [], OscType osc_list []);
+	FORCEINLINE static void
+						process_rec (long len, DataType dest_ptr [], DataType src_ptr [], const DataType cos_ptr [], long cos_len, const long br_ptr [], OscType osc_list []);
+	FORCEINLINE static void
+						process_internal (long len, DataType dest_ptr [], const DataType src_ptr [], const DataType cos_ptr [], long cos_len, const long br_ptr [], OscType osc_list []);
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+protected:
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+
+
+/*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+						FFTRealPassInverse ();
+						~FFTRealPassInverse ();
+						FFTRealPassInverse (const FFTRealPassInverse &other);
+	FFTRealPassInverse &
+						operator = (const FFTRealPassInverse &other);
+	bool				operator == (const FFTRealPassInverse &other);
+	bool				operator != (const FFTRealPassInverse &other);
+
+};	// class FFTRealPassInverse
+
+
+
+#include	"FFTRealPassInverse.hpp"
+
+
+
+#endif	// FFTRealPassInverse_HEADER_INCLUDED
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/FFTRealPassInverse.hpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,229 @@
+/*****************************************************************************
+
+        FFTRealPassInverse.hpp
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if defined (FFTRealPassInverse_CURRENT_CODEHEADER)
+	#error Recursive inclusion of FFTRealPassInverse code header.
+#endif
+#define	FFTRealPassInverse_CURRENT_CODEHEADER
+
+#if ! defined (FFTRealPassInverse_CODEHEADER_INCLUDED)
+#define	FFTRealPassInverse_CODEHEADER_INCLUDED
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+#include	"FFTRealUseTrigo.h"
+
+
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+template <int PASS>
+void	FFTRealPassInverse <PASS>::process (long len, DataType dest_ptr [], DataType src_ptr [], const DataType f_ptr [], const DataType cos_ptr [], long cos_len, const long br_ptr [], OscType osc_list [])
+{
+	process_internal (
+		len,
+		dest_ptr,
+		f_ptr,
+		cos_ptr,
+		cos_len,
+		br_ptr,
+		osc_list
+	);
+	FFTRealPassInverse <PASS - 1>::process_rec (
+		len,
+		src_ptr,
+		dest_ptr,
+		cos_ptr,
+		cos_len,
+		br_ptr,
+		osc_list
+	);
+}
+
+
+
+template <int PASS>
+void	FFTRealPassInverse <PASS>::process_rec (long len, DataType dest_ptr [], DataType src_ptr [], const DataType cos_ptr [], long cos_len, const long br_ptr [], OscType osc_list [])
+{
+	process_internal (
+		len,
+		dest_ptr,
+		src_ptr,
+		cos_ptr,
+		cos_len,
+		br_ptr,
+		osc_list
+	);
+	FFTRealPassInverse <PASS - 1>::process_rec (
+		len,
+		src_ptr,
+		dest_ptr,
+		cos_ptr,
+		cos_len,
+		br_ptr,
+		osc_list
+	);
+}
+
+template <>
+void	FFTRealPassInverse <0>::process_rec (long len, DataType dest_ptr [], DataType src_ptr [], const DataType cos_ptr [], long cos_len, const long br_ptr [], OscType osc_list [])
+{
+	// Stops recursion
+}
+
+
+
+template <int PASS>
+void	FFTRealPassInverse <PASS>::process_internal (long len, DataType dest_ptr [], const DataType src_ptr [], const DataType cos_ptr [], long cos_len, const long br_ptr [], OscType osc_list [])
+{
+	const long		dist = 1L << (PASS - 1);
+	const long		c1_r = 0;
+	const long		c1_i = dist;
+	const long		c2_r = dist * 2;
+	const long		c2_i = dist * 3;
+	const long		cend = dist * 4;
+	const long		table_step = cos_len >> (PASS - 1);
+
+   enum {	TRIGO_OSC		= PASS - FFTRealFixLenParam::TRIGO_BD_LIMIT	};
+	enum {	TRIGO_DIRECT	= (TRIGO_OSC >= 0) ? 1 : 0	};
+
+	long				coef_index = 0;
+	do
+	{
+		const DataType	* const	sf = src_ptr + coef_index;
+		DataType			* const	df = dest_ptr + coef_index;
+
+		// Extreme coefficients are always real
+		df [c1_r] = sf [c1_r] + sf [c2_r];
+		df [c2_r] = sf [c1_r] - sf [c2_r];
+		df [c1_i] = sf [c1_i] * 2;
+		df [c2_i] = sf [c2_i] * 2;
+
+		FFTRealUseTrigo <TRIGO_DIRECT>::prepare (osc_list [TRIGO_OSC]);
+
+		// Others are conjugate complex numbers
+		for (long i = 1; i < dist; ++ i)
+		{
+			df [c1_r + i] = sf [c1_r + i] + sf [c2_r - i];
+			df [c1_i + i] = sf [c2_r + i] - sf [cend - i];
+
+			DataType			c;
+			DataType			s;
+			FFTRealUseTrigo <TRIGO_DIRECT>::iterate (
+				osc_list [TRIGO_OSC],
+				c,
+				s,
+				cos_ptr,
+				i * table_step,
+				(dist - i) * table_step
+			);
+
+			const DataType	vr = sf [c1_r + i] - sf [c2_r - i];
+			const DataType	vi = sf [c2_r + i] + sf [cend - i];
+
+			df [c2_r + i] = vr * c + vi * s;
+			df [c2_i + i] = vi * c - vr * s;
+		}
+
+		coef_index += cend;
+	}
+	while (coef_index < len);
+}
+
+template <>
+void	FFTRealPassInverse <2>::process_internal (long len, DataType dest_ptr [], const DataType src_ptr [], const DataType cos_ptr [], long cos_len, const long br_ptr [], OscType osc_list [])
+{
+	// Antepenultimate pass
+	const DataType	sqrt2_2 = DataType (SQRT2 * 0.5);
+
+	long				coef_index = 0;
+	do
+	{
+		dest_ptr [coef_index    ] = src_ptr [coef_index] + src_ptr [coef_index + 4];
+		dest_ptr [coef_index + 4] = src_ptr [coef_index] - src_ptr [coef_index + 4];
+		dest_ptr [coef_index + 2] = src_ptr [coef_index + 2] * 2;
+		dest_ptr [coef_index + 6] = src_ptr [coef_index + 6] * 2;
+
+		dest_ptr [coef_index + 1] = src_ptr [coef_index + 1] + src_ptr [coef_index + 3];
+		dest_ptr [coef_index + 3] = src_ptr [coef_index + 5] - src_ptr [coef_index + 7];
+
+		const DataType	vr = src_ptr [coef_index + 1] - src_ptr [coef_index + 3];
+		const DataType	vi = src_ptr [coef_index + 5] + src_ptr [coef_index + 7];
+
+		dest_ptr [coef_index + 5] = (vr + vi) * sqrt2_2;
+		dest_ptr [coef_index + 7] = (vi - vr) * sqrt2_2;
+
+		coef_index += 8;
+	}
+	while (coef_index < len);
+}
+
+template <>
+void	FFTRealPassInverse <1>::process_internal (long len, DataType dest_ptr [], const DataType src_ptr [], const DataType cos_ptr [], long cos_len, const long br_ptr [], OscType osc_list [])
+{
+	// Penultimate and last pass at once
+	const long		qlen = len >> 2;
+
+	long				coef_index = 0;
+	do
+	{
+		const long		ri_0 = br_ptr [coef_index >> 2];
+
+		const DataType	b_0 = src_ptr [coef_index    ] + src_ptr [coef_index + 2];
+		const DataType	b_2 = src_ptr [coef_index    ] - src_ptr [coef_index + 2];
+		const DataType	b_1 = src_ptr [coef_index + 1] * 2;
+		const DataType	b_3 = src_ptr [coef_index + 3] * 2;
+
+		dest_ptr [ri_0           ] = b_0 + b_1;
+		dest_ptr [ri_0 + 2 * qlen] = b_0 - b_1;
+		dest_ptr [ri_0 + 1 * qlen] = b_2 + b_3;
+		dest_ptr [ri_0 + 3 * qlen] = b_2 - b_3;
+
+		coef_index += 4;
+	}
+	while (coef_index < len);
+}
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+#endif	// FFTRealPassInverse_CODEHEADER_INCLUDED
+
+#undef FFTRealPassInverse_CURRENT_CODEHEADER
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/FFTRealSelect.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,77 @@
+/*****************************************************************************
+
+        FFTRealSelect.h
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if ! defined (FFTRealSelect_HEADER_INCLUDED)
+#define	FFTRealSelect_HEADER_INCLUDED
+
+#if defined (_MSC_VER)
+	#pragma once
+#endif
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+#include	"def.h"
+
+
+
+template <int P>
+class FFTRealSelect
+{
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+public:
+
+	FORCEINLINE static float *
+						sel_bin (float *e_ptr, float *o_ptr);
+
+
+
+/*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+						FFTRealSelect ();
+						~FFTRealSelect ();
+						FFTRealSelect (const FFTRealSelect &other);
+	FFTRealSelect&	operator = (const FFTRealSelect &other);
+	bool				operator == (const FFTRealSelect &other);
+	bool				operator != (const FFTRealSelect &other);
+
+};	// class FFTRealSelect
+
+
+
+#include	"FFTRealSelect.hpp"
+
+
+
+#endif	// FFTRealSelect_HEADER_INCLUDED
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/FFTRealSelect.hpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,62 @@
+/*****************************************************************************
+
+        FFTRealSelect.hpp
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if defined (FFTRealSelect_CURRENT_CODEHEADER)
+	#error Recursive inclusion of FFTRealSelect code header.
+#endif
+#define	FFTRealSelect_CURRENT_CODEHEADER
+
+#if ! defined (FFTRealSelect_CODEHEADER_INCLUDED)
+#define	FFTRealSelect_CODEHEADER_INCLUDED
+
+
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+template <int P>
+float *	FFTRealSelect <P>::sel_bin (float *e_ptr, float *o_ptr)
+{
+	return (o_ptr);
+}
+
+
+
+template <>
+float *	FFTRealSelect <0>::sel_bin (float *e_ptr, float *o_ptr)
+{
+	return (e_ptr);
+}
+
+
+
+#endif	// FFTRealSelect_CODEHEADER_INCLUDED
+
+#undef FFTRealSelect_CURRENT_CODEHEADER
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/FFTRealUseTrigo.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,101 @@
+/*****************************************************************************
+
+        FFTRealUseTrigo.h
+        Copyright (c) 2005 Laurent de Soras
+
+Template parameters:
+	- ALGO: algorithm choice. 0 = table, other = oscillator
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if ! defined (FFTRealUseTrigo_HEADER_INCLUDED)
+#define	FFTRealUseTrigo_HEADER_INCLUDED
+
+#if defined (_MSC_VER)
+	#pragma once
+	#pragma warning (4 : 4250) // "Inherits via dominance."
+#endif
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+#include	"def.h"
+#include	"FFTRealFixLenParam.h"
+#include	"OscSinCos.h"
+
+
+
+template <int ALGO>
+class FFTRealUseTrigo
+{
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+public:
+
+   typedef	FFTRealFixLenParam::DataType	DataType;
+	typedef	OscSinCos <DataType>	OscType;
+
+	FORCEINLINE static void
+						prepare (OscType &osc);
+	FORCEINLINE	static void
+						iterate (OscType &osc, DataType &c, DataType &s, const DataType cos_ptr [], long index_c, long index_s);
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+protected:
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+
+
+/*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+						FFTRealUseTrigo ();
+						~FFTRealUseTrigo ();
+						FFTRealUseTrigo (const FFTRealUseTrigo &other);
+	FFTRealUseTrigo &
+						operator = (const FFTRealUseTrigo &other);
+	bool				operator == (const FFTRealUseTrigo &other);
+	bool				operator != (const FFTRealUseTrigo &other);
+
+};	// class FFTRealUseTrigo
+
+
+
+#include	"FFTRealUseTrigo.hpp"
+
+
+
+#endif	// FFTRealUseTrigo_HEADER_INCLUDED
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/FFTRealUseTrigo.hpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,91 @@
+/*****************************************************************************
+
+        FFTRealUseTrigo.hpp
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if defined (FFTRealUseTrigo_CURRENT_CODEHEADER)
+	#error Recursive inclusion of FFTRealUseTrigo code header.
+#endif
+#define	FFTRealUseTrigo_CURRENT_CODEHEADER
+
+#if ! defined (FFTRealUseTrigo_CODEHEADER_INCLUDED)
+#define	FFTRealUseTrigo_CODEHEADER_INCLUDED
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+#include	"OscSinCos.h"
+
+
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+template <int ALGO>
+void	FFTRealUseTrigo <ALGO>::prepare (OscType &osc)
+{
+	osc.clear_buffers ();
+}
+
+template <>
+void	FFTRealUseTrigo <0>::prepare (OscType &osc)
+{
+	// Nothing
+}
+
+
+
+template <int ALGO>
+void	FFTRealUseTrigo <ALGO>::iterate (OscType &osc, DataType &c, DataType &s, const DataType cos_ptr [], long index_c, long index_s)
+{
+	osc.step ();
+	c = osc.get_cos ();
+	s = osc.get_sin ();
+}
+
+template <>
+void	FFTRealUseTrigo <0>::iterate (OscType &osc, DataType &c, DataType &s, const DataType cos_ptr [], long index_c, long index_s)
+{
+	c = cos_ptr [index_c];
+	s = cos_ptr [index_s];
+}
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+#endif	// FFTRealUseTrigo_CODEHEADER_INCLUDED
+
+#undef FFTRealUseTrigo_CURRENT_CODEHEADER
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/OscSinCos.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,106 @@
+/*****************************************************************************
+
+        OscSinCos.h
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if ! defined (OscSinCos_HEADER_INCLUDED)
+#define	OscSinCos_HEADER_INCLUDED
+
+#if defined (_MSC_VER)
+	#pragma once
+	#pragma warning (4 : 4250) // "Inherits via dominance."
+#endif
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+#include	"def.h"
+
+
+
+template <class T>
+class OscSinCos
+{
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+public:
+
+	typedef	T	DataType;
+
+						OscSinCos ();
+
+	FORCEINLINE void
+						set_step (double angle_rad);
+
+	FORCEINLINE DataType
+						get_cos () const;
+	FORCEINLINE DataType
+						get_sin () const;
+	FORCEINLINE void
+						step ();
+	FORCEINLINE void
+						clear_buffers ();
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+protected:
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+	DataType			_pos_cos;		// Current phase expressed with sin and cos. [-1 ; 1]
+	DataType			_pos_sin;		// -
+	DataType			_step_cos;		// Phase increment per step, [-1 ; 1]
+	DataType			_step_sin;		// -
+
+
+
+/*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+						OscSinCos (const OscSinCos &other);
+	OscSinCos &		operator = (const OscSinCos &other);
+	bool				operator == (const OscSinCos &other);
+	bool				operator != (const OscSinCos &other);
+
+};	// class OscSinCos
+
+
+
+#include	"OscSinCos.hpp"
+
+
+
+#endif	// OscSinCos_HEADER_INCLUDED
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/OscSinCos.hpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,122 @@
+/*****************************************************************************
+
+        OscSinCos.hpp
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if defined (OscSinCos_CURRENT_CODEHEADER)
+	#error Recursive inclusion of OscSinCos code header.
+#endif
+#define	OscSinCos_CURRENT_CODEHEADER
+
+#if ! defined (OscSinCos_CODEHEADER_INCLUDED)
+#define	OscSinCos_CODEHEADER_INCLUDED
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+#include	<cmath>
+
+namespace std { }
+
+
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+template <class T>
+OscSinCos <T>::OscSinCos ()
+:	_pos_cos (1)
+,	_pos_sin (0)
+,	_step_cos (1)
+,	_step_sin (0)
+{
+	// Nothing
+}
+
+
+
+template <class T>
+void	OscSinCos <T>::set_step (double angle_rad)
+{
+	using namespace std;
+
+	_step_cos = static_cast <DataType> (cos (angle_rad));
+	_step_sin = static_cast <DataType> (sin (angle_rad));
+}
+
+
+
+template <class T>
+typename OscSinCos <T>::DataType	OscSinCos <T>::get_cos () const
+{
+	return (_pos_cos);
+}
+
+
+
+template <class T>
+typename OscSinCos <T>::DataType	OscSinCos <T>::get_sin () const
+{
+	return (_pos_sin);
+}
+
+
+
+template <class T>
+void	OscSinCos <T>::step ()
+{
+	const DataType	old_cos = _pos_cos;
+	const DataType	old_sin = _pos_sin;
+
+	_pos_cos = old_cos * _step_cos - old_sin * _step_sin;
+	_pos_sin = old_cos * _step_sin + old_sin * _step_cos;
+}
+
+
+
+template <class T>
+void	OscSinCos <T>::clear_buffers ()
+{
+	_pos_cos = static_cast <DataType> (1);
+	_pos_sin = static_cast <DataType> (0);
+}
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+#endif	// OscSinCos_CODEHEADER_INCLUDED
+
+#undef OscSinCos_CURRENT_CODEHEADER
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/TestAccuracy.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,105 @@
+/*****************************************************************************
+
+        TestAccuracy.h
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if ! defined (TestAccuracy_HEADER_INCLUDED)
+#define	TestAccuracy_HEADER_INCLUDED
+
+#if defined (_MSC_VER)
+	#pragma once
+	#pragma warning (4 : 4250) // "Inherits via dominance."
+#endif
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+template <class FO>
+class TestAccuracy
+{
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+public:
+
+	typedef	typename FO::DataType	DataType;
+	typedef	long double	BigFloat;	// To get maximum accuracy during intermediate calculations
+
+   static int		perform_test_single_object (FO &fft);
+   static int		perform_test_d (FO &fft, const char *class_name_0);
+   static int		perform_test_i (FO &fft, const char *class_name_0);
+   static int		perform_test_di (FO &fft, const char *class_name_0);
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+protected:
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+	enum {			NBR_ACC_TESTS	= 10 * 1000 * 1000	};
+   enum {         MAX_NBR_TESTS  = 10000  };
+
+   static void		compute_tf (DataType s [], const DataType x [], long length);
+	static void		compute_itf (DataType x [], const DataType s [], long length);
+	static int		compare_vect_display (const DataType x_ptr [], const DataType y_ptr [], long len, BigFloat &max_err_rel);
+	static BigFloat
+						compute_power (const DataType x_ptr [], long len);
+	static BigFloat
+						compute_power (const DataType x_ptr [], const DataType y_ptr [], long len);
+	static void		compare_vect (const DataType x_ptr [], const DataType y_ptr [], BigFloat &power, long &max_err_pos, long len);
+
+
+
+/*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+						TestAccuracy ();
+						~TestAccuracy ();
+						TestAccuracy (const TestAccuracy &other);
+	TestAccuracy &	operator = (const TestAccuracy &other);
+	bool				operator == (const TestAccuracy &other);
+	bool				operator != (const TestAccuracy &other);
+
+};	// class TestAccuracy
+
+
+
+#include	"TestAccuracy.hpp"
+
+
+
+#endif	// TestAccuracy_HEADER_INCLUDED
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/TestAccuracy.hpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,472 @@
+/*****************************************************************************
+
+        TestAccuracy.hpp
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if defined (TestAccuracy_CURRENT_CODEHEADER)
+	#error Recursive inclusion of TestAccuracy code header.
+#endif
+#define	TestAccuracy_CURRENT_CODEHEADER
+
+#if ! defined (TestAccuracy_CODEHEADER_INCLUDED)
+#define	TestAccuracy_CODEHEADER_INCLUDED
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+#include	"def.h"
+#include	"test_fnc.h"
+#include	"TestWhiteNoiseGen.h"
+
+#include	<typeinfo>
+#include	<vector>
+
+#include	<cmath>
+#include	<cstdio>
+
+
+
+static const double	TestAccuracy_LN10	= 2.3025850929940456840179914546844;
+
+
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+template <class FO>
+int	TestAccuracy <FO>::perform_test_single_object (FO &fft)
+{
+	assert (&fft != 0);
+
+	using namespace std;
+
+	int				ret_val = 0;
+
+	const std::type_info &	ti = typeid (fft);
+	const char *	class_name_0 = ti.name ();
+
+	if (ret_val == 0)
+	{
+		ret_val = perform_test_d (fft, class_name_0);
+	}
+	if (ret_val == 0)
+	{
+		ret_val = perform_test_i (fft, class_name_0);
+	}
+	if (ret_val == 0)
+	{
+		ret_val = perform_test_di (fft, class_name_0);
+	}
+
+	if (ret_val == 0)
+	{
+		printf ("\n");
+	}
+
+	return (ret_val);
+}
+
+
+
+template <class FO>
+int	TestAccuracy <FO>::perform_test_d (FO &fft, const char *class_name_0)
+{
+	assert (&fft != 0);
+   assert (class_name_0 != 0);
+
+	using namespace std;
+
+	int				ret_val = 0;
+	const long		len = fft.get_length ();
+   const long     nbr_tests = limit (
+      NBR_ACC_TESTS / len / len,
+      1L,
+      static_cast <long> (MAX_NBR_TESTS)
+   );
+
+	printf ("Testing %s::do_fft () [%ld samples]... ", class_name_0, len);
+	fflush (stdout);
+	TestWhiteNoiseGen <DataType>	noise;
+	std::vector <DataType>	x (len);
+	std::vector <DataType>	s1 (len);
+	std::vector <DataType>	s2 (len);
+	BigFloat			err_avg = 0;
+
+	for (long test = 0; test < nbr_tests && ret_val == 0; ++ test)
+	{
+		noise.generate (&x [0], len);
+		fft.do_fft (&s1 [0], &x [0]);
+		compute_tf (&s2 [0], &x [0], len);
+
+		BigFloat			max_err;
+		compare_vect_display (&s1 [0], &s2 [0], len, max_err);
+		err_avg += max_err;
+	}
+	err_avg /= NBR_ACC_TESTS;
+
+	printf ("done.\n");
+	printf (
+		"Average maximum error: %.6f %% (%f dB)\n",
+		static_cast <double> (err_avg * 100),
+		static_cast <double> ((20 / TestAccuracy_LN10) * log (err_avg))
+	);
+
+	return (ret_val);
+}
+
+
+
+template <class FO>
+int	TestAccuracy <FO>::perform_test_i (FO &fft, const char *class_name_0)
+{
+	assert (&fft != 0);
+   assert (class_name_0 != 0);
+
+	using namespace std;
+
+	int				ret_val = 0;
+	const long		len = fft.get_length ();
+   const long     nbr_tests = limit (
+      NBR_ACC_TESTS / len / len,
+      10L,
+      static_cast <long> (MAX_NBR_TESTS)
+   );
+
+	printf ("Testing %s::do_ifft () [%ld samples]... ", class_name_0, len);
+	fflush (stdout);
+	TestWhiteNoiseGen <DataType>	noise;
+	std::vector <DataType>	s (len);
+	std::vector <DataType>	x1 (len);
+	std::vector <DataType>	x2 (len);
+	BigFloat			err_avg = 0;
+
+	for (long test = 0; test < nbr_tests && ret_val == 0; ++ test)
+	{
+		noise.generate (&s [0], len);
+		fft.do_ifft (&s [0], &x1 [0]);
+		compute_itf (&x2 [0], &s [0], len);
+
+		BigFloat			max_err;
+		compare_vect_display (&x1 [0], &x2 [0], len, max_err);
+		err_avg += max_err;
+	}
+	err_avg /= NBR_ACC_TESTS;
+
+	printf ("done.\n");
+	printf (
+		"Average maximum error: %.6f %% (%f dB)\n",
+		static_cast <double> (err_avg * 100),
+		static_cast <double> ((20 / TestAccuracy_LN10) * log (err_avg))
+	);
+
+	return (ret_val);
+}
+
+
+
+template <class FO>
+int	TestAccuracy <FO>::perform_test_di (FO &fft, const char *class_name_0)
+{
+	assert (&fft != 0);
+   assert (class_name_0 != 0);
+
+	using namespace std;
+
+	int				ret_val = 0;
+	const long		len = fft.get_length ();
+   const long     nbr_tests = limit (
+      NBR_ACC_TESTS / len / len,
+      1L,
+      static_cast <long> (MAX_NBR_TESTS)
+   );
+
+	printf (
+		"Testing %s::do_fft () / do_ifft () / rescale () [%ld samples]... ",
+		class_name_0,
+		len
+	);
+	fflush (stdout);
+	TestWhiteNoiseGen <DataType>	noise;
+	std::vector <DataType>	x (len);
+	std::vector <DataType>	s (len);
+	std::vector <DataType>	y (len);
+	BigFloat			err_avg = 0;
+
+	for (long test = 0; test < nbr_tests && ret_val == 0; ++ test)
+	{
+		noise.generate (&x [0], len);
+		fft.do_fft (&s [0], &x [0]);
+		fft.do_ifft (&s [0], &y [0]);
+		fft.rescale (&y [0]);
+
+		BigFloat			max_err;
+		compare_vect_display (&x [0], &y [0], len, max_err);
+		err_avg += max_err;
+	}
+	err_avg /= NBR_ACC_TESTS;
+
+	printf ("done.\n");
+	printf (
+		"Average maximum error: %.6f %% (%f dB)\n",
+		static_cast <double> (err_avg * 100),
+		static_cast <double> ((20 / TestAccuracy_LN10) * log (err_avg))
+	);
+
+	return (ret_val);
+}
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+// Positive transform
+template <class FO>
+void	TestAccuracy <FO>::compute_tf (DataType s [], const DataType x [], long length)
+{
+	assert (s != 0);
+	assert (x != 0);
+	assert (length >= 2);
+	assert ((length & 1) == 0);
+
+	const long		nbr_bins = length >> 1;
+
+	// DC and Nyquist
+	BigFloat			dc = 0;
+	BigFloat			ny = 0;
+	for (long pos = 0; pos < length; pos += 2)
+	{
+		const BigFloat	even = x [pos    ];
+		const BigFloat	odd  = x [pos + 1];
+		dc += even + odd;
+		ny += even - odd;
+	}
+	s [0       ] = static_cast <DataType> (dc);
+	s [nbr_bins] = static_cast <DataType> (ny);
+
+	// Regular bins
+	for (long bin = 1; bin < nbr_bins; ++ bin)
+	{
+		BigFloat			sum_r = 0;
+		BigFloat			sum_i = 0;
+
+		const BigFloat	m = bin * static_cast <BigFloat> (2 * PI) / length;
+
+		for (long pos = 0; pos < length; ++pos)
+		{
+			using namespace std;
+
+			const BigFloat	phase = pos * m;
+			const BigFloat	e_r = cos (phase);
+			const BigFloat	e_i = sin (phase);
+
+			sum_r += x [pos] * e_r;
+			sum_i += x [pos] * e_i;
+		}
+
+		s [           bin] = static_cast <DataType> (sum_r);
+		s [nbr_bins + bin] = static_cast <DataType> (sum_i);
+	}
+}
+
+
+
+// Negative transform
+template <class FO>
+void	TestAccuracy <FO>::compute_itf (DataType x [], const DataType s [], long length)
+{
+	assert (s != 0);
+	assert (x != 0);
+	assert (length >= 2);
+	assert ((length & 1) == 0);
+
+	const long		nbr_bins = length >> 1;
+
+	// DC and Nyquist
+	BigFloat			dc = s [0       ];
+	BigFloat			ny = s [nbr_bins];
+
+	// Regular bins
+	for (long pos = 0; pos < length; ++pos)
+	{
+		BigFloat				sum = dc + ny * (1 - 2 * (pos & 1));
+
+		const BigFloat		m = pos * static_cast <BigFloat> (-2 * PI) / length;
+
+		for (long bin = 1; bin < nbr_bins; ++ bin)
+		{
+			using namespace std;
+
+			const BigFloat	phase = bin * m;
+			const BigFloat	e_r = cos (phase);
+			const BigFloat	e_i = sin (phase);
+
+			sum += 2 * (  e_r * s [bin           ]
+			            - e_i * s [bin + nbr_bins]);
+		}
+
+		x [pos] = static_cast <DataType> (sum);
+	}
+}
+
+
+
+template <class FO>
+int	TestAccuracy <FO>::compare_vect_display (const DataType x_ptr [], const DataType y_ptr [], long len, BigFloat &max_err_rel)
+{
+	assert (x_ptr != 0);
+	assert (y_ptr != 0);
+	assert (len > 0);
+	assert (&max_err_rel != 0);
+
+	using namespace std;
+
+	int				ret_val = 0;
+
+	BigFloat			power = compute_power (&x_ptr [0], &y_ptr [0], len);
+	BigFloat			power_dif;
+	long				max_err_pos;
+	compare_vect (&x_ptr [0], &y_ptr [0], power_dif, max_err_pos, len);
+
+	if (power == 0)
+	{
+		power = power_dif;
+	}
+	const BigFloat	power_err_rel = power_dif / power;
+
+	BigFloat	      max_err = 0;
+	max_err_rel = 0;
+	if (max_err_pos >= 0)
+	{
+      max_err = y_ptr [max_err_pos] - x_ptr [max_err_pos];
+		max_err_rel = 2 * fabs (max_err) / (  fabs (y_ptr [max_err_pos])
+		                                    + fabs (x_ptr [max_err_pos]));
+	}
+
+	if (power_err_rel > 0.001)
+	{
+		printf ("Power error  : %f (%.6f %%)\n",
+			static_cast <double> (power_err_rel),
+			static_cast <double> (power_err_rel * 100)
+		);
+		if (max_err_pos >= 0)
+		{
+			printf (
+				"Maximum error: %f - %f = %f (%f)\n",
+				static_cast <double> (y_ptr [max_err_pos]),
+				static_cast <double> (x_ptr [max_err_pos]),
+				static_cast <double> (max_err),
+				static_cast <double> (max_err_pos)
+			);
+		}
+	}
+
+	return (ret_val);
+}
+
+
+
+template <class FO>
+typename TestAccuracy <FO>::BigFloat	TestAccuracy <FO>::compute_power (const DataType x_ptr [], long len)
+{
+	assert (x_ptr != 0);
+	assert (len > 0);
+
+	BigFloat		power = 0;
+	for (long pos = 0; pos < len; ++pos)
+	{
+		const BigFloat	val = x_ptr [pos];
+
+		power += val * val;
+	}
+
+	using namespace std;
+
+	power = sqrt (power) / len;
+
+	return (power);
+}
+
+
+
+template <class FO>
+typename TestAccuracy <FO>::BigFloat	TestAccuracy <FO>::compute_power (const DataType x_ptr [], const DataType y_ptr [], long len)
+{
+	assert (x_ptr != 0);
+	assert (y_ptr != 0);
+	assert (len > 0);
+
+	return ((compute_power (x_ptr, len) + compute_power (y_ptr, len)) * 0.5);
+}
+
+
+
+template <class FO>
+void	TestAccuracy <FO>::compare_vect (const DataType x_ptr [], const DataType y_ptr [], BigFloat &power, long &max_err_pos, long len)
+{
+	assert (x_ptr != 0);
+	assert (y_ptr != 0);
+	assert (len > 0);
+	assert (&power != 0);
+	assert (&max_err_pos != 0);
+
+	power = 0;
+	BigFloat			max_dif2 = 0;
+	max_err_pos = -1;
+
+	for (long pos = 0; pos < len; ++pos)
+	{
+		const BigFloat	x = x_ptr [pos];
+		const BigFloat	y = y_ptr [pos];
+		const BigFloat	dif = y - x;
+		const BigFloat	dif2 = dif * dif;
+
+		power += dif2;
+		if (dif2 > max_dif2)
+		{
+			max_err_pos = pos;
+			max_dif2 = dif2;
+		}
+	}
+
+	using namespace std;
+
+	power = sqrt (power) / len;
+}
+
+
+
+#endif	// TestAccuracy_CODEHEADER_INCLUDED
+
+#undef TestAccuracy_CURRENT_CODEHEADER
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/TestHelperFixLen.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,93 @@
+/*****************************************************************************
+
+        TestHelperFixLen.h
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if ! defined (TestHelperFixLen_HEADER_INCLUDED)
+#define	TestHelperFixLen_HEADER_INCLUDED
+
+#if defined (_MSC_VER)
+	#pragma once
+	#pragma warning (4 : 4250) // "Inherits via dominance."
+#endif
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+#include	"FFTRealFixLen.h"
+
+
+
+template <int L>
+class TestHelperFixLen
+{
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+public:
+
+	typedef  FFTRealFixLen <L> FftType;
+
+   static void    perform_test_accuracy (int &ret_val);
+   static void    perform_test_speed (int &ret_val);
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+protected:
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+
+
+/*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+						TestHelperFixLen ();
+						~TestHelperFixLen ();
+						TestHelperFixLen (const TestHelperFixLen &other);
+	TestHelperFixLen &
+						operator = (const TestHelperFixLen &other);
+	bool				operator == (const TestHelperFixLen &other);
+	bool				operator != (const TestHelperFixLen &other);
+
+};	// class TestHelperFixLen
+
+
+
+#include	"TestHelperFixLen.hpp"
+
+
+
+#endif	// TestHelperFixLen_HEADER_INCLUDED
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/TestHelperFixLen.hpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,93 @@
+/*****************************************************************************
+
+        TestHelperFixLen.hpp
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if defined (TestHelperFixLen_CURRENT_CODEHEADER)
+	#error Recursive inclusion of TestHelperFixLen code header.
+#endif
+#define	TestHelperFixLen_CURRENT_CODEHEADER
+
+#if ! defined (TestHelperFixLen_CODEHEADER_INCLUDED)
+#define	TestHelperFixLen_CODEHEADER_INCLUDED
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+#include	"test_settings.h"
+
+#include	"TestAccuracy.h"
+#if defined (test_settings_SPEED_TEST_ENABLED)
+	#include	"TestSpeed.h"
+#endif
+
+
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+template <int L>
+void	TestHelperFixLen <L>::perform_test_accuracy (int &ret_val)
+{
+   if (ret_val == 0)
+   {
+		FftType			fft;
+      ret_val = TestAccuracy <FftType>::perform_test_single_object (fft);
+   }
+}
+
+
+
+template <int L>
+void	TestHelperFixLen <L>::perform_test_speed (int &ret_val)
+{
+#if defined (test_settings_SPEED_TEST_ENABLED)
+
+   if (ret_val == 0)
+   {
+		FftType			fft;
+      ret_val = TestSpeed <FftType>::perform_test_single_object (fft);
+   }
+
+#endif
+}
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+#endif	// TestHelperFixLen_CODEHEADER_INCLUDED
+
+#undef TestHelperFixLen_CURRENT_CODEHEADER
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/TestHelperNormal.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,94 @@
+/*****************************************************************************
+
+        TestHelperNormal.h
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if ! defined (TestHelperNormal_HEADER_INCLUDED)
+#define	TestHelperNormal_HEADER_INCLUDED
+
+#if defined (_MSC_VER)
+	#pragma once
+	#pragma warning (4 : 4250) // "Inherits via dominance."
+#endif
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+#include	"FFTReal.h"
+
+
+
+template <class DT>
+class TestHelperNormal
+{
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+public:
+
+	typedef	DT	DataType;
+	typedef	FFTReal <DataType>	FftType;
+
+   static void    perform_test_accuracy (int &ret_val);
+   static void    perform_test_speed (int &ret_val);
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+protected:
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+
+
+/*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+						TestHelperNormal ();
+						~TestHelperNormal ();
+						TestHelperNormal (const TestHelperNormal &other);
+	TestHelperNormal &
+						operator = (const TestHelperNormal &other);
+	bool				operator == (const TestHelperNormal &other);
+	bool				operator != (const TestHelperNormal &other);
+
+};	// class TestHelperNormal
+
+
+
+#include	"TestHelperNormal.hpp"
+
+
+
+#endif	// TestHelperNormal_HEADER_INCLUDED
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/TestHelperNormal.hpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,99 @@
+/*****************************************************************************
+
+        TestHelperNormal.hpp
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if defined (TestHelperNormal_CURRENT_CODEHEADER)
+	#error Recursive inclusion of TestHelperNormal code header.
+#endif
+#define	TestHelperNormal_CURRENT_CODEHEADER
+
+#if ! defined (TestHelperNormal_CODEHEADER_INCLUDED)
+#define	TestHelperNormal_CODEHEADER_INCLUDED
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+#include	"test_settings.h"
+
+#include	"TestAccuracy.h"
+#if defined (test_settings_SPEED_TEST_ENABLED)
+	#include	"TestSpeed.h"
+#endif
+
+
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+template <class DT>
+void	TestHelperNormal <DT>::perform_test_accuracy (int &ret_val)
+{
+	const int		len_arr [] = { 1, 2, 3, 4, 7, 8, 10, 12 };
+	const int		nbr_len = sizeof (len_arr) / sizeof (len_arr [0]);
+	for (int k = 0; k < nbr_len && ret_val == 0; ++k)
+	{
+		const long		len = 1L << (len_arr [k]);
+		FftType			fft (len);
+		ret_val = TestAccuracy <FftType>::perform_test_single_object (fft);
+	}
+}
+
+
+
+template <class DT>
+void	TestHelperNormal <DT>::perform_test_speed (int &ret_val)
+{
+#if defined (test_settings_SPEED_TEST_ENABLED)
+
+	const int		len_arr [] = { 1, 2, 3, 4, 7, 8, 10, 12, 14, 16, 18, 20, 22 };
+	const int		nbr_len = sizeof (len_arr) / sizeof (len_arr [0]);
+	for (int k = 0; k < nbr_len && ret_val == 0; ++k)
+	{
+		const long		len = 1L << (len_arr [k]);
+		FftType			fft (len);
+		ret_val = TestSpeed <FftType>::perform_test_single_object (fft);
+	}
+
+#endif
+}
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+#endif	// TestHelperNormal_CODEHEADER_INCLUDED
+
+#undef TestHelperNormal_CURRENT_CODEHEADER
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/TestSpeed.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,95 @@
+/*****************************************************************************
+
+        TestSpeed.h
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if ! defined (TestSpeed_HEADER_INCLUDED)
+#define	TestSpeed_HEADER_INCLUDED
+
+#if defined (_MSC_VER)
+	#pragma once
+	#pragma warning (4 : 4250) // "Inherits via dominance."
+#endif
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+template <class FO>
+class TestSpeed
+{
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+public:
+
+	typedef	typename FO::DataType	DataType;
+
+   static int		perform_test_single_object (FO &fft);
+   static int		perform_test_d (FO &fft, const char *class_name_0);
+   static int		perform_test_i (FO &fft, const char *class_name_0);
+   static int		perform_test_di (FO &fft, const char *class_name_0);
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+protected:
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+	enum {			NBR_SPD_TESTS	= 10 * 1000 * 1000	};
+   enum {         MAX_NBR_TESTS  = 10000  };
+
+
+
+/*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+						TestSpeed ();
+						~TestSpeed ();
+						TestSpeed (const TestSpeed &other);
+	TestSpeed &		operator = (const TestSpeed &other);
+	bool				operator == (const TestSpeed &other);
+	bool				operator != (const TestSpeed &other);
+
+};	// class TestSpeed
+
+
+
+#include	"TestSpeed.hpp"
+
+
+
+#endif	// TestSpeed_HEADER_INCLUDED
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/TestSpeed.hpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,223 @@
+/*****************************************************************************
+
+        TestSpeed.hpp
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if defined (TestSpeed_CURRENT_CODEHEADER)
+	#error Recursive inclusion of TestSpeed code header.
+#endif
+#define	TestSpeed_CURRENT_CODEHEADER
+
+#if ! defined (TestSpeed_CODEHEADER_INCLUDED)
+#define	TestSpeed_CODEHEADER_INCLUDED
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+#include	"test_fnc.h"
+#include	"stopwatch/StopWatch.h"
+#include	"TestWhiteNoiseGen.h"
+
+#include	<typeinfo>
+
+#include	<cstdio>
+
+
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+template <class FO>
+int	TestSpeed <FO>::perform_test_single_object (FO &fft)
+{
+	assert (&fft != 0);
+
+   int            ret_val = 0;
+
+	const std::type_info &	ti = typeid (fft);
+	const char *	class_name_0 = ti.name ();
+
+   if (ret_val == 0)
+   {
+	   perform_test_d (fft, class_name_0);
+   }
+   if (ret_val == 0)
+   {
+	   perform_test_i (fft, class_name_0);
+   }
+	if (ret_val == 0)
+   {
+      perform_test_di (fft, class_name_0);
+   }
+
+   if (ret_val == 0)
+   {
+      printf ("\n");
+   }
+
+   return (ret_val);
+}
+
+
+
+template <class FO>
+int	TestSpeed <FO>::perform_test_d (FO &fft, const char *class_name_0)
+{
+	assert (&fft != 0);
+   assert (class_name_0 != 0);
+
+	const long		len = fft.get_length ();
+   const long     nbr_tests = limit (
+      static_cast <long> (NBR_SPD_TESTS / len / len),
+      1L,
+      static_cast <long> (MAX_NBR_TESTS)
+   );
+
+	TestWhiteNoiseGen <DataType>	noise;
+	std::vector <DataType>	x (len, 0);
+	std::vector <DataType>	s (len);
+	noise.generate (&x [0], len);
+
+   printf (
+		"%s::do_fft () speed test [%ld samples]... ",
+		class_name_0,
+		len
+	);
+	fflush (stdout);
+
+	stopwatch::StopWatch	chrono;
+	chrono.start ();
+	for (long test = 0; test < nbr_tests; ++ test)
+	{
+		fft.do_fft (&s [0], &x [0]);
+		chrono.stop_lap ();
+	}
+
+	printf ("%.1f clocks/sample\n", chrono.get_time_best_lap (len));
+
+	return (0);
+}
+
+
+
+template <class FO>
+int	TestSpeed <FO>::perform_test_i (FO &fft, const char *class_name_0)
+{
+	assert (&fft != 0);
+   assert (class_name_0 != 0);
+
+	const long		len = fft.get_length ();
+   const long     nbr_tests = limit (
+      static_cast <long> (NBR_SPD_TESTS / len / len),
+      1L,
+      static_cast <long> (MAX_NBR_TESTS)
+   );
+
+	TestWhiteNoiseGen <DataType>	noise;
+	std::vector <DataType>	x (len);
+	std::vector <DataType>	s (len, 0);
+	noise.generate (&s [0], len);
+
+   printf (
+		"%s::do_ifft () speed test [%ld samples]... ",
+		class_name_0,
+		len
+	);
+	fflush (stdout);
+
+	stopwatch::StopWatch	chrono;
+	chrono.start ();
+	for (long test = 0; test < nbr_tests; ++ test)
+	{
+		fft.do_ifft (&s [0], &x [0]);
+		chrono.stop_lap ();
+	}
+
+	printf ("%.1f clocks/sample\n", chrono.get_time_best_lap (len));
+
+	return (0);
+}
+
+
+
+template <class FO>
+int	TestSpeed <FO>::perform_test_di (FO &fft, const char *class_name_0)
+{
+	assert (&fft != 0);
+   assert (class_name_0 != 0);
+
+	const long		len = fft.get_length ();
+   const long     nbr_tests = limit (
+      static_cast <long> (NBR_SPD_TESTS / len / len),
+      1L,
+      static_cast <long> (MAX_NBR_TESTS)
+   );
+
+	TestWhiteNoiseGen <DataType>	noise;
+	std::vector <DataType>	x (len, 0);
+	std::vector <DataType>	s (len);
+	std::vector <DataType>	y (len);
+	noise.generate (&x [0], len);
+
+   printf (
+		"%s::do_fft () / do_ifft () / rescale () speed test [%ld samples]... ",
+		class_name_0,
+		len
+	);
+	fflush (stdout);
+
+	stopwatch::StopWatch	chrono;
+
+	chrono.start ();
+	for (long test = 0; test < nbr_tests; ++ test)
+	{
+		fft.do_fft (&s [0], &x [0]);
+		fft.do_ifft (&s [0], &y [0]);
+		fft.rescale (&y [0]);
+		chrono.stop_lap ();
+	}
+
+	printf ("%.1f clocks/sample\n", chrono.get_time_best_lap (len));
+
+	return (0);
+}
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+#endif	// TestSpeed_CODEHEADER_INCLUDED
+
+#undef TestSpeed_CURRENT_CODEHEADER
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/TestWhiteNoiseGen.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,95 @@
+/*****************************************************************************
+
+        TestWhiteNoiseGen.h
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if ! defined (TestWhiteNoiseGen_HEADER_INCLUDED)
+#define	TestWhiteNoiseGen_HEADER_INCLUDED
+
+#if defined (_MSC_VER)
+	#pragma once
+	#pragma warning (4 : 4250) // "Inherits via dominance."
+#endif
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+template <class DT>
+class TestWhiteNoiseGen
+{
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+public:
+
+	typedef	DT	DataType;
+
+						TestWhiteNoiseGen ();
+	virtual			~TestWhiteNoiseGen () {}
+
+	void				generate (DataType data_ptr [], long len);
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+protected:
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+	typedef	unsigned long	StateType;
+
+	StateType		_rand_state;
+
+
+
+/*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+						TestWhiteNoiseGen (const TestWhiteNoiseGen &other);
+	TestWhiteNoiseGen &
+						operator = (const TestWhiteNoiseGen &other);
+	bool				operator == (const TestWhiteNoiseGen &other);
+	bool				operator != (const TestWhiteNoiseGen &other);
+
+};	// class TestWhiteNoiseGen
+
+
+
+#include	"TestWhiteNoiseGen.hpp"
+
+
+
+#endif	// TestWhiteNoiseGen_HEADER_INCLUDED
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/TestWhiteNoiseGen.hpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,91 @@
+/*****************************************************************************
+
+        TestWhiteNoiseGen.hpp
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if defined (TestWhiteNoiseGen_CURRENT_CODEHEADER)
+	#error Recursive inclusion of TestWhiteNoiseGen code header.
+#endif
+#define	TestWhiteNoiseGen_CURRENT_CODEHEADER
+
+#if ! defined (TestWhiteNoiseGen_CODEHEADER_INCLUDED)
+#define	TestWhiteNoiseGen_CODEHEADER_INCLUDED
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+template <class DT>
+TestWhiteNoiseGen <DT>::TestWhiteNoiseGen ()
+:	_rand_state (0)
+{
+	_rand_state = reinterpret_cast <StateType> (this);
+}
+
+
+
+template <class DT>
+void	TestWhiteNoiseGen <DT>::generate (DataType data_ptr [], long len)
+{
+	assert (data_ptr != 0);
+	assert (len > 0);
+
+	const DataType	one = static_cast <DataType> (1);
+	const DataType	mul = one / static_cast <DataType> (0x80000000UL);
+
+	long				pos = 0;
+	do
+	{
+		const DataType	x = static_cast <DataType> (_rand_state & 0xFFFFFFFFUL);
+		data_ptr [pos] = x * mul - one;
+
+		_rand_state = _rand_state * 1234567UL + 890123UL;
+
+		++ pos;
+	}
+	while (pos < len);
+}
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+#endif	// TestWhiteNoiseGen_CODEHEADER_INCLUDED
+
+#undef TestWhiteNoiseGen_CURRENT_CODEHEADER
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/bwins/fftrealu.def	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,5 @@
+EXPORTS
+	??0FFTRealWrapper@@QAE@XZ @ 1 NONAME ; FFTRealWrapper::FFTRealWrapper(void)
+	??1FFTRealWrapper@@QAE@XZ @ 2 NONAME ; FFTRealWrapper::~FFTRealWrapper(void)
+	?calculateFFT@FFTRealWrapper@@QAEXQAMQBM@Z @ 3 NONAME ; void FFTRealWrapper::calculateFFT(float * const, float const * const)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/def.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,60 @@
+/*****************************************************************************
+
+        def.h
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if ! defined (def_HEADER_INCLUDED)
+#define	def_HEADER_INCLUDED
+
+#if defined (_MSC_VER)
+	#pragma once
+	#pragma warning (4 : 4250) // "Inherits via dominance."
+#endif
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+
+const double	PI		= 3.1415926535897932384626433832795;
+const double	SQRT2	= 1.41421356237309514547462185873883;
+
+#if defined (_MSC_VER)
+
+	#define	FORCEINLINE	__forceinline
+
+#else
+
+	#define	FORCEINLINE	inline
+
+#endif
+
+
+
+#endif	// def_HEADER_INCLUDED
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/eabi/fftrealu.def	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,7 @@
+EXPORTS
+	_ZN14FFTRealWrapper12calculateFFTEPfPKf @ 1 NONAME
+	_ZN14FFTRealWrapperC1Ev @ 2 NONAME
+	_ZN14FFTRealWrapperC2Ev @ 3 NONAME
+	_ZN14FFTRealWrapperD1Ev @ 4 NONAME
+	_ZN14FFTRealWrapperD2Ev @ 5 NONAME
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/fftreal.pas	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,661 @@
+(*****************************************************************************
+
+        DIGITAL SIGNAL PROCESSING TOOLS
+        Version 1.03, 2001/06/15
+        (c) 1999 - Laurent de Soras
+
+        FFTReal.h
+        Fourier transformation of real number arrays.
+        Portable ISO C++
+
+------------------------------------------------------------------------------
+
+	LEGAL
+
+	Source code may be freely used for any purpose, including commercial
+	applications. Programs must display in their "About" dialog-box (or
+	documentation) a text telling they use these routines by Laurent de Soras.
+	Modified source code can be distributed, but modifications must be clearly
+	indicated.
+
+	CONTACT
+
+	Laurent de Soras
+	92 avenue Albert 1er
+	92500 Rueil-Malmaison
+	France
+
+	ldesoras@club-internet.fr
+
+------------------------------------------------------------------------------
+
+        Translation to ObjectPascal by :
+          Frederic Vanmol
+          frederic@axiworld.be
+
+*****************************************************************************)
+
+
+unit
+    FFTReal;
+
+interface
+
+uses
+    Windows;
+
+(* Change this typedef to use a different floating point type in your FFTs
+	(i.e. float, double or long double). *)
+type
+    pflt_t = ^flt_t;
+    flt_t = single;
+
+    pflt_array = ^flt_array;
+    flt_array = array[0..0] of flt_t;
+
+    plongarray = ^longarray;
+    longarray = array[0..0] of longint;
+
+const
+     sizeof_flt : longint = SizeOf(flt_t);
+
+
+
+type
+    // Bit reversed look-up table nested class
+    TBitReversedLUT = class
+    private
+      _ptr : plongint;
+    public
+      constructor Create(const nbr_bits: integer);
+      destructor Destroy; override;
+      function get_ptr: plongint;
+    end;
+
+    // Trigonometric look-up table nested class
+    TTrigoLUT = class
+    private
+      _ptr : pflt_t;
+    public
+      constructor Create(const nbr_bits: integer);
+      destructor Destroy; override;
+      function get_ptr(const level: integer): pflt_t;
+    end;
+
+    TFFTReal = class
+    private
+      _bit_rev_lut  : TBitReversedLUT;
+      _trigo_lut    : TTrigoLUT;
+      _sqrt2_2      : flt_t;
+      _length       : longint;
+      _nbr_bits     : integer;
+      _buffer_ptr   : pflt_t;
+    public
+      constructor Create(const length: longint);
+      destructor Destroy; override;
+
+      procedure do_fft(f: pflt_array; const x: pflt_array);
+      procedure do_ifft(const f: pflt_array; x: pflt_array);
+      procedure rescale(x: pflt_array);
+    end;
+
+
+
+
+
+
+
+implementation
+
+uses
+    Math;
+
+{ TBitReversedLUT }
+
+constructor TBitReversedLUT.Create(const nbr_bits: integer);
+var
+   length   : longint;
+   cnt      : longint;
+   br_index : longint;
+   bit      : longint;
+begin
+  inherited Create;
+
+  length := 1 shl nbr_bits;
+  GetMem(_ptr, length*SizeOf(longint));
+
+  br_index := 0;
+  plongarray(_ptr)^[0] := 0;
+  for cnt := 1 to length-1 do
+  begin
+    // ++br_index (bit reversed)
+    bit := length shr 1;
+    br_index := br_index xor bit;
+    while br_index and bit = 0 do
+    begin
+      bit := bit shr 1;
+      br_index := br_index xor bit;
+    end;
+
+    plongarray(_ptr)^[cnt] := br_index;
+  end;
+end;
+
+destructor TBitReversedLUT.Destroy;
+begin
+  FreeMem(_ptr);
+  _ptr := nil;
+  inherited;
+end;
+
+function TBitReversedLUT.get_ptr: plongint;
+begin
+  Result := _ptr;
+end;
+
+{ TTrigLUT }
+
+constructor TTrigoLUT.Create(const nbr_bits: integer);
+var
+   total_len : longint;
+   PI        : double;
+   level     : integer;
+   level_len : longint;
+   level_ptr : pflt_array;
+   mul       : double;
+   i         : longint;
+begin
+  inherited Create;
+
+  _ptr := nil;
+
+  if (nbr_bits > 3) then
+  begin
+    total_len := (1 shl (nbr_bits - 1)) - 4;
+    GetMem(_ptr, total_len * sizeof_flt);
+
+    PI := ArcTan(1) * 4;
+    for level := 3 to nbr_bits-1 do
+    begin
+      level_len := 1 shl (level - 1);
+      level_ptr := pointer(get_ptr(level));
+      mul := PI / (level_len shl 1);
+
+      for i := 0 to level_len-1 do
+        level_ptr^[i] := cos(i * mul);
+    end;
+  end;
+end;
+
+destructor TTrigoLUT.Destroy;
+begin
+  FreeMem(_ptr);
+  _ptr := nil;
+  inherited;
+end;
+
+function TTrigoLUT.get_ptr(const level: integer): pflt_t;
+var
+   tempp : pflt_t;
+begin
+  tempp := _ptr;
+  inc(tempp, (1 shl (level-1)) - 4);
+  Result := tempp;
+end;
+
+{ TFFTReal }
+
+constructor TFFTReal.Create(const length: longint);
+begin
+  inherited Create;
+
+  _length := length;
+  _nbr_bits := Floor(Ln(length) / Ln(2) + 0.5);
+  _bit_rev_lut := TBitReversedLUT.Create(Floor(Ln(length) / Ln(2) + 0.5));
+  _trigo_lut := TTrigoLUT.Create(Floor(Ln(length) / Ln(2) + 0.05));
+  _sqrt2_2 := Sqrt(2) * 0.5;
+
+  _buffer_ptr := nil;
+  if _nbr_bits > 2 then
+    GetMem(_buffer_ptr, _length * sizeof_flt);
+end;
+
+destructor TFFTReal.Destroy;
+begin
+  if _buffer_ptr <> nil then
+  begin
+    FreeMem(_buffer_ptr);
+    _buffer_ptr := nil;
+  end;
+
+  _bit_rev_lut.Free;
+  _bit_rev_lut := nil;
+  _trigo_lut.Free;
+  _trigo_lut := nil;
+
+  inherited;       
+end;
+
+(*==========================================================================*/
+/*      Name: do_fft                                                        */
+/*      Description: Compute the FFT of the array.                          */
+/*      Input parameters:                                                   */
+/*        - x: pointer on the source array (time).                          */
+/*      Output parameters:                                                  */
+/*        - f: pointer on the destination array (frequencies).              */
+/*             f [0...length(x)/2] = real values,                           */
+/*             f [length(x)/2+1...length(x)-1] = imaginary values of        */
+/*               coefficents 1...length(x)/2-1.                             */
+/*==========================================================================*)
+procedure TFFTReal.do_fft(f: pflt_array; const x: pflt_array);
+var
+   sf, df     : pflt_array;
+   pass       : integer;
+   nbr_coef   : longint;
+   h_nbr_coef : longint;
+   d_nbr_coef : longint;
+   coef_index : longint;
+   bit_rev_lut_ptr : plongarray;
+   rev_index_0 : longint;
+   rev_index_1 : longint;
+   rev_index_2 : longint;
+   rev_index_3 : longint;
+   df2         : pflt_array;
+   n1, n2, n3  : integer;
+   sf_0, sf_2  : flt_t;
+   sqrt2_2     : flt_t;
+   v           : flt_t;
+   cos_ptr     : pflt_array;
+   i           : longint;
+   sf1r, sf2r  : pflt_array;
+   dfr, dfi    : pflt_array;
+   sf1i, sf2i  : pflt_array;
+   c, s        : flt_t;
+   temp_ptr    : pflt_array;
+   b_0, b_2    : flt_t;
+begin
+  n1 := 1;
+  n2 := 2;
+  n3 := 3;
+
+  (*______________________________________________
+   *
+   * General case
+   *______________________________________________
+   *)
+
+  if _nbr_bits > 2 then
+  begin
+    if _nbr_bits and 1 <> 0 then
+    begin
+      df := pointer(_buffer_ptr);
+      sf := f;
+    end
+    else
+    begin
+      df := f;
+      sf := pointer(_buffer_ptr);
+    end;
+
+    //
+    // Do the transformation in several passes
+    //
+
+    // First and second pass at once
+    bit_rev_lut_ptr := pointer(_bit_rev_lut.get_ptr);
+    coef_index := 0;
+
+    repeat
+      rev_index_0 := bit_rev_lut_ptr^[coef_index];
+      rev_index_1 := bit_rev_lut_ptr^[coef_index + 1];
+      rev_index_2 := bit_rev_lut_ptr^[coef_index + 2];
+      rev_index_3 := bit_rev_lut_ptr^[coef_index + 3];
+
+      df2 := pointer(longint(df) + (coef_index*sizeof_flt));
+      df2^[n1] := x^[rev_index_0] - x^[rev_index_1];
+      df2^[n3] := x^[rev_index_2] - x^[rev_index_3];
+
+      sf_0 := x^[rev_index_0] + x^[rev_index_1];
+      sf_2 := x^[rev_index_2] + x^[rev_index_3];
+
+      df2^[0] := sf_0 + sf_2;
+      df2^[n2] := sf_0 - sf_2;
+
+      inc(coef_index, 4);
+    until (coef_index >= _length);
+
+
+    // Third pass
+    coef_index := 0;
+    sqrt2_2 := _sqrt2_2;
+
+    repeat
+      sf^[coef_index] := df^[coef_index] + df^[coef_index + 4];
+      sf^[coef_index + 4] := df^[coef_index] - df^[coef_index + 4];
+      sf^[coef_index + 2] := df^[coef_index + 2];
+      sf^[coef_index + 6] := df^[coef_index + 6];
+
+      v := (df [coef_index + 5] - df^[coef_index + 7]) * sqrt2_2;
+      sf^[coef_index + 1] := df^[coef_index + 1] + v;
+      sf^[coef_index + 3] := df^[coef_index + 1] - v;
+
+      v := (df^[coef_index + 5] + df^[coef_index + 7]) * sqrt2_2;
+      sf [coef_index + 5] := v + df^[coef_index + 3];
+      sf [coef_index + 7] := v - df^[coef_index + 3];
+
+      inc(coef_index, 8);
+    until (coef_index >= _length);
+
+
+    // Next pass
+    for pass := 3 to _nbr_bits-1 do
+    begin
+      coef_index := 0;
+      nbr_coef := 1 shl pass;
+      h_nbr_coef := nbr_coef shr 1;
+      d_nbr_coef := nbr_coef shl 1;
+
+      cos_ptr := pointer(_trigo_lut.get_ptr(pass));
+      repeat
+        sf1r := pointer(longint(sf) + (coef_index * sizeof_flt));
+        sf2r := pointer(longint(sf1r) + (nbr_coef * sizeof_flt));
+        dfr := pointer(longint(df) + (coef_index * sizeof_flt));
+        dfi := pointer(longint(dfr) + (nbr_coef * sizeof_flt));
+
+        // Extreme coefficients are always real
+        dfr^[0] := sf1r^[0] + sf2r^[0];
+        dfi^[0] := sf1r^[0] - sf2r^[0];   // dfr [nbr_coef] =
+        dfr^[h_nbr_coef] := sf1r^[h_nbr_coef];
+        dfi^[h_nbr_coef] := sf2r^[h_nbr_coef];
+
+        // Others are conjugate complex numbers
+        sf1i := pointer(longint(sf1r) + (h_nbr_coef * sizeof_flt));
+        sf2i := pointer(longint(sf1i) + (nbr_coef * sizeof_flt));
+
+        for i := 1 to h_nbr_coef-1 do
+        begin
+          c := cos_ptr^[i];               // cos (i*PI/nbr_coef);
+          s := cos_ptr^[h_nbr_coef - i];  // sin (i*PI/nbr_coef);
+
+          v := sf2r^[i] * c - sf2i^[i] * s;
+          dfr^[i] := sf1r^[i] + v;
+          dfi^[-i] := sf1r^[i] - v;	// dfr [nbr_coef - i] =
+
+          v := sf2r^[i] * s + sf2i^[i] * c;
+          dfi^[i] := v + sf1i^[i];
+          dfi^[nbr_coef - i] := v - sf1i^[i];
+        end;
+
+        inc(coef_index, d_nbr_coef);
+      until (coef_index >= _length);
+
+      // Prepare to the next pass
+      temp_ptr := df;
+      df := sf;
+      sf := temp_ptr;
+    end;
+  end
+
+  (*______________________________________________
+   *
+   * Special cases
+   *______________________________________________
+   *)
+
+  // 4-point FFT
+  else if _nbr_bits = 2 then
+  begin
+    f^[n1] := x^[0] - x^[n2];
+    f^[n3] := x^[n1] - x^[n3];
+
+    b_0 := x^[0] + x^[n2];
+    b_2 := x^[n1] + x^[n3];
+
+    f^[0] := b_0 + b_2;
+    f^[n2] := b_0 - b_2;
+  end
+
+  // 2-point FFT
+  else if _nbr_bits = 1 then
+  begin
+    f^[0] := x^[0] + x^[n1];
+    f^[n1] := x^[0] - x^[n1];
+  end
+
+  // 1-point FFT
+  else
+    f^[0] := x^[0];
+end;
+
+
+(*==========================================================================*/
+/*      Name: do_ifft                                                       */
+/*      Description: Compute the inverse FFT of the array. Notice that      */
+/*                   IFFT (FFT (x)) = x * length (x). Data must be          */
+/*                   post-scaled.                                           */
+/*      Input parameters:                                                   */
+/*        - f: pointer on the source array (frequencies).                   */
+/*             f [0...length(x)/2] = real values,                           */
+/*             f [length(x)/2+1...length(x)-1] = imaginary values of        */
+/*               coefficents 1...length(x)/2-1.                             */
+/*      Output parameters:                                                  */
+/*        - x: pointer on the destination array (time).                     */
+/*==========================================================================*)
+procedure TFFTReal.do_ifft(const f: pflt_array; x: pflt_array);
+var
+   n1, n2, n3      : integer;
+   n4, n5, n6, n7  : integer;
+   sf, df, df_temp : pflt_array;
+   pass            : integer;
+   nbr_coef        : longint;
+   h_nbr_coef      : longint;
+   d_nbr_coef      : longint;
+   coef_index      : longint;
+   cos_ptr         : pflt_array;
+   i               : longint;
+   sfr, sfi        : pflt_array;
+   df1r, df2r      : pflt_array;
+   df1i, df2i      : pflt_array;
+   c, s, vr, vi    : flt_t;
+   temp_ptr        : pflt_array;
+   sqrt2_2         : flt_t;
+   bit_rev_lut_ptr : plongarray;
+   sf2             : pflt_array;
+   b_0, b_1, b_2, b_3 : flt_t;
+begin
+  n1 := 1;
+  n2 := 2;
+  n3 := 3;
+  n4 := 4;
+  n5 := 5;
+  n6 := 6;
+  n7 := 7;
+
+  (*______________________________________________
+   *
+   * General case
+   *______________________________________________
+   *)
+
+  if _nbr_bits > 2 then
+  begin
+    sf := f;
+
+    if _nbr_bits and 1 <> 0 then
+    begin
+      df := pointer(_buffer_ptr);
+      df_temp := x;
+    end
+    else
+    begin
+      df := x;
+      df_temp := pointer(_buffer_ptr);
+    end;
+
+    // Do the transformation in several pass
+
+    // First pass
+    for pass := _nbr_bits-1 downto 3 do
+    begin
+      coef_index := 0;
+      nbr_coef := 1 shl pass;
+      h_nbr_coef := nbr_coef shr 1;
+      d_nbr_coef := nbr_coef shl 1;
+
+      cos_ptr := pointer(_trigo_lut.get_ptr(pass));
+
+      repeat
+        sfr := pointer(longint(sf) + (coef_index*sizeof_flt));
+        sfi := pointer(longint(sfr) + (nbr_coef*sizeof_flt));
+        df1r := pointer(longint(df) + (coef_index*sizeof_flt));
+        df2r := pointer(longint(df1r) + (nbr_coef*sizeof_flt));
+
+        // Extreme coefficients are always real
+        df1r^[0] := sfr^[0] + sfi^[0];		// + sfr [nbr_coef]
+        df2r^[0] := sfr^[0] - sfi^[0];		// - sfr [nbr_coef]
+        df1r^[h_nbr_coef] := sfr^[h_nbr_coef] * 2;
+        df2r^[h_nbr_coef] := sfi^[h_nbr_coef] * 2;
+
+        // Others are conjugate complex numbers
+        df1i := pointer(longint(df1r) + (h_nbr_coef*sizeof_flt));
+        df2i := pointer(longint(df1i) + (nbr_coef*sizeof_flt));
+
+        for i := 1 to h_nbr_coef-1 do
+        begin
+          df1r^[i] := sfr^[i] + sfi^[-i];		// + sfr [nbr_coef - i]
+          df1i^[i] := sfi^[i] - sfi^[nbr_coef - i];
+
+          c := cos_ptr^[i];					// cos (i*PI/nbr_coef);
+          s := cos_ptr^[h_nbr_coef - i];	// sin (i*PI/nbr_coef);
+          vr := sfr^[i] - sfi^[-i];		// - sfr [nbr_coef - i]
+          vi := sfi^[i] + sfi^[nbr_coef - i];
+
+          df2r^[i] := vr * c + vi * s;
+          df2i^[i] := vi * c - vr * s;
+        end;
+
+        inc(coef_index, d_nbr_coef);
+      until (coef_index >= _length);
+
+
+      // Prepare to the next pass 
+      if (pass < _nbr_bits - 1) then
+      begin
+        temp_ptr := df;
+        df := sf;
+        sf := temp_ptr;
+      end
+      else
+      begin
+        sf := df;
+        df := df_temp;
+      end
+    end;
+
+    // Antepenultimate pass
+    sqrt2_2 := _sqrt2_2;
+    coef_index := 0;
+
+    repeat
+      df^[coef_index] := sf^[coef_index] + sf^[coef_index + 4];
+      df^[coef_index + 4] := sf^[coef_index] - sf^[coef_index + 4];
+      df^[coef_index + 2] := sf^[coef_index + 2] * 2;
+      df^[coef_index + 6] := sf^[coef_index + 6] * 2;
+
+      df^[coef_index + 1] := sf^[coef_index + 1] + sf^[coef_index + 3];
+      df^[coef_index + 3] := sf^[coef_index + 5] - sf^[coef_index + 7];
+
+      vr := sf^[coef_index + 1] - sf^[coef_index + 3];
+      vi := sf^[coef_index + 5] + sf^[coef_index + 7];
+
+      df^[coef_index + 5] := (vr + vi) * sqrt2_2;
+      df^[coef_index + 7] := (vi - vr) * sqrt2_2;
+
+      inc(coef_index, 8);
+    until (coef_index >= _length);
+
+
+    // Penultimate and last pass at once 
+    coef_index := 0;
+    bit_rev_lut_ptr := pointer(_bit_rev_lut.get_ptr);
+    sf2 := df;
+
+    repeat
+      b_0 := sf2^[0] + sf2^[n2];
+      b_2 := sf2^[0] - sf2^[n2];
+      b_1 := sf2^[n1] * 2;
+      b_3 := sf2^[n3] * 2;
+
+      x^[bit_rev_lut_ptr^[0]] := b_0 + b_1;
+      x^[bit_rev_lut_ptr^[n1]] := b_0 - b_1;
+      x^[bit_rev_lut_ptr^[n2]] := b_2 + b_3;
+      x^[bit_rev_lut_ptr^[n3]] := b_2 - b_3;
+
+      b_0 := sf2^[n4] + sf2^[n6];
+      b_2 := sf2^[n4] - sf2^[n6];
+      b_1 := sf2^[n5] * 2;
+      b_3 := sf2^[n7] * 2;
+
+      x^[bit_rev_lut_ptr^[n4]] := b_0 + b_1;
+      x^[bit_rev_lut_ptr^[n5]] := b_0 - b_1;
+      x^[bit_rev_lut_ptr^[n6]] := b_2 + b_3;
+      x^[bit_rev_lut_ptr^[n7]] := b_2 - b_3;
+
+      inc(sf2, 8);
+      inc(coef_index, 8);
+      inc(bit_rev_lut_ptr, 8);
+    until (coef_index >= _length);
+  end
+
+  (*______________________________________________
+   *
+   * Special cases
+   *______________________________________________
+   *)
+
+  // 4-point IFFT
+  else if _nbr_bits = 2 then
+  begin
+    b_0 := f^[0] + f [n2];
+    b_2 := f^[0] - f [n2];
+
+    x^[0] := b_0 + f [n1] * 2;
+    x^[n2] := b_0 - f [n1] * 2;
+    x^[n1] := b_2 + f [n3] * 2;
+    x^[n3] := b_2 - f [n3] * 2;
+  end
+
+  // 2-point IFFT
+  else if _nbr_bits = 1 then
+  begin
+    x^[0] := f^[0] + f^[n1];
+    x^[n1] := f^[0] - f^[n1];
+  end
+
+  // 1-point IFFT
+  else
+    x^[0] := f^[0];
+end;
+
+(*==========================================================================*/
+/*      Name: rescale                                                       */
+/*      Description: Scale an array by divide each element by its length.   */
+/*                   This function should be called after FFT + IFFT.       */
+/*      Input/Output parameters:                                            */
+/*        - x: pointer on array to rescale (time or frequency).             */
+/*==========================================================================*)
+procedure TFFTReal.rescale(x: pflt_array);
+var
+   mul  : flt_t;
+   i    : longint;
+begin
+  mul := 1.0 / _length;
+  i := _length - 1;
+
+  repeat
+    x^[i] := x^[i] * mul;
+    dec(i);
+  until (i < 0);
+end;
+
+end.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/fftreal.pro	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,42 @@
+TEMPLATE = lib
+TARGET   = fftreal
+
+# FFTReal
+HEADERS  += Array.h \
+            Array.hpp \
+            DynArray.h \
+            DynArray.hpp \
+            FFTRealFixLen.h \
+            FFTRealFixLen.hpp \
+            FFTRealFixLenParam.h \
+            FFTRealPassDirect.h \
+            FFTRealPassDirect.hpp \
+            FFTRealPassInverse.h \
+            FFTRealPassInverse.hpp \
+            FFTRealSelect.h \
+            FFTRealSelect.hpp \
+            FFTRealUseTrigo.h \
+            FFTRealUseTrigo.hpp \
+            OscSinCos.h \
+            OscSinCos.hpp \
+            def.h
+	    
+# Wrapper used to export the required instantiation of the FFTRealFixLen template
+HEADERS  += fftreal_wrapper.h
+SOURCES  += fftreal_wrapper.cpp
+
+DEFINES  += FFTREAL_LIBRARY
+
+symbian {
+    # Provide unique ID for the generated binary, required by Symbian OS
+    TARGET.UID3 = 0xA000E3FB
+    MMP_RULES += EXPORTUNFROZEN
+} else {
+    macx {
+        CONFIG += lib_bundle
+    } else {
+        DESTDIR = ../../bin
+    }
+} 
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/fftreal_wrapper.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,54 @@
+/***************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** This program is free software: you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as
+** published by the Free Software Foundation, either version 2.1. 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. You should have received a copy of the GNU General
+** Public License along with this program. If not, see
+** <http://www.gnu.org/licenses/>.
+**
+***************************************************************************/
+
+#include "fftreal_wrapper.h"
+
+// FFTReal code generates quite a lot of 'unused parameter' compiler warnings,
+// which we suppress here in order to get a clean build output.
+#if defined Q_CC_MSVC
+#    pragma warning(disable:4100)
+#elif defined Q_CC_GNU
+#    pragma GCC diagnostic ignored "-Wunused-parameter"
+#elif defined Q_CC_MWERKS
+#    pragma warning off (10182)
+#endif
+
+#include "FFTRealFixLen.h"
+
+class FFTRealWrapperPrivate {
+public:
+    FFTRealFixLen<FFTLengthPowerOfTwo> m_fft;
+};
+
+
+FFTRealWrapper::FFTRealWrapper()
+    :   m_private(new FFTRealWrapperPrivate)
+{
+
+}
+
+FFTRealWrapper::~FFTRealWrapper()
+{
+    delete m_private;
+}
+
+void FFTRealWrapper::calculateFFT(DataType in[], const DataType out[])
+{
+    m_private->m_fft.do_fft(in, out);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/fftreal_wrapper.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,63 @@
+/***************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** This program is free software: you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as
+** published by the Free Software Foundation, either version 2.1. 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. You should have received a copy of the GNU General
+** Public License along with this program. If not, see
+** <http://www.gnu.org/licenses/>.
+**
+***************************************************************************/
+
+#ifndef FFTREAL_WRAPPER_H
+#define FFTREAL_WRAPPER_H
+
+#include <QtCore/QtGlobal>
+
+#if defined(FFTREAL_LIBRARY)
+#  define FFTREAL_EXPORT Q_DECL_EXPORT
+#else
+#  define FFTREAL_EXPORT Q_DECL_IMPORT
+#endif
+
+class FFTRealWrapperPrivate;
+
+// Each pass of the FFT processes 2^X samples, where X is the
+// number below.
+static const int FFTLengthPowerOfTwo = 12;
+
+/**
+ * Wrapper around the FFTRealFixLen template provided by the FFTReal
+ * library
+ *
+ * This class instantiates a single instance of FFTRealFixLen, using
+ * FFTLengthPowerOfTwo as the template parameter.  It then exposes
+ * FFTRealFixLen<FFTLengthPowerOfTwo>::do_fft via the calculateFFT
+ * function, thereby allowing an application to dynamically link
+ * against the FFTReal implementation.
+ *
+ * See http://ldesoras.free.fr/prod.html
+ */
+class FFTREAL_EXPORT FFTRealWrapper
+{
+public:
+    FFTRealWrapper();
+    ~FFTRealWrapper();
+
+    typedef float DataType;
+    void calculateFFT(DataType in[], const DataType out[]);
+
+private:
+    FFTRealWrapperPrivate*  m_private;
+};
+
+#endif // FFTREAL_WRAPPER_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/license.txt	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,459 @@
+		  GNU LESSER GENERAL PUBLIC LICENSE
+		       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+		  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/readme.txt	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,242 @@
+==============================================================================
+
+        FFTReal
+        Version 2.00, 2005/10/18
+
+        Fourier transformation (FFT, IFFT) library specialised for real data
+        Portable ISO C++
+
+        (c) Laurent de Soras <laurent.de.soras@club-internet.fr>
+        Object Pascal port (c) Frederic Vanmol <frederic@fruityloops.com>
+
+==============================================================================
+
+
+
+1. Legal
+--------
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+Check the file license.txt to get full information about the license.
+
+
+
+2. Content
+----------
+
+FFTReal is a library to compute Discrete Fourier Transforms (DFT) with the
+FFT algorithm (Fast Fourier Transform) on arrays of real numbers. It can
+also compute the inverse transform.
+
+You should find in this package a lot of files ; some of them are of interest:
+- readme.txt: you are reading it
+- FFTReal.h: FFT, length fixed at run-time
+- FFTRealFixLen.h: FFT, length fixed at compile-time
+- FFTReal.pas: Pascal implementation (working but not up-to-date)
+- stopwatch directory
+
+
+
+3. Using FFTReal
+----------------
+
+Important - if you were using older versions of FFTReal (up to 1.03), some
+things have changed. FFTReal is now a template. Therefore use FFTReal<float>
+or FFTReal<double> in your code depending on the application datatype. The
+flt_t typedef has been removed.
+
+You have two ways to use FFTReal. In the first way, the FFT has its length
+fixed at run-time, when the object is instanciated. It means that you have
+not to know the length when you write the code. This is the usual way of
+proceeding.
+
+
+3.1 FFTReal - Length fixed at run-time
+--------------------------------------
+
+Just instanciate one time a FFTReal object. Specify the data type you want
+as template parameter (only floating point: float, double, long double or
+custom type). The constructor precompute a lot of things, so it may be a bit
+long. The parameter is the number of points used for the next FFTs. It must
+be a power of 2:
+
+   #include "FFTReal.h"
+   ...
+   long len = 1024;
+   ...
+   FFTReal <float> fft_object (len);   // 1024-point FFT object constructed.
+
+Then you can use this object to compute as many FFTs and IFFTs as you want.
+They will be computed very quickly because a lot of work has been done in the
+object construction.
+
+   float x [1024];
+   float f [1024];
+
+   ...
+   fft_object.do_fft (f, x);     // x (real) --FFT---> f (complex)
+   ...
+   fft_object.do_ifft (f, x);    // f (complex) --IFFT--> x (real)
+   fft_object.rescale (x);       // Post-scaling should be done after FFT+IFFT
+   ...
+
+x [] and f [] are floating point number arrays. x [] is the real number
+sequence which we want to compute the FFT. f [] is the result, in the
+"frequency" domain. f has the same number of elements as x [], but f []
+elements are complex numbers. The routine uses some FFT properties to
+optimize memory and to reduce calculations: the transformaton of a real
+number sequence is a conjugate complex number sequence: F [k] = F [-k]*.
+
+
+3.2 FFTRealFixLen - Length fixed at compile-time
+------------------------------------------------
+
+This class is significantly faster than the previous one, giving a speed
+gain between 50 and 100 %. The template parameter is the base-2 logarithm of
+the FFT length. The datatype is float; it can be changed by modifying the
+DataType typedef in FFTRealFixLenParam.h. As FFTReal class, it supports
+only floating-point types or equivalent.
+
+To instanciate the object, just proceed as below:
+
+   #include "FFTRealFixLen.h"
+   ...
+   FFTRealFixLen <10> fft_object; // 1024-point (2^10) FFT object constructed.
+
+Use is similar as the one of FFTReal.
+
+
+3.3 Data organisation
+---------------------
+
+Mathematically speaking, the formulas below show what does FFTReal:
+
+do_fft() : f(k) = sum (p = 0, N-1, x(p) * exp (+j*2*pi*k*p/N))
+do_ifft(): x(k) = sum (p = 0, N-1, f(p) * exp (-j*2*pi*k*p/N))
+
+Where j is the square root of -1. The formulas differ only by the sign of
+the exponential. When the sign is positive, the transform is called positive.
+Common formulas for Fourier transform are negative for the direct tranform and
+positive for the inverse one.
+
+However in these formulas, f is an array of complex numbers and doesn't
+correspound exactly to the f[] array taken as function parameter. The
+following table shows how the f[] sequence is mapped onto the usable FFT
+coefficients (called bins):
+
+   FFTReal output | Positive FFT equiv.   | Negative FFT equiv.
+   ---------------+-----------------------+-----------------------
+   f [0]          | Real (bin 0)          | Real (bin 0)
+   f [...]        | Real (bin ...)        | Real (bin ...)
+   f [length/2]   | Real (bin length/2)   | Real (bin length/2)
+   f [length/2+1] | Imag (bin 1)          | -Imag (bin 1)
+   f [...]        | Imag (bin ...)        | -Imag (bin ...)
+   f [length-1]   | Imag (bin length/2-1) | -Imag (bin length/2-1)
+
+And FFT bins are distributed in f [] as above:
+
+               |                | Positive FFT    | Negative FFT
+   Bin         | Real part      | imaginary part  | imaginary part
+   ------------+----------------+-----------------+---------------
+   0           | f [0]          | 0               | 0
+   1           | f [1]          | f [length/2+1]  | -f [length/2+1]
+   ...         | f [...],       | f [...]         | -f [...]
+   length/2-1  | f [length/2-1] | f [length-1]    | -f [length-1]
+   length/2    | f [length/2]   | 0               | 0
+   length/2+1  | f [length/2-1] | -f [length-1]   | f [length-1]
+   ...         | f [...]        | -f [...]        | f [...]
+   length-1    | f [1]          | -f [length/2+1] | f [length/2+1]
+
+f [] coefficients have the same layout for FFT and IFFT functions. You may
+notice that scaling must be done if you want to retrieve x after FFT and IFFT.
+Actually, IFFT (FFT (x)) = x * length(x). This is a not a problem because
+most of the applications don't care about absolute values. Thus, the operation
+requires less calculation. If you want to use the FFT and IFFT to transform a
+signal, you have to apply post- (or pre-) processing yourself. Multiplying
+or dividing floating point numbers by a power of 2 doesn't generate extra
+computation noise.
+
+
+
+4. Compilation and testing
+--------------------------
+
+Drop the following files into your project or makefile:
+
+Array.*
+def.h
+DynArray.*
+FFTReal*.cpp
+FFTReal*.h*
+OscSinCos.*
+
+Other files are for testing purpose only, do not include them if you just need
+to use the library ; they are not needed to use FFTReal in your own programs.
+
+FFTReal may be compiled in two versions: release and debug. Debug version
+has checks that could slow down the code. Define NDEBUG to set the Release
+mode. For example, the command line to compile the test bench on GCC would
+look like:
+
+Debug mode:
+g++ -Wall -o fftreal_debug.exe *.cpp stopwatch/*.cpp
+
+Release mode:
+g++ -Wall -o fftreal_release.exe -DNDEBUG -O3 *.cpp stopwatch/*.cpp
+
+It may be tricky to compile the test bench because the speed tests use the
+stopwatch sub-library, which is not that cross-platform. If you encounter
+any problem that you cannot easily fix while compiling it, edit the file
+test_settings.h and un-define the speed test macro. Remove the stopwatch
+directory from your source file list, too.
+
+If it's not done by default, you should activate the exception handling
+of your compiler to get the class memory-leak-safe. Thus, when a memory
+allocation fails (in the constructor), an exception is thrown and the entire
+object is safely destructed. It reduces the permanent error checking overhead
+in the client code. Also, the test bench requires Run-Time Type Information
+(RTTI) to be enabled in order to display the names of the tested classes -
+sometimes mangled, depending on the compiler.
+
+The test bench may take a long time to compile, especially in Release mode,
+because a lot of recursive templates are instanciated.
+
+
+
+5. History
+----------
+
+v2.00 (2005.10.18)
+- Turned FFTReal class into template (data type as parameter)
+- Added FFTRealFixLen
+- Trigonometric tables are size-limited in order to preserve cache memory;
+over a given size, sin/cos functions are computed on the fly.
+- Better test bench for accuracy and speed
+
+v1.03 (2001.06.15)
+- Thanks to Frederic Vanmol for the Pascal port (works with Delphi).
+- Documentation improvement
+
+v1.02 (2001.03.25)
+- sqrt() is now precomputed when the object FFTReal is constructed, resulting
+in speed impovement for small size FFT.
+
+v1.01 (2000)
+- Small modifications, I don't remember what.
+
+v1.00 (1999.08.14)
+- First version released
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/stopwatch/ClockCycleCounter.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,285 @@
+/*****************************************************************************
+
+        ClockCycleCounter.cpp
+        Copyright (c) 2003 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if defined (_MSC_VER)
+	#pragma warning (1 : 4130) // "'operator' : logical operation on address of string constant"
+	#pragma warning (1 : 4223) // "nonstandard extension used : non-lvalue array converted to pointer"
+	#pragma warning (1 : 4705) // "statement has no effect"
+	#pragma warning (1 : 4706) // "assignment within conditional expression"
+	#pragma warning (4 : 4786) // "identifier was truncated to '255' characters in the debug information"
+	#pragma warning (4 : 4800) // "forcing value to bool 'true' or 'false' (performance warning)"
+	#pragma warning (4 : 4355) // "'this' : used in base member initializer list"
+#endif
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+#include	"ClockCycleCounter.h"
+
+#include	<cassert>
+
+
+
+namespace stopwatch
+{
+
+
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+/*
+==============================================================================
+Name: ctor
+Description:
+	The first object constructed initialise global data. This first
+	construction may be a bit slow.
+Throws: Nothing
+==============================================================================
+*/
+
+ClockCycleCounter::ClockCycleCounter ()
+:	_start_time (0)
+,	_state (0)
+,	_best_score (-1)
+{
+	if (! _init_flag)
+	{
+		// Should be executed in this order
+		compute_clk_mul ();
+		compute_measure_time_total ();
+		compute_measure_time_lap ();
+
+		// Restores object state
+		_start_time = 0;
+		_state      = 0;
+		_best_score = -1;
+
+		_init_flag = true;
+	}
+}
+
+
+
+/*
+==============================================================================
+Name: get_time_total
+Description:
+	Gives the time elapsed between the latest stop_lap() and start() calls.
+Returns:
+	The duration, in clock cycles.
+Throws: Nothing
+==============================================================================
+*/
+
+Int64	ClockCycleCounter::get_time_total () const
+{
+	const Int64		duration = _state - _start_time;
+	assert (duration >= 0);
+
+	const Int64		t = max (
+		duration - _measure_time_total,
+		static_cast <Int64> (0)
+	);
+
+	return (t * _clk_mul);
+}
+
+
+
+/*
+==============================================================================
+Name: get_time_best_lap
+Description:
+	Gives the smallest time between two consecutive stop_lap() or between
+	the stop_lap() and start(). The value is reset by a call to start().
+	Call this function only after a stop_lap().
+	The time is amputed from the duration of the stop_lap() call itself.
+Returns:
+	The smallest duration, in clock cycles.
+Throws: Nothing
+==============================================================================
+*/
+
+Int64	ClockCycleCounter::get_time_best_lap () const
+{
+	assert (_best_score >= 0);
+
+	const Int64		t1 = max (
+		_best_score - _measure_time_lap,
+		static_cast <Int64> (0)
+	);
+	const Int64		t = min (t1, get_time_total ());
+
+	return (t * _clk_mul);
+}
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+#if defined (__MACOS__)
+
+static inline double	stopwatch_ClockCycleCounter_get_time_s ()
+{
+	const Nanoseconds	ns = AbsoluteToNanoseconds (UpTime ());
+
+	return (ns.hi * 4294967296e-9 + ns.lo * 1e-9);
+}
+
+#endif	// __MACOS__
+
+
+
+/*
+==============================================================================
+Name: compute_clk_mul
+Description:
+	This function, only for PowerPC/MacOS computers, computes the multiplier
+	required to deduce clock cycles from the internal counter.
+Throws: Nothing
+==============================================================================
+*/
+
+void	ClockCycleCounter::compute_clk_mul ()
+{
+	assert (! _init_flag);
+
+#if defined (__MACOS__)
+
+	long				clk_speed_mhz = CurrentProcessorSpeed ();
+	const Int64		clk_speed =
+		static_cast <Int64> (clk_speed_mhz) * (1000L*1000L);
+
+	const double	start_time_s = stopwatch_ClockCycleCounter_get_time_s ();
+	start ();
+
+	const double	duration = 0.01;	// Seconds
+	while (stopwatch_ClockCycleCounter_get_time_s () - start_time_s < duration)
+	{
+		continue;
+	}
+
+	const double	stop_time_s = stopwatch_ClockCycleCounter_get_time_s ();
+	stop ();
+
+	const double	diff_time_s = stop_time_s - start_time_s;
+	const double	nbr_cycles = diff_time_s * static_cast <double> (clk_speed);
+
+	const Int64		diff_time_c = _state - _start_time;
+	const double	clk_mul = nbr_cycles / static_cast <double> (diff_time_c);
+
+	_clk_mul = round_int (clk_mul);
+
+#endif	// __MACOS__
+}
+
+
+
+void	ClockCycleCounter::compute_measure_time_total ()
+{
+	start ();
+	spend_time ();
+
+	Int64				best_result = 0x7FFFFFFFL;	// Should be enough
+	long				nbr_tests = 100;
+	for (long cnt = 0; cnt < nbr_tests; ++cnt)
+	{
+		start ();
+		stop_lap ();
+		const Int64		duration = _state - _start_time;
+		best_result = min (best_result, duration);
+	}
+
+	_measure_time_total = best_result;
+}
+
+
+
+/*
+==============================================================================
+Name: compute_measure_time_lap
+Description:
+	Computes the duration of one stop_lap() call and store it. It will be used
+	later to get the real duration of the measured operation (by substracting
+	the measurement duration).
+Throws: Nothing
+==============================================================================
+*/
+
+void	ClockCycleCounter::compute_measure_time_lap ()
+{
+	start ();
+	spend_time ();
+
+	long				nbr_tests = 10;
+	for (long cnt = 0; cnt < nbr_tests; ++cnt)
+	{
+		stop_lap ();
+		stop_lap ();
+		stop_lap ();
+		stop_lap ();
+	}
+
+	_measure_time_lap = _best_score;
+}
+
+
+
+void	ClockCycleCounter::spend_time ()
+{
+	const Int64		nbr_clocks = 500;	// Number of clock cycles to spend
+
+	const Int64		start = read_clock_counter ();
+	Int64				current;
+
+	do
+	{
+		current = read_clock_counter ();
+	}
+	while ((current - start) * _clk_mul < nbr_clocks);
+}
+
+
+
+Int64	ClockCycleCounter::_measure_time_total = 0;
+Int64	ClockCycleCounter::_measure_time_lap = 0;
+int	ClockCycleCounter::_clk_mul = 1;
+bool	ClockCycleCounter::_init_flag = false;
+
+
+}	// namespace stopwatch
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/stopwatch/ClockCycleCounter.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,124 @@
+/*****************************************************************************
+
+        ClockCycleCounter.h
+        Copyright (c) 2003 Laurent de Soras
+
+Instrumentation class, for accurate time interval measurement. You may have
+to modify the implementation to adapt it to your system and/or compiler.
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if ! defined (stopwatch_ClockCycleCounter_HEADER_INCLUDED)
+#define	stopwatch_ClockCycleCounter_HEADER_INCLUDED
+
+#if defined (_MSC_VER)
+	#pragma once
+	#pragma warning (4 : 4250) // "Inherits via dominance."
+#endif
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+#include	"def.h"
+#include	"Int64.h"
+
+
+
+namespace stopwatch
+{
+
+
+
+class ClockCycleCounter
+{
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+public:
+
+						ClockCycleCounter ();
+
+	stopwatch_FORCEINLINE void
+						start ();
+	stopwatch_FORCEINLINE void
+						stop_lap ();
+	Int64				get_time_total () const;
+	Int64				get_time_best_lap () const;
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+protected:
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+	void				compute_clk_mul ();
+	void				compute_measure_time_total ();
+	void				compute_measure_time_lap ();
+
+	static void		spend_time ();
+	static stopwatch_FORCEINLINE Int64
+						read_clock_counter ();
+
+	Int64				_start_time;
+	Int64				_state;
+	Int64				_best_score;
+
+	static Int64	_measure_time_total;
+	static Int64	_measure_time_lap;
+	static int		_clk_mul;
+	static bool		_init_flag;
+
+
+
+/*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+						ClockCycleCounter (const ClockCycleCounter &other);
+	ClockCycleCounter &
+						operator = (const ClockCycleCounter &other);
+	bool				operator == (const ClockCycleCounter &other);
+	bool				operator != (const ClockCycleCounter &other);
+
+};	// class ClockCycleCounter
+
+
+
+}	// namespace stopwatch
+
+
+
+#include	"ClockCycleCounter.hpp"
+
+
+
+#endif	// stopwatch_ClockCycleCounter_HEADER_INCLUDED
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/stopwatch/ClockCycleCounter.hpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,150 @@
+/*****************************************************************************
+
+        ClockCycleCounter.hpp
+        Copyright (c) 2003 Laurent de Soras
+
+Please complete the definitions according to your compiler/architecture.
+It's not a big deal if it's not possible to get the clock count...
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if defined (stopwatch_ClockCycleCounter_CURRENT_CODEHEADER)
+	#error Recursive inclusion of ClockCycleCounter code header.
+#endif
+#define	stopwatch_ClockCycleCounter_CURRENT_CODEHEADER
+
+#if ! defined (stopwatch_ClockCycleCounter_CODEHEADER_INCLUDED)
+#define	stopwatch_ClockCycleCounter_CODEHEADER_INCLUDED
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+#include	"fnc.h"
+
+#include	<climits>
+
+
+
+namespace stopwatch
+{
+
+
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+/*
+==============================================================================
+Name: start
+Description:
+	Starts the counter.
+Throws: Nothing
+==============================================================================
+*/
+
+void	ClockCycleCounter::start ()
+{
+	_best_score = (static_cast <Int64> (1) << (sizeof (Int64) * CHAR_BIT - 2));
+	const Int64		start_clock = read_clock_counter ();
+	_start_time = start_clock;
+	_state = start_clock - _best_score;
+}
+
+
+
+/*
+==============================================================================
+Name: stop_lap
+Description:
+	Captures the current time and updates the smallest duration between two
+	consecutive calls to stop_lap() or the latest start().
+	start() must have been called at least once before calling this function.
+Throws: Nothing
+==============================================================================
+*/
+
+void	ClockCycleCounter::stop_lap ()
+{
+	const Int64		end_clock = read_clock_counter ();
+	_best_score = min (end_clock - _state, _best_score);
+	_state = end_clock;
+}
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+Int64	ClockCycleCounter::read_clock_counter ()
+{
+	register Int64		clock_cnt;
+
+#if defined (_MSC_VER)
+
+	__asm
+	{
+		lea				edi, clock_cnt
+		rdtsc
+		mov				[edi    ], eax
+		mov				[edi + 4], edx
+	}
+
+#elif defined (__GNUC__) && defined (__i386__)
+
+	__asm__ __volatile__ ("rdtsc" : "=A" (clock_cnt));
+
+#elif (__MWERKS__) && defined (__POWERPC__) 
+	
+	asm
+	{
+	loop:
+		mftbu			clock_cnt@hiword
+		mftb			clock_cnt@loword
+		mftbu			r5
+		cmpw			clock_cnt@hiword,r5
+		bne loop
+	}
+	
+#endif
+
+	return (clock_cnt);
+}
+
+
+
+}	// namespace stopwatch
+
+
+
+#endif	// stopwatch_ClockCycleCounter_CODEHEADER_INCLUDED
+
+#undef stopwatch_ClockCycleCounter_CURRENT_CODEHEADER
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/stopwatch/Int64.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,71 @@
+/*****************************************************************************
+
+        Int64.h
+        Copyright (c) 2003 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if ! defined (stopwatch_Int64_HEADER_INCLUDED)
+#define	stopwatch_Int64_HEADER_INCLUDED
+
+#if defined (_MSC_VER)
+	#pragma once
+	#pragma warning (4 : 4250) // "Inherits via dominance."
+#endif
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+namespace stopwatch
+{
+
+
+#if defined (_MSC_VER)
+
+	typedef	__int64	Int64;
+
+#elif defined (__MWERKS__) || defined (__GNUC__)
+
+	typedef	long long	Int64;
+
+#elif defined (__BEOS__)
+
+	typedef	int64	Int64;
+
+#else
+
+	#error No 64-bit integer type defined for this compiler !
+
+#endif
+
+
+}	// namespace stopwatch
+
+
+
+#endif	// stopwatch_Int64_HEADER_INCLUDED
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/stopwatch/StopWatch.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,101 @@
+/*****************************************************************************
+
+        StopWatch.cpp
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if defined (_MSC_VER)
+	#pragma warning (1 : 4130) // "'operator' : logical operation on address of string constant"
+	#pragma warning (1 : 4223) // "nonstandard extension used : non-lvalue array converted to pointer"
+	#pragma warning (1 : 4705) // "statement has no effect"
+	#pragma warning (1 : 4706) // "assignment within conditional expression"
+	#pragma warning (4 : 4786) // "identifier was truncated to '255' characters in the debug information"
+	#pragma warning (4 : 4800) // "forcing value to bool 'true' or 'false' (performance warning)"
+	#pragma warning (4 : 4355) // "'this' : used in base member initializer list"
+#endif
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+#include	"StopWatch.h"
+
+#include	<cassert>
+
+
+
+namespace stopwatch
+{
+
+
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+StopWatch::StopWatch ()
+:	_ccc ()
+,	_nbr_laps (0)
+{
+	// Nothing
+}
+
+
+
+double	StopWatch::get_time_total (Int64 nbr_op) const
+{
+	assert (_nbr_laps > 0);
+	assert (nbr_op > 0);
+
+	return (
+		  static_cast <double> (_ccc.get_time_total ())
+	   / (static_cast <double> (nbr_op) * static_cast <double> (_nbr_laps))
+	);
+}
+
+
+
+double	StopWatch::get_time_best_lap (Int64 nbr_op) const
+{
+	assert (nbr_op > 0);
+
+	return (
+		  static_cast <double> (_ccc.get_time_best_lap ())
+		/ static_cast <double> (nbr_op)
+	);
+}
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+}	// namespace stopwatch
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/stopwatch/StopWatch.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,110 @@
+/*****************************************************************************
+
+        StopWatch.h
+        Copyright (c) 2005 Laurent de Soras
+
+Utility class based on ClockCycleCounter to measure the unit time of a
+repeated operation.
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if ! defined (stopwatch_StopWatch_HEADER_INCLUDED)
+#define	stopwatch_StopWatch_HEADER_INCLUDED
+
+#if defined (_MSC_VER)
+	#pragma once
+	#pragma warning (4 : 4250) // "Inherits via dominance."
+#endif
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+#include	"ClockCycleCounter.h"
+
+
+
+namespace stopwatch
+{
+
+
+
+class StopWatch
+{
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+public:
+
+						StopWatch ();
+
+	stopwatch_FORCEINLINE void
+						start ();
+	stopwatch_FORCEINLINE void
+						stop_lap ();
+
+	double			get_time_total (Int64 nbr_op) const;
+	double			get_time_best_lap (Int64 nbr_op) const;
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+protected:
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+	ClockCycleCounter
+						_ccc;
+	Int64				_nbr_laps;
+
+
+
+/*\\\ FORBIDDEN MEMBER FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+private:
+
+						StopWatch (const StopWatch &other);
+	StopWatch &		operator = (const StopWatch &other);
+	bool				operator == (const StopWatch &other);
+	bool				operator != (const StopWatch &other);
+
+};	// class StopWatch
+
+
+
+}	// namespace stopwatch
+
+
+
+#include	"StopWatch.hpp"
+
+
+
+#endif	// stopwatch_StopWatch_HEADER_INCLUDED
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/stopwatch/StopWatch.hpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,83 @@
+/*****************************************************************************
+
+        StopWatch.hpp
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if defined (stopwatch_StopWatch_CURRENT_CODEHEADER)
+	#error Recursive inclusion of StopWatch code header.
+#endif
+#define	stopwatch_StopWatch_CURRENT_CODEHEADER
+
+#if ! defined (stopwatch_StopWatch_CODEHEADER_INCLUDED)
+#define	stopwatch_StopWatch_CODEHEADER_INCLUDED
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+namespace stopwatch
+{
+
+
+
+/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+void	StopWatch::start ()
+{
+	_nbr_laps = 0;
+	_ccc.start ();
+}
+
+
+
+void	StopWatch::stop_lap ()
+{
+	_ccc.stop_lap ();
+	++ _nbr_laps;
+}
+
+
+
+/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+}	// namespace stopwatch
+
+
+
+#endif	// stopwatch_StopWatch_CODEHEADER_INCLUDED
+
+#undef stopwatch_StopWatch_CURRENT_CODEHEADER
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/stopwatch/def.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,65 @@
+/*****************************************************************************
+
+        def.h
+        Copyright (c) 2003 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if ! defined (stopwatch_def_HEADER_INCLUDED)
+#define	stopwatch_def_HEADER_INCLUDED
+
+#if defined (_MSC_VER)
+	#pragma once
+	#pragma warning (4 : 4250) // "Inherits via dominance."
+#endif
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+namespace stopwatch
+{
+
+
+
+#if defined (_MSC_VER)
+
+	#define	stopwatch_FORCEINLINE	__forceinline
+
+#else
+
+	#define	stopwatch_FORCEINLINE	inline
+
+#endif
+
+
+
+}	// namespace stopwatch
+
+
+
+#endif	// stopwatch_def_HEADER_INCLUDED
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/stopwatch/fnc.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,67 @@
+/*****************************************************************************
+
+        fnc.h
+        Copyright (c) 2003 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if ! defined (stopwatch_fnc_HEADER_INCLUDED)
+#define	stopwatch_fnc_HEADER_INCLUDED
+
+#if defined (_MSC_VER)
+	#pragma once
+	#pragma warning (4 : 4250) // "Inherits via dominance."
+#endif
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+namespace stopwatch
+{
+
+
+
+template <typename T>
+inline T	min (T a, T b);
+
+template <typename T>
+inline T	max (T a, T b);
+
+inline int	round_int (double x);
+
+
+
+}	// namespace rsp
+
+
+
+#include	"fnc.hpp"
+
+
+
+#endif	// stopwatch_fnc_HEADER_INCLUDED
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/stopwatch/fnc.hpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,85 @@
+/*****************************************************************************
+
+        fnc.hpp
+        Copyright (c) 2003 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if defined (stopwatch_fnc_CURRENT_CODEHEADER)
+	#error Recursive inclusion of fnc code header.
+#endif
+#define	stopwatch_fnc_CURRENT_CODEHEADER
+
+#if ! defined (stopwatch_fnc_CODEHEADER_INCLUDED)
+#define	stopwatch_fnc_CODEHEADER_INCLUDED
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+#include	<cassert>
+#include	<cmath>
+
+namespace std {}
+
+
+
+namespace stopwatch
+{
+
+
+
+template <typename T>
+inline T	min (T a, T b)
+{
+	return ((a < b) ? a : b);
+}
+
+
+
+template <typename T>
+inline T	max (T a, T b)
+{
+	return ((b < a) ? a : b);
+}
+
+
+
+int	round_int (double x)
+{
+	using namespace std;
+
+	return (static_cast <int> (floor (x + 0.5)));
+}
+
+
+
+}	// namespace stopwatch
+
+
+
+#endif	// stopwatch_fnc_CODEHEADER_INCLUDED
+
+#undef stopwatch_fnc_CURRENT_CODEHEADER
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/test.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,267 @@
+/*****************************************************************************
+
+        test.cpp
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if defined (_MSC_VER)
+	#pragma warning (4 : 4786) // "identifier was truncated to '255' characters in the debug information"
+	#pragma warning (4 : 4800) // "forcing value to bool 'true' or 'false' (performance warning)"
+#endif
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+#include	"test_settings.h"
+#include	"TestHelperFixLen.h"
+#include	"TestHelperNormal.h"
+
+#if defined (_MSC_VER)
+#include	<crtdbg.h>
+#include	<new.h>
+#endif	// _MSC_VER
+
+#include	<new>
+
+#include	<cassert>
+#include	<cstdio>
+
+
+
+#define	TEST_
+
+
+/*\\\ FUNCTIONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+static int	TEST_perform_test_accuracy_all ();
+static int	TEST_perform_test_speed_all ();
+
+static void	TEST_prog_init ();
+static void	TEST_prog_end ();
+
+
+
+int main (int argc, char *argv [])
+{
+	using namespace std;
+
+	int				ret_val = 0;
+
+	TEST_prog_init ();
+
+	try
+	{
+		if (ret_val == 0)
+		{
+			ret_val = TEST_perform_test_accuracy_all ();
+		}
+
+		if (ret_val == 0)
+		{
+			ret_val = TEST_perform_test_speed_all ();
+		}
+	}
+
+	catch (std::exception &e)
+	{
+		printf ("\n*** main(): Exception (std::exception) : %s\n", e.what ());
+		ret_val = -1;
+	}
+
+	catch (...)
+	{
+		printf ("\n*** main(): Undefined exception\n");
+		ret_val = -1;
+	}
+
+	TEST_prog_end ();
+
+	return (ret_val);
+}
+
+
+
+int	TEST_perform_test_accuracy_all ()
+{
+   int            ret_val = 0;
+
+	TestHelperNormal <float >::perform_test_accuracy (ret_val);
+	TestHelperNormal <double>::perform_test_accuracy (ret_val);
+
+   TestHelperFixLen < 1>::perform_test_accuracy (ret_val);
+   TestHelperFixLen < 2>::perform_test_accuracy (ret_val);
+   TestHelperFixLen < 3>::perform_test_accuracy (ret_val);
+   TestHelperFixLen < 4>::perform_test_accuracy (ret_val);
+   TestHelperFixLen < 7>::perform_test_accuracy (ret_val);
+   TestHelperFixLen < 8>::perform_test_accuracy (ret_val);
+   TestHelperFixLen <10>::perform_test_accuracy (ret_val);
+   TestHelperFixLen <12>::perform_test_accuracy (ret_val);
+   TestHelperFixLen <13>::perform_test_accuracy (ret_val);
+
+	return (ret_val);
+}
+
+
+
+int	TEST_perform_test_speed_all ()
+{
+   int            ret_val = 0;
+
+#if defined (test_settings_SPEED_TEST_ENABLED)
+
+	TestHelperNormal <float >::perform_test_speed (ret_val);
+	TestHelperNormal <double>::perform_test_speed (ret_val);
+
+   TestHelperFixLen < 1>::perform_test_speed (ret_val);
+   TestHelperFixLen < 2>::perform_test_speed (ret_val);
+   TestHelperFixLen < 3>::perform_test_speed (ret_val);
+   TestHelperFixLen < 4>::perform_test_speed (ret_val);
+   TestHelperFixLen < 7>::perform_test_speed (ret_val);
+   TestHelperFixLen < 8>::perform_test_speed (ret_val);
+   TestHelperFixLen <10>::perform_test_speed (ret_val);
+   TestHelperFixLen <12>::perform_test_speed (ret_val);
+   TestHelperFixLen <14>::perform_test_speed (ret_val);
+   TestHelperFixLen <16>::perform_test_speed (ret_val);
+   TestHelperFixLen <20>::perform_test_speed (ret_val);
+
+#endif
+
+   return (ret_val);
+}
+
+
+
+#if defined (_MSC_VER)
+static int __cdecl	TEST_new_handler_cb (size_t dummy)
+{
+	throw std::bad_alloc ();
+	return (0);
+}
+#endif	// _MSC_VER
+
+
+
+#if defined (_MSC_VER) && ! defined (NDEBUG)
+static int	__cdecl	TEST_debug_alloc_hook_cb (int alloc_type, void *user_data_ptr, size_t size, int block_type, long request_nbr, const unsigned char *filename_0, int line_nbr)
+{
+	if (block_type != _CRT_BLOCK)	// Ignore CRT blocks to prevent infinite recursion
+	{
+		switch (alloc_type)
+		{
+		case	_HOOK_ALLOC:
+		case	_HOOK_REALLOC:
+		case	_HOOK_FREE:
+
+			// Put some debug code here
+
+			break;
+
+		default:
+			assert (false);	// Undefined allocation type
+			break;
+		}
+	}
+
+	return (1);
+}
+#endif
+
+
+
+#if defined (_MSC_VER) && ! defined (NDEBUG)
+static int	__cdecl	TEST_debug_report_hook_cb (int report_type, char *user_msg_0, int *ret_val_ptr)
+{
+	*ret_val_ptr = 0;	// 1 to override the CRT default reporting mode
+
+	switch (report_type)
+	{
+	case	_CRT_WARN:
+	case	_CRT_ERROR:
+	case	_CRT_ASSERT:
+
+// Put some debug code here
+
+		break;
+	}
+
+	return (*ret_val_ptr);
+}
+#endif
+
+
+
+static void	TEST_prog_init ()
+{
+#if defined (_MSC_VER)
+	::_set_new_handler (::TEST_new_handler_cb);
+#endif	// _MSC_VER
+
+#if defined (_MSC_VER) && ! defined (NDEBUG)
+	{
+		const int	mode =   (1 * _CRTDBG_MODE_DEBUG)
+						       | (1 * _CRTDBG_MODE_WNDW);
+		::_CrtSetReportMode (_CRT_WARN, mode);
+		::_CrtSetReportMode (_CRT_ERROR, mode);
+		::_CrtSetReportMode (_CRT_ASSERT, mode);
+
+		const int	old_flags = ::_CrtSetDbgFlag (_CRTDBG_REPORT_FLAG);
+		::_CrtSetDbgFlag (  old_flags
+		                  | (1 * _CRTDBG_LEAK_CHECK_DF)
+		                  | (1 * _CRTDBG_CHECK_ALWAYS_DF));
+		::_CrtSetBreakAlloc (-1);	// Specify here a memory bloc number
+		::_CrtSetAllocHook (TEST_debug_alloc_hook_cb);
+		::_CrtSetReportHook (TEST_debug_report_hook_cb);
+
+		// Speed up I/O but breaks C stdio compatibility
+//		std::cout.sync_with_stdio (false);
+//		std::cin.sync_with_stdio (false);
+//		std::cerr.sync_with_stdio (false);
+//		std::clog.sync_with_stdio (false);
+	}
+#endif	// _MSC_VER, NDEBUG
+}
+
+
+
+static void	TEST_prog_end ()
+{
+#if defined (_MSC_VER) && ! defined (NDEBUG)
+	{
+		const int	mode =   (1 * _CRTDBG_MODE_DEBUG)
+						       | (0 * _CRTDBG_MODE_WNDW);
+		::_CrtSetReportMode (_CRT_WARN, mode);
+		::_CrtSetReportMode (_CRT_ERROR, mode);
+		::_CrtSetReportMode (_CRT_ASSERT, mode);
+
+		::_CrtMemState	mem_state;
+		::_CrtMemCheckpoint (&mem_state);
+		::_CrtMemDumpStatistics (&mem_state);
+	}
+#endif	// _MSC_VER, NDEBUG
+}
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/test_fnc.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,53 @@
+/*****************************************************************************
+
+        test_fnc.h
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if ! defined (test_fnc_HEADER_INCLUDED)
+#define	test_fnc_HEADER_INCLUDED
+
+#if defined (_MSC_VER)
+	#pragma once
+	#pragma warning (4 : 4250) // "Inherits via dominance."
+#endif
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+template <class T>
+inline T	limit (const T &x, const T &inf, const T &sup);
+
+
+
+#include	"test_fnc.hpp"
+
+
+
+#endif	// test_fnc_HEADER_INCLUDED
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/test_fnc.hpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,56 @@
+/*****************************************************************************
+
+        test_fnc.hpp
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if defined (test_fnc_CURRENT_CODEHEADER)
+	#error Recursive inclusion of test_fnc code header.
+#endif
+#define	test_fnc_CURRENT_CODEHEADER
+
+#if ! defined (test_fnc_CODEHEADER_INCLUDED)
+#define	test_fnc_CODEHEADER_INCLUDED
+
+
+
+/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+
+
+
+template <class T>
+T	limit (const T &x, const T &inf, const T &sup)
+{
+	assert (! (sup < inf));
+
+	return ((x < inf) ? inf : ((sup < x) ? sup : x));
+}
+
+
+
+#endif	// test_fnc_CODEHEADER_INCLUDED
+
+#undef test_fnc_CURRENT_CODEHEADER
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/test_settings.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,45 @@
+/*****************************************************************************
+
+        test_settings.h
+        Copyright (c) 2005 Laurent de Soras
+
+--- Legal stuff ---
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+*Tab=3***********************************************************************/
+
+
+
+#if ! defined (test_settings_HEADER_INCLUDED)
+#define	test_settings_HEADER_INCLUDED
+
+#if defined (_MSC_VER)
+	#pragma once
+	#pragma warning (4 : 4250) // "Inherits via dominance."
+#endif
+
+
+
+// #undef this label to avoid speed test compilation.
+#define	test_settings_SPEED_TEST_ENABLED
+
+
+
+#endif	// test_settings_HEADER_INCLUDED
+
+
+
+/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/3rdparty/fftreal/testapp.dpr	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,150 @@
+program testapp;
+{$APPTYPE CONSOLE}
+uses
+  SysUtils,
+  fftreal in 'fftreal.pas',
+  Math,
+  Windows;
+
+var
+   nbr_points  : longint;
+   x, f        : pflt_array;
+   fft         : TFFTReal;
+   i           : longint;
+   PI          : double;
+   areal, img  : double;
+   f_abs       : double;
+   buffer_size : longint;
+   nbr_tests   : longint;
+   time0, time1, time2 : int64;
+   timereso    : int64;
+   offset      : longint;
+   t0, t1      : double;
+   nbr_s_chn   : longint;
+   tempp1, tempp2 : pflt_array;
+
+begin
+  (*______________________________________________
+   *
+   * Exactness test
+   *______________________________________________
+   *)
+
+  WriteLn('Accuracy test:');
+  WriteLn;
+
+  nbr_points := 16;       // Power of 2
+  GetMem(x, nbr_points * sizeof_flt);
+  GetMem(f, nbr_points * sizeof_flt);
+  fft := TFFTReal.Create(nbr_points);    // FFT object initialized here
+
+  // Test signal
+  PI := ArcTan(1) * 4;
+  for i := 0 to nbr_points-1 do
+  begin
+    x^[i] := -1 + sin (3*2*PI*i/nbr_points)
+                + cos (5*2*PI*i/nbr_points) * 2
+                - sin (7*2*PI*i/nbr_points) * 3
+                + cos (8*2*PI*i/nbr_points) * 5;
+  end;
+
+  // Compute FFT and IFFT
+  fft.do_fft(f, x);
+  fft.do_ifft(f, x);
+  fft.rescale(x);
+
+  // Display the result
+  WriteLn('FFT:');
+  for i := 0 to nbr_points div 2 do
+  begin
+    areal := f^[i];
+    if (i > 0) and (i < nbr_points div 2) then
+      img := f^[i + nbr_points div 2]
+    else
+      img := 0;
+
+    f_abs := Sqrt(areal * areal + img * img);
+    WriteLn(Format('%5d: %12.6f %12.6f (%12.6f)', [i, areal, img, f_abs]));
+  end;
+
+  WriteLn;
+  WriteLn('IFFT:');
+  for i := 0 to nbr_points-1 do
+    WriteLn(Format('%5d: %f', [i, x^[i]]));
+
+  WriteLn;
+
+  FreeMem(x);
+  FreeMem(f);
+  fft.Free;
+
+
+  (*______________________________________________
+   *
+   * Speed test
+   *______________________________________________
+   *)
+
+  WriteLn('Speed test:');
+  WriteLn('Please wait...');
+  WriteLn;
+
+  nbr_points := 1024;	          // Power of 2
+  buffer_size := 256*nbr_points;  // Number of flt_t (float or double)
+  nbr_tests := 10000;
+
+  assert(nbr_points <= buffer_size);
+  GetMem(x, buffer_size * sizeof_flt);
+  GetMem(f, buffer_size * sizeof_flt);
+  fft := TFFTReal.Create(nbr_points);					// FFT object initialized here
+
+  // Test signal: noise
+  for i := 0 to nbr_points-1 do
+    x^[i] := Random($7fff) - ($7fff shr 1);
+
+  // timing
+  QueryPerformanceFrequency(timereso);
+  QueryPerformanceCounter(time0);
+
+  for i := 0 to nbr_tests-1 do
+  begin
+    offset := (i * nbr_points) and (buffer_size - 1);
+    tempp1 := f;
+    inc(tempp1, offset);
+    tempp2 := x;
+    inc(tempp2, offset);
+    fft.do_fft(tempp1, tempp2);
+  end;
+
+  QueryPerformanceCounter(time1);
+
+  for i := 0 to nbr_tests-1 do
+  begin
+    offset := (i * nbr_points) and (buffer_size - 1);
+    tempp1 := f;
+    inc(tempp1, offset);
+    tempp2 := x;
+    inc(tempp2, offset);
+    fft.do_ifft(tempp1, tempp2);
+    fft.rescale(x);
+  end;
+
+  QueryPerformanceCounter(time2);
+
+  t0 := ((time1-time0) / timereso) / nbr_tests;
+  t1 := ((time2-time1) / timereso) / nbr_tests;
+
+  WriteLn(Format('%d-points FFT           : %.0f us.', [nbr_points, t0 * 1000000]));
+  WriteLn(Format('%d-points IFFT + scaling: %.0f us.', [nbr_points, t1 * 1000000]));
+
+  nbr_s_chn := Floor(nbr_points / ((t0 + t1) * 44100 * 2));
+  WriteLn(Format('Peak performance: FFT+IFFT on %d mono channels at 44.1 KHz (with overlapping)', [nbr_s_chn]));
+  WriteLn;
+
+  FreeMem(x);
+  FreeMem(f);
+  fft.Free;
+
+  WriteLn('Press [Return] key to terminate...');
+  ReadLn;
+end.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/README.txt	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,103 @@
+Spectrum analyser demo app
+==========================
+
+Introduction
+------------
+
+This application is a demo which uses the QtMultimedia APIs to capture and play back PCM audio.  While either recording or playback is ongoing, the application performs real-time level and frequency spectrum analysis, displaying the results in its main window.
+
+
+Acknowledgments
+---------------
+
+The application uses the FFTReal v2.00 library by Laurent de Soras to perform frequency analysis of the audio signal.  For further information, see the project home page:
+    http://ldesoras.free.fr/prod.html
+
+
+Quick start
+-----------
+
+Play generated tone
+1. Select 'Play generated tone' from the mode menu
+2. Ensure that the 'Frequency sweep' box is checked
+3. Press 'OK'
+4. Press the play button
+You should hear a rising tone, and see progressively higher frequencies indicated by the spectrograph.
+
+Record and playback
+1. Select 'Record and play back audio' from the mode menu
+2. Press the record button, and speak into the microphone
+3. Wait until the buffer is full (shown as a full blue bar in the top widget)
+4. Press play, and wait until playback of the buffer is complete
+
+Play file
+1. Select 'Play file' from the mode menu
+2. Select a WAV file
+3. Press the play button
+You should hear the first few seconds of the file being played.  The waveform, spectrograph and level meter should be updated as the file is played.
+
+
+Things to play with
+-------------------
+
+Try repeating the 'Play generated tone' sequence using different window functions.  These can be selected from the  settings dialog - launch it by pressing the spanner icon.  The window function is applied to the audio signal before performing the frequency analysis; different windows should have a visible effect on the resulting frequency spectrum.
+
+Try clicking on one of the spectrograph bars while the tone is being played.  The frequency range for that bar will be displayed at the top of the application window.
+
+
+Troubleshooting
+---------------
+
+If either recording or playback do not work, you may need to select a different input / output audio device.  This can be done in the settings dialog - launch it by pressing the spanner icon.
+
+If that doesn't work, there may be a problem either in the application or in Qt.  Report a bug in the usual way.
+
+
+Application interface
+---------------------
+
+The main window of the application contains the following widgets, starting at the top:
+
+Message box
+This shows various messages during execution, such as the current audio format.
+
+Progress bar / waveform display
+- While recording or playback is ongoing, the audio waveform is displayed, sliding from right to left.
+- Superimposed on the waveform, the amount of data currently in the buffer is showed as a blue bar.  When recording, this blue bar fills up from left to right; when playing, the bar gets consumed from left to right.
+- A green window shows which part of the buffer has most recently been analysed.  This window should be close to the 'leading edge' of recording or playback, i.e. the most recently recorded / played data, although it will lag slightly depending on the performance of the machine on which the application is running.
+
+Frequency spectrograph (on the left)
+The spectrograph shows 10 bars, each representing a frequency range.  The frequency range of each bar is displayed in the message box when the bar is clicked.  The height of the bar shows the maximum amplitude of freqencies within its range.
+
+Level meter (on the right)
+The current peak audio level is shown as a pink bar; the current RMS level is shown as a red bar.  The 'high water mark' during a recent period is shown as a thin red line.
+
+Button panel
+- The mode menu allows switching between the three operation modes - 'Play generated tone', 'Record and play back' and 'Play file'.
+- The record button starts or resumes audio capture from the current input device.
+- The pause button suspends either capture or recording.
+- The play button starts or resumes audio playback to the current output device.
+- The settings button launches the settings dialog.
+
+
+Hacking
+-------
+
+If you want to hack the application, here are some pointers to get started.
+
+The spectrum.pri file contains several macros which you can enable by uncommenting:
+- LOG_FOO      Enable logging from class Foo via qDebug()
+- DUMP_FOO     Dump data from class Foo to the file system
+               e.g. DUMP_SPECTRUMANALYSER writes files containing the raw FFT input and output.
+               Be aware that this can generate a *lot* of data and may slow the app down considerably.
+- DISABLE_FOO  Disable specified functionality
+
+If you don't like the combination of the waveform and progress bar in a single widget, separate them by commenting out SUPERIMPOSE_PROGRESS_ON_WAVEFORM.
+
+The spectrum.h file defines a number of parameters which can be played with.  These control things such as the number of audio samples analysed per FFT calculation, the range and number of bands displayed by the spectrograph, and so on.
+
+The part of the application which interacts with QtMultimedia is in the Engine class.
+
+Some ideas for enhancements to the app are listed in TODO.txt.  Feel free to start work on any of them :)
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/TODO.txt	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,34 @@
+TODO list for spectrum analyser
+===============================
+
+Bug fixes
+---------
+
+
+New features
+------------
+
+* Wrap user-visible strings in tr()
+
+* Allow user to set frequency range
+There should be some constraints on this, e.g.
+	- Maximum frequency must not be greater than Nyquist frequency
+	- Range is divisible by number of bars?
+
+* Add more visualizers other than bar spectrogram
+e.g. Funky OpenGL visualizers, particle effects etc
+
+
+Non-functional stuff
+--------------------
+
+* Improve robustness of QComboBox -> enum mapping
+At the moment, SettingsDialog relies on casting the combobox item index directly to the enumerated type.  This is clearly a bit fragile...
+
+* For functions which take or return qint64 values, make a clear distinction between duration (microseconds) and length (bytes).
+A sensible convention would be that the default is bytes - i.e. microseconds must be indicated by adding a Us suffix, where not already obvious from the function name.
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/app.pro	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,121 @@
+include(../spectrum.pri)
+
+TEMPLATE = app
+
+TARGET = spectrum
+unix: !macx: !symbian: TARGET = spectrum.bin
+
+QT       += multimedia
+
+SOURCES  += main.cpp \
+            engine.cpp \
+            frequencyspectrum.cpp \
+            levelmeter.cpp \
+            mainwidget.cpp \
+            progressbar.cpp \
+            settingsdialog.cpp \
+            spectrograph.cpp \
+            spectrumanalyser.cpp \
+            tonegenerator.cpp \
+            tonegeneratordialog.cpp \
+            utils.cpp \
+            waveform.cpp \
+            wavfile.cpp
+
+HEADERS  += engine.h \
+            frequencyspectrum.h \
+            levelmeter.h \
+            mainwidget.h \
+            progressbar.h \
+            settingsdialog.h \
+            spectrograph.h \
+            spectrum.h \
+            spectrumanalyser.h \
+            tonegenerator.h \
+            tonegeneratordialog.h \
+            utils.h \
+            waveform.h \
+            wavfile.h
+
+fftreal_dir = ../3rdparty/fftreal
+
+INCLUDEPATH += $${fftreal_dir}
+
+RESOURCES = spectrum.qrc
+
+symbian {
+    # Platform security capability required to record audio on Symbian
+    TARGET.CAPABILITY += UserEnvironment
+
+    # Provide unique ID for the generated binary, required by Symbian OS
+    TARGET.UID3 = 0xA000E3FA
+}
+
+
+# Dynamic linkage against FFTReal DLL
+!contains(DEFINES, DISABLE_FFT) {
+    symbian {
+        # Must explicitly add the .dll suffix to ensure dynamic linkage
+        LIBS += -lfftreal.dll
+    } else {
+        macx {
+            # Link to fftreal framework
+            LIBS += -F$${fftreal_dir}
+            LIBS += -framework fftreal
+        } else {
+            # Link to dynamic library which is written to ../bin
+            LIBS += -L../bin
+            LIBS += -lfftreal
+        }
+    }
+}
+
+
+# Deployment
+
+symbian {
+    include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
+
+    !contains(DEFINES, DISABLE_FFT) {
+        # Include FFTReal DLL in the SIS file
+        fftreal.sources = $${EPOCROOT}epoc32/release/$(PLATFORM)/$(TARGET)/fftreal.dll
+        fftreal.path = !:/sys/bin
+        DEPLOYMENT += fftreal
+    }
+} else {
+    macx {
+        # Specify directory in which to create spectrum.app bundle
+        DESTDIR = ..
+
+        !contains(DEFINES, DISABLE_FFT) {
+            # Relocate fftreal.framework into spectrum.app bundle
+            framework_dir = ../spectrum.app/Contents/Frameworks
+            framework_name = fftreal.framework/Versions/1/fftreal
+            QMAKE_POST_LINK = \
+                mkdir -p $${framework_dir} &&\
+                rm -rf $${framework_dir}/fftreal.framework &&\
+                cp -R $${fftreal_dir}/fftreal.framework $${framework_dir} &&\
+                install_name_tool -id @executable_path/../Frameworks/$${framework_name} \
+                                  $${framework_dir}/$${framework_name} &&\
+                install_name_tool -change $${framework_name} \
+                                  @executable_path/../Frameworks/$${framework_name} \
+                                  ../spectrum.app/Contents/MacOS/spectrum
+        }
+    } else {
+        # Specify directory in which to create spectrum application
+        DESTDIR = ../bin
+
+        unix: !symbian {
+            # On unices other than Mac OSX, we copy a shell script into the bin directory.
+            # This script takes care of correctly setting the LD_LIBRARY_PATH so that
+            # the dynamic library can be located.
+            copy_launch_script.target = copy_launch_script
+            copy_launch_script.commands = \
+                install -m 0555 spectrum.sh ../bin/spectrum
+            QMAKE_EXTRA_TARGETS += copy_launch_script
+            POST_TARGETDEPS += copy_launch_script
+        }
+    }
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/engine.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,752 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "engine.h"
+#include "tonegenerator.h"
+#include "utils.h"
+
+#include <math.h>
+
+#include <QCoreApplication>
+#include <QMetaObject>
+#include <QSet>
+#include <QtMultimedia/QAudioInput>
+#include <QtMultimedia/QAudioOutput>
+#include <QDebug>
+#include <QThread>
+#include <QFile>
+
+//-----------------------------------------------------------------------------
+// Constants
+//-----------------------------------------------------------------------------
+
+const qint64 BufferDurationUs       = 10 * 1000000;
+const int    NotifyIntervalMs       = 100;
+
+// Size of the level calculation window in microseconds
+const int    LevelWindowUs          = 0.1 * 1000000;
+
+
+//-----------------------------------------------------------------------------
+// Helper functions
+//-----------------------------------------------------------------------------
+
+QDebug& operator<<(QDebug &debug, const QAudioFormat &format)
+{
+    debug << format.frequency() << "Hz"
+          << format.channels() << "channels";
+    return debug;
+}
+
+//-----------------------------------------------------------------------------
+// Constructor and destructor
+//-----------------------------------------------------------------------------
+
+Engine::Engine(QObject *parent)
+    :   QObject(parent)
+    ,   m_mode(QAudio::AudioInput)
+    ,   m_state(QAudio::StoppedState)
+    ,   m_generateTone(false)
+    ,   m_file(0)
+    ,   m_availableAudioInputDevices
+            (QAudioDeviceInfo::availableDevices(QAudio::AudioInput))
+    ,   m_audioInputDevice(QAudioDeviceInfo::defaultInputDevice())
+    ,   m_audioInput(0)
+    ,   m_audioInputIODevice(0)
+    ,   m_recordPosition(0)
+    ,   m_availableAudioOutputDevices
+            (QAudioDeviceInfo::availableDevices(QAudio::AudioOutput))
+    ,   m_audioOutputDevice(QAudioDeviceInfo::defaultOutputDevice())
+    ,   m_audioOutput(0)
+    ,   m_playPosition(0)
+    ,   m_dataLength(0)
+    ,   m_rmsLevel(0.0)
+    ,   m_peakLevel(0.0)
+    ,   m_spectrumLengthBytes(0)
+    ,   m_spectrumAnalyser()
+    ,   m_spectrumPosition(0)
+    ,   m_count(0)
+{
+    qRegisterMetaType<FrequencySpectrum>("FrequencySpectrum");
+    CHECKED_CONNECT(&m_spectrumAnalyser,
+                    SIGNAL(spectrumChanged(FrequencySpectrum)),
+                    this,
+                    SLOT(spectrumChanged(FrequencySpectrum)));
+
+    initialize();
+
+#ifdef DUMP_DATA
+    createOutputDir();
+#endif
+
+#ifdef DUMP_SPECTRUM
+    m_spectrumAnalyser.setOutputPath(outputPath());
+#endif
+}
+
+Engine::~Engine()
+{
+
+}
+
+//-----------------------------------------------------------------------------
+// Public functions
+//-----------------------------------------------------------------------------
+
+bool Engine::loadFile(const QString &fileName)
+{
+    bool result = false;
+    m_generateTone = false;
+
+    Q_ASSERT(!fileName.isEmpty());
+    Q_ASSERT(!m_file);
+    m_file = new QFile(fileName, this);
+    m_file->setFileName(fileName);
+    Q_ASSERT(m_file->exists());
+    if (m_file->open(QFile::ReadOnly)) {
+        m_wavFile.readHeader(*m_file);
+        if (isPCMS16LE(m_wavFile.format())) {
+            result = initialize();
+        } else {
+            emit errorMessage(tr("Audio format not supported"),
+                              formatToString(m_wavFile.format()));
+        }
+    } else {
+        emit errorMessage(tr("Could not open file"), fileName);
+    }
+
+    delete m_file;
+    m_file = 0;
+
+    return result;
+}
+
+bool Engine::generateTone(const Tone &tone)
+{
+    Q_ASSERT(!m_file);
+    m_generateTone = true;
+    m_tone = tone;
+    ENGINE_DEBUG << "Engine::generateTone"
+                 << "startFreq" << m_tone.startFreq
+                 << "endFreq" << m_tone.endFreq
+                 << "amp" << m_tone.amplitude;
+    return initialize();
+}
+
+bool Engine::generateSweptTone(qreal amplitude)
+{
+    Q_ASSERT(!m_file);
+    m_generateTone = true;
+    m_tone.startFreq = 1;
+    m_tone.endFreq = 0;
+    m_tone.amplitude = amplitude;
+    ENGINE_DEBUG << "Engine::generateSweptTone"
+                 << "startFreq" << m_tone.startFreq
+                 << "amp" << m_tone.amplitude;
+    return initialize();
+}
+
+bool Engine::initializeRecord()
+{
+    ENGINE_DEBUG << "Engine::initializeRecord";
+    Q_ASSERT(!m_file);
+    m_generateTone = false;
+    m_tone = SweptTone();
+    return initialize();
+}
+
+qint64 Engine::bufferDuration() const
+{
+    return BufferDurationUs;
+}
+
+qint64 Engine::dataDuration() const
+{
+    qint64 result = 0;
+    if (QAudioFormat() != m_format)
+        result = audioDuration(m_format, m_dataLength);
+    return result;
+}
+
+qint64 Engine::audioBufferLength() const
+{
+    qint64 length = 0;
+    if (QAudio::ActiveState == m_state || QAudio::IdleState == m_state) {
+        Q_ASSERT(QAudioFormat() != m_format);
+        switch (m_mode) {
+        case QAudio::AudioInput:
+            length = m_audioInput->bufferSize();
+            break;
+        case QAudio::AudioOutput:
+            length = m_audioOutput->bufferSize();
+            break;
+        }
+    }
+    return length;
+}
+
+void Engine::setWindowFunction(WindowFunction type)
+{
+    m_spectrumAnalyser.setWindowFunction(type);
+}
+
+
+//-----------------------------------------------------------------------------
+// Public slots
+//-----------------------------------------------------------------------------
+
+void Engine::startRecording()
+{
+    if (m_audioInput) {
+        if (QAudio::AudioInput == m_mode &&
+            QAudio::SuspendedState == m_state) {
+            m_audioInput->resume();
+        } else {
+            m_spectrumAnalyser.cancelCalculation();
+            spectrumChanged(0, 0, FrequencySpectrum());
+
+            m_buffer.fill(0);
+            setRecordPosition(0, true);
+            stopPlayback();
+            m_mode = QAudio::AudioInput;
+            CHECKED_CONNECT(m_audioInput, SIGNAL(stateChanged(QAudio::State)),
+                            this, SLOT(audioStateChanged(QAudio::State)));
+            CHECKED_CONNECT(m_audioInput, SIGNAL(notify()),
+                            this, SLOT(audioNotify()));
+            m_count = 0;
+            m_dataLength = 0;
+            emit dataDurationChanged(0);
+            m_audioInputIODevice = m_audioInput->start();
+            CHECKED_CONNECT(m_audioInputIODevice, SIGNAL(readyRead()),
+                            this, SLOT(audioDataReady()));
+        }
+    }
+}
+
+void Engine::startPlayback()
+{
+    if (m_audioOutput) {
+        if (QAudio::AudioOutput == m_mode &&
+            QAudio::SuspendedState == m_state) {
+#ifdef Q_OS_WIN
+            // The Windows backend seems to internally go back into ActiveState
+            // while still returning SuspendedState, so to ensure that it doesn't
+            // ignore the resume() call, we first re-suspend
+            m_audioOutput->suspend();
+#endif
+            m_audioOutput->resume();
+        } else {
+            m_spectrumAnalyser.cancelCalculation();
+            spectrumChanged(0, 0, FrequencySpectrum());
+
+            setPlayPosition(0, true);
+            stopRecording();
+            m_mode = QAudio::AudioOutput;
+            CHECKED_CONNECT(m_audioOutput, SIGNAL(stateChanged(QAudio::State)),
+                            this, SLOT(audioStateChanged(QAudio::State)));
+            CHECKED_CONNECT(m_audioOutput, SIGNAL(notify()),
+                            this, SLOT(audioNotify()));
+            m_count = 0;
+            m_audioOutputIODevice.close();
+            m_audioOutputIODevice.setBuffer(&m_buffer);
+            m_audioOutputIODevice.open(QIODevice::ReadOnly);
+            m_audioOutput->start(&m_audioOutputIODevice);
+        }
+    }
+}
+
+void Engine::suspend()
+{
+    if (QAudio::ActiveState == m_state ||
+        QAudio::IdleState == m_state) {
+        switch (m_mode) {
+        case QAudio::AudioInput:
+            m_audioInput->suspend();
+            break;
+        case QAudio::AudioOutput:
+            m_audioOutput->suspend();
+            break;
+        }
+    }
+}
+
+void Engine::setAudioInputDevice(const QAudioDeviceInfo &device)
+{
+    if (device.deviceName() != m_audioInputDevice.deviceName()) {
+        m_audioInputDevice = device;
+        initialize();
+    }
+}
+
+void Engine::setAudioOutputDevice(const QAudioDeviceInfo &device)
+{
+    if (device.deviceName() != m_audioOutputDevice.deviceName()) {
+        m_audioOutputDevice = device;
+        initialize();
+    }
+}
+
+
+//-----------------------------------------------------------------------------
+// Private slots
+//-----------------------------------------------------------------------------
+
+void Engine::audioNotify()
+{
+    switch (m_mode) {
+    case QAudio::AudioInput: {
+            const qint64 recordPosition =
+                    qMin(BufferDurationUs, m_audioInput->processedUSecs());
+            setRecordPosition(recordPosition);
+
+            // Calculate level of most recently captured data
+            qint64 levelLength = audioLength(m_format, LevelWindowUs);
+            levelLength = qMin(m_dataLength, levelLength);
+            const qint64 levelPosition = m_dataLength - levelLength;
+            calculateLevel(levelPosition, levelLength);
+
+            // Calculate spectrum of most recently captured data
+            if (m_dataLength >= m_spectrumLengthBytes) {
+                const qint64 spectrumPosition = m_dataLength - m_spectrumLengthBytes;
+                calculateSpectrum(spectrumPosition);
+            }
+        }
+        break;
+    case QAudio::AudioOutput: {
+            const qint64 playPosition =
+                    qMin(dataDuration(), m_audioOutput->processedUSecs());
+            setPlayPosition(playPosition);
+
+            qint64 analysisPosition = audioLength(m_format, playPosition);
+
+            // Calculate level of data starting at current playback position
+            const qint64 levelLength = audioLength(m_format, LevelWindowUs);
+            if (analysisPosition + levelLength < m_dataLength)
+                calculateLevel(analysisPosition, levelLength);
+
+            if (analysisPosition + m_spectrumLengthBytes < m_dataLength)
+                calculateSpectrum(analysisPosition);
+
+            if (dataDuration() == playPosition)
+                stopPlayback();
+        }
+        break;
+    }
+}
+
+void Engine::audioStateChanged(QAudio::State state)
+{
+    ENGINE_DEBUG << "Engine::audioStateChanged from" << m_state
+                 << "to" << state;
+
+    if (QAudio::StoppedState == state) {
+        // Check error
+        QAudio::Error error = QAudio::NoError;
+        switch (m_mode) {
+        case QAudio::AudioInput:
+            error = m_audioInput->error();
+            break;
+        case QAudio::AudioOutput:
+            error = m_audioOutput->error();
+            break;
+        }
+        if (QAudio::NoError != error) {
+            reset();
+            return;
+        }
+    }
+    setState(state);
+}
+
+void Engine::audioDataReady()
+{
+    const qint64 bytesReady = m_audioInput->bytesReady();
+    const qint64 bytesSpace = m_buffer.size() - m_dataLength;
+    const qint64 bytesToRead = qMin(bytesReady, bytesSpace);
+
+    const qint64 bytesRead = m_audioInputIODevice->read(
+                                       m_buffer.data() + m_dataLength,
+                                       bytesToRead);
+
+    if (bytesRead) {
+        m_dataLength += bytesRead;
+
+        const qint64 duration = audioDuration(m_format, m_dataLength);
+        emit dataDurationChanged(duration);
+    }
+
+    if (m_buffer.size() == m_dataLength)
+        stopRecording();
+}
+
+void Engine::spectrumChanged(const FrequencySpectrum &spectrum)
+{
+    ENGINE_DEBUG << "Engine::spectrumChanged" << "pos" << m_spectrumPosition;
+    const qint64 positionUs = audioDuration(m_format, m_spectrumPosition);
+    const qint64 lengthUs = audioDuration(m_format, m_spectrumLengthBytes);
+    emit spectrumChanged(positionUs, lengthUs, spectrum);
+}
+
+
+//-----------------------------------------------------------------------------
+// Private functions
+//-----------------------------------------------------------------------------
+
+void Engine::reset()
+{
+    stopRecording();
+    stopPlayback();
+    setState(QAudio::AudioInput, QAudio::StoppedState);
+    setFormat(QAudioFormat());
+    delete m_audioInput;
+    m_audioInput = 0;
+    m_audioInputIODevice = 0;
+    setRecordPosition(0);
+    delete m_audioOutput;
+    m_audioOutput = 0;
+    setPlayPosition(0);
+    m_buffer.clear();
+    m_dataLength = 0;
+    m_spectrumPosition = 0;
+    emit dataDurationChanged(0);
+    setLevel(0.0, 0.0, 0);
+}
+
+bool Engine::initialize()
+{
+    bool result = false;
+
+    reset();
+
+    if (selectFormat()) {
+        const qint64 bufferLength = audioLength(m_format, BufferDurationUs);
+        m_buffer.resize(bufferLength);
+        m_buffer.fill(0);
+        emit bufferDurationChanged(BufferDurationUs);
+
+        if (m_generateTone) {
+            if (0 == m_tone.endFreq) {
+                const qreal nyquist = nyquistFrequency(m_format);
+                m_tone.endFreq = qMin(qreal(SpectrumHighFreq), nyquist);
+            }
+
+            // Call function defined in utils.h, at global scope
+            ::generateTone(m_tone, m_format, m_buffer);
+            m_dataLength = m_buffer.size();
+            emit dataDurationChanged(bufferDuration());
+            setRecordPosition(bufferDuration());
+            result = true;
+        } else if (m_file) {
+            const qint64 length = m_wavFile.readData(*m_file, m_buffer, m_format);
+            if (length) {
+                m_dataLength = length;
+                emit dataDurationChanged(dataDuration());
+                setRecordPosition(dataDuration());
+                result = true;
+            }
+        } else {
+            m_audioInput = new QAudioInput(m_audioInputDevice, m_format, this);
+            m_audioInput->setNotifyInterval(NotifyIntervalMs);
+            result = true;
+        }
+
+        m_audioOutput = new QAudioOutput(m_audioOutputDevice, m_format, this);
+        m_audioOutput->setNotifyInterval(NotifyIntervalMs);
+        m_spectrumLengthBytes = SpectrumLengthSamples *
+                                (m_format.sampleSize() / 8) * m_format.channels();
+    } else {
+        if (m_file)
+            emit errorMessage(tr("Audio format not supported"),
+                              formatToString(m_format));
+        else if (m_generateTone)
+            emit errorMessage(tr("No suitable format found"), "");
+        else
+            emit errorMessage(tr("No common input / output format found"), "");
+    }
+
+    ENGINE_DEBUG << "Engine::initialize" << "format" << m_format;
+
+    return result;
+}
+
+bool Engine::selectFormat()
+{
+    bool foundSupportedFormat = false;
+
+    if (m_file) {
+        // Header is read from the WAV file; just need to check whether
+        // it is supported by the audio output device
+        QAudioFormat format = m_wavFile.format();
+        if (m_audioOutputDevice.isFormatSupported(m_wavFile.format())) {
+            setFormat(m_wavFile.format());
+            foundSupportedFormat = true;
+        } else {
+            // Try flipping mono <-> stereo
+            const int channels = (format.channels() == 1) ? 2 : 1;
+            format.setChannels(channels);
+            if (m_audioOutputDevice.isFormatSupported(format)) {
+                setFormat(format);
+                foundSupportedFormat = true;
+            }
+        }
+    } else {
+
+        QList<int> frequenciesList;
+    #ifdef Q_OS_WIN
+        // The Windows audio backend does not correctly report format support
+        // (see QTBUG-9100).  Furthermore, although the audio subsystem captures
+        // at 11025Hz, the resulting audio is corrupted.
+        frequenciesList += 8000;
+    #endif
+
+        if (!m_generateTone)
+            frequenciesList += m_audioInputDevice.supportedFrequencies();
+
+        frequenciesList += m_audioOutputDevice.supportedFrequencies();
+        frequenciesList = frequenciesList.toSet().toList(); // remove duplicates
+        qSort(frequenciesList);
+        ENGINE_DEBUG << "Engine::initialize frequenciesList" << frequenciesList;
+
+        QList<int> channelsList;
+        channelsList += m_audioInputDevice.supportedChannels();
+        channelsList += m_audioOutputDevice.supportedChannels();
+        channelsList = channelsList.toSet().toList();
+        qSort(channelsList);
+        ENGINE_DEBUG << "Engine::initialize channelsList" << channelsList;
+
+        QAudioFormat format;
+        format.setByteOrder(QAudioFormat::LittleEndian);
+        format.setCodec("audio/pcm");
+        format.setSampleSize(16);
+        format.setSampleType(QAudioFormat::SignedInt);
+        int frequency, channels;
+        foreach (frequency, frequenciesList) {
+            if (foundSupportedFormat)
+                break;
+            format.setFrequency(frequency);
+            foreach (channels, channelsList) {
+                format.setChannels(channels);
+                const bool inputSupport = m_generateTone ||
+                                          m_audioInputDevice.isFormatSupported(format);
+                const bool outputSupport = m_audioOutputDevice.isFormatSupported(format);
+                ENGINE_DEBUG << "Engine::initialize checking " << format
+                             << "input" << inputSupport
+                             << "output" << outputSupport;
+                if (inputSupport && outputSupport) {
+                    foundSupportedFormat = true;
+                    break;
+                }
+            }
+        }
+
+        if (!foundSupportedFormat)
+            format = QAudioFormat();
+
+        setFormat(format);
+    }
+
+    return foundSupportedFormat;
+}
+
+void Engine::stopRecording()
+{
+    if (m_audioInput) {
+        m_audioInput->stop();
+        QCoreApplication::instance()->processEvents();
+        m_audioInput->disconnect();
+    }
+    m_audioInputIODevice = 0;
+
+#ifdef DUMP_AUDIO
+    dumpData();
+#endif
+}
+
+void Engine::stopPlayback()
+{
+    if (m_audioOutput) {
+        m_audioOutput->stop();
+        QCoreApplication::instance()->processEvents();
+        m_audioOutput->disconnect();
+        setPlayPosition(0);
+    }
+}
+
+void Engine::setState(QAudio::State state)
+{
+    const bool changed = (m_state != state);
+    m_state = state;
+    if (changed)
+        emit stateChanged(m_mode, m_state);
+}
+
+void Engine::setState(QAudio::Mode mode, QAudio::State state)
+{
+    const bool changed = (m_mode != mode || m_state != state);
+    m_mode = mode;
+    m_state = state;
+    if (changed)
+        emit stateChanged(m_mode, m_state);
+}
+
+void Engine::setRecordPosition(qint64 position, bool forceEmit)
+{
+    const bool changed = (m_recordPosition != position);
+    m_recordPosition = position;
+    if (changed || forceEmit)
+        emit recordPositionChanged(m_recordPosition);
+}
+
+void Engine::setPlayPosition(qint64 position, bool forceEmit)
+{
+    const bool changed = (m_playPosition != position);
+    m_playPosition = position;
+    if (changed || forceEmit)
+        emit playPositionChanged(m_playPosition);
+}
+
+void Engine::calculateLevel(qint64 position, qint64 length)
+{
+#ifdef DISABLE_LEVEL
+    Q_UNUSED(position)
+    Q_UNUSED(length)
+#else
+    Q_ASSERT(position + length <= m_dataLength);
+
+    qreal peakLevel = 0.0;
+
+    qreal sum = 0.0;
+    const char *ptr = m_buffer.constData() + position;
+    const char *const end = ptr + length;
+    while (ptr < end) {
+        const qint16 value = *reinterpret_cast<const qint16*>(ptr);
+        const qreal fracValue = pcmToReal(value);
+        peakLevel = qMax(peakLevel, fracValue);
+        sum += fracValue * fracValue;
+        ptr += 2;
+    }
+    const int numSamples = length / 2;
+    qreal rmsLevel = sqrt(sum / numSamples);
+
+    rmsLevel = qMax(qreal(0.0), rmsLevel);
+    rmsLevel = qMin(qreal(1.0), rmsLevel);
+    setLevel(rmsLevel, peakLevel, numSamples);
+
+    ENGINE_DEBUG << "Engine::calculateLevel" << "pos" << position << "len" << length
+                 << "rms" << rmsLevel << "peak" << peakLevel;
+#endif
+}
+
+void Engine::calculateSpectrum(qint64 position)
+{
+#ifdef DISABLE_SPECTRUM
+    Q_UNUSED(position)
+#else
+    Q_ASSERT(position + m_spectrumLengthBytes <= m_dataLength);
+    Q_ASSERT(0 == m_spectrumLengthBytes % 2); // constraint of FFT algorithm
+
+    // QThread::currentThread is marked 'for internal use only', but
+    // we're only using it for debug output here, so it's probably OK :)
+    ENGINE_DEBUG << "Engine::calculateSpectrum" << QThread::currentThread()
+                 << "count" << m_count << "pos" << position << "len" << m_spectrumLengthBytes
+                 << "spectrumAnalyser.isReady" << m_spectrumAnalyser.isReady();
+
+    if(m_spectrumAnalyser.isReady()) {
+        m_spectrumBuffer = QByteArray::fromRawData(m_buffer.constData() + position,
+                                                   m_spectrumLengthBytes);
+        m_spectrumPosition = position;
+        m_spectrumAnalyser.calculate(m_spectrumBuffer, m_format);
+    }
+#endif
+}
+
+void Engine::setFormat(const QAudioFormat &format)
+{
+    const bool changed = (format != m_format);
+    m_format = format;
+    if (changed)
+        emit formatChanged(m_format);
+}
+
+void Engine::setLevel(qreal rmsLevel, qreal peakLevel, int numSamples)
+{
+    m_rmsLevel = rmsLevel;
+    m_peakLevel = peakLevel;
+    emit levelChanged(m_rmsLevel, m_peakLevel, numSamples);
+}
+
+#ifdef DUMP_DATA
+void Engine::createOutputDir()
+{
+    m_outputDir.setPath("output");
+
+    // Ensure output directory exists and is empty
+    if (m_outputDir.exists()) {
+        const QStringList files = m_outputDir.entryList(QDir::Files);
+        QString file;
+        foreach (file, files)
+            m_outputDir.remove(file);
+    } else {
+        QDir::current().mkdir("output");
+    }
+}
+#endif // DUMP_DATA
+
+#ifdef DUMP_AUDIO
+void Engine::dumpData()
+{
+    const QString txtFileName = m_outputDir.filePath("data.txt");
+    QFile txtFile(txtFileName);
+    txtFile.open(QFile::WriteOnly | QFile::Text);
+    QTextStream stream(&txtFile);
+    const qint16 *ptr = reinterpret_cast<const qint16*>(m_buffer.constData());
+    const int numSamples = m_dataLength / (2 * m_format.channels());
+    for (int i=0; i<numSamples; ++i) {
+        stream << i << "\t" << *ptr << "\n";
+        ptr += m_format.channels();
+    }
+
+    const QString pcmFileName = m_outputDir.filePath("data.pcm");
+    QFile pcmFile(pcmFileName);
+    pcmFile.open(QFile::WriteOnly);
+    pcmFile.write(m_buffer.constData(), m_dataLength);
+}
+#endif // DUMP_AUDIO
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/engine.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,311 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are met:
+** - Redistributions of source code must retain the above copyright notice,
+**   this list of conditions and the following disclaimer.
+** - Redistributions in binary form must reproduce the above copyright notice,
+**   this list of conditions and the following disclaimer in the documentation
+**   and/or other materials provided with the distribution.
+** - Neither the name of Nokia Corporation and its Subsidiary(-ies) nor the
+**   names of its contributors may be used to endorse or promote products
+**   derived from this software without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+** POSSIBILITY OF SUCH DAMAGE.
+** $QT_END_LICENSE$
+**
+*****************************************************************************/
+
+#ifndef ENGINE_H
+#define ENGINE_H
+
+#include "spectrum.h"
+#include "spectrumanalyser.h"
+#include "wavfile.h"
+
+#include <QObject>
+#include <QByteArray>
+#include <QBuffer>
+#include <QVector>
+#include <QtMultimedia/QAudioDeviceInfo>
+#include <QtMultimedia/QAudioFormat>
+
+#ifdef DUMP_CAPTURED_AUDIO
+#define DUMP_DATA
+#endif
+
+#ifdef DUMP_SPECTRUM
+#define DUMP_DATA
+#endif
+
+#ifdef DUMP_DATA
+#include <QDir>
+#endif
+
+class QAudioInput;
+class QAudioOutput;
+class FrequencySpectrum;
+class QFile;
+
+/**
+ * This class interfaces with the QtMultimedia audio classes, and also with
+ * the SpectrumAnalyser class.  Its role is to manage the capture and playback
+ * of audio data, meanwhile performing real-time analysis of the audio level
+ * and frequency spectrum.
+ */
+class Engine : public QObject {
+    Q_OBJECT
+public:
+    Engine(QObject *parent = 0);
+    ~Engine();
+
+    const QList<QAudioDeviceInfo>& availableAudioInputDevices() const
+                                    { return m_availableAudioInputDevices; }
+
+    const QList<QAudioDeviceInfo>& availableAudioOutputDevices() const
+                                    { return m_availableAudioOutputDevices; }
+
+    QAudio::Mode mode() const       { return m_mode; }
+    QAudio::State state() const     { return m_state; }
+
+    /**
+     * \return Reference to internal audio buffer
+     * \note This reference is valid for the lifetime of the Engine
+     */
+    const QByteArray& buffer() const    { return m_buffer; }
+
+    /**
+     * \return Current audio format
+     * \note May be QAudioFormat() if engine is not initialized
+     */
+    const QAudioFormat& format() const  { return m_format; }
+
+    /**
+     * Stop any ongoing recording or playback, and reset to ground state.
+     */
+    void reset();
+
+    /**
+     * Load data from WAV file
+     */
+    bool loadFile(const QString &fileName);
+
+    /**
+     * Generate tone
+     */
+    bool generateTone(const Tone &tone);
+
+    /**
+     * Generate tone
+     */
+    bool generateSweptTone(qreal amplitude);
+
+    /**
+     * Initialize for recording
+     */
+    bool initializeRecord();
+
+    /**
+     * Position of the audio input device.
+     * \return Position in microseconds.
+     */
+    qint64 recordPosition() const   { return m_recordPosition; }
+
+    /**
+     * RMS level of the most recently processed set of audio samples.
+     * \return Level in range (0.0, 1.0)
+     */
+    qreal rmsLevel() const          { return m_rmsLevel; }
+
+    /**
+     * Peak level of the most recently processed set of audio samples.
+     * \return Level in range (0.0, 1.0)
+     */
+    qreal peakLevel() const         { return m_peakLevel; }
+
+    /**
+     * Position of the audio output device.
+     * \return Position in microseconds.
+     */
+    qint64 playPosition() const     { return m_playPosition; }
+
+    /**
+     * Length of the internal engine buffer.
+     * \return Buffer length in microseconds.
+     */
+    qint64 bufferDuration() const;
+
+    /**
+     * Amount of data held in the buffer.
+     * \return Data duration in microseconds.
+     */
+    qint64 dataDuration() const;
+
+    /**
+     * Returns the size of the underlying audio buffer in bytes.
+     * This should be an approximation of the capture latency.
+     */
+    qint64 audioBufferLength() const;
+
+    /**
+     * Set window function applied to audio data before spectral analysis.
+     */
+    void setWindowFunction(WindowFunction type);
+
+public slots:
+    void startRecording();
+    void startPlayback();
+    void suspend();
+    void setAudioInputDevice(const QAudioDeviceInfo &device);
+    void setAudioOutputDevice(const QAudioDeviceInfo &device);
+
+signals:
+    void stateChanged(QAudio::Mode mode, QAudio::State state);
+
+    /**
+     * Informational message for non-modal display
+     */
+    void infoMessage(const QString &message, int durationMs);
+
+    /**
+     * Error message for modal display
+     */
+    void errorMessage(const QString &heading, const QString &detail);
+
+    /**
+     * Format of audio data has changed
+     */
+    void formatChanged(const QAudioFormat &format);
+
+    /**
+     * Length of buffer has changed.
+     * \param duration Duration in microseconds
+     */
+    void bufferDurationChanged(qint64 duration);
+
+    /**
+     * Amount of data in buffer has changed.
+     * \param duration Duration of data in microseconds
+     */
+    void dataDurationChanged(qint64 duration);
+
+    /**
+     * Position of the audio input device has changed.
+     * \param position Position in microseconds
+     */
+    void recordPositionChanged(qint64 position);
+
+    /**
+     * Position of the audio output device has changed.
+     * \param position Position in microseconds
+     */
+    void playPositionChanged(qint64 position);
+
+    /**
+     * Level changed
+     * \param rmsLevel RMS level in range 0.0 - 1.0
+     * \param peakLevel Peak level in range 0.0 - 1.0
+     * \param numSamples Number of audio samples analysed
+     */
+    void levelChanged(qreal rmsLevel, qreal peakLevel, int numSamples);
+
+    /**
+     * Spectrum has changed.
+     * \param position Position of start of window in microseconds
+     * \param length   Length of window in microseconds
+     * \param spectrum Resulting frequency spectrum
+     */
+    void spectrumChanged(qint64 position, qint64 length, const FrequencySpectrum &spectrum);
+
+private slots:
+    void audioNotify();
+    void audioStateChanged(QAudio::State state);
+    void audioDataReady();
+    void spectrumChanged(const FrequencySpectrum &spectrum);
+
+private:
+    bool initialize();
+    bool selectFormat();
+    void stopRecording();
+    void stopPlayback();
+    void setState(QAudio::State state);
+    void setState(QAudio::Mode mode, QAudio::State state);
+    void setFormat(const QAudioFormat &format);
+    void setRecordPosition(qint64 position, bool forceEmit = false);
+    void setPlayPosition(qint64 position, bool forceEmit = false);
+    void calculateLevel(qint64 position, qint64 length);
+    void calculateSpectrum(qint64 position);
+    void setLevel(qreal rmsLevel, qreal peakLevel, int numSamples);
+
+#ifdef DUMP_DATA
+    void createOutputDir();
+    QString outputPath() const { return m_outputDir.path(); }
+#endif
+
+#ifdef DUMP_CAPTURED_AUDIO
+    void dumpData();
+#endif
+
+private:
+    QAudio::Mode        m_mode;
+    QAudio::State       m_state;
+
+    bool                m_generateTone;
+    SweptTone           m_tone;
+
+    QFile*              m_file;
+    WavFile             m_wavFile;
+
+    QAudioFormat        m_format;
+
+    const QList<QAudioDeviceInfo> m_availableAudioInputDevices;
+    QAudioDeviceInfo    m_audioInputDevice;
+    QAudioInput*        m_audioInput;
+    QIODevice*          m_audioInputIODevice;
+    qint64              m_recordPosition;
+
+    const QList<QAudioDeviceInfo> m_availableAudioOutputDevices;
+    QAudioDeviceInfo    m_audioOutputDevice;
+    QAudioOutput*       m_audioOutput;
+    qint64              m_playPosition;
+    QBuffer             m_audioOutputIODevice;
+
+    QByteArray          m_buffer;
+    qint64              m_dataLength;
+
+    qreal               m_rmsLevel;
+    qreal               m_peakLevel;
+
+    int                 m_spectrumLengthBytes;
+    QByteArray          m_spectrumBuffer;
+    SpectrumAnalyser    m_spectrumAnalyser;
+    qint64              m_spectrumPosition;
+
+    int                 m_count;
+
+#ifdef DUMP_DATA
+    QDir                m_outputDir;
+#endif
+
+};
+
+#endif // ENGINE_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/frequencyspectrum.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "frequencyspectrum.h"
+
+FrequencySpectrum::FrequencySpectrum(int numPoints)
+    :   m_elements(numPoints)
+{
+
+}
+
+void FrequencySpectrum::reset()
+{
+    iterator i = begin();
+    for ( ; i != end(); ++i)
+        *i = Element();
+}
+
+int FrequencySpectrum::count() const
+{
+    return m_elements.count();
+}
+
+FrequencySpectrum::Element& FrequencySpectrum::operator[](int index)
+{
+    return m_elements[index];
+}
+
+const FrequencySpectrum::Element& FrequencySpectrum::operator[](int index) const
+{
+    return m_elements[index];
+}
+
+FrequencySpectrum::iterator FrequencySpectrum::begin()
+{
+    return m_elements.begin();
+}
+
+FrequencySpectrum::iterator FrequencySpectrum::end()
+{
+    return m_elements.end();
+}
+
+FrequencySpectrum::const_iterator FrequencySpectrum::begin() const
+{
+    return m_elements.begin();
+}
+
+FrequencySpectrum::const_iterator FrequencySpectrum::end() const
+{
+    return m_elements.end();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/frequencyspectrum.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,95 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are met:
+** - Redistributions of source code must retain the above copyright notice,
+**   this list of conditions and the following disclaimer.
+** - Redistributions in binary form must reproduce the above copyright notice,
+**   this list of conditions and the following disclaimer in the documentation
+**   and/or other materials provided with the distribution.
+** - Neither the name of Nokia Corporation and its Subsidiary(-ies) nor the
+**   names of its contributors may be used to endorse or promote products
+**   derived from this software without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+** POSSIBILITY OF SUCH DAMAGE.
+** $QT_END_LICENSE$
+**
+*****************************************************************************/
+
+#ifndef FREQUENCYSPECTRUM_H
+#define FREQUENCYSPECTRUM_H
+
+#include <QtCore/QVector>
+
+/**
+ * Represents a frequency spectrum as a series of elements, each of which
+ * consists of a frequency, an amplitude and a phase.
+ */
+class FrequencySpectrum {
+public:
+    FrequencySpectrum(int numPoints = 0);
+
+    struct Element {
+        Element()
+        :   frequency(0.0), amplitude(0.0), phase(0.0), clipped(false)
+        { }
+
+        /**
+         * Frequency in Hertz
+         */
+        qreal frequency;
+
+        /**
+         * Amplitude in range [0.0, 1.0]
+         */
+        qreal amplitude;
+
+        /**
+         * Phase in range [0.0, 2*PI]
+         */
+        qreal phase;
+
+        /**
+         * Indicates whether value has been clipped during spectrum analysis
+         */
+        bool clipped;
+    };
+
+    typedef QVector<Element>::iterator iterator;
+    typedef QVector<Element>::const_iterator const_iterator;
+
+    void reset();
+
+    int count() const;
+    Element& operator[](int index);
+    const Element& operator[](int index) const;
+    iterator begin();
+    iterator end();
+    const_iterator begin() const;
+    const_iterator end() const;
+
+private:
+    QVector<Element> m_elements;
+
+};
+
+#endif // FREQUENCYSPECTRUM_H
Binary file demos/spectrum/app/images/record.png has changed
Binary file demos/spectrum/app/images/settings.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/levelmeter.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,143 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "levelmeter.h"
+
+#include <math.h>
+
+#include <QPainter>
+#include <QTimer>
+#include <QDebug>
+
+
+// Constants
+const int RedrawInterval = 100; // ms
+const qreal PeakDecayRate = 0.001;
+const int PeakHoldLevelDuration = 2000; // ms
+
+
+LevelMeter::LevelMeter(QWidget *parent)
+    :   QWidget(parent)
+    ,   m_rmsLevel(0.0)
+    ,   m_peakLevel(0.0)
+    ,   m_decayedPeakLevel(0.0)
+    ,   m_peakDecayRate(PeakDecayRate)
+    ,   m_peakHoldLevel(0.0)
+    ,   m_redrawTimer(new QTimer(this))
+    ,   m_rmsColor(Qt::red)
+    ,   m_peakColor(255, 200, 200, 255)
+{
+    setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);
+    setMinimumWidth(30);
+
+    connect(m_redrawTimer, SIGNAL(timeout()), this, SLOT(redrawTimerExpired()));
+    m_redrawTimer->start(RedrawInterval);
+}
+
+LevelMeter::~LevelMeter()
+{
+
+}
+
+void LevelMeter::reset()
+{
+    m_rmsLevel = 0.0;
+    m_peakLevel = 0.0;
+    update();
+}
+
+void LevelMeter::levelChanged(qreal rmsLevel, qreal peakLevel, int numSamples)
+{
+    // Smooth the RMS signal
+    const qreal smooth = pow(qreal(0.9), static_cast<qreal>(numSamples) / 256); // TODO: remove this magic number
+    m_rmsLevel = (m_rmsLevel * smooth) + (rmsLevel * (1.0 - smooth));
+
+    if (peakLevel > m_decayedPeakLevel) {
+        m_peakLevel = peakLevel;
+        m_decayedPeakLevel = peakLevel;
+        m_peakLevelChanged.start();
+    }
+
+    if (peakLevel > m_peakHoldLevel) {
+        m_peakHoldLevel = peakLevel;
+        m_peakHoldLevelChanged.start();
+    }
+
+    update();
+}
+
+void LevelMeter::redrawTimerExpired()
+{
+    // Decay the peak signal
+    const int elapsedMs = m_peakLevelChanged.elapsed();
+    const qreal decayAmount = m_peakDecayRate * elapsedMs;
+    if (decayAmount < m_peakLevel)
+        m_decayedPeakLevel = m_peakLevel - decayAmount;
+    else
+        m_decayedPeakLevel = 0.0;
+
+    // Check whether to clear the peak hold level
+    if (m_peakHoldLevelChanged.elapsed() > PeakHoldLevelDuration)
+        m_peakHoldLevel = 0.0;
+
+    update();
+}
+
+void LevelMeter::paintEvent(QPaintEvent *event)
+{
+    Q_UNUSED(event)
+
+    QPainter painter(this);
+    painter.fillRect(rect(), Qt::black);
+
+    QRect bar = rect();
+
+    bar.setTop(rect().top() + (1.0 - m_peakHoldLevel) * rect().height());
+    bar.setBottom(bar.top() + 5);
+    painter.fillRect(bar, m_rmsColor);
+    bar.setBottom(rect().bottom());
+
+    bar.setTop(rect().top() + (1.0 - m_decayedPeakLevel) * rect().height());
+    painter.fillRect(bar, m_peakColor);
+
+    bar.setTop(rect().top() + (1.0 - m_rmsLevel) * rect().height());
+    painter.fillRect(bar, m_rmsColor);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/levelmeter.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,113 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are met:
+** - Redistributions of source code must retain the above copyright notice,
+**   this list of conditions and the following disclaimer.
+** - Redistributions in binary form must reproduce the above copyright notice,
+**   this list of conditions and the following disclaimer in the documentation
+**   and/or other materials provided with the distribution.
+** - Neither the name of Nokia Corporation and its Subsidiary(-ies) nor the
+**   names of its contributors may be used to endorse or promote products
+**   derived from this software without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+** POSSIBILITY OF SUCH DAMAGE.
+** $QT_END_LICENSE$
+**
+*****************************************************************************/
+
+#ifndef LEVELMETER_H
+#define LEVELMETER_H
+
+#include <QTime>
+#include <QWidget>
+
+/**
+ * Widget which displays a vertical audio level meter, indicating the
+ * RMS and peak levels of the window of audio samples most recently analysed
+ * by the Engine.
+ */
+class LevelMeter : public QWidget {
+    Q_OBJECT
+public:
+    LevelMeter(QWidget *parent = 0);
+    ~LevelMeter();
+
+    void paintEvent(QPaintEvent *event);
+
+public slots:
+    void reset();
+    void levelChanged(qreal rmsLevel, qreal peakLevel, int numSamples);
+
+private slots:
+    void redrawTimerExpired();
+
+private:
+    /**
+     * Height of RMS level bar.
+     * Range 0.0 - 1.0.
+     */
+    qreal m_rmsLevel;
+
+    /**
+     * Most recent peak level.
+     * Range 0.0 - 1.0.
+     */
+    qreal m_peakLevel;
+
+    /**
+     * Height of peak level bar.
+     * This is calculated by decaying m_peakLevel depending on the
+     * elapsed time since m_peakLevelChanged, and the value of m_decayRate.
+     */
+    qreal m_decayedPeakLevel;
+
+    /**
+     * Time at which m_peakLevel was last changed.
+     */
+    QTime m_peakLevelChanged;
+
+    /**
+     * Rate at which peak level bar decays.
+     * Expressed in level units / millisecond.
+     */
+    qreal m_peakDecayRate;
+
+    /**
+     * High watermark of peak level.
+     * Range 0.0 - 1.0.
+     */
+    qreal m_peakHoldLevel;
+
+    /**
+     * Time at which m_peakHoldLevel was last changed.
+     */
+    QTime m_peakHoldLevelChanged;
+
+    QTimer *m_redrawTimer;
+
+    QColor m_rmsColor;
+    QColor m_peakColor;
+
+};
+
+#endif // LEVELMETER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/main.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui/QApplication>
+#include "mainwidget.h"
+
+int main(int argc, char **argv)
+{
+    QApplication app(argc, argv);
+    app.setApplicationName("QtMultimedia spectrum analyser");
+    MainWidget w;
+
+#ifdef Q_OS_SYMBIAN
+    w.showMaximized();
+#else
+    w.show();
+#endif
+
+    return app.exec();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/mainwidget.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,455 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "engine.h"
+#include "levelmeter.h"
+#include "mainwidget.h"
+#include "waveform.h"
+#include "progressbar.h"
+#include "settingsdialog.h"
+#include "spectrograph.h"
+#include "tonegeneratordialog.h"
+#include "utils.h"
+
+#include <QLabel>
+#include <QPushButton>
+#include <QHBoxLayout>
+#include <QVBoxLayout>
+#include <QStyle>
+#include <QMenu>
+#include <QFileDialog>
+#include <QTimerEvent>
+#include <QMessageBox>
+
+const int NullTimerId = -1;
+
+MainWidget::MainWidget(QWidget *parent)
+    :   QWidget(parent)
+    ,   m_mode(NoMode)
+    ,   m_engine(new Engine(this))
+#ifndef DISABLE_WAVEFORM
+    ,   m_waveform(new Waveform(m_engine->buffer(), this))
+#endif
+    ,   m_progressBar(new ProgressBar(this))
+    ,   m_spectrograph(new Spectrograph(this))
+    ,   m_levelMeter(new LevelMeter(this))
+    ,   m_modeButton(new QPushButton(this))
+    ,   m_recordButton(new QPushButton(this))
+    ,   m_pauseButton(new QPushButton(this))
+    ,   m_playButton(new QPushButton(this))
+    ,   m_settingsButton(new QPushButton(this))
+    ,   m_infoMessage(new QLabel(tr("Select a mode to begin"), this))
+    ,   m_infoMessageTimerId(NullTimerId)
+    ,   m_settingsDialog(new SettingsDialog(
+            m_engine->availableAudioInputDevices(),
+            m_engine->availableAudioOutputDevices(),
+            this))
+    ,   m_toneGeneratorDialog(new ToneGeneratorDialog(this))
+    ,   m_modeMenu(new QMenu(this))
+    ,   m_loadFileAction(0)
+    ,   m_generateToneAction(0)
+    ,   m_recordAction(0)
+{
+    m_spectrograph->setParams(SpectrumNumBands, SpectrumLowFreq, SpectrumHighFreq);
+
+    createUi();
+    connectUi();
+}
+
+MainWidget::~MainWidget()
+{
+
+}
+
+
+//-----------------------------------------------------------------------------
+// Public slots
+//-----------------------------------------------------------------------------
+
+void MainWidget::stateChanged(QAudio::Mode mode, QAudio::State state)
+{
+    Q_UNUSED(mode);
+
+    updateButtonStates();
+
+    if (QAudio::ActiveState != state && QAudio::SuspendedState != state) {
+        m_levelMeter->reset();
+        m_spectrograph->reset();
+    }
+}
+
+void MainWidget::formatChanged(const QAudioFormat &format)
+{
+   infoMessage(formatToString(format), NullMessageTimeout);
+
+#ifndef DISABLE_WAVEFORM
+    if (QAudioFormat() != format) {
+        m_waveform->initialize(format, WaveformTileLength,
+                               WaveformWindowDuration);
+    }
+#endif
+}
+
+void MainWidget::spectrumChanged(qint64 position, qint64 length,
+                                 const FrequencySpectrum &spectrum)
+{
+    m_progressBar->windowChanged(position, length);
+    m_spectrograph->spectrumChanged(spectrum);
+}
+
+void MainWidget::infoMessage(const QString &message, int timeoutMs)
+{
+    m_infoMessage->setText(message);
+
+    if (NullTimerId != m_infoMessageTimerId) {
+        killTimer(m_infoMessageTimerId);
+        m_infoMessageTimerId = NullTimerId;
+    }
+
+    if (NullMessageTimeout != timeoutMs)
+        m_infoMessageTimerId = startTimer(timeoutMs);
+}
+
+void MainWidget::errorMessage(const QString &heading, const QString &detail)
+{
+#ifdef Q_OS_SYMBIAN
+    const QString message = heading + "\n" + detail;
+    QMessageBox::warning(this, "", message, QMessageBox::Close);
+#else
+    QMessageBox::warning(this, heading, detail, QMessageBox::Close);
+#endif
+}
+
+void MainWidget::timerEvent(QTimerEvent *event)
+{
+    Q_ASSERT(event->timerId() == m_infoMessageTimerId);
+    Q_UNUSED(event) // suppress warnings in release builds
+    killTimer(m_infoMessageTimerId);
+    m_infoMessageTimerId = NullTimerId;
+    m_infoMessage->setText("");
+}
+
+void MainWidget::positionChanged(qint64 positionUs)
+{
+#ifndef DISABLE_WAVEFORM
+    qint64 positionBytes = audioLength(m_engine->format(), positionUs);
+    m_waveform->positionChanged(positionBytes);
+#else
+    Q_UNUSED(positionUs)
+#endif
+}
+
+void MainWidget::bufferDurationChanged(qint64 durationUs)
+{
+    m_progressBar->bufferDurationChanged(durationUs);
+}
+
+
+//-----------------------------------------------------------------------------
+// Private slots
+//-----------------------------------------------------------------------------
+
+void MainWidget::dataDurationChanged(qint64 duration)
+{
+#ifndef DISABLE_WAVEFORM
+    const qint64 dataLength = audioLength(m_engine->format(), duration);
+    m_waveform->dataLengthChanged(dataLength);
+#else
+    Q_UNUSED(duration)
+#endif
+
+    updateButtonStates();
+}
+
+void MainWidget::showFileDialog()
+{
+    reset();
+    const QString dir;
+    const QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("Open WAV file"), dir, "*.wav");
+    if (fileNames.count()) {
+        setMode(LoadFileMode);
+        m_engine->loadFile(fileNames.front());
+        updateButtonStates();
+    }
+}
+
+void MainWidget::showSettingsDialog()
+{
+    reset();
+    m_settingsDialog->exec();
+    if (m_settingsDialog->result() == QDialog::Accepted) {
+        m_engine->setAudioInputDevice(m_settingsDialog->inputDevice());
+        m_engine->setAudioOutputDevice(m_settingsDialog->outputDevice());
+        m_engine->setWindowFunction(m_settingsDialog->windowFunction());
+    }
+}
+
+void MainWidget::showToneGeneratorDialog()
+{
+    reset();
+    m_toneGeneratorDialog->exec();
+    if (m_toneGeneratorDialog->result() == QDialog::Accepted) {
+        setMode(GenerateToneMode);
+        const qreal amplitude = m_toneGeneratorDialog->amplitude();
+        if (m_toneGeneratorDialog->isFrequencySweepEnabled()) {
+            m_engine->generateSweptTone(amplitude);
+        } else {
+            const qreal frequency = m_toneGeneratorDialog->frequency();
+            const Tone tone(frequency, amplitude);
+            m_engine->generateTone(tone);
+            updateButtonStates();
+        }
+    }
+}
+
+void MainWidget::initializeRecord()
+{
+    reset();
+    setMode(RecordMode);
+    if (m_engine->initializeRecord())
+        updateButtonStates();
+}
+
+
+//-----------------------------------------------------------------------------
+// Private functions
+//-----------------------------------------------------------------------------
+
+void MainWidget::createUi()
+{
+    createMenus();
+
+    setWindowTitle(tr("Spectrum Analyser"));
+
+    QVBoxLayout *windowLayout = new QVBoxLayout(this);
+
+    m_infoMessage->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+    m_infoMessage->setAlignment(Qt::AlignHCenter);
+    windowLayout->addWidget(m_infoMessage);
+
+#ifdef SUPERIMPOSE_PROGRESS_ON_WAVEFORM
+    QScopedPointer<QHBoxLayout> waveformLayout(new QHBoxLayout);
+    waveformLayout->addWidget(m_progressBar);
+    m_progressBar->setMinimumHeight(m_waveform->minimumHeight());
+    waveformLayout->setMargin(0);
+    m_waveform->setLayout(waveformLayout.data());
+    waveformLayout.take();
+    windowLayout->addWidget(m_waveform);
+#else
+#ifndef DISABLE_WAVEFORM
+    windowLayout->addWidget(m_waveform);
+#endif // DISABLE_WAVEFORM
+    windowLayout->addWidget(m_progressBar);
+#endif // SUPERIMPOSE_PROGRESS_ON_WAVEFORM
+
+    // Spectrograph and level meter
+
+    QScopedPointer<QHBoxLayout> analysisLayout(new QHBoxLayout);
+    analysisLayout->addWidget(m_spectrograph);
+    analysisLayout->addWidget(m_levelMeter);
+    windowLayout->addLayout(analysisLayout.data());
+    analysisLayout.take();
+
+    // Button panel
+
+    const QSize buttonSize(30, 30);
+
+    m_modeButton->setText(tr("Mode"));
+
+    m_recordIcon = QIcon(":/images/record.png");
+    m_recordButton->setIcon(m_recordIcon);
+    m_recordButton->setEnabled(false);
+    m_recordButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+    m_recordButton->setMinimumSize(buttonSize);
+
+    m_pauseIcon = style()->standardIcon(QStyle::SP_MediaPause);
+    m_pauseButton->setIcon(m_pauseIcon);
+    m_pauseButton->setEnabled(false);
+    m_pauseButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+    m_pauseButton->setMinimumSize(buttonSize);
+
+    m_playIcon = style()->standardIcon(QStyle::SP_MediaPlay);
+    m_playButton->setIcon(m_playIcon);
+    m_playButton->setEnabled(false);
+    m_playButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+    m_playButton->setMinimumSize(buttonSize);
+
+    m_settingsIcon = QIcon(":/images/settings.png");
+    m_settingsButton->setIcon(m_settingsIcon);
+    m_settingsButton->setEnabled(true);
+    m_settingsButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+    m_settingsButton->setMinimumSize(buttonSize);
+
+    QScopedPointer<QHBoxLayout> buttonPanelLayout(new QHBoxLayout);
+    buttonPanelLayout->addStretch();
+    buttonPanelLayout->addWidget(m_modeButton);
+    buttonPanelLayout->addWidget(m_recordButton);
+    buttonPanelLayout->addWidget(m_pauseButton);
+    buttonPanelLayout->addWidget(m_playButton);
+    buttonPanelLayout->addWidget(m_settingsButton);
+
+    QWidget *buttonPanel = new QWidget(this);
+    buttonPanel->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+    buttonPanel->setLayout(buttonPanelLayout.data());
+    buttonPanelLayout.take(); // ownership transferred to buttonPanel
+
+    QScopedPointer<QHBoxLayout> bottomPaneLayout(new QHBoxLayout);
+    bottomPaneLayout->addWidget(buttonPanel);
+    windowLayout->addLayout(bottomPaneLayout.data());
+    bottomPaneLayout.take(); // ownership transferred to windowLayout
+
+    // Apply layout
+
+    setLayout(windowLayout);
+}
+
+void MainWidget::connectUi()
+{
+    CHECKED_CONNECT(m_recordButton, SIGNAL(clicked()),
+            m_engine, SLOT(startRecording()));
+
+    CHECKED_CONNECT(m_pauseButton, SIGNAL(clicked()),
+            m_engine, SLOT(suspend()));
+
+    CHECKED_CONNECT(m_playButton, SIGNAL(clicked()),
+            m_engine, SLOT(startPlayback()));
+
+    CHECKED_CONNECT(m_settingsButton, SIGNAL(clicked()),
+            this, SLOT(showSettingsDialog()));
+
+    CHECKED_CONNECT(m_engine, SIGNAL(stateChanged(QAudio::Mode,QAudio::State)),
+            this, SLOT(stateChanged(QAudio::Mode,QAudio::State)));
+
+    CHECKED_CONNECT(m_engine, SIGNAL(formatChanged(const QAudioFormat &)),
+            this, SLOT(formatChanged(const QAudioFormat &)));
+
+    m_progressBar->bufferDurationChanged(m_engine->bufferDuration());
+
+    CHECKED_CONNECT(m_engine, SIGNAL(bufferDurationChanged(qint64)),
+            this, SLOT(bufferDurationChanged(qint64)));
+
+    CHECKED_CONNECT(m_engine, SIGNAL(dataDurationChanged(qint64)),
+            this, SLOT(dataDurationChanged(qint64)));
+
+    CHECKED_CONNECT(m_engine, SIGNAL(recordPositionChanged(qint64)),
+            m_progressBar, SLOT(recordPositionChanged(qint64)));
+
+    CHECKED_CONNECT(m_engine, SIGNAL(playPositionChanged(qint64)),
+            m_progressBar, SLOT(playPositionChanged(qint64)));
+
+    CHECKED_CONNECT(m_engine, SIGNAL(recordPositionChanged(qint64)),
+            this, SLOT(positionChanged(qint64)));
+
+    CHECKED_CONNECT(m_engine, SIGNAL(playPositionChanged(qint64)),
+            this, SLOT(positionChanged(qint64)));
+
+    CHECKED_CONNECT(m_engine, SIGNAL(levelChanged(qreal, qreal, int)),
+            m_levelMeter, SLOT(levelChanged(qreal, qreal, int)));
+
+    CHECKED_CONNECT(m_engine, SIGNAL(spectrumChanged(qint64, qint64, const FrequencySpectrum &)),
+            this, SLOT(spectrumChanged(qint64, qint64, const FrequencySpectrum &)));
+
+    CHECKED_CONNECT(m_engine, SIGNAL(infoMessage(QString, int)),
+            this, SLOT(infoMessage(QString, int)));
+
+    CHECKED_CONNECT(m_engine, SIGNAL(errorMessage(QString, QString)),
+            this, SLOT(errorMessage(QString, QString)));
+
+    CHECKED_CONNECT(m_spectrograph, SIGNAL(infoMessage(QString, int)),
+            this, SLOT(infoMessage(QString, int)));
+}
+
+void MainWidget::createMenus()
+{
+    m_modeButton->setMenu(m_modeMenu);
+
+    m_generateToneAction = m_modeMenu->addAction(tr("Play generated tone"));
+    m_recordAction = m_modeMenu->addAction(tr("Record and play back"));
+    m_loadFileAction = m_modeMenu->addAction(tr("Play file"));
+
+    m_loadFileAction->setCheckable(true);
+    m_generateToneAction->setCheckable(true);
+    m_recordAction->setCheckable(true);
+
+    connect(m_loadFileAction, SIGNAL(triggered(bool)), this, SLOT(showFileDialog()));
+    connect(m_generateToneAction, SIGNAL(triggered(bool)), this, SLOT(showToneGeneratorDialog()));
+    connect(m_recordAction, SIGNAL(triggered(bool)), this, SLOT(initializeRecord()));
+}
+
+void MainWidget::updateButtonStates()
+{
+    const bool recordEnabled = ((QAudio::AudioOutput == m_engine->mode() ||
+                                (QAudio::ActiveState != m_engine->state() &&
+                                 QAudio::IdleState != m_engine->state())) &&
+                                RecordMode == m_mode);
+    m_recordButton->setEnabled(recordEnabled);
+
+    const bool pauseEnabled = (QAudio::ActiveState == m_engine->state() ||
+                               QAudio::IdleState == m_engine->state());
+    m_pauseButton->setEnabled(pauseEnabled);
+
+    const bool playEnabled = (m_engine->dataDuration() &&
+                              (QAudio::AudioOutput != m_engine->mode() ||
+                               (QAudio::ActiveState != m_engine->state() &&
+                                QAudio::IdleState != m_engine->state())));
+    m_playButton->setEnabled(playEnabled);
+}
+
+void MainWidget::reset()
+{
+#ifndef DISABLE_WAVEFORM
+    m_waveform->reset();
+#endif
+    m_engine->reset();
+    m_levelMeter->reset();
+    m_spectrograph->reset();
+    m_progressBar->reset();
+}
+
+void MainWidget::setMode(Mode mode)
+{
+
+    m_mode = mode;
+    m_loadFileAction->setChecked(LoadFileMode == mode);
+    m_generateToneAction->setChecked(GenerateToneMode == mode);
+    m_recordAction->setChecked(RecordMode == mode);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/mainwidget.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,138 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are met:
+** - Redistributions of source code must retain the above copyright notice,
+**   this list of conditions and the following disclaimer.
+** - Redistributions in binary form must reproduce the above copyright notice,
+**   this list of conditions and the following disclaimer in the documentation
+**   and/or other materials provided with the distribution.
+** - Neither the name of Nokia Corporation and its Subsidiary(-ies) nor the
+**   names of its contributors may be used to endorse or promote products
+**   derived from this software without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+** POSSIBILITY OF SUCH DAMAGE.
+** $QT_END_LICENSE$
+**
+*****************************************************************************/
+
+#ifndef MAINWIDGET_H
+#define MAINWIDGET_H
+
+#include <QWidget>
+#include <QIcon>
+#include <QtMultimedia/qaudio.h>
+
+class Engine;
+class FrequencySpectrum;
+class ProgressBar;
+class Spectrograph;
+class Waveform;
+class LevelMeter;
+class SettingsDialog;
+class ToneGeneratorDialog;
+class QAudioFormat;
+class QLabel;
+class QPushButton;
+class QMenu;
+class QAction;
+
+/**
+ * Main application widget, responsible for connecting the various UI
+ * elements to the Engine.
+ */
+class MainWidget : public QWidget {
+    Q_OBJECT
+public:
+    MainWidget(QWidget *parent = 0);
+    ~MainWidget();
+
+    // QObject
+    void timerEvent(QTimerEvent *event);
+
+public slots:
+    void stateChanged(QAudio::Mode mode, QAudio::State state);
+    void formatChanged(const QAudioFormat &format);
+    void spectrumChanged(qint64 position, qint64 length,
+                         const FrequencySpectrum &spectrum);
+    void infoMessage(const QString &message, int timeoutMs);
+    void errorMessage(const QString &heading, const QString &detail);
+    void positionChanged(qint64 position);
+    void bufferDurationChanged(qint64 duration);
+
+private slots:
+    void showFileDialog();
+    void showSettingsDialog();
+    void showToneGeneratorDialog();
+    void initializeRecord();
+    void dataDurationChanged(qint64 duration);
+
+private:
+    void createUi();
+    void createMenus();
+    void connectUi();
+    void updateButtonStates();
+    void reset();
+
+    enum Mode {
+        NoMode,
+        RecordMode,
+        GenerateToneMode,
+        LoadFileMode
+    };
+
+    void setMode(Mode mode);
+
+private:
+    Mode                    m_mode;
+
+    Engine*                 m_engine;
+
+    Waveform*               m_waveform;
+    ProgressBar*            m_progressBar;
+    Spectrograph*           m_spectrograph;
+    LevelMeter*             m_levelMeter;
+
+    QPushButton*            m_modeButton;
+    QPushButton*            m_recordButton;
+    QIcon                   m_recordIcon;
+    QPushButton*            m_pauseButton;
+    QIcon                   m_pauseIcon;
+    QPushButton*            m_playButton;
+    QIcon                   m_playIcon;
+    QPushButton*            m_settingsButton;
+    QIcon                   m_settingsIcon;
+
+    QLabel*                 m_infoMessage;
+    int                     m_infoMessageTimerId;
+
+    SettingsDialog*         m_settingsDialog;
+    ToneGeneratorDialog*    m_toneGeneratorDialog;
+
+    QMenu*                  m_modeMenu;
+    QAction*                m_loadFileAction;
+    QAction*                m_generateToneAction;
+    QAction*                m_recordAction;
+
+};
+
+#endif // MAINWIDGET_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/progressbar.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,141 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "progressbar.h"
+#include "spectrum.h"
+#include <QPainter>
+
+ProgressBar::ProgressBar(QWidget *parent)
+    :   QWidget(parent)
+    ,   m_bufferDuration(0)
+    ,   m_recordPosition(0)
+    ,   m_playPosition(0)
+    ,   m_windowPosition(0)
+    ,   m_windowLength(0)
+{
+    setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+    setMinimumHeight(30);
+#ifdef SUPERIMPOSE_PROGRESS_ON_WAVEFORM
+    setAutoFillBackground(false);
+#endif
+}
+
+ProgressBar::~ProgressBar()
+{
+
+}
+
+void ProgressBar::reset()
+{
+    m_bufferDuration = 0;
+    m_recordPosition = 0;
+    m_playPosition = 0;
+    m_windowPosition = 0;
+    m_windowLength = 0;
+    update();
+}
+
+void ProgressBar::paintEvent(QPaintEvent * /*event*/)
+{
+    QPainter painter(this);
+
+    QColor bufferColor(0, 0, 255);
+    QColor windowColor(0, 255, 0);
+
+#ifdef SUPERIMPOSE_PROGRESS_ON_WAVEFORM
+    bufferColor.setAlphaF(0.5);
+    windowColor.setAlphaF(0.5);
+#else
+    painter.fillRect(rect(), Qt::black);
+#endif
+
+    if (m_bufferDuration) {
+        QRect bar = rect();
+        const qreal play = qreal(m_playPosition) / m_bufferDuration;
+        bar.setLeft(rect().left() + play * rect().width());
+        const qreal record = qreal(m_recordPosition) / m_bufferDuration;
+        bar.setRight(rect().left() + record * rect().width());
+        painter.fillRect(bar, bufferColor);
+
+        QRect window = rect();
+        const qreal windowLeft = qreal(m_windowPosition) / m_bufferDuration;
+        window.setLeft(rect().left() + windowLeft * rect().width());
+        const qreal windowWidth = qreal(m_windowLength) / m_bufferDuration;
+        window.setWidth(windowWidth * rect().width());
+        painter.fillRect(window, windowColor);
+    }
+}
+
+void ProgressBar::bufferDurationChanged(qint64 bufferSize)
+{
+    m_bufferDuration = bufferSize;
+    m_recordPosition = 0;
+    m_playPosition = 0;
+    m_windowPosition = 0;
+    m_windowLength = 0;
+    repaint();
+}
+
+void ProgressBar::recordPositionChanged(qint64 recordPosition)
+{
+    Q_ASSERT(recordPosition >= 0);
+    Q_ASSERT(recordPosition <= m_bufferDuration);
+    m_recordPosition = recordPosition;
+    repaint();
+}
+
+void ProgressBar::playPositionChanged(qint64 playPosition)
+{
+    Q_ASSERT(playPosition >= 0);
+    Q_ASSERT(playPosition <= m_bufferDuration);
+    m_playPosition = playPosition;
+    repaint();
+}
+
+void ProgressBar::windowChanged(qint64 position, qint64 length)
+{
+    Q_ASSERT(position >= 0);
+    Q_ASSERT(position <= m_bufferDuration);
+    Q_ASSERT(position + length <= m_bufferDuration);
+    m_windowPosition = position;
+    m_windowLength = length;
+    repaint();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/progressbar.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are met:
+** - Redistributions of source code must retain the above copyright notice,
+**   this list of conditions and the following disclaimer.
+** - Redistributions in binary form must reproduce the above copyright notice,
+**   this list of conditions and the following disclaimer in the documentation
+**   and/or other materials provided with the distribution.
+** - Neither the name of Nokia Corporation and its Subsidiary(-ies) nor the
+**   names of its contributors may be used to endorse or promote products
+**   derived from this software without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+** POSSIBILITY OF SUCH DAMAGE.
+** $QT_END_LICENSE$
+**
+*****************************************************************************/
+
+#ifndef PROGRESSBAR_H
+#define PROGRESSBAR_H
+
+#include <QWidget>
+
+/**
+ * Widget which displays a the current fill state of the Engine's internal
+ * buffer, and the current play/record position within that buffer.
+ */
+class ProgressBar : public QWidget {
+    Q_OBJECT
+public:
+    ProgressBar(QWidget *parent = 0);
+    ~ProgressBar();
+
+    void reset();
+    void paintEvent(QPaintEvent *event);
+
+public slots:
+    void bufferDurationChanged(qint64 bufferSize);
+    void recordPositionChanged(qint64 recordPosition);
+    void playPositionChanged(qint64 playPosition);
+    void windowChanged(qint64 position, qint64 length);
+
+private:
+    qint64 m_bufferDuration;
+    qint64 m_recordPosition;
+    qint64 m_playPosition;
+    qint64 m_windowPosition;
+    qint64 m_windowLength;
+
+};
+
+#endif // PROGRESSBAR_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/settingsdialog.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,149 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "settingsdialog.h"
+#include <QComboBox>
+#include <QDialogButtonBox>
+#include <QLabel>
+#include <QPushButton>
+#include <QVBoxLayout>
+#include <QCheckBox>
+#include <QSlider>
+#include <QSpinBox>
+
+SettingsDialog::SettingsDialog(
+            const QList<QAudioDeviceInfo> &availableInputDevices,
+            const QList<QAudioDeviceInfo> &availableOutputDevices,
+            QWidget *parent)
+    :   QDialog(parent)
+    ,   m_windowFunction(DefaultWindowFunction)
+    ,   m_inputDeviceComboBox(new QComboBox(this))
+    ,   m_outputDeviceComboBox(new QComboBox(this))
+    ,   m_windowFunctionComboBox(new QComboBox(this))
+{
+    QVBoxLayout *dialogLayout = new QVBoxLayout(this);
+
+    // Populate combo boxes
+
+    QAudioDeviceInfo device;
+    foreach (device, availableInputDevices)
+        m_inputDeviceComboBox->addItem(device.deviceName(),
+                                       qVariantFromValue(device));
+    foreach (device, availableOutputDevices)
+        m_outputDeviceComboBox->addItem(device.deviceName(),
+                                       qVariantFromValue(device));
+
+    m_windowFunctionComboBox->addItem(tr("None"), qVariantFromValue(int(NoWindow)));
+    m_windowFunctionComboBox->addItem("Hann", qVariantFromValue(int(HannWindow)));
+    m_windowFunctionComboBox->setCurrentIndex(m_windowFunction);
+
+    // Initialize default devices
+    if (!availableInputDevices.empty())
+        m_inputDevice = availableInputDevices.front();
+    if (!availableOutputDevices.empty())
+        m_outputDevice = availableOutputDevices.front();
+
+    // Add widgets to layout
+
+    QScopedPointer<QHBoxLayout> inputDeviceLayout(new QHBoxLayout);
+    QLabel *inputDeviceLabel = new QLabel(tr("Input device"), this);
+    inputDeviceLayout->addWidget(inputDeviceLabel);
+    inputDeviceLayout->addWidget(m_inputDeviceComboBox);
+    dialogLayout->addLayout(inputDeviceLayout.data());
+    inputDeviceLayout.take(); // ownership transferred to dialogLayout
+
+    QScopedPointer<QHBoxLayout> outputDeviceLayout(new QHBoxLayout);
+    QLabel *outputDeviceLabel = new QLabel(tr("Output device"), this);
+    outputDeviceLayout->addWidget(outputDeviceLabel);
+    outputDeviceLayout->addWidget(m_outputDeviceComboBox);
+    dialogLayout->addLayout(outputDeviceLayout.data());
+    outputDeviceLayout.take(); // ownership transferred to dialogLayout
+
+    QScopedPointer<QHBoxLayout> windowFunctionLayout(new QHBoxLayout);
+    QLabel *windowFunctionLabel = new QLabel(tr("Window function"), this);
+    windowFunctionLayout->addWidget(windowFunctionLabel);
+    windowFunctionLayout->addWidget(m_windowFunctionComboBox);
+    dialogLayout->addLayout(windowFunctionLayout.data());
+    windowFunctionLayout.take(); // ownership transferred to dialogLayout
+
+    // Connect
+    CHECKED_CONNECT(m_inputDeviceComboBox, SIGNAL(activated(int)),
+                    this, SLOT(inputDeviceChanged(int)));
+    CHECKED_CONNECT(m_outputDeviceComboBox, SIGNAL(activated(int)),
+                    this, SLOT(outputDeviceChanged(int)));
+    CHECKED_CONNECT(m_windowFunctionComboBox, SIGNAL(activated(int)),
+                    this, SLOT(windowFunctionChanged(int)));
+
+    // Add standard buttons to layout
+    QDialogButtonBox *buttonBox = new QDialogButtonBox(this);
+    buttonBox->setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
+    dialogLayout->addWidget(buttonBox);
+
+    // Connect standard buttons
+    CHECKED_CONNECT(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()),
+                    this, SLOT(accept()));
+    CHECKED_CONNECT(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()),
+                    this, SLOT(reject()));
+
+    setLayout(dialogLayout);
+}
+
+SettingsDialog::~SettingsDialog()
+{
+
+}
+
+void SettingsDialog::windowFunctionChanged(int index)
+{
+    m_windowFunction = static_cast<WindowFunction>(
+            m_windowFunctionComboBox->itemData(index).value<int>());
+}
+
+void SettingsDialog::inputDeviceChanged(int index)
+{
+    m_inputDevice = m_inputDeviceComboBox->itemData(index).value<QAudioDeviceInfo>();
+}
+
+void SettingsDialog::outputDeviceChanged(int index)
+{
+    m_outputDevice = m_outputDeviceComboBox->itemData(index).value<QAudioDeviceInfo>();
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/settingsdialog.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are met:
+** - Redistributions of source code must retain the above copyright notice,
+**   this list of conditions and the following disclaimer.
+** - Redistributions in binary form must reproduce the above copyright notice,
+**   this list of conditions and the following disclaimer in the documentation
+**   and/or other materials provided with the distribution.
+** - Neither the name of Nokia Corporation and its Subsidiary(-ies) nor the
+**   names of its contributors may be used to endorse or promote products
+**   derived from this software without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+** POSSIBILITY OF SUCH DAMAGE.
+** $QT_END_LICENSE$
+**
+*****************************************************************************/
+
+#ifndef SETTINGSDIALOG_H
+#define SETTINGSDIALOG_H
+
+#include "spectrum.h"
+#include <QDialog>
+#include <QtMultimedia/QAudioDeviceInfo>
+
+class QComboBox;
+class QCheckBox;
+class QSlider;
+class QSpinBox;
+class QGridLayout;
+
+/**
+ * Dialog used to control settings such as the audio input / output device
+ * and the windowing function.
+ */
+class SettingsDialog : public QDialog {
+    Q_OBJECT
+public:
+    SettingsDialog(const QList<QAudioDeviceInfo> &availableInputDevices,
+                   const QList<QAudioDeviceInfo> &availableOutputDevices,
+                   QWidget *parent = 0);
+    ~SettingsDialog();
+
+    WindowFunction windowFunction() const           { return m_windowFunction; }
+    const QAudioDeviceInfo& inputDevice() const     { return m_inputDevice; }
+    const QAudioDeviceInfo& outputDevice() const    { return m_outputDevice; }
+
+private slots:
+    void windowFunctionChanged(int index);
+    void inputDeviceChanged(int index);
+    void outputDeviceChanged(int index);
+
+private:
+    WindowFunction   m_windowFunction;
+    QAudioDeviceInfo m_inputDevice;
+    QAudioDeviceInfo m_outputDevice;
+
+    QComboBox*      m_inputDeviceComboBox;
+    QComboBox*      m_outputDeviceComboBox;
+
+    QComboBox*      m_windowFunctionComboBox;
+
+};
+
+#endif // SETTINGSDIALOG_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/spectrograph.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,242 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "spectrograph.h"
+#include <QPainter>
+#include <QMouseEvent>
+#include <QDebug>
+#include <QTimerEvent>
+
+const int NullTimerId = -1;
+const int NullIndex = -1;
+const int BarSelectionInterval = 2000;
+
+Spectrograph::Spectrograph(QWidget *parent)
+    :   QWidget(parent)
+    ,   m_barSelected(NullIndex)
+    ,   m_timerId(NullTimerId)
+    ,   m_lowFreq(0.0)
+    ,   m_highFreq(0.0)
+{
+    setMinimumHeight(100);
+}
+
+Spectrograph::~Spectrograph()
+{
+
+}
+
+void Spectrograph::setParams(int numBars, qreal lowFreq, qreal highFreq)
+{
+    Q_ASSERT(numBars > 0);
+    Q_ASSERT(highFreq > lowFreq);
+    m_bars.resize(numBars);
+    m_lowFreq = lowFreq;
+    m_highFreq = highFreq;
+    updateBars();
+}
+
+void Spectrograph::timerEvent(QTimerEvent *event)
+{
+    Q_ASSERT(event->timerId() == m_timerId);
+    Q_UNUSED(event) // suppress warnings in release builds
+    killTimer(m_timerId);
+    m_timerId = NullTimerId;
+    m_barSelected = NullIndex;
+    update();
+}
+
+void Spectrograph::paintEvent(QPaintEvent *event)
+{
+    Q_UNUSED(event)
+
+    QPainter painter(this);
+    painter.fillRect(rect(), Qt::black);
+
+    const int numBars = m_bars.count();
+
+    // Highlight region of selected bar
+    if (m_barSelected != NullIndex && numBars) {
+        QRect regionRect = rect();
+        regionRect.setLeft(m_barSelected * rect().width() / numBars);
+        regionRect.setWidth(rect().width() / numBars);
+        QColor regionColor(202, 202, 64);
+        painter.setBrush(Qt::DiagCrossPattern);
+        painter.fillRect(regionRect, regionColor);
+        painter.setBrush(Qt::NoBrush);
+    }
+
+    QColor barColor(51, 204, 102);
+    QColor clipColor(255, 255, 0);
+
+    // Draw the outline
+    const QColor gridColor = barColor.darker();
+    QPen gridPen(gridColor);
+    painter.setPen(gridPen);
+    painter.drawLine(rect().topLeft(), rect().topRight());
+    painter.drawLine(rect().topRight(), rect().bottomRight());
+    painter.drawLine(rect().bottomRight(), rect().bottomLeft());
+    painter.drawLine(rect().bottomLeft(), rect().topLeft());
+
+    QVector<qreal> dashes;
+    dashes << 2 << 2;
+    gridPen.setDashPattern(dashes);
+    painter.setPen(gridPen);
+
+    // Draw vertical lines between bars
+    if (numBars) {
+        const int numHorizontalSections = numBars;
+        QLine line(rect().topLeft(), rect().bottomLeft());
+        for (int i=1; i<numHorizontalSections; ++i) {
+            line.translate(rect().width()/numHorizontalSections, 0);
+            painter.drawLine(line);
+        }
+    }
+
+    // Draw horizontal lines
+    const int numVerticalSections = 10;
+    QLine line(rect().topLeft(), rect().topRight());
+    for (int i=1; i<numVerticalSections; ++i) {
+        line.translate(0, rect().height()/numVerticalSections);
+        painter.drawLine(line);
+    }
+
+    barColor = barColor.lighter();
+    barColor.setAlphaF(0.75);
+    clipColor.setAlphaF(0.75);
+
+    // Draw the bars
+    if (numBars) {
+        // Calculate width of bars and gaps
+        const int widgetWidth = rect().width();
+        const int barPlusGapWidth = widgetWidth / numBars;
+        const int barWidth = 0.8 * barPlusGapWidth;
+        const int gapWidth = barPlusGapWidth - barWidth;
+        const int paddingWidth = widgetWidth - numBars * (barWidth + gapWidth);
+        const int leftPaddingWidth = (paddingWidth + gapWidth) / 2;
+        const int barHeight = rect().height() - 2 * gapWidth;
+
+        for (int i=0; i<numBars; ++i) {
+            const qreal value = m_bars[i].value;
+            Q_ASSERT(value >= 0.0 && value <= 1.0);
+            QRect bar = rect();
+            bar.setLeft(rect().left() + leftPaddingWidth + (i * (gapWidth + barWidth)));
+            bar.setWidth(barWidth);
+            bar.setTop(rect().top() + gapWidth + (1.0 - value) * barHeight);
+            bar.setBottom(rect().bottom() - gapWidth);
+
+            QColor color = barColor;
+            if (m_bars[i].clipped)
+                color = clipColor;
+
+            painter.fillRect(bar, color);
+        }
+    }
+}
+
+void Spectrograph::mousePressEvent(QMouseEvent *event)
+{
+    const QPoint pos = event->pos();
+    const int index = m_bars.count() * (pos.x() - rect().left()) / rect().width();
+    selectBar(index);
+}
+
+void Spectrograph::reset()
+{
+    m_spectrum.reset();
+    spectrumChanged(m_spectrum);
+}
+
+void Spectrograph::spectrumChanged(const FrequencySpectrum &spectrum)
+{
+    m_spectrum = spectrum;
+    updateBars();
+}
+
+int Spectrograph::barIndex(qreal frequency) const
+{
+    Q_ASSERT(frequency >= m_lowFreq && frequency < m_highFreq);
+    const qreal bandWidth = (m_highFreq - m_lowFreq) / m_bars.count();
+    const int index = (frequency - m_lowFreq) / bandWidth;
+    if(index <0 || index >= m_bars.count())
+        Q_ASSERT(false);
+    return index;
+}
+
+QPair<qreal, qreal> Spectrograph::barRange(int index) const
+{
+    Q_ASSERT(index >= 0 && index < m_bars.count());
+    const qreal bandWidth = (m_highFreq - m_lowFreq) / m_bars.count();
+    return QPair<qreal, qreal>(index * bandWidth, (index+1) * bandWidth);
+}
+
+void Spectrograph::updateBars()
+{
+    m_bars.fill(Bar());
+    FrequencySpectrum::const_iterator i = m_spectrum.begin();
+    const FrequencySpectrum::const_iterator end = m_spectrum.end();
+    for ( ; i != end; ++i) {
+        const FrequencySpectrum::Element e = *i;
+        if (e.frequency >= m_lowFreq && e.frequency < m_highFreq) {
+            Bar &bar = m_bars[barIndex(e.frequency)];
+            bar.value = qMax(bar.value, e.amplitude);
+            bar.clipped |= e.clipped;
+        }
+    }
+    update();
+}
+
+void Spectrograph::selectBar(int index) {
+    const QPair<qreal, qreal> frequencyRange = barRange(index);
+    const QString message = QString("%1 - %2 Hz")
+                                .arg(frequencyRange.first)
+                                .arg(frequencyRange.second);
+    emit infoMessage(message, BarSelectionInterval);
+
+    if (NullTimerId != m_timerId)
+        killTimer(m_timerId);
+    m_timerId = startTimer(BarSelectionInterval);
+
+    m_barSelected = index;
+    update();
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/spectrograph.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,96 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are met:
+** - Redistributions of source code must retain the above copyright notice,
+**   this list of conditions and the following disclaimer.
+** - Redistributions in binary form must reproduce the above copyright notice,
+**   this list of conditions and the following disclaimer in the documentation
+**   and/or other materials provided with the distribution.
+** - Neither the name of Nokia Corporation and its Subsidiary(-ies) nor the
+**   names of its contributors may be used to endorse or promote products
+**   derived from this software without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+** POSSIBILITY OF SUCH DAMAGE.
+** $QT_END_LICENSE$
+**
+*****************************************************************************/
+
+#ifndef SPECTROGRAPH_H
+#define SPECTROGRAPH_H
+
+#include <QWidget>
+#include "frequencyspectrum.h"
+
+class QMouseEvent;
+
+/**
+ * Widget which displays a spectrograph showing the frequency spectrum
+ * of the window of audio samples most recently analysed by the Engine.
+ */
+class Spectrograph : public QWidget {
+    Q_OBJECT
+public:
+    Spectrograph(QWidget *parent = 0);
+    ~Spectrograph();
+
+    void setParams(int numBars, qreal lowFreq, qreal highFreq);
+
+    // QObject
+    void timerEvent(QTimerEvent *event);
+
+    // QWidget
+    void paintEvent(QPaintEvent *event);
+    void mousePressEvent(QMouseEvent *event);
+
+signals:
+    void infoMessage(const QString &message, int intervalMs);
+
+public slots:
+    void reset();
+    void spectrumChanged(const FrequencySpectrum &spectrum);
+
+private:
+    int barIndex(qreal frequency) const;
+    QPair<qreal, qreal> barRange(int barIndex) const;
+    void updateBars();
+
+    void selectBar(int index);
+
+private:
+    struct Bar {
+        Bar() : value(0.0), clipped(false) { }
+        qreal   value;
+        bool    clipped;
+    };
+
+    QVector<Bar>        m_bars;
+    int                 m_barSelected;
+    int                 m_timerId;
+    qreal               m_lowFreq;
+    qreal               m_highFreq;
+    FrequencySpectrum   m_spectrum;
+
+
+};
+
+#endif // SPECTROGRAPH_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/spectrum.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,141 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are met:
+** - Redistributions of source code must retain the above copyright notice,
+**   this list of conditions and the following disclaimer.
+** - Redistributions in binary form must reproduce the above copyright notice,
+**   this list of conditions and the following disclaimer in the documentation
+**   and/or other materials provided with the distribution.
+** - Neither the name of Nokia Corporation and its Subsidiary(-ies) nor the
+**   names of its contributors may be used to endorse or promote products
+**   derived from this software without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+** POSSIBILITY OF SUCH DAMAGE.
+** $QT_END_LICENSE$
+**
+*****************************************************************************/
+
+#ifndef SPECTRUM_H
+#define SPECTRUM_H
+
+#include <QtCore/qglobal.h>
+#include "utils.h"
+#include "fftreal_wrapper.h" // For FFTLengthPowerOfTwo
+
+//-----------------------------------------------------------------------------
+// Constants
+//-----------------------------------------------------------------------------
+
+// Number of audio samples used to calculate the frequency spectrum
+const int    SpectrumLengthSamples  = PowerOfTwo<FFTLengthPowerOfTwo>::Result;
+
+// Number of bands in the frequency spectrum
+const int    SpectrumNumBands       = 10;
+
+// Lower bound of first band in the spectrum
+const qreal  SpectrumLowFreq        = 0.0; // Hz
+
+// Upper band of last band in the spectrum
+const qreal  SpectrumHighFreq       = 1000.0; // Hz
+
+// Waveform window size in microseconds
+const qint64 WaveformWindowDuration = 500 * 1000;
+
+// Length of waveform tiles in bytes
+// Ideally, these would match the QAudio*::bufferSize(), but that isn't
+// available until some time after QAudio*::start() has been called, and we
+// need this value in order to initialize the waveform display.
+// We therefore just choose a sensible value.
+const int   WaveformTileLength      = 4096;
+
+// Fudge factor used to calculate the spectrum bar heights
+const qreal SpectrumAnalyserMultiplier = 0.15;
+
+// Disable message timeout
+const int   NullMessageTimeout      = -1;
+
+
+//-----------------------------------------------------------------------------
+// Types and data structures
+//-----------------------------------------------------------------------------
+
+enum WindowFunction {
+    NoWindow,
+    HannWindow
+};
+
+const WindowFunction DefaultWindowFunction = HannWindow;
+
+struct Tone {
+    Tone(qreal freq = 0.0, qreal amp = 0.0)
+    :   frequency(freq), amplitude(amp)
+    { }
+
+    // Start and end frequencies for swept tone generation
+    qreal   frequency;
+
+    // Amplitude in range [0.0, 1.0]
+    qreal   amplitude;
+};
+
+struct SweptTone {
+    SweptTone(qreal start = 0.0, qreal end = 0.0, qreal amp = 0.0)
+    :   startFreq(start), endFreq(end), amplitude(amp)
+    { Q_ASSERT(end >= start); }
+
+    SweptTone(const Tone &tone)
+    :   startFreq(tone.frequency), endFreq(tone.frequency), amplitude(tone.amplitude)
+    { }
+
+    // Start and end frequencies for swept tone generation
+    qreal   startFreq;
+    qreal   endFreq;
+
+    // Amplitude in range [0.0, 1.0]
+    qreal   amplitude;
+};
+
+
+//-----------------------------------------------------------------------------
+// Macros
+//-----------------------------------------------------------------------------
+
+// Macro which connects a signal to a slot, and which causes application to
+// abort if the connection fails.  This is intended to catch programming errors
+// such as mis-typing a signal or slot name.  It is necessary to write our own
+// macro to do this - the following idiom
+//     Q_ASSERT(connect(source, signal, receiver, slot));
+// will not work because Q_ASSERT compiles to a no-op in release builds.
+
+#define CHECKED_CONNECT(source, signal, receiver, slot) \
+    if(!connect(source, signal, receiver, slot)) \
+        qt_assert_x(Q_FUNC_INFO, "CHECKED_CONNECT failed", __FILE__, __LINE__);
+
+// Handle some dependencies between macros defined in the .pro file
+
+#ifdef DISABLE_WAVEFORM
+#undef SUPERIMPOSE_PROGRESS_ON_WAVEFORM
+#endif
+
+#endif // SPECTRUM_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/spectrum.qrc	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,7 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+    <file>images/record.png</file>
+    <file>images/settings.png</file>
+</qresource>
+</RCC>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/spectrum.sh	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+# Shell script for launching spectrum application on Unix systems other than Mac OSX
+
+bindir=`dirname "$0"`
+LD_LIBRARY_PATH="${bindir}:${LD_LIBRARY_PATH}"
+export LD_LIBRARY_PATH
+exec "${bindir}/spectrum.bin" ${1+"$@"}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/spectrumanalyser.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,280 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "spectrumanalyser.h"
+#include "utils.h"
+
+#include <QtCore/qmath.h>
+#include <QtCore/qmetatype.h>
+#include <QtMultimedia/QAudioFormat>
+#include <QThread>
+
+#include "fftreal_wrapper.h"
+
+SpectrumAnalyserThread::SpectrumAnalyserThread(QObject *parent)
+    :   QObject(parent)
+#ifndef DISABLE_FFT
+    ,   m_fft(new FFTRealWrapper)
+#endif
+    ,   m_numSamples(SpectrumLengthSamples)
+    ,   m_windowFunction(DefaultWindowFunction)
+    ,   m_window(SpectrumLengthSamples, 0.0)
+    ,   m_input(SpectrumLengthSamples, 0.0)
+    ,   m_output(SpectrumLengthSamples, 0.0)
+    ,   m_spectrum(SpectrumLengthSamples)
+#ifdef SPECTRUM_ANALYSER_SEPARATE_THREAD
+    ,   m_thread(new QThread(this))
+#endif
+{
+#ifdef SPECTRUM_ANALYSER_SEPARATE_THREAD
+    moveToThread(m_thread);
+    m_thread->start();
+#endif
+    calculateWindow();
+}
+
+SpectrumAnalyserThread::~SpectrumAnalyserThread()
+{
+#ifndef DISABLE_FFT
+    delete m_fft;
+#endif
+}
+
+void SpectrumAnalyserThread::setWindowFunction(WindowFunction type)
+{
+    m_windowFunction = type;
+    calculateWindow();
+}
+
+void SpectrumAnalyserThread::calculateWindow()
+{
+    for (int i=0; i<m_numSamples; ++i) {
+        DataType x = 0.0;
+
+        switch (m_windowFunction) {
+        case NoWindow:
+            x = 1.0;
+            break;
+        case HannWindow:
+            x = 0.5 * (1 - qCos((2 * M_PI * i) / (m_numSamples - 1)));
+            break;
+        default:
+            Q_ASSERT(false);
+        }
+
+        m_window[i] = x;
+    }
+}
+
+void SpectrumAnalyserThread::calculateSpectrum(const QByteArray &buffer,
+                                                int inputFrequency,
+                                                int bytesPerSample)
+{
+#ifndef DISABLE_FFT
+    Q_ASSERT(buffer.size() == m_numSamples * bytesPerSample);
+
+    // Initialize data array
+    const char *ptr = buffer.constData();
+    for (int i=0; i<m_numSamples; ++i) {
+        const qint16 pcmSample = *reinterpret_cast<const qint16*>(ptr);
+        // Scale down to range [-1.0, 1.0]
+        const DataType realSample = pcmToReal(pcmSample);
+        const DataType windowedSample = realSample * m_window[i];
+        m_input[i] = windowedSample;
+        ptr += bytesPerSample;
+    }
+
+    // Calculate the FFT
+    m_fft->calculateFFT(m_output.data(), m_input.data());
+
+    // Analyse output to obtain amplitude and phase for each frequency
+    for (int i=2; i<=m_numSamples/2; ++i) {
+        // Calculate frequency of this complex sample
+        m_spectrum[i].frequency = qreal(i * inputFrequency) / (m_numSamples);
+
+        const qreal real = m_output[i];
+        qreal imag = 0.0;
+        if (i>0 && i<m_numSamples/2)
+            imag = m_output[m_numSamples/2 + i];
+
+        const qreal magnitude = sqrt(real*real + imag*imag);
+        qreal amplitude = SpectrumAnalyserMultiplier * log(magnitude);
+
+        // Bound amplitude to [0.0, 1.0]
+        m_spectrum[i].clipped = (amplitude > 1.0);
+        amplitude = qMax(qreal(0.0), amplitude);
+        amplitude = qMin(qreal(1.0), amplitude);
+        m_spectrum[i].amplitude = amplitude;
+    }
+#endif
+
+    emit calculationComplete(m_spectrum);
+}
+
+
+//=============================================================================
+// SpectrumAnalyser
+//=============================================================================
+
+SpectrumAnalyser::SpectrumAnalyser(QObject *parent)
+    :   QObject(parent)
+    ,   m_thread(new SpectrumAnalyserThread(this))
+    ,   m_state(Idle)
+#ifdef DUMP_SPECTRUMANALYSER
+    ,   m_count(0)
+#endif
+{
+    CHECKED_CONNECT(m_thread, SIGNAL(calculationComplete(FrequencySpectrum)),
+                    this, SLOT(calculationComplete(FrequencySpectrum)));
+}
+
+SpectrumAnalyser::~SpectrumAnalyser()
+{
+
+}
+
+#ifdef DUMP_SPECTRUMANALYSER
+void SpectrumAnalyser::setOutputPath(const QString &outputDir)
+{
+    m_outputDir.setPath(outputDir);
+    m_textFile.setFileName(m_outputDir.filePath("spectrum.txt"));
+    m_textFile.open(QIODevice::WriteOnly | QIODevice::Text);
+    m_textStream.setDevice(&m_textFile);
+}
+#endif
+
+//-----------------------------------------------------------------------------
+// Public functions
+//-----------------------------------------------------------------------------
+
+void SpectrumAnalyser::setWindowFunction(WindowFunction type)
+{
+    const bool b = QMetaObject::invokeMethod(m_thread, "setWindowFunction",
+                              Qt::AutoConnection,
+                              Q_ARG(WindowFunction, type));
+    Q_ASSERT(b);
+    Q_UNUSED(b) // suppress warnings in release builds
+}
+
+void SpectrumAnalyser::calculate(const QByteArray &buffer,
+                         const QAudioFormat &format)
+{
+    // QThread::currentThread is marked 'for internal use only', but
+    // we're only using it for debug output here, so it's probably OK :)
+    SPECTRUMANALYSER_DEBUG << "SpectrumAnalyser::calculate"
+                           << QThread::currentThread()
+                           << "state" << m_state;
+
+    if (isReady()) {
+        Q_ASSERT(isPCMS16LE(format));
+
+        const int bytesPerSample = format.sampleSize() * format.channels() / 8;
+
+#ifdef DUMP_SPECTRUMANALYSER
+        m_count++;
+        const QString pcmFileName = m_outputDir.filePath(QString("spectrum_%1.pcm").arg(m_count, 4, 10, QChar('0')));
+        QFile pcmFile(pcmFileName);
+        pcmFile.open(QIODevice::WriteOnly);
+        const int bufferLength = m_numSamples * bytesPerSample;
+        pcmFile.write(buffer, bufferLength);
+
+        m_textStream << "TimeDomain " << m_count << "\n";
+        const qint16* input = reinterpret_cast<const qint16*>(buffer);
+        for (int i=0; i<m_numSamples; ++i) {
+            m_textStream << i << "\t" << *input << "\n";
+            input += format.channels();
+        }
+#endif
+
+        m_state = Busy;
+
+        // Invoke SpectrumAnalyserThread::calculateSpectrum using QMetaObject.  If
+        // m_thread is in a different thread from the current thread, the
+        // calculation will be done in the child thread.
+        // Once the calculation is finished, a calculationChanged signal will be
+        // emitted by m_thread.
+        const bool b = QMetaObject::invokeMethod(m_thread, "calculateSpectrum",
+                                  Qt::AutoConnection,
+                                  Q_ARG(QByteArray, buffer),
+                                  Q_ARG(int, format.frequency()),
+                                  Q_ARG(int, bytesPerSample));
+        Q_ASSERT(b);
+        Q_UNUSED(b) // suppress warnings in release builds
+
+#ifdef DUMP_SPECTRUMANALYSER
+        m_textStream << "FrequencySpectrum " << m_count << "\n";
+        FrequencySpectrum::const_iterator x = m_spectrum.begin();
+        for (int i=0; i<m_numSamples; ++i, ++x)
+            m_textStream << i << "\t"
+                         << x->frequency << "\t"
+                         << x->amplitude<< "\t"
+                         << x->phase << "\n";
+#endif
+    }
+}
+
+bool SpectrumAnalyser::isReady() const
+{
+    return (Idle == m_state);
+}
+
+void SpectrumAnalyser::cancelCalculation()
+{
+    if (Busy == m_state)
+        m_state = Cancelled;
+}
+
+
+//-----------------------------------------------------------------------------
+// Private slots
+//-----------------------------------------------------------------------------
+
+void SpectrumAnalyser::calculationComplete(const FrequencySpectrum &spectrum)
+{
+    Q_ASSERT(Idle != m_state);
+    if (Busy == m_state)
+        emit spectrumChanged(spectrum);
+    m_state = Idle;
+}
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/spectrumanalyser.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,190 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are met:
+** - Redistributions of source code must retain the above copyright notice,
+**   this list of conditions and the following disclaimer.
+** - Redistributions in binary form must reproduce the above copyright notice,
+**   this list of conditions and the following disclaimer in the documentation
+**   and/or other materials provided with the distribution.
+** - Neither the name of Nokia Corporation and its Subsidiary(-ies) nor the
+**   names of its contributors may be used to endorse or promote products
+**   derived from this software without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+** POSSIBILITY OF SUCH DAMAGE.
+** $QT_END_LICENSE$
+**
+*****************************************************************************/
+
+#ifndef SPECTRUMANALYSER_H
+#define SPECTRUMANALYSER_H
+
+#include <QByteArray>
+#include <QObject>
+#include <QVector>
+
+#ifdef DUMP_SPECTRUMANALYSER
+#include <QDir>
+#include <QFile>
+#include <QTextStream>
+#endif
+
+#include "frequencyspectrum.h"
+#include "spectrum.h"
+
+#ifndef DISABLE_FFT
+#include "FFTRealFixLenParam.h"
+#endif
+
+class QAudioFormat;
+class QThread;
+class FFTRealWrapper;
+
+class SpectrumAnalyserThreadPrivate;
+
+/**
+ * Implementation of the spectrum analysis which can be run in a
+ * separate thread.
+ */
+class SpectrumAnalyserThread : public QObject
+{
+    Q_OBJECT
+public:
+    SpectrumAnalyserThread(QObject *parent);
+    ~SpectrumAnalyserThread();
+
+public slots:
+    void setWindowFunction(WindowFunction type);
+    void calculateSpectrum(const QByteArray &buffer,
+                           int inputFrequency,
+                           int bytesPerSample);
+
+signals:
+    void calculationComplete(const FrequencySpectrum &spectrum);
+
+private:
+    void calculateWindow();
+
+private:
+#ifndef DISABLE_FFT
+    FFTRealWrapper*                             m_fft;
+#endif
+
+    const int                                   m_numSamples;
+
+    WindowFunction                              m_windowFunction;
+
+#ifdef DISABLE_FFT
+    typedef qreal                               DataType;
+#else
+    typedef FFTRealFixLenParam::DataType        DataType;
+#endif
+    QVector<DataType>                           m_window;
+
+    QVector<DataType>                           m_input;
+    QVector<DataType>                           m_output;
+
+    FrequencySpectrum                           m_spectrum;
+
+#ifdef SPECTRUM_ANALYSER_SEPARATE_THREAD
+    QThread*                                    m_thread;
+#endif
+};
+
+/**
+ * Class which performs frequency spectrum analysis on a window of
+ * audio samples, provided to it by the Engine.
+ */
+class SpectrumAnalyser : public QObject
+{
+    Q_OBJECT
+public:
+    SpectrumAnalyser(QObject *parent = 0);
+    ~SpectrumAnalyser();
+
+#ifdef DUMP_SPECTRUMANALYSER
+    void setOutputPath(const QString &outputPath);
+#endif
+
+public:
+    /*
+     * Set the windowing function which is applied before calculating the FFT
+     */
+    void setWindowFunction(WindowFunction type);
+
+    /*
+     * Calculate a frequency spectrum
+     *
+     * \param buffer       Audio data
+     * \param format       Format of audio data
+     *
+     * Frequency spectrum is calculated asynchronously.  The result is returned
+     * via the spectrumChanged signal.
+     *
+     * An ongoing calculation can be cancelled by calling cancelCalculation().
+     *
+     */
+    void calculate(const QByteArray &buffer, const QAudioFormat &format);
+
+    /*
+     * Check whether the object is ready to perform another calculation
+     */
+    bool isReady() const;
+
+    /*
+     * Cancel an ongoing calculation
+     *
+     * Note that cancelling is asynchronous.
+     */
+    void cancelCalculation();
+
+signals:
+    void spectrumChanged(const FrequencySpectrum &spectrum);
+
+private slots:
+    void calculationComplete(const FrequencySpectrum &spectrum);
+
+private:
+    void calculateWindow();
+
+private:
+
+    SpectrumAnalyserThread*    m_thread;
+
+    enum State {
+        Idle,
+        Busy,
+        Cancelled
+    };
+
+    State              m_state;
+
+#ifdef DUMP_SPECTRUMANALYSER
+    QDir                m_outputDir;
+    int                 m_count;
+    QFile               m_textFile;
+    QTextStream         m_textStream;
+#endif
+};
+
+#endif // SPECTRUMANALYSER_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/tonegenerator.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,92 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "spectrum.h"
+#include "utils.h"
+#include <QByteArray>
+#include <QtMultimedia/QAudioFormat>
+#include <QtCore/qmath.h>
+#include <QtCore/qendian.h>
+
+void generateTone(const SweptTone &tone, const QAudioFormat &format, QByteArray &buffer)
+{
+    Q_ASSERT(isPCMS16LE(format));
+
+    const int channelBytes = format.sampleSize() / 8;
+    const int sampleBytes = format.channels() * channelBytes;
+    int length = buffer.size();
+    const int numSamples = buffer.size() / sampleBytes;
+
+    Q_ASSERT(length % sampleBytes == 0);
+    Q_UNUSED(sampleBytes) // suppress warning in release builds
+
+    unsigned char *ptr = reinterpret_cast<unsigned char *>(buffer.data());
+
+    qreal phase = 0.0;
+
+    const qreal d = 2 * M_PI / format.frequency();
+
+    // We can't generate a zero-frequency sine wave
+    const qreal startFreq = tone.startFreq ? tone.startFreq : 1.0;
+
+    // Amount by which phase increases on each sample
+    qreal phaseStep = d * startFreq;
+
+    // Amount by which phaseStep increases on each sample
+    // If this is non-zero, the output is a frequency-swept tone
+    const qreal phaseStepStep = d * (tone.endFreq - startFreq) / numSamples;
+
+    while (length) {
+        const qreal x = tone.amplitude * qSin(phase);
+        const qint16 value = realToPcm(x);
+        for (int i=0; i<format.channels(); ++i) {
+            qToLittleEndian<qint16>(value, ptr);
+            ptr += channelBytes;
+            length -= channelBytes;
+        }
+
+        phase += phaseStep;
+        while (phase > 2 * M_PI)
+            phase -= 2 * M_PI;
+        phaseStep += phaseStepStep;
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/tonegenerator.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are met:
+** - Redistributions of source code must retain the above copyright notice,
+**   this list of conditions and the following disclaimer.
+** - Redistributions in binary form must reproduce the above copyright notice,
+**   this list of conditions and the following disclaimer in the documentation
+**   and/or other materials provided with the distribution.
+** - Neither the name of Nokia Corporation and its Subsidiary(-ies) nor the
+**   names of its contributors may be used to endorse or promote products
+**   derived from this software without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+** POSSIBILITY OF SUCH DAMAGE.
+** $QT_END_LICENSE$
+**
+*****************************************************************************/
+
+#ifndef TONEGENERATOR_H
+#define TONEGENERATOR_H
+
+#include <QtCore/qglobal.h>
+#include "spectrum.h"
+
+class QAudioFormat;
+class QByteArray;
+
+/**
+ * Generate a sine wave
+ */
+void generateTone(const SweptTone &tone, const QAudioFormat &format, QByteArray &buffer);
+
+#endif // TONEGENERATOR_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/tonegeneratordialog.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,148 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "tonegeneratordialog.h"
+#include <QComboBox>
+#include <QDialogButtonBox>
+#include <QLabel>
+#include <QPushButton>
+#include <QVBoxLayout>
+#include <QCheckBox>
+#include <QSlider>
+#include <QSpinBox>
+
+const int ToneGeneratorFreqMin = 1;
+const int ToneGeneratorFreqMax = 1000;
+const int ToneGeneratorFreqDefault = 440;
+const int ToneGeneratorAmplitudeDefault = 75;
+
+ToneGeneratorDialog::ToneGeneratorDialog(QWidget *parent)
+    :   QDialog(parent)
+    ,   m_toneGeneratorSweepCheckBox(new QCheckBox(tr("Frequency sweep"), this))
+    ,   m_frequencySweepEnabled(true)
+    ,   m_toneGeneratorControl(new QWidget(this))
+    ,   m_toneGeneratorFrequencyControl(new QWidget(this))
+    ,   m_frequencySlider(new QSlider(Qt::Horizontal, this))
+    ,   m_frequencySpinBox(new QSpinBox(this))
+    ,   m_frequency(ToneGeneratorFreqDefault)
+    ,   m_amplitudeSlider(new QSlider(Qt::Horizontal, this))
+{
+    QVBoxLayout *dialogLayout = new QVBoxLayout(this);
+
+    m_toneGeneratorSweepCheckBox->setChecked(true);
+
+    // Configure tone generator controls
+    m_frequencySlider->setRange(ToneGeneratorFreqMin, ToneGeneratorFreqMax);
+    m_frequencySlider->setValue(ToneGeneratorFreqDefault);
+    m_frequencySpinBox->setRange(ToneGeneratorFreqMin, ToneGeneratorFreqMax);
+    m_frequencySpinBox->setValue(ToneGeneratorFreqDefault);
+    m_amplitudeSlider->setRange(0, 100);
+    m_amplitudeSlider->setValue(ToneGeneratorAmplitudeDefault);
+
+    // Add widgets to layout
+
+    QScopedPointer<QGridLayout> frequencyControlLayout(new QGridLayout);
+    QLabel *frequencyLabel = new QLabel(tr("Frequency (Hz)"), this);
+    frequencyControlLayout->addWidget(frequencyLabel, 0, 0, 2, 1);
+    frequencyControlLayout->addWidget(m_frequencySlider, 0, 1);
+    frequencyControlLayout->addWidget(m_frequencySpinBox, 1, 1);
+    m_toneGeneratorFrequencyControl->setLayout(frequencyControlLayout.data());
+    frequencyControlLayout.take(); // ownership transferred to m_toneGeneratorFrequencyControl
+    m_toneGeneratorFrequencyControl->setEnabled(false);
+
+    QScopedPointer<QGridLayout> toneGeneratorLayout(new QGridLayout);
+    QLabel *amplitudeLabel = new QLabel(tr("Amplitude"), this);
+    toneGeneratorLayout->addWidget(m_toneGeneratorSweepCheckBox, 0, 1);
+    toneGeneratorLayout->addWidget(m_toneGeneratorFrequencyControl, 1, 0, 1, 2);
+    toneGeneratorLayout->addWidget(amplitudeLabel, 2, 0);
+    toneGeneratorLayout->addWidget(m_amplitudeSlider, 2, 1);
+    m_toneGeneratorControl->setLayout(toneGeneratorLayout.data());
+    m_toneGeneratorControl->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+    dialogLayout->addWidget(m_toneGeneratorControl);
+    toneGeneratorLayout.take(); // ownership transferred
+
+    // Connect
+    CHECKED_CONNECT(m_toneGeneratorSweepCheckBox, SIGNAL(toggled(bool)),
+                    this, SLOT(frequencySweepEnabled(bool)));
+    CHECKED_CONNECT(m_frequencySlider, SIGNAL(valueChanged(int)),
+                    m_frequencySpinBox, SLOT(setValue(int)));
+    CHECKED_CONNECT(m_frequencySpinBox, SIGNAL(valueChanged(int)),
+                    m_frequencySlider, SLOT(setValue(int)));
+
+    // Add standard buttons to layout
+    QDialogButtonBox *buttonBox = new QDialogButtonBox(this);
+    buttonBox->setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
+    dialogLayout->addWidget(buttonBox);
+
+    // Connect standard buttons
+    CHECKED_CONNECT(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()),
+                    this, SLOT(accept()));
+    CHECKED_CONNECT(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()),
+                    this, SLOT(reject()));
+
+    setLayout(dialogLayout);
+}
+
+ToneGeneratorDialog::~ToneGeneratorDialog()
+{
+
+}
+
+bool ToneGeneratorDialog::isFrequencySweepEnabled() const
+{
+    return m_toneGeneratorSweepCheckBox->isChecked();
+}
+
+qreal ToneGeneratorDialog::frequency() const
+{
+    return qreal(m_frequencySlider->value());
+}
+
+qreal ToneGeneratorDialog::amplitude() const
+{
+    return qreal(m_amplitudeSlider->value()) / 100.0;
+}
+
+void ToneGeneratorDialog::frequencySweepEnabled(bool enabled)
+{
+    m_frequencySweepEnabled = enabled;
+    m_toneGeneratorFrequencyControl->setEnabled(!enabled);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/tonegeneratordialog.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are met:
+** - Redistributions of source code must retain the above copyright notice,
+**   this list of conditions and the following disclaimer.
+** - Redistributions in binary form must reproduce the above copyright notice,
+**   this list of conditions and the following disclaimer in the documentation
+**   and/or other materials provided with the distribution.
+** - Neither the name of Nokia Corporation and its Subsidiary(-ies) nor the
+**   names of its contributors may be used to endorse or promote products
+**   derived from this software without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+** POSSIBILITY OF SUCH DAMAGE.
+** $QT_END_LICENSE$
+**
+*****************************************************************************/
+
+#ifndef TONEGENERATORDIALOG_H
+#define TONEGENERATORDIALOG_H
+
+#include "spectrum.h"
+#include <QDialog>
+#include <QtMultimedia/QAudioDeviceInfo>
+
+class QCheckBox;
+class QSlider;
+class QSpinBox;
+class QGridLayout;
+
+/**
+ * Dialog which controls the parameters of the tone generator.
+ */
+class ToneGeneratorDialog : public QDialog {
+    Q_OBJECT
+public:
+    ToneGeneratorDialog(QWidget *parent = 0);
+    ~ToneGeneratorDialog();
+
+    bool isFrequencySweepEnabled() const;
+    qreal frequency() const;
+    qreal amplitude() const;
+
+private slots:
+    void frequencySweepEnabled(bool enabled);
+
+private:
+    QCheckBox*      m_toneGeneratorSweepCheckBox;
+    bool            m_frequencySweepEnabled;
+    QWidget*        m_toneGeneratorControl;
+    QWidget*        m_toneGeneratorFrequencyControl;
+    QSlider*        m_frequencySlider;
+    QSpinBox*       m_frequencySpinBox;
+    qreal           m_frequency;
+    QSlider*        m_amplitudeSlider;
+
+};
+
+#endif // TONEGENERATORDIALOG_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/utils.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,138 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtMultimedia/QAudioFormat>
+#include "utils.h"
+
+qint64 audioDuration(const QAudioFormat &format, qint64 bytes)
+{
+    return (bytes * 1000000) /
+        (format.frequency() * format.channels() * (format.sampleSize() / 8));
+}
+
+qint64 audioLength(const QAudioFormat &format, qint64 microSeconds)
+{
+   return (format.frequency() * format.channels() * (format.sampleSize() / 8))
+       * microSeconds / 1000000;
+}
+
+qreal nyquistFrequency(const QAudioFormat &format)
+{
+    return format.frequency() / 2;
+}
+
+QString formatToString(const QAudioFormat &format)
+{
+    QString result;
+
+    if (QAudioFormat() != format) {
+        if (format.codec() == "audio/pcm") {
+            Q_ASSERT(format.sampleType() == QAudioFormat::SignedInt);
+
+            const QString formatEndian = (format.byteOrder() == QAudioFormat::LittleEndian)
+                ?   QString("LE") : QString("BE");
+
+            QString formatType;
+            switch(format.sampleType()) {
+            case QAudioFormat::SignedInt:
+                formatType = "signed";
+                break;
+            case QAudioFormat::UnSignedInt:
+                formatType = "unsigned";
+                break;
+            case QAudioFormat::Float:
+                formatType = "float";
+                break;
+            case QAudioFormat::Unknown:
+                formatType = "unknown";
+                break;
+            }
+
+            QString formatChannels = QString("%1 channels").arg(format.channels());
+            switch (format.channels()) {
+            case 1:
+                formatChannels = "mono";
+                break;
+            case 2:
+                formatChannels = "stereo";
+                break;
+            }
+
+            result = QString("%1 Hz %2 bit %3 %4 %5")
+                .arg(format.frequency())
+                .arg(format.sampleSize())
+                .arg(formatType)
+                .arg(formatEndian)
+                .arg(formatChannels);
+        } else {
+            result = format.codec();
+        }
+    }
+
+    return result;
+}
+
+bool isPCM(const QAudioFormat &format)
+{
+    return (format.codec() == "audio/pcm");
+}
+
+
+bool isPCMS16LE(const QAudioFormat &format)
+{
+    return (isPCM(format) &&
+            format.sampleType() == QAudioFormat::SignedInt &&
+            format.sampleSize() == 16 &&
+            format.byteOrder() == QAudioFormat::LittleEndian);
+}
+
+const qint16  PCMS16MaxValue     =  32767;
+const quint16 PCMS16MaxAmplitude =  32768; // because minimum is -32768
+
+qreal pcmToReal(qint16 pcm)
+{
+    return qreal(pcm) / PCMS16MaxAmplitude;
+}
+
+qint16 realToPcm(qreal real)
+{
+    return real * PCMS16MaxValue;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/utils.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,109 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are met:
+** - Redistributions of source code must retain the above copyright notice,
+**   this list of conditions and the following disclaimer.
+** - Redistributions in binary form must reproduce the above copyright notice,
+**   this list of conditions and the following disclaimer in the documentation
+**   and/or other materials provided with the distribution.
+** - Neither the name of Nokia Corporation and its Subsidiary(-ies) nor the
+**   names of its contributors may be used to endorse or promote products
+**   derived from this software without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+** POSSIBILITY OF SUCH DAMAGE.
+** $QT_END_LICENSE$
+**
+*****************************************************************************/
+
+#ifndef UTILS_H
+#define UTILS_H
+
+#include <QtCore/qglobal.h>
+#include <QDebug>
+
+class QAudioFormat;
+
+//-----------------------------------------------------------------------------
+// Miscellaneous utility functions
+//-----------------------------------------------------------------------------
+
+qint64 audioDuration(const QAudioFormat &format, qint64 bytes);
+qint64 audioLength(const QAudioFormat &format, qint64 microSeconds);
+
+QString formatToString(const QAudioFormat &format);
+
+qreal nyquistFrequency(const QAudioFormat &format);
+
+// Scale PCM value to [-1.0, 1.0]
+qreal pcmToReal(qint16 pcm);
+
+// Scale real value in [-1.0, 1.0] to PCM
+qint16 realToPcm(qreal real);
+
+// Check whether the audio format is PCM
+bool isPCM(const QAudioFormat &format);
+
+// Check whether the audio format is signed, little-endian, 16-bit PCM
+bool isPCMS16LE(const QAudioFormat &format);
+
+// Compile-time calculation of powers of two
+
+template<int N> class PowerOfTwo
+{ public: static const int Result = PowerOfTwo<N-1>::Result * 2; };
+
+template<> class PowerOfTwo<0>
+{ public: static const int Result = 1; };
+
+
+//-----------------------------------------------------------------------------
+// Debug output
+//-----------------------------------------------------------------------------
+
+class NullDebug
+{
+public:
+    template <typename T>
+    NullDebug& operator<<(const T&) { return *this; }
+};
+
+inline NullDebug nullDebug() { return NullDebug(); }
+
+#ifdef LOG_ENGINE
+#   define ENGINE_DEBUG qDebug()
+#else
+#   define ENGINE_DEBUG nullDebug()
+#endif
+
+#ifdef LOG_SPECTRUMANALYSER
+#   define SPECTRUMANALYSER_DEBUG qDebug()
+#else
+#   define SPECTRUMANALYSER_DEBUG nullDebug()
+#endif
+
+#ifdef LOG_WAVEFORM
+#   define WAVEFORM_DEBUG qDebug()
+#else
+#   define WAVEFORM_DEBUG nullDebug()
+#endif
+
+#endif // UTILS_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/waveform.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,419 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "waveform.h"
+#include "utils.h"
+#include <QPainter>
+#include <QResizeEvent>
+#include <QDebug>
+
+
+Waveform::Waveform(const QByteArray &buffer, QWidget *parent)
+    :   QWidget(parent)
+    ,   m_buffer(buffer)
+    ,   m_dataLength(0)
+    ,   m_position(0)
+    ,   m_active(false)
+    ,   m_tileLength(0)
+    ,   m_tileArrayStart(0)
+    ,   m_windowPosition(0)
+    ,   m_windowLength(0)
+{
+    setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+    setMinimumHeight(50);
+}
+
+Waveform::~Waveform()
+{
+    deletePixmaps();
+}
+
+void Waveform::paintEvent(QPaintEvent * /*event*/)
+{
+    QPainter painter(this);
+
+    painter.fillRect(rect(), Qt::black);
+
+    if (m_active) {
+        WAVEFORM_DEBUG << "Waveform::paintEvent"
+                       << "windowPosition" << m_windowPosition
+                       << "windowLength" << m_windowLength;
+        qint64 pos = m_windowPosition;
+        const qint64 windowEnd = m_windowPosition + m_windowLength;
+        int destLeft = 0;
+        int destRight = 0;
+        while (pos < windowEnd) {
+            const TilePoint point = tilePoint(pos);
+            WAVEFORM_DEBUG << "Waveform::paintEvent" << "pos" << pos
+                           << "tileIndex" << point.index
+                           << "positionOffset" << point.positionOffset
+                           << "pixelOffset" << point.pixelOffset;
+
+            if (point.index != NullIndex) {
+                const Tile &tile = m_tiles[point.index];
+                if (tile.painted) {
+                    const qint64 sectionLength = qMin((m_tileLength - point.positionOffset),
+                                                     (windowEnd - pos));
+                    Q_ASSERT(sectionLength > 0);
+
+                    const int sourceRight = tilePixelOffset(point.positionOffset + sectionLength);
+                    destRight = windowPixelOffset(pos - m_windowPosition + sectionLength);
+
+                    QRect destRect = rect();
+                    destRect.setLeft(destLeft);
+                    destRect.setRight(destRight);
+
+                    QRect sourceRect(QPoint(), m_pixmapSize);
+                    sourceRect.setLeft(point.pixelOffset);
+                    sourceRect.setRight(sourceRight);
+
+                    WAVEFORM_DEBUG << "Waveform::paintEvent" << "tileIndex" << point.index
+                                   << "source" << point.pixelOffset << sourceRight
+                                   << "dest" << destLeft << destRight;
+
+                    painter.drawPixmap(destRect, *tile.pixmap, sourceRect);
+
+                    destLeft = destRight;
+
+                    if (point.index < m_tiles.count()) {
+                        pos = tilePosition(point.index + 1);
+                        WAVEFORM_DEBUG << "Waveform::paintEvent" << "pos ->" << pos;
+                    } else {
+                        // Reached end of tile array
+                        WAVEFORM_DEBUG << "Waveform::paintEvent" << "reached end of tile array";
+                        break;
+                    }
+                } else {
+                    // Passed last tile which is painted
+                    WAVEFORM_DEBUG << "Waveform::paintEvent" << "tile" << point.index << "not painted";
+                    break;
+                }
+            } else {
+                // pos is past end of tile array
+                WAVEFORM_DEBUG << "Waveform::paintEvent" << "pos" << pos << "past end of tile array";
+                break;
+            }
+        }
+
+        WAVEFORM_DEBUG << "Waveform::paintEvent" << "final pos" << pos << "final x" << destRight;
+    }
+}
+
+void Waveform::resizeEvent(QResizeEvent *event)
+{
+    if (event->size() != event->oldSize())
+        createPixmaps(event->size());
+}
+
+void Waveform::initialize(const QAudioFormat &format, qint64 audioBufferSize, qint64 windowDurationUs)
+{
+    WAVEFORM_DEBUG << "Waveform::initialize"
+                   << "audioBufferSize" << audioBufferSize
+                   << "m_buffer.size()" << m_buffer.size()
+                   << "windowDurationUs" << windowDurationUs;
+
+    reset();
+
+    m_format = format;
+
+    // Calculate tile size
+    m_tileLength = audioBufferSize;
+
+    // Calculate window size
+    m_windowLength = audioLength(m_format, windowDurationUs);
+
+    // Calculate number of tiles required
+    int nTiles;
+    if (m_tileLength > m_windowLength) {
+        nTiles = 2;
+    } else {
+        nTiles = m_windowLength / m_tileLength + 1;
+        if (m_windowLength % m_tileLength)
+            ++nTiles;
+    }
+
+    WAVEFORM_DEBUG << "Waveform::initialize"
+                   << "tileLength" << m_tileLength
+                   << "windowLength" << m_windowLength
+                   << "nTiles" << nTiles;
+
+    m_pixmaps.fill(0, nTiles);
+    m_tiles.resize(nTiles);
+
+    createPixmaps(rect().size());
+
+    m_active = true;
+}
+
+void Waveform::reset()
+{
+    WAVEFORM_DEBUG << "Waveform::reset";
+
+    m_dataLength = 0;
+    m_position = 0;
+    m_format = QAudioFormat();
+    m_active = false;
+    deletePixmaps();
+    m_tiles.clear();
+    m_tileLength = 0;
+    m_tileArrayStart = 0;
+    m_windowPosition = 0;
+    m_windowLength = 0;
+}
+
+void Waveform::dataLengthChanged(qint64 length)
+{
+    WAVEFORM_DEBUG << "Waveform::dataLengthChanged" << length;
+    const qint64 oldLength = m_dataLength;
+    m_dataLength = length;
+
+    if (m_active) {
+        if (m_dataLength < oldLength)
+            positionChanged(m_dataLength);
+        else
+            paintTiles();
+    }
+}
+
+void Waveform::positionChanged(qint64 position)
+{
+    WAVEFORM_DEBUG << "Waveform::positionChanged" << position;
+
+    if (position + m_windowLength > m_dataLength)
+        position = m_dataLength - m_windowLength;
+
+    m_position = position;
+
+    setWindowPosition(position);
+}
+
+void Waveform::deletePixmaps()
+{
+    QPixmap *pixmap;
+    foreach (pixmap, m_pixmaps)
+        delete pixmap;
+    m_pixmaps.clear();
+}
+
+void Waveform::createPixmaps(const QSize &widgetSize)
+{
+    m_pixmapSize = widgetSize;
+    m_pixmapSize.setWidth(qreal(widgetSize.width()) * m_tileLength / m_windowLength);
+
+    WAVEFORM_DEBUG << "Waveform::createPixmaps"
+                   << "widgetSize" << widgetSize
+                   << "pixmapSize" << m_pixmapSize;
+
+    Q_ASSERT(m_tiles.count() == m_pixmaps.count());
+
+    // (Re)create pixmaps
+    for (int i=0; i<m_pixmaps.size(); ++i) {
+        delete m_pixmaps[i];
+        m_pixmaps[i] = 0;
+        m_pixmaps[i] = new QPixmap(m_pixmapSize);
+    }
+
+    // Update tile pixmap pointers, and mark for repainting
+    for (int i=0; i<m_tiles.count(); ++i) {
+        m_tiles[i].pixmap = m_pixmaps[i];
+        m_tiles[i].painted = false;
+    }
+
+    paintTiles();
+}
+
+void Waveform::setWindowPosition(qint64 position)
+{
+    WAVEFORM_DEBUG << "Waveform::setWindowPosition"
+                   << "old" << m_windowPosition << "new" << position
+                   << "tileArrayStart" << m_tileArrayStart;
+
+    const qint64 oldPosition = m_windowPosition;
+    m_windowPosition = position;
+
+    if((m_windowPosition >= oldPosition) &&
+        (m_windowPosition - m_tileArrayStart < (m_tiles.count() * m_tileLength))) {
+        // Work out how many tiles need to be shuffled
+        const qint64 offset = m_windowPosition - m_tileArrayStart;
+        const int nTiles = offset / m_tileLength;
+        shuffleTiles(nTiles);
+    } else {
+        resetTiles(m_windowPosition);
+    }
+
+    if(!paintTiles() && m_windowPosition != oldPosition)
+        update();
+}
+
+qint64 Waveform::tilePosition(int index) const
+{
+    return m_tileArrayStart + index * m_tileLength;
+}
+
+Waveform::TilePoint Waveform::tilePoint(qint64 position) const
+{
+    TilePoint result;
+    if (position >= m_tileArrayStart) {
+        const qint64 tileArrayEnd = m_tileArrayStart + m_tiles.count() * m_tileLength;
+        if (position < tileArrayEnd) {
+            const qint64 offsetIntoTileArray = position - m_tileArrayStart;
+            result.index = offsetIntoTileArray / m_tileLength;
+            Q_ASSERT(result.index >= 0 && result.index <= m_tiles.count());
+            result.positionOffset = offsetIntoTileArray % m_tileLength;
+            result.pixelOffset = tilePixelOffset(result.positionOffset);
+            Q_ASSERT(result.pixelOffset >= 0 && result.pixelOffset <= m_pixmapSize.width());
+        }
+    }
+
+    return result;
+}
+
+int Waveform::tilePixelOffset(qint64 positionOffset) const
+{
+    Q_ASSERT(positionOffset >= 0 && positionOffset <= m_tileLength);
+    const int result = (qreal(positionOffset) / m_tileLength) * m_pixmapSize.width();
+    return result;
+}
+
+int Waveform::windowPixelOffset(qint64 positionOffset) const
+{
+    Q_ASSERT(positionOffset >= 0 && positionOffset <= m_windowLength);
+    const int result = (qreal(positionOffset) / m_windowLength) * rect().width();
+    return result;
+}
+
+bool Waveform::paintTiles()
+{
+    WAVEFORM_DEBUG << "Waveform::paintTiles";
+    bool updateRequired = false;
+
+    for (int i=0; i<m_tiles.count(); ++i) {
+        const Tile &tile = m_tiles[i];
+        if (!tile.painted) {
+            const qint64 tileEnd = m_tileArrayStart + (i + 1) * m_tileLength;
+            if (m_dataLength >= tileEnd) {
+                paintTile(i);
+                updateRequired = true;
+            }
+        }
+    }
+
+    if (updateRequired)
+        update();
+
+    return updateRequired;
+}
+
+void Waveform::paintTile(int index)
+{
+    WAVEFORM_DEBUG << "Waveform::paintTile" << "index" << index;
+
+    const qint64 tileStart = m_tileArrayStart + index * m_tileLength;
+    Q_ASSERT(m_dataLength >= tileStart + m_tileLength);
+
+    Tile &tile = m_tiles[index];
+    Q_ASSERT(!tile.painted);
+
+    const qint16* base = reinterpret_cast<const qint16*>(m_buffer.constData());
+    const qint16* buffer = base + (tileStart / 2);
+    const int numSamples = m_tileLength / (2 * m_format.channels());
+
+    QPainter painter(tile.pixmap);
+
+    painter.fillRect(tile.pixmap->rect(), Qt::black);
+
+    QPen pen(Qt::white);
+    painter.setPen(pen);
+
+    // Calculate initial PCM value
+    qint16 previousPcmValue = 0;
+    if (buffer > base)
+        previousPcmValue = *(buffer - m_format.channels());
+
+    // Calculate initial point
+    const qreal previousRealValue = pcmToReal(previousPcmValue);
+    const int originY = ((previousRealValue + 1.0) / 2) * m_pixmapSize.height();
+    const QPoint origin(0, originY);
+
+    QLine line(origin, origin);
+
+    for (int i=0; i<numSamples; ++i) {
+        const qint16* ptr = buffer + i * m_format.channels();
+        const qint16 pcmValue = *ptr;
+        const qreal realValue = pcmToReal(pcmValue);
+
+        const int x = tilePixelOffset(i * 2 * m_format.channels());
+        const int y = ((realValue + 1.0) / 2) * m_pixmapSize.height();
+
+        line.setP2(QPoint(x, y));
+        painter.drawLine(line);
+        line.setP1(line.p2());
+    }
+
+    tile.painted = true;
+}
+
+void Waveform::shuffleTiles(int n)
+{
+    WAVEFORM_DEBUG << "Waveform::shuffleTiles" << "n" << n;
+
+    while (n--) {
+        Tile tile = m_tiles.first();
+        tile.painted = false;
+        m_tiles.erase(m_tiles.begin());
+        m_tiles += tile;
+        m_tileArrayStart += m_tileLength;
+    }
+
+    WAVEFORM_DEBUG << "Waveform::shuffleTiles" << "tileArrayStart" << m_tileArrayStart;
+}
+
+void Waveform::resetTiles(qint64 newStartPos)
+{
+    WAVEFORM_DEBUG << "Waveform::resetTiles" << "newStartPos" << newStartPos;
+
+    QVector<Tile>::iterator i = m_tiles.begin();
+    for ( ; i != m_tiles.end(); ++i)
+        i->painted = false;
+
+    m_tileArrayStart = newStartPos;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/waveform.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,198 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are met:
+** - Redistributions of source code must retain the above copyright notice,
+**   this list of conditions and the following disclaimer.
+** - Redistributions in binary form must reproduce the above copyright notice,
+**   this list of conditions and the following disclaimer in the documentation
+**   and/or other materials provided with the distribution.
+** - Neither the name of Nokia Corporation and its Subsidiary(-ies) nor the
+**   names of its contributors may be used to endorse or promote products
+**   derived from this software without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+** POSSIBILITY OF SUCH DAMAGE.
+** $QT_END_LICENSE$
+**
+*****************************************************************************/
+
+#ifndef WAVEFORM_H
+#define WAVEFORM_H
+
+#include <QWidget>
+#include <QtMultimedia/QAudioFormat>
+#include <QPixmap>
+#include <QScopedPointer>
+
+class QByteArray;
+
+/**
+ * Widget which displays a section of the audio waveform.
+ *
+ * The waveform is rendered on a set of QPixmaps which form a group of tiles
+ * whose extent covers the widget.  As the audio position is updated, these
+ * tiles are scrolled from left to right; when the left-most tile scrolls
+ * outside the widget, it is moved to the right end of the tile array and
+ * painted with the next section of the waveform.
+ */
+class Waveform : public QWidget {
+    Q_OBJECT
+public:
+    Waveform(const QByteArray &buffer, QWidget *parent = 0);
+    ~Waveform();
+
+    // QWidget
+    void paintEvent(QPaintEvent *event);
+    void resizeEvent(QResizeEvent *event);
+
+    void initialize(const QAudioFormat &format, qint64 audioBufferSize, qint64 windowDurationUs);
+    void reset();
+
+    void setAutoUpdatePosition(bool enabled);
+
+public slots:
+    void dataLengthChanged(qint64 length);
+    void positionChanged(qint64 position);
+
+private:
+    static const int NullIndex = -1;
+
+    void deletePixmaps();
+
+    /*
+     * (Re)create all pixmaps, repaint and update the display.
+     * Triggers an update();
+     */
+    void createPixmaps(const QSize &newSize);
+
+    /*
+     * Update window position.
+     * Triggers an update().
+     */
+    void setWindowPosition(qint64 position);
+
+    /*
+     * Base position of tile
+     */
+    qint64 tilePosition(int index) const;
+
+    /*
+     * Structure which identifies a point within a given
+     * tile.
+     */
+    struct TilePoint
+    {
+        TilePoint(int idx = 0, qint64 pos = 0, qint64 pix = 0)
+        :   index(idx), positionOffset(pos), pixelOffset(pix)
+        { }
+
+        // Index of tile
+        int     index;
+
+        // Number of bytes from start of tile
+        qint64  positionOffset;
+
+        // Number of pixels from left of corresponding pixmap
+        int     pixelOffset;
+    };
+
+    /*
+     * Convert position in m_buffer into a tile index and an offset in pixels
+     * into the corresponding pixmap.
+     *
+     * \param position  Offset into m_buffer, in bytes
+
+     * If position is outside the tile array, index is NullIndex and
+     * offset is zero.
+     */
+    TilePoint tilePoint(qint64 position) const;
+
+    /*
+     * Convert offset in bytes into a tile into an offset in pixels
+     * within that tile.
+     */
+    int tilePixelOffset(qint64 positionOffset) const;
+
+    /*
+     * Convert offset in bytes into the window into an offset in pixels
+     * within the widget rect().
+     */
+    int windowPixelOffset(qint64 positionOffset) const;
+
+    /*
+     * Paint all tiles which can be painted.
+     * \return true iff update() was called
+     */
+    bool paintTiles();
+
+    /*
+     * Paint the specified tile
+     *
+     * \pre Sufficient data is available to completely paint the tile, i.e.
+     *      m_dataLength is greater than the upper bound of the tile.
+     */
+    void paintTile(int index);
+
+    /*
+     * Move the first n tiles to the end of the array, and mark them as not
+     * painted.
+     */
+    void shuffleTiles(int n);
+
+    /*
+     * Reset tile array
+     */
+    void resetTiles(qint64 newStartPos);
+
+private:
+    const QByteArray&       m_buffer;
+    qint64                  m_dataLength;
+    qint64                  m_position;
+    QAudioFormat            m_format;
+
+    bool                    m_active;
+
+    QSize                   m_pixmapSize;
+    QVector<QPixmap*>       m_pixmaps;
+
+    struct Tile {
+        // Pointer into parent m_pixmaps array
+        QPixmap*            pixmap;
+
+        // Flag indicating whether this tile has been painted
+        bool                painted;
+    };
+
+    QVector<Tile>           m_tiles;
+
+    // Length of audio data in bytes depicted by each tile
+    qint64                  m_tileLength;
+
+    // Position in bytes of the first tile, relative to m_buffer
+    qint64                  m_tileArrayStart;
+
+    qint64                  m_windowPosition;
+    qint64                  m_windowLength;
+
+};
+
+#endif // WAVEFORM_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/wavfile.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,247 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtCore/qendian.h>
+#include <QVector>
+#include <QDebug>
+#include "utils.h"
+#include "wavfile.h"
+
+struct chunk
+{
+    char        id[4];
+    quint32     size;
+};
+
+struct RIFFHeader
+{
+    chunk       descriptor;     // "RIFF"
+    char        type[4];        // "WAVE"
+};
+
+struct WAVEHeader
+{
+    chunk       descriptor;
+    quint16     audioFormat;
+    quint16     numChannels;
+    quint32     sampleRate;
+    quint32     byteRate;
+    quint16     blockAlign;
+    quint16     bitsPerSample;
+};
+
+struct DATAHeader
+{
+    chunk       descriptor;
+};
+
+struct CombinedHeader
+{
+    RIFFHeader  riff;
+    WAVEHeader  wave;
+    DATAHeader  data;
+};
+
+static const int HeaderLength = sizeof(CombinedHeader);
+
+
+WavFile::WavFile(const QAudioFormat &format, qint64 dataLength)
+    :   m_format(format)
+    ,   m_dataLength(dataLength)
+{
+
+}
+
+bool WavFile::readHeader(QIODevice &device)
+{
+    bool result = true;
+
+    if (!device.isSequential())
+        result = device.seek(0);
+    // else, assume that current position is the start of the header
+
+    if (result) {
+        CombinedHeader header;
+        result = (device.read(reinterpret_cast<char *>(&header), HeaderLength) == HeaderLength);
+        if (result) {
+            if ((memcmp(&header.riff.descriptor.id, "RIFF", 4) == 0
+                || memcmp(&header.riff.descriptor.id, "RIFX", 4) == 0)
+                && memcmp(&header.riff.type, "WAVE", 4) == 0
+                && memcmp(&header.wave.descriptor.id, "fmt ", 4) == 0
+                && header.wave.audioFormat == 1 // PCM
+            ) {
+                if (memcmp(&header.riff.descriptor.id, "RIFF", 4) == 0)
+                    m_format.setByteOrder(QAudioFormat::LittleEndian);
+                else
+                    m_format.setByteOrder(QAudioFormat::BigEndian);
+
+                m_format.setChannels(qFromLittleEndian<quint16>(header.wave.numChannels));
+                m_format.setCodec("audio/pcm");
+                m_format.setFrequency(qFromLittleEndian<quint32>(header.wave.sampleRate));
+                m_format.setSampleSize(qFromLittleEndian<quint16>(header.wave.bitsPerSample));
+
+                switch(header.wave.bitsPerSample) {
+                case 8:
+                    m_format.setSampleType(QAudioFormat::UnSignedInt);
+                    break;
+                case 16:
+                    m_format.setSampleType(QAudioFormat::SignedInt);
+                    break;
+                default:
+                    result = false;
+                }
+
+                m_dataLength = device.size() - HeaderLength;
+            } else {
+                result = false;
+            }
+        }
+    }
+
+    return result;
+}
+
+bool WavFile::writeHeader(QIODevice &device)
+{
+    CombinedHeader header;
+
+    memset(&header, 0, HeaderLength);
+
+    // RIFF header
+    if (m_format.byteOrder() == QAudioFormat::LittleEndian)
+        strncpy(&header.riff.descriptor.id[0], "RIFF", 4);
+    else
+        strncpy(&header.riff.descriptor.id[0], "RIFX", 4);
+    qToLittleEndian<quint32>(quint32(m_dataLength + HeaderLength - 8),
+                             reinterpret_cast<unsigned char*>(&header.riff.descriptor.size));
+    strncpy(&header.riff.type[0], "WAVE", 4);
+
+    // WAVE header
+    strncpy(&header.wave.descriptor.id[0], "fmt ", 4);
+    qToLittleEndian<quint32>(quint32(16),
+                             reinterpret_cast<unsigned char*>(&header.wave.descriptor.size));
+    qToLittleEndian<quint16>(quint16(1),
+                             reinterpret_cast<unsigned char*>(&header.wave.audioFormat));
+    qToLittleEndian<quint16>(quint16(m_format.channels()),
+                             reinterpret_cast<unsigned char*>(&header.wave.numChannels));
+    qToLittleEndian<quint32>(quint32(m_format.frequency()),
+                             reinterpret_cast<unsigned char*>(&header.wave.sampleRate));
+    qToLittleEndian<quint32>(quint32(m_format.frequency() * m_format.channels() * m_format.sampleSize() / 8),
+                             reinterpret_cast<unsigned char*>(&header.wave.byteRate));
+    qToLittleEndian<quint16>(quint16(m_format.channels() * m_format.sampleSize() / 8),
+                             reinterpret_cast<unsigned char*>(&header.wave.blockAlign));
+    qToLittleEndian<quint16>(quint16(m_format.sampleSize()),
+                             reinterpret_cast<unsigned char*>(&header.wave.bitsPerSample));
+
+    // DATA header
+    strncpy(&header.data.descriptor.id[0], "data", 4);
+    qToLittleEndian<quint32>(quint32(m_dataLength),
+                             reinterpret_cast<unsigned char*>(&header.data.descriptor.size));
+
+    return (device.write(reinterpret_cast<const char *>(&header), HeaderLength) == HeaderLength);
+}
+
+const QAudioFormat& WavFile::format() const
+{
+    return m_format;
+}
+
+qint64 WavFile::dataLength() const
+{
+    return m_dataLength;
+}
+
+qint64 WavFile::headerLength()
+{
+    return HeaderLength;
+}
+
+bool WavFile::writeDataLength(QIODevice &device, qint64 dataLength)
+{
+    bool result = false;
+    if (!device.isSequential()) {
+        device.seek(40);
+        unsigned char dataLengthLE[4];
+        qToLittleEndian<quint32>(quint32(dataLength), dataLengthLE);
+        result = (device.write(reinterpret_cast<const char *>(dataLengthLE), 4) == 4);
+    }
+    return result;
+}
+
+#include <QFile>
+#include <QTextStream>
+
+qint64 WavFile::readData(QIODevice &device, QByteArray &buffer,
+                         QAudioFormat outputFormat)
+{
+    if (QAudioFormat() == outputFormat)
+        outputFormat = m_format;
+
+    qint64 result = 0;
+
+    QFile file("wav.txt");
+    file.open(QIODevice::WriteOnly | QIODevice::Text);
+    QTextStream stream;
+    stream.setDevice(&file);
+
+    if (isPCMS16LE(outputFormat) && isPCMS16LE(m_format)) {
+        QVector<char> inputSample(2 * m_format.channels());
+
+        qint16 *output = reinterpret_cast<qint16*>(buffer.data());
+
+        while (result < buffer.size()) {
+            if (device.read(inputSample.data(), inputSample.count())) {
+                int inputIdx = 0;
+                for (int outputIdx = 0; outputIdx < outputFormat.channels(); ++outputIdx) {
+                    const qint16* input = reinterpret_cast<const qint16*>(inputSample.data() + 2 * inputIdx);
+                    *output++ = qFromLittleEndian<qint16>(*input);
+                    result += 2;
+                    if (inputIdx < m_format.channels())
+                        ++inputIdx;
+                }
+            } else {
+                break;
+            }
+        }
+    }
+    return result;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/app/wavfile.h	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are met:
+** - Redistributions of source code must retain the above copyright notice,
+**   this list of conditions and the following disclaimer.
+** - Redistributions in binary form must reproduce the above copyright notice,
+**   this list of conditions and the following disclaimer in the documentation
+**   and/or other materials provided with the distribution.
+** - Neither the name of Nokia Corporation and its Subsidiary(-ies) nor the
+**   names of its contributors may be used to endorse or promote products
+**   derived from this software without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+** POSSIBILITY OF SUCH DAMAGE.
+** $QT_END_LICENSE$
+**
+*****************************************************************************/
+
+
+#ifndef WAVFILE_H
+#define WAVFILE_H
+
+#include <QtCore/qobject.h>
+#include <QtCore/qfile.h>
+#include <QtMultimedia/qaudioformat.h>
+
+/**
+ * Helper class for reading WAV files
+ *
+ * See https://ccrma.stanford.edu/courses/422/projects/WaveFormat/
+ */
+class WavFile
+{
+public:
+    WavFile(const QAudioFormat &format = QAudioFormat(),
+              qint64 dataLength = 0);
+
+    // Reads WAV header and seeks to start of data
+    bool readHeader(QIODevice &device);
+
+    // Writes WAV header
+    bool writeHeader(QIODevice &device);
+
+    // Read PCM data
+    qint64 readData(QIODevice &device, QByteArray &buffer,
+                    QAudioFormat outputFormat = QAudioFormat());
+
+    const QAudioFormat& format() const;
+    qint64 dataLength() const;
+
+    static qint64 headerLength();
+
+    static bool writeDataLength(QIODevice &device, qint64 dataLength);
+
+private:
+    QAudioFormat m_format;
+    qint64 m_dataLength;
+};
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/spectrum.pri	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,37 @@
+# The following macros allow certain features and debugging output
+# to be disabled / enabled at compile time.
+
+# Debug output from spectrum calculation
+DEFINES += LOG_SPECTRUMANALYSER
+
+# Debug output from waveform generation
+#DEFINES += LOG_WAVEFORM
+
+# Debug output from engine
+DEFINES += LOG_ENGINE
+
+# Dump input data to spectrum analyer, plus artefact data files
+#DEFINES += DUMP_SPECTRUMANALYSER
+
+# Dump captured audio data
+#DEFINES += DUMP_CAPTURED_AUDIO
+
+# Disable calculation of level
+#DEFINES += DISABLE_LEVEL
+
+# Disable calculation of frequency spectrum
+# If this macro is defined, the FFTReal DLL will not be built
+#DEFINES += DISABLE_FFT
+
+# Disables rendering of the waveform
+#DEFINES += DISABLE_WAVEFORM
+
+# If defined, superimpose the progress bar on the waveform
+DEFINES += SUPERIMPOSE_PROGRESS_ON_WAVEFORM
+
+# Perform spectrum analysis calculation in a separate thread
+DEFINES += SPECTRUM_ANALYSER_SEPARATE_THREAD
+
+# Suppress warnings about strncpy potentially being unsafe, emitted by MSVC
+win32: DEFINES += _CRT_SECURE_NO_WARNINGS
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/spectrum/spectrum.pro	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,37 @@
+load(data_caging_paths)
+include(spectrum.pri)
+
+TEMPLATE = subdirs
+
+# Ensure that library is built before application
+CONFIG  += ordered
+
+!contains(DEFINES, DISABLE_FFT) {
+    SUBDIRS += 3rdparty/fftreal
+}
+
+SUBDIRS += app
+
+TARGET = spectrum
+
+symbian {
+    # Create a 'make sis' rule which can be run from the top-level
+
+    include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri)
+
+    # UID for the SIS file
+    TARGET.UID3 = 0xA000E3FA
+
+    bin.sources     = spectrum.exe
+    !contains(DEFINES, DISABLE_FFT) {
+        bin.sources += fftreal.dll
+    }
+    bin.path        = /sys/bin
+    rsc.sources     = $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/spectrum.rsc
+    rsc.path        = $$APP_RESOURCE_DIR
+    mif.sources     = $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/spectrum.mif
+    mif.path        = $$APP_RESOURCE_DIR
+    reg_rsc.sources = $${EPOCROOT}$$HW_ZDIR$$REG_RESOURCE_IMPORT_DIR/spectrum_reg.rsc
+    reg_rsc.path    = $$REG_RESOURCE_IMPORT_DIR
+    DEPLOYMENT += bin rsc mif reg_rsc
+}
--- a/examples/multimedia/audiodevices/audiodevices.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/examples/multimedia/audiodevices/audiodevices.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -44,6 +44,40 @@
 
 #include "audiodevices.h"
 
+// Utility functions for converting QAudioFormat fields into text
+
+QString toString(QAudioFormat::SampleType sampleType)
+{
+    QString result("Unknown");
+    switch (sampleType) {
+    case QAudioFormat::SignedInt:
+        result = "SignedInt";
+        break;
+    case QAudioFormat::UnSignedInt:
+        result = "UnSignedInt";
+        break;
+    case QAudioFormat::Float:
+        result = "Float";
+        break;
+    }
+    return result;
+}
+
+QString toString(QAudioFormat::Endian endian)
+{
+    QString result("Unknown");
+    switch (endian) {
+    case QAudioFormat::LittleEndian:
+        result = "LittleEndian";
+        break;
+    case QAudioFormat::BigEndian:
+        result = "BigEndian";
+        break;
+    }
+    return result;
+}
+
+
 AudioDevicesBase::AudioDevicesBase(QWidget *parent, Qt::WFlags f)
     : QMainWindow(parent, f)
 {
@@ -67,6 +101,7 @@
     connect(sampleSizesBox, SIGNAL(activated(int)), SLOT(sampleSizeChanged(int)));
     connect(sampleTypesBox, SIGNAL(activated(int)), SLOT(sampleTypeChanged(int)));
     connect(endianBox, SIGNAL(activated(int)), SLOT(endianChanged(int)));
+    connect(populateTableButton, SIGNAL(clicked()), SLOT(populateTable()));
 
     modeBox->setCurrentIndex(0);
     modeChanged(0);
@@ -81,12 +116,11 @@
 void AudioTest::test()
 {
     // tries to set all the settings picked.
-    logOutput->clear();
-    logOutput->append("NOTE: an invalid codec audio/test exists for testing, to get a fail condition.");
+    testResult->clear();
 
     if (!deviceInfo.isNull()) {
         if (deviceInfo.isFormatSupported(settings)) {
-            logOutput->append(tr("Success"));
+            testResult->setText(tr("Success"));
             nearestFreq->setText("");
             nearestChannel->setText("");
             nearestCodec->setText("");
@@ -95,40 +129,23 @@
             nearestEndian->setText("");
         } else {
             QAudioFormat nearest = deviceInfo.nearestFormat(settings);
-            logOutput->append(tr("Failed"));
+            testResult->setText(tr("Failed"));
             nearestFreq->setText(QString("%1").arg(nearest.frequency()));
             nearestChannel->setText(QString("%1").arg(nearest.channels()));
             nearestCodec->setText(nearest.codec());
             nearestSampleSize->setText(QString("%1").arg(nearest.sampleSize()));
-
-            switch(nearest.sampleType()) {
-                case QAudioFormat::SignedInt:
-                    nearestSampleType->setText("SignedInt");
-                    break;
-                case QAudioFormat::UnSignedInt:
-                    nearestSampleType->setText("UnSignedInt");
-                    break;
-                case QAudioFormat::Float:
-                    nearestSampleType->setText("Float");
-                    break;
-                case QAudioFormat::Unknown:
-                    nearestSampleType->setText("Unknown");
-            }
-            switch(nearest.byteOrder()) {
-                case QAudioFormat::LittleEndian:
-                    nearestEndian->setText("LittleEndian");
-                    break;
-                case QAudioFormat::BigEndian:
-                    nearestEndian->setText("BigEndian");
-            }
+            nearestSampleType->setText(toString(nearest.sampleType()));
+            nearestEndian->setText(toString(nearest.byteOrder()));
         }
     }
     else
-        logOutput->append(tr("No Device"));
+        testResult->setText(tr("No Device"));
 }
 
 void AudioTest::modeChanged(int idx)
 {
+    testResult->clear();
+
     // mode has changed
     if (idx == 0)
         mode = QAudio::AudioInput;
@@ -138,10 +155,15 @@
     deviceBox->clear();
     foreach (const QAudioDeviceInfo &deviceInfo, QAudioDeviceInfo::availableDevices(mode))
         deviceBox->addItem(deviceInfo.deviceName(), qVariantFromValue(deviceInfo));
+
+    deviceBox->setCurrentIndex(0);
+    deviceChanged(0);
 }
 
 void AudioTest::deviceChanged(int idx)
 {
+    testResult->clear();
+
     if (deviceBox->count() == 0)
         return;
 
@@ -180,38 +202,68 @@
 
     sampleTypesBox->clear();
     QList<QAudioFormat::SampleType> sampleTypez = deviceInfo.supportedSampleTypes();
-    for (int i = 0; i < sampleTypez.size(); ++i) {
-        switch(sampleTypez.at(i)) {
-            case QAudioFormat::SignedInt:
-                sampleTypesBox->addItem("SignedInt");
-                break;
-            case QAudioFormat::UnSignedInt:
-                sampleTypesBox->addItem("UnSignedInt");
-                break;
-            case QAudioFormat::Float:
-                sampleTypesBox->addItem("Float");
-                break;
-            case QAudioFormat::Unknown:
-                sampleTypesBox->addItem("Unknown");
-        }
-	if (sampleTypez.size())
-            settings.setSampleType(sampleTypez.at(0));
-    }
+
+    for (int i = 0; i < sampleTypez.size(); ++i)
+        sampleTypesBox->addItem(toString(sampleTypez.at(i)));
+    if (sampleTypez.size())
+        settings.setSampleType(sampleTypez.at(0));
 
     endianBox->clear();
     QList<QAudioFormat::Endian> endianz = deviceInfo.supportedByteOrders();
-    for (int i = 0; i < endianz.size(); ++i) {
-        switch (endianz.at(i)) {
-            case QAudioFormat::LittleEndian:
-                endianBox->addItem("Little Endian");
-                break;
-            case QAudioFormat::BigEndian:
-                endianBox->addItem("Big Endian");
-                break;
+    for (int i = 0; i < endianz.size(); ++i)
+        endianBox->addItem(toString(endianz.at(i)));
+    if (endianz.size())
+        settings.setByteOrder(endianz.at(0));
+
+    allFormatsTable->clearContents();
+}
+
+void AudioTest::populateTable()
+{
+    int row = 0;
+
+    QAudioFormat format;
+    foreach (QString codec, deviceInfo.supportedCodecs()) {
+        format.setCodec(codec);
+        foreach (int frequency, deviceInfo.supportedFrequencies()) {
+            format.setFrequency(frequency);
+            foreach (int channels, deviceInfo.supportedChannels()) {
+                format.setChannels(channels);
+                foreach (QAudioFormat::SampleType sampleType, deviceInfo.supportedSampleTypes()) {
+                    format.setSampleType(sampleType);
+                    foreach (int sampleSize, deviceInfo.supportedSampleSizes()) {
+                        format.setSampleSize(sampleSize);
+                        foreach (QAudioFormat::Endian endian, deviceInfo.supportedByteOrders()) {
+                            format.setByteOrder(endian);
+                            if (deviceInfo.isFormatSupported(format)) {
+                                allFormatsTable->setRowCount(row + 1);
+
+                                QTableWidgetItem *codecItem = new QTableWidgetItem(format.codec());
+                                allFormatsTable->setItem(row, 0, codecItem);
+
+                                QTableWidgetItem *frequencyItem = new QTableWidgetItem(QString("%1").arg(format.frequency()));
+                                allFormatsTable->setItem(row, 1, frequencyItem);
+
+                                QTableWidgetItem *channelsItem = new QTableWidgetItem(QString("%1").arg(format.channels()));
+                                allFormatsTable->setItem(row, 2, channelsItem);
+
+                                QTableWidgetItem *sampleTypeItem = new QTableWidgetItem(toString(format.sampleType()));
+                                allFormatsTable->setItem(row, 3, sampleTypeItem);
+
+                                QTableWidgetItem *sampleSizeItem = new QTableWidgetItem(QString("%1").arg(format.sampleSize()));
+                                allFormatsTable->setItem(row, 4, sampleSizeItem);
+
+                                QTableWidgetItem *byteOrderItem = new QTableWidgetItem(toString(format.byteOrder()));
+                                allFormatsTable->setItem(row, 5, byteOrderItem);
+
+                                ++row;
+                            }
+                        }
+                    }
+                }
+            }
         }
     }
-    if (endianz.size())
-        settings.setByteOrder(endianz.at(0));
 }
 
 void AudioTest::freqChanged(int idx)
--- a/examples/multimedia/audiodevices/audiodevices.h	Thu May 27 13:40:48 2010 +0300
+++ b/examples/multimedia/audiodevices/audiodevices.h	Fri Jun 11 14:24:45 2010 +0300
@@ -74,5 +74,7 @@
     void sampleTypeChanged(int idx);
     void endianChanged(int idx);
     void test();
+    void populateTable();
+
 };
 
--- a/examples/multimedia/audiodevices/audiodevicesbase.ui	Thu May 27 13:40:48 2010 +0300
+++ b/examples/multimedia/audiodevices/audiodevicesbase.ui	Fri Jun 11 14:24:45 2010 +0300
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>320</width>
-    <height>300</height>
+    <width>679</width>
+    <height>598</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -30,58 +30,30 @@
        <property name="geometry">
         <rect>
          <x>0</x>
-         <y>-192</y>
-         <width>282</width>
-         <height>471</height>
+         <y>0</y>
+         <width>659</width>
+         <height>558</height>
         </rect>
        </property>
-       <layout class="QVBoxLayout" name="verticalLayout_2">
-        <item>
-         <layout class="QGridLayout" name="gridLayout">
+       <layout class="QGridLayout" name="gridLayout_4">
+        <item row="0" column="0">
+         <layout class="QGridLayout" name="gridLayout_2">
           <item row="0" column="0">
-           <widget class="QLabel" name="deviceLabel">
-            <property name="sizePolicy">
-             <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
-              <horstretch>1</horstretch>
-              <verstretch>0</verstretch>
-             </sizepolicy>
-            </property>
-            <property name="text">
-             <string>Device</string>
-            </property>
-           </widget>
-          </item>
-          <item row="0" column="1">
            <widget class="QLabel" name="modeLabel">
             <property name="text">
              <string>Mode</string>
             </property>
            </widget>
           </item>
-          <item row="1" column="0">
-           <widget class="QComboBox" name="deviceBox">
-            <property name="sizePolicy">
-             <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
-              <horstretch>0</horstretch>
-              <verstretch>0</verstretch>
-             </sizepolicy>
-            </property>
-            <property name="minimumSize">
-             <size>
-              <width>150</width>
-              <height>0</height>
-             </size>
+          <item row="0" column="1">
+           <widget class="QLabel" name="deviceLabel">
+            <property name="text">
+             <string>Device</string>
             </property>
            </widget>
           </item>
-          <item row="1" column="1">
+          <item row="1" column="0">
            <widget class="QComboBox" name="modeBox">
-            <property name="sizePolicy">
-             <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-              <horstretch>0</horstretch>
-              <verstretch>0</verstretch>
-             </sizepolicy>
-            </property>
             <item>
              <property name="text">
               <string>Input</string>
@@ -94,203 +66,322 @@
             </item>
            </widget>
           </item>
-          <item row="2" column="0">
-           <widget class="QLabel" name="actualLabel">
-            <property name="frameShape">
-             <enum>QFrame::Panel</enum>
-            </property>
-            <property name="frameShadow">
-             <enum>QFrame::Raised</enum>
-            </property>
-            <property name="text">
-             <string>Actual Settings</string>
-            </property>
-            <property name="alignment">
-             <set>Qt::AlignCenter</set>
-            </property>
-           </widget>
-          </item>
-          <item row="2" column="1">
-           <widget class="QLabel" name="nearestLabel">
-            <property name="frameShape">
-             <enum>QFrame::Panel</enum>
-            </property>
-            <property name="frameShadow">
-             <enum>QFrame::Raised</enum>
-            </property>
-            <property name="text">
-             <string>Nearest Settings</string>
-            </property>
-            <property name="alignment">
-             <set>Qt::AlignCenter</set>
-            </property>
-           </widget>
-          </item>
-          <item row="3" column="0">
-           <widget class="QLabel" name="actualFreqLabel">
-            <property name="text">
-             <string>Frequency</string>
-            </property>
-           </widget>
-          </item>
-          <item row="3" column="1">
-           <widget class="QLabel" name="nearestFreqLabel">
-            <property name="text">
-             <string>Frequency</string>
-            </property>
-           </widget>
-          </item>
-          <item row="4" column="0">
-           <widget class="QComboBox" name="frequencyBox"/>
-          </item>
-          <item row="4" column="1">
-           <widget class="QLineEdit" name="nearestFreq">
-            <property name="enabled">
-             <bool>false</bool>
-            </property>
-           </widget>
-          </item>
-          <item row="5" column="0">
-           <widget class="QLabel" name="actualChannelsLabel">
-            <property name="text">
-             <string>Channels</string>
-            </property>
-           </widget>
-          </item>
-          <item row="5" column="1">
-           <widget class="QLabel" name="nearestChannelLabel">
-            <property name="text">
-             <string>Channel</string>
-            </property>
-           </widget>
-          </item>
-          <item row="6" column="0">
-           <widget class="QComboBox" name="channelsBox"/>
-          </item>
-          <item row="6" column="1">
-           <widget class="QLineEdit" name="nearestChannel">
-            <property name="enabled">
-             <bool>false</bool>
-            </property>
-           </widget>
-          </item>
-          <item row="7" column="0">
-           <widget class="QLabel" name="actualCodecLabel">
-            <property name="text">
-             <string>Codecs</string>
-            </property>
-           </widget>
-          </item>
-          <item row="7" column="1">
-           <widget class="QLabel" name="nearestCodecLabel">
-            <property name="text">
-             <string>Codec</string>
-            </property>
-           </widget>
-          </item>
-          <item row="8" column="0">
-           <widget class="QComboBox" name="codecsBox"/>
+          <item row="1" column="1">
+           <widget class="QComboBox" name="deviceBox"/>
           </item>
-          <item row="8" column="1">
-           <widget class="QLineEdit" name="nearestCodec">
-            <property name="enabled">
-             <bool>false</bool>
-            </property>
-           </widget>
-          </item>
-          <item row="9" column="0">
-           <widget class="QLabel" name="actualSampleSizeLabel">
-            <property name="text">
-             <string>SampleSize</string>
-            </property>
-           </widget>
-          </item>
-          <item row="9" column="1">
-           <widget class="QLabel" name="nearestSampleSizeLabel">
-            <property name="text">
-             <string>SampleSize</string>
-            </property>
-           </widget>
-          </item>
-          <item row="10" column="0">
-           <widget class="QComboBox" name="sampleSizesBox"/>
-          </item>
-          <item row="10" column="1">
-           <widget class="QLineEdit" name="nearestSampleSize">
-            <property name="enabled">
-             <bool>false</bool>
-            </property>
-           </widget>
-          </item>
-          <item row="11" column="0">
-           <widget class="QLabel" name="actualSampleTypeLabel">
-            <property name="text">
-             <string>SampleType</string>
-            </property>
-           </widget>
-          </item>
-          <item row="11" column="1">
-           <widget class="QLabel" name="nearestSampleTypeLabel">
-            <property name="text">
-             <string>SampleType</string>
+          <item row="2" column="0" colspan="2">
+           <widget class="QTabWidget" name="tabWidget">
+            <property name="currentIndex">
+             <number>0</number>
             </property>
-           </widget>
-          </item>
-          <item row="12" column="0">
-           <widget class="QComboBox" name="sampleTypesBox"/>
-          </item>
-          <item row="12" column="1">
-           <widget class="QLineEdit" name="nearestSampleType">
-            <property name="enabled">
-             <bool>false</bool>
-            </property>
-           </widget>
-          </item>
-          <item row="13" column="0">
-           <widget class="QLabel" name="actualEndianLabel">
-            <property name="text">
-             <string>Endianess</string>
-            </property>
-           </widget>
-          </item>
-          <item row="13" column="1">
-           <widget class="QLabel" name="nearestEndianLabel">
-            <property name="text">
-             <string>Endianess</string>
-            </property>
-           </widget>
-          </item>
-          <item row="14" column="0">
-           <widget class="QComboBox" name="endianBox"/>
-          </item>
-          <item row="14" column="1">
-           <widget class="QLineEdit" name="nearestEndian">
-            <property name="enabled">
-             <bool>false</bool>
-            </property>
-           </widget>
-          </item>
-          <item row="15" column="0" colspan="2">
-           <widget class="QTextEdit" name="logOutput">
-            <property name="enabled">
-             <bool>false</bool>
-            </property>
-            <property name="sizePolicy">
-             <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
-              <horstretch>0</horstretch>
-              <verstretch>0</verstretch>
-             </sizepolicy>
-            </property>
-            <property name="horizontalScrollBarPolicy">
-             <enum>Qt::ScrollBarAlwaysOff</enum>
-            </property>
-           </widget>
-          </item>
-          <item row="16" column="0" colspan="2">
-           <widget class="QPushButton" name="testButton">
-            <property name="text">
-             <string>Test</string>
-            </property>
+            <widget class="QWidget" name="testFormatTab">
+             <attribute name="title">
+              <string>Test format</string>
+             </attribute>
+             <layout class="QGridLayout" name="gridLayout">
+              <item row="0" column="1">
+               <widget class="QLabel" name="actualLabel">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="frameShape">
+                 <enum>QFrame::NoFrame</enum>
+                </property>
+                <property name="frameShadow">
+                 <enum>QFrame::Plain</enum>
+                </property>
+                <property name="text">
+                 <string>&lt;i&gt;Actual Settings&lt;/i&gt;</string>
+                </property>
+                <property name="textFormat">
+                 <enum>Qt::RichText</enum>
+                </property>
+                <property name="alignment">
+                 <set>Qt::AlignCenter</set>
+                </property>
+               </widget>
+              </item>
+              <item row="0" column="2">
+               <widget class="QLabel" name="nearestLabel">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="frameShape">
+                 <enum>QFrame::NoFrame</enum>
+                </property>
+                <property name="frameShadow">
+                 <enum>QFrame::Plain</enum>
+                </property>
+                <property name="text">
+                 <string>&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:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-style:italic;&quot;&gt;Nearest Settings&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+                </property>
+                <property name="textFormat">
+                 <enum>Qt::RichText</enum>
+                </property>
+                <property name="alignment">
+                 <set>Qt::AlignCenter</set>
+                </property>
+               </widget>
+              </item>
+              <item row="3" column="1">
+               <widget class="QComboBox" name="frequencyBox">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+               </widget>
+              </item>
+              <item row="3" column="2">
+               <widget class="QLineEdit" name="nearestFreq">
+                <property name="enabled">
+                 <bool>false</bool>
+                </property>
+               </widget>
+              </item>
+              <item row="5" column="1">
+               <widget class="QComboBox" name="channelsBox"/>
+              </item>
+              <item row="5" column="2">
+               <widget class="QLineEdit" name="nearestChannel">
+                <property name="enabled">
+                 <bool>false</bool>
+                </property>
+               </widget>
+              </item>
+              <item row="9" column="1">
+               <widget class="QComboBox" name="sampleSizesBox"/>
+              </item>
+              <item row="9" column="2">
+               <widget class="QLineEdit" name="nearestSampleSize">
+                <property name="enabled">
+                 <bool>false</bool>
+                </property>
+               </widget>
+              </item>
+              <item row="14" column="1">
+               <widget class="QComboBox" name="endianBox"/>
+              </item>
+              <item row="14" column="2">
+               <widget class="QLineEdit" name="nearestEndian">
+                <property name="enabled">
+                 <bool>false</bool>
+                </property>
+               </widget>
+              </item>
+              <item row="15" column="1">
+               <widget class="QPushButton" name="testButton">
+                <property name="text">
+                 <string>Test</string>
+                </property>
+               </widget>
+              </item>
+              <item row="15" column="2">
+               <widget class="QLabel" name="testResult">
+                <property name="text">
+                 <string/>
+                </property>
+               </widget>
+              </item>
+              <item row="3" column="0">
+               <widget class="QLabel" name="actualFreqLabel">
+                <property name="text">
+                 <string>Frequency (Hz)</string>
+                </property>
+               </widget>
+              </item>
+              <item row="5" column="0">
+               <widget class="QLabel" name="actualChannelLabel">
+                <property name="text">
+                 <string>Channels</string>
+                </property>
+               </widget>
+              </item>
+              <item row="9" column="0">
+               <widget class="QLabel" name="actualSampleSizeLabel">
+                <property name="text">
+                 <string>Sample size (bits)</string>
+                </property>
+               </widget>
+              </item>
+              <item row="14" column="0">
+               <widget class="QLabel" name="actualEndianLabel">
+                <property name="text">
+                 <string>Endianess</string>
+                </property>
+               </widget>
+              </item>
+              <item row="16" column="0" colspan="3">
+               <widget class="QLabel" name="label">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string>Note: an invalid codec 'audio/test' exists in order to allow an invalid format to be constructed, and therefore to trigger a 'nearest format' calculation.</string>
+                </property>
+                <property name="wordWrap">
+                 <bool>true</bool>
+                </property>
+               </widget>
+              </item>
+              <item row="2" column="0">
+               <widget class="QLabel" name="actualCodecLabel">
+                <property name="text">
+                 <string>Codec</string>
+                </property>
+               </widget>
+              </item>
+              <item row="2" column="2">
+               <widget class="QLineEdit" name="nearestCodec">
+                <property name="enabled">
+                 <bool>false</bool>
+                </property>
+               </widget>
+              </item>
+              <item row="2" column="1">
+               <widget class="QComboBox" name="codecsBox"/>
+              </item>
+              <item row="6" column="0">
+               <widget class="QLabel" name="actualSampleTypeLabel">
+                <property name="text">
+                 <string>SampleType</string>
+                </property>
+               </widget>
+              </item>
+              <item row="6" column="1">
+               <widget class="QComboBox" name="sampleTypesBox"/>
+              </item>
+              <item row="6" column="2">
+               <widget class="QLineEdit" name="nearestSampleType">
+                <property name="enabled">
+                 <bool>false</bool>
+                </property>
+               </widget>
+              </item>
+             </layout>
+            </widget>
+            <widget class="QWidget" name="tab">
+             <attribute name="title">
+              <string>All formats</string>
+             </attribute>
+             <layout class="QVBoxLayout" name="verticalLayout_2">
+              <item>
+               <widget class="QPushButton" name="populateTableButton">
+                <property name="text">
+                 <string>Populate table</string>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <widget class="QTableWidget" name="allFormatsTable">
+                <property name="editTriggers">
+                 <set>QAbstractItemView::NoEditTriggers</set>
+                </property>
+                <property name="dragDropOverwriteMode">
+                 <bool>false</bool>
+                </property>
+                <property name="selectionMode">
+                 <enum>QAbstractItemView::NoSelection</enum>
+                </property>
+                <property name="selectionBehavior">
+                 <enum>QAbstractItemView::SelectItems</enum>
+                </property>
+                <property name="textElideMode">
+                 <enum>Qt::ElideNone</enum>
+                </property>
+                <property name="sortingEnabled">
+                 <bool>false</bool>
+                </property>
+                <property name="wordWrap">
+                 <bool>false</bool>
+                </property>
+                <property name="cornerButtonEnabled">
+                 <bool>false</bool>
+                </property>
+                <attribute name="horizontalHeaderHighlightSections">
+                 <bool>false</bool>
+                </attribute>
+                <attribute name="verticalHeaderVisible">
+                 <bool>false</bool>
+                </attribute>
+                <attribute name="verticalHeaderHighlightSections">
+                 <bool>false</bool>
+                </attribute>
+                <attribute name="verticalHeaderVisible">
+                 <bool>false</bool>
+                </attribute>
+                <attribute name="horizontalHeaderHighlightSections">
+                 <bool>false</bool>
+                </attribute>
+                <attribute name="verticalHeaderHighlightSections">
+                 <bool>false</bool>
+                </attribute>
+                <column>
+                 <property name="text">
+                  <string>Codec</string>
+                 </property>
+                 <property name="textAlignment">
+                  <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+                 </property>
+                </column>
+                <column>
+                 <property name="text">
+                  <string>Frequency (Hz)</string>
+                 </property>
+                 <property name="textAlignment">
+                  <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+                 </property>
+                </column>
+                <column>
+                 <property name="text">
+                  <string>Channels</string>
+                 </property>
+                 <property name="textAlignment">
+                  <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+                 </property>
+                </column>
+                <column>
+                 <property name="text">
+                  <string>Sample type</string>
+                 </property>
+                 <property name="textAlignment">
+                  <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+                 </property>
+                </column>
+                <column>
+                 <property name="text">
+                  <string>Sample size (bits)</string>
+                 </property>
+                 <property name="textAlignment">
+                  <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+                 </property>
+                </column>
+                <column>
+                 <property name="text">
+                  <string>Endianness</string>
+                 </property>
+                 <property name="textAlignment">
+                  <set>AlignHCenter|AlignVCenter|AlignCenter</set>
+                 </property>
+                </column>
+               </widget>
+              </item>
+             </layout>
+            </widget>
            </widget>
           </item>
          </layout>
--- a/examples/multimedia/audiodevices/main.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/examples/multimedia/audiodevices/main.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -49,7 +49,11 @@
     app.setApplicationName("Audio Device Test");
 
     AudioTest audio;
+#ifdef Q_OS_SYMBIAN
+    audio.showMaximized();
+#else
     audio.show();
+#endif
 
     return app.exec();
 }
--- a/mkspecs/features/symbian/qt.prf	Thu May 27 13:40:48 2010 +0300
+++ b/mkspecs/features/symbian/qt.prf	Fri Jun 11 14:24:45 2010 +0300
@@ -44,7 +44,7 @@
 isEmpty(TARGET.EPOCSTACKSIZE):TARGET.EPOCSTACKSIZE = 0x14000
 isEmpty(TARGET.EPOCHEAPSIZE):TARGET.EPOCHEAPSIZE = 0x020000 0x800000
 
+#QTP: add userinclude and app layer includes (temporarily only) 
+MMP_RULES+="USERINCLUDE  ."
 INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
 
-#QTP: add userinclude 
-MMP_RULES+="USERINCLUDE  ."
--- a/projects.pro	Thu May 27 13:40:48 2010 +0300
+++ b/projects.pro	Fri Jun 11 14:24:45 2010 +0300
@@ -154,6 +154,10 @@
    DEFAULT_QMAKESPEC ~= s,^.*mkspecs/,,g
    mkspecs.commands += $(DEL_FILE) $(INSTALL_ROOT)$$mkspecs.path/default; $(SYMLINK) $$DEFAULT_QMAKESPEC $(INSTALL_ROOT)$$mkspecs.path/default
 }
+win32:!equals(QT_BUILD_TREE, $$QT_SOURCE_TREE) {
+    # When shadow building on Windows, the default mkspec only exists in the build tree.
+    mkspecs.files += $$QT_BUILD_TREE/mkspecs/default
+}
 INSTALLS += mkspecs
 
 false:macx { #mac install location
--- a/src/3rdparty/phonon/mmf/audioplayer.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/3rdparty/phonon/mmf/audioplayer.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -99,7 +99,7 @@
      * stack by doing a runtime check of the SDK version. */
 #if !defined(__SERIES60_31__)
     const int err = m_player->SetVolume(mmfVolume);
-    if (QSysInfo::s60Version() >= QSysInfo::SV_S60_5_0)
+    if (QSysInfo::s60Version() >= QSysInfo::SV_S60_3_2)
         return err;
     else
         return KErrNone;
--- a/src/3rdparty/phonon/qt7/audiodevice.mm	Thu May 27 13:40:48 2010 +0300
+++ b/src/3rdparty/phonon/qt7/audiodevice.mm	Fri Jun 11 14:24:45 2010 +0300
@@ -149,7 +149,6 @@
     size = sizeof(translation);
     err = AudioDeviceGetProperty(deviceID, 0, 0, kAudioDevicePropertyDataSourceNameForIDCFString, &size, &translation);
 	if (err != noErr){
-        CFRelease(cfName);
         return QString();
     }
 	QString name = PhononCFString::toQString(cfName);
--- a/src/corelib/io/qiodevice.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/corelib/io/qiodevice.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -810,6 +810,9 @@
                 }
             }
 
+            if (!maxSize)
+                return readSoFar;
+
             if ((d->openMode & Unbuffered) == 0 && maxSize < QIODEVICE_BUFFERSIZE) {
                 // In buffered mode, we try to fill up the QIODevice buffer before
                 // we do anything else.
--- a/src/corelib/io/qurl.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/corelib/io/qurl.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -3129,10 +3129,11 @@
 
 
 static const char * const idn_whitelist[] = {
-    "ac", "at",
-    "br",
+    "ac", "ar", "at",
+    "biz", "br",
     "cat", "ch", "cl", "cn",
     "de", "dk",
+    "es",
     "fi",
     "gr",
     "hu",
@@ -3146,6 +3147,9 @@
     "se", "sh",
     "th", "tm", "tw",
     "vn",
+    "xn--mgbaam7a8h",           // UAE
+    "xn--mgberp4a5d4ar",        // Saudi Arabia
+    "xn--wgbh1c"                // Egypt
 };
 
 static QStringList *user_idn_whitelist = 0;
@@ -3304,6 +3308,7 @@
             qt_nameprep(&result, prevLen);
             labelLength = result.length() - prevLen;
             register int toReserve = labelLength + 4 + 6; // "xn--" plus some extra bytes
+            aceForm.resize(0);
             if (toReserve > aceForm.capacity())
                 aceForm.reserve(toReserve);
             toPunycodeHelper(result.constData() + prevLen, result.size() - prevLen, &aceForm);
--- a/src/corelib/kernel/qeventdispatcher_symbian.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/corelib/kernel/qeventdispatcher_symbian.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -47,6 +47,8 @@
 #include <unistd.h>
 #include <errno.h>
 
+#include <net/if.h>
+
 QT_BEGIN_NAMESPACE
 
 #ifdef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS
@@ -569,13 +571,17 @@
              * check if socket is in exception set
              * then signal RequestComplete for it
              */
-            qWarning("exception on %d [will close the socket handle - hack]", i.key()->socket());
+            qWarning("exception on %d [will do setdefaultif(0) - hack]", i.key()->socket());
             // quick fix; there is a bug
             // when doing read on socket
             // errors not preoperly mapped
             // after offline-ing the device
             // on some devices we do get exception
-            ::close(i.key()->socket());
+            // close all exiting sockets
+            // and reset default IAP
+            if(::setdefaultif(0) != KErrNone) // well we can't do much about it
+                qWarning("setdefaultif(0) failed");
+
             toRemove.append(i.key());
             TRequestStatus *status = i.value();
             QEventDispatcherSymbian::RequestComplete(d->threadData->symbian_thread_handle, status, KErrNone);
@@ -642,8 +648,8 @@
     QIdleDetectorThread()
     : m_state(STATE_RUN), m_stop(false)
     {
-        qt_symbian_throwIfError(m_lock.CreateLocal());
-        TInt err = m_idleDetectorThread.Create(KNullDesC(), &idleDetectorThreadFunc, 1024, &User::Allocator(), this);
+        qt_symbian_throwIfError(m_lock.CreateLocal(0));
+        TInt err = m_idleDetectorThread.Create(KNullDesC(), &idleDetectorThreadFunc, 1024, NULL, this);
         if (err != KErrNone)
             m_lock.Close();
         qt_symbian_throwIfError(err);
@@ -694,7 +700,7 @@
     enum IdleStates {STATE_KICKED, STATE_RUN} m_state;
     bool m_stop;
     RThread m_idleDetectorThread;
-    RFastLock m_lock;
+    RSemaphore m_lock;
 };
 
 Q_GLOBAL_STATIC(QIdleDetectorThread, idleDetectorThread);
--- a/src/corelib/kernel/qfunctions_wince.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/corelib/kernel/qfunctions_wince.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -352,16 +352,18 @@
     size_t low = 0;
     size_t high = num - 1;
     while (low <= high) {
-        unsigned int mid = ((unsigned) (low + high)) >> 1;
+        size_t mid = (low + high) >> 1;
         int c = compare(key, (char*)base + mid * size);
-        if (c < 0)
+        if (c < 0) {
+            if (!mid)
+                break;
             high = mid - 1;
-        else if (c > 0)
+        } else if (c > 0)
             low = mid + 1;
         else
             return (char*) base + mid * size;
     }
-    return (NULL);
+    return 0;
 }
 
 void *lfind(const void* key, const void* base, size_t* elements, size_t size,
--- a/src/corelib/tools/qlocale_symbian.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/corelib/tools/qlocale_symbian.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -98,6 +98,7 @@
     { ELangSwedish,             "sv_SE" },
     { ELangDanish,              "da_DK" },
     { ELangNorwegian,           "no_NO" },
+    { ELangNorwegianNynorsk,    "nn_NO" },
     { ELangFinnish,             "fi_FI" },
     { ELangAmerican,            "en_US" },
     { ELangPortuguese,          "pt_PT" },
@@ -134,10 +135,11 @@
     { ELangBrazilianPortuguese, "pt_BR" },
     { ELangRomanian,            "ro_RO" },
     { ELangSerbian,             "sr_YU" },
-    { ELangLatinAmericanSpanish, "es" },
+    { ELangLatinAmericanSpanish,"es_MX" }, // TODO: should be es_419
     { ELangUkrainian,           "uk_UA" },
     { ELangUrdu,                "ur_PK" }, // India/Pakistan
     { ELangVietnamese,          "vi_VN" },
+    { ELangKorean,              "ko_KO" },
 #ifdef __E32LANG_H__
 // 5.0
     { ELangBasque,              "eu_ES" },
--- a/src/corelib/tools/qscopedpointer.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/corelib/tools/qscopedpointer.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -57,7 +57,7 @@
     called resource acquisition is initialization(RAII).
 
     QScopedPointer guarantees that the object pointed to will get deleted when
-    the current scope dissapears.
+    the current scope disappears.
 
     Consider this function which does heap allocations, and have various exit points:
 
@@ -227,7 +227,7 @@
 
 /*!
   \class QScopedArrayPointer
-  
+
   \brief The QScopedArrayPointer class stores a pointer to a
   dynamically allocated array of objects, and deletes it upon
   destruction.
--- a/src/dbus/qdbusinterface.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/dbus/qdbusinterface.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -258,7 +258,7 @@
 int QDBusInterface::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
 {
     _id = QDBusAbstractInterface::qt_metacall(_c, _id, _a);
-    if (_id < 0 || !d_func()->isValid)
+    if (_id < 0 || !d_func()->isValid || !d_func()->metaObject)
         return _id;
     return d_func()->metacall(_c, _id, _a);
 }
--- a/src/dbus/qdbusmacros.h	Thu May 27 13:40:48 2010 +0300
+++ b/src/dbus/qdbusmacros.h	Fri Jun 11 14:24:45 2010 +0300
@@ -48,8 +48,10 @@
 
 #if defined(QDBUS_MAKEDLL)
 # define QDBUS_EXPORT Q_DECL_EXPORT
+#elif defined(QT_SHARED)
+# define QDBUS_EXPORT Q_DECL_IMPORT
 #else
-# define QDBUS_EXPORT Q_DECL_IMPORT
+# define QDBUS_EXPORT
 #endif
 
 #ifndef Q_MOC_RUN
--- a/src/gui/dialogs/qprintdialog_unix.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/dialogs/qprintdialog_unix.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -968,7 +968,7 @@
 #if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
 void QUnixPrintWidgetPrivate::setCupsProperties()
 {
-    if (cups && QCUPSSupport::isAvailable()) {
+    if (cups && QCUPSSupport::isAvailable() && cups->pageSizes()) {
         QPrintEngine *engine = printer->printEngine();
         const ppd_option_t* pageSizes = cups->pageSizes();
         QByteArray cupsPageSize;
--- a/src/gui/graphicsview/qgraphicsitem.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/graphicsview/qgraphicsitem.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -3578,6 +3578,8 @@
     // Update and repositition.
     if (!(d_ptr->flags & ItemSendsGeometryChanges)) {
         d_ptr->setPosHelper(pos);
+        if (d_ptr->isWidget)
+            static_cast<QGraphicsWidget *>(this)->d_func()->setGeometryFromSetPos();
         return;
     }
 
--- a/src/gui/graphicsview/qgraphicsscene.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/graphicsview/qgraphicsscene.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -693,6 +693,14 @@
     --selectionChanging;
     if (!selectionChanging && selectedItems.size() != oldSelectedItemsSize)
         emit q->selectionChanged();
+
+    QHash<QGesture *, QGraphicsObject *>::iterator it;
+    for (it = gestureTargets.begin(); it != gestureTargets.end();) {
+        if (it.value() == item)
+            it = gestureTargets.erase(it);
+        else
+            ++it;
+    }
 }
 
 /*!
@@ -808,13 +816,13 @@
 #endif //QT_NO_IM
     }
 
+    if (item)
+        focusItem = item;
+    updateInputMethodSensitivityInViews();
     if (item) {
-        focusItem = item;
         QFocusEvent event(QEvent::FocusIn, focusReason);
         sendEvent(item, &event);
     }
-
-    updateInputMethodSensitivityInViews();
 }
 
 /*!
--- a/src/gui/graphicsview/qgraphicswidget.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/graphicsview/qgraphicswidget.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -1044,13 +1044,7 @@
         }
         break;
     case ItemPositionHasChanged:
-        if (!d->inSetGeometry) {
-            d->inSetPos = 1;
-            // Ensure setGeometry is called (avoid recursion when setPos is
-            // called from within setGeometry).
-            setGeometry(QRectF(pos(), size()));
-            d->inSetPos = 0 ;
-        }
+        d->setGeometryFromSetPos();
         break;
     case ItemParentChange: {
         QGraphicsItem *parent = qVariantValue<QGraphicsItem *>(value);
--- a/src/gui/graphicsview/qgraphicswidget_p.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/graphicsview/qgraphicswidget_p.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -825,6 +825,18 @@
     }
 }
 
+void QGraphicsWidgetPrivate::setGeometryFromSetPos()
+{
+    if (inSetGeometry)
+        return;
+    Q_Q(QGraphicsWidget);
+    inSetPos = 1;
+    // Ensure setGeometry is called (avoid recursion when setPos is
+    // called from within setGeometry).
+    q->setGeometry(QRectF(pos, q->size()));
+    inSetPos = 0 ;
+}
+
 QT_END_NAMESPACE
 
 #endif //QT_NO_GRAPHICSVIEW
--- a/src/gui/graphicsview/qgraphicswidget_p.h	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/graphicsview/qgraphicswidget_p.h	Fri Jun 11 14:24:45 2010 +0300
@@ -130,6 +130,8 @@
     void windowFrameHoverLeaveEvent(QGraphicsSceneHoverEvent *event);
     bool hasDecoration() const;
 
+    void setGeometryFromSetPos();
+
     // State
     inline int attributeToBitIndex(Qt::WidgetAttribute att) const
     {
--- a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -87,7 +87,7 @@
     m_fepState->SetDefaultInputMode( EAknEditorTextInputMode );
     m_fepState->SetPermittedInputModes( EAknEditorAllInputModes );
     m_fepState->SetDefaultCase( EAknEditorLowerCase );
-    m_fepState->SetPermittedCases( EAknEditorLowerCase|EAknEditorUpperCase );
+    m_fepState->SetPermittedCases( EAknEditorAllCaseModes );
     m_fepState->SetSpecialCharacterTableResourceId(R_AVKON_SPECIAL_CHARACTER_TABLE_DIALOG);
     m_fepState->SetNumericKeymap( EAknEditorStandardNumberModeKeymap );
 }
@@ -484,9 +484,10 @@
 void QCoeFepInputContext::applyFormat(QList<QInputMethodEvent::Attribute> *attributes)
 {
     TCharFormat cFormat;
-    QColor styleTextColor = QApplication::palette("QLineEdit").text().color();
-    TLogicalRgb tontColor(TRgb(styleTextColor.red(), styleTextColor.green(), styleTextColor.blue(), styleTextColor.alpha()));
-    cFormat.iFontPresentation.iTextColor = tontColor;
+    const QColor styleTextColor = focusWidget() ? focusWidget()->palette().text().color() : 
+        QApplication::palette("QLineEdit").text().color();
+    const TLogicalRgb fontColor(TRgb(styleTextColor.red(), styleTextColor.green(), styleTextColor.blue(), styleTextColor.alpha()));
+    cFormat.iFontPresentation.iTextColor = fontColor;
 
     TInt numChars = 0;
     TInt charPos = 0;
--- a/src/gui/inputmethod/qinputcontextfactory.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/inputmethod/qinputcontextfactory.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -73,7 +73,7 @@
 #endif
 #ifdef Q_WS_S60
 #include "qcoefepinputcontext_p.h"
-#include "akninputlanguageinfo.h"
+#include "AknInputLanguageInfo.h"
 #endif
 
 #include "private/qfactoryloader_p.h"
--- a/src/gui/kernel/qapplication.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/kernel/qapplication.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -5255,10 +5255,20 @@
             qic = QInputContextFactory::create(QLatin1String("xim"), that);
         that->d_func()->inputContext = qic;
     }
-#elif defined(Q_WS_S60)
+#elif defined(Q_OS_SYMBIAN)
     if (!d->inputContext) {
         QApplication *that = const_cast<QApplication *>(this);
-        that->d_func()->inputContext = QInputContextFactory::create(QString::fromLatin1("coefep"), that);
+        const QStringList keys = QInputContextFactory::keys();
+        // Try hbim and coefep first, then try others.
+        if (keys.contains("hbim")) {
+            that->d_func()->inputContext = QInputContextFactory::create(QLatin1String("hbim"), that);
+        } else if (keys.contains("coefep")) {
+            that->d_func()->inputContext = QInputContextFactory::create(QLatin1String("coefep"), that);
+        } else {
+            for (int c = 0; c < keys.size() && !d->inputContext; ++c) {
+                that->d_func()->inputContext = QInputContextFactory::create(keys[c], that);
+            }
+        }
     }
 #endif
     return d->inputContext;
--- a/src/gui/kernel/qapplication_s60.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/kernel/qapplication_s60.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -440,7 +440,7 @@
                 state |= Qt::TouchPointPrimary;
             touchPoint.setState(state);
 
-            QPointF screenPos = QPointF(event->iPosition.iX, event->iPosition.iY);
+            QPointF screenPos = qwidget->mapToGlobal(QPoint(event->iPosition.iX, event->iPosition.iY));
             touchPoint.setScreenPos(screenPos);
             touchPoint.setNormalizedPos(QPointF(screenPos.x() / screenGeometry.width(),
                                                 screenPos.y() / screenGeometry.height()));
@@ -642,10 +642,12 @@
 
                 QPoint pos = QCursor::pos();
                 TPointerEvent fakeEvent;
+                fakeEvent.iType = (TPointerEvent::TType)(-1);
                 TInt x = pos.x();
                 TInt y = pos.y();
                 if (type == EEventKeyUp) {
-                    if (keyCode == Qt::Key_Select)
+                    if (keyCode == Qt::Key_Select &&
+                        (S60->virtualMousePressedKeys & QS60Data::Select))
                         fakeEvent.iType = TPointerEvent::EButton1Up;
                     S60->virtualMouseAccel = 1;
                     S60->virtualMouseLastKey = 0;
@@ -694,8 +696,7 @@
                         // example for drag'n'drop), Symbian starts producing spurious up and
                         // down messages for some keys. Therefore, make sure we have a clean slate
                         // of pressed keys before starting a new button press.
-                        if (S60->virtualMousePressedKeys != 0) {
-                            S60->virtualMousePressedKeys |= QS60Data::Select;
+                        if (S60->virtualMousePressedKeys & QS60Data::Select) {
                             return EKeyWasConsumed;
                         } else {
                             S60->virtualMousePressedKeys |= QS60Data::Select;
@@ -718,7 +719,8 @@
                 fakeEvent.iModifiers = keyEvent.iModifiers;
                 fakeEvent.iPosition = cpos;
                 fakeEvent.iParentPosition = epos;
-                HandlePointerEvent(fakeEvent);
+                if(fakeEvent.iType != -1)
+                    HandlePointerEvent(fakeEvent);
                 return EKeyWasConsumed;
             }
             else {
@@ -991,15 +993,6 @@
             const TBool isFullscreen = qwidget->windowState() & Qt::WindowFullScreen;
             const TBool cbaVisibilityHint = qwidget->windowFlags() & Qt::WindowSoftkeysVisibleHint;
             buttonGroup->MakeVisible(visible || (isFullscreen && cbaVisibilityHint));
-
-            // Responsiviness
-            CEikCba *cba = static_cast<CEikCba *>( buttonGroup->ButtonGroup() ); // downcast from MEikButtonGroup
-            TUint cbaFlags = cba->ButtonGroupFlags();
-            if(qwidget->windowFlags() & Qt::WindowSoftkeysRespondHint)
-                cbaFlags |= EAknCBAFlagRespondWhenInvisible;
-            else
-                cbaFlags &= ~EAknCBAFlagRespondWhenInvisible;
-            cba->SetButtonGroupFlags(cbaFlags);
         }
 #endif
     } else if (QApplication::activeWindow() == qwidget->window()) {
--- a/src/gui/kernel/qapplication_win.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/kernel/qapplication_win.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -2447,7 +2447,7 @@
                 QApplication::postEvent(widget, new QEvent(QEvent::Close));
             else
 #ifndef QT_NO_MENUBAR
-                QMenuBar::wceCommands(LOWORD(wParam), (HWND) lParam);
+                QMenuBar::wceCommands(LOWORD(wParam));
 #endif
             result = true;
         }
--- a/src/gui/kernel/qwidget_s60.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/kernel/qwidget_s60.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -400,6 +400,9 @@
         if (!desktop)
           s60UpdateIsOpaque();
 
+        if (!desktop)
+            s60UpdateIsOpaque(); // must be called after setWinId()
+
     } else if (q->testAttribute(Qt::WA_NativeWindow) || paintOnScreen()) { // create native child widget
 
         QScopedPointer<QSymbianControl> control( q_check_ptr(new QSymbianControl(q)) );
@@ -1123,15 +1126,6 @@
         if (buttonGroup) {
             // Visibility
             buttonGroup->MakeVisible(visible || (isFullscreen && cbaRequested));
-
-            // Responsiviness
-            CEikCba *cba = static_cast<CEikCba *>( buttonGroup->ButtonGroup() ); // downcast from MEikButtonGroup
-            TUint cbaFlags = cba->ButtonGroupFlags();
-            if(windowFlags() & Qt::WindowSoftkeysRespondHint)
-                cbaFlags |= EAknCBAFlagRespondWhenInvisible;
-            else
-                cbaFlags &= ~EAknCBAFlagRespondWhenInvisible;
-            cba->SetButtonGroupFlags(cbaFlags);
         }
 #endif // Q_WS_S60
 
--- a/src/gui/painting/qpainter.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/painting/qpainter.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -5773,12 +5773,17 @@
         gf.glyphs = engine.shapedGlyphs(&si);
         gf.chars = engine.layoutData->string.unicode() + si.position;
         gf.num_chars = engine.length(item);
-        gf.width = si.width;
+        if (engine.forceJustification) {
+            for (int j=0; j<gf.glyphs.numGlyphs; ++j)
+                gf.width += gf.glyphs.effectiveAdvance(j);
+        } else {
+            gf.width = si.width;
+        }
         gf.logClusters = engine.logClusters(&si);
 
         drawTextItem(QPointF(x.toReal(), p.y()), gf);
 
-        x += si.width;
+        x += gf.width;
     }
 }
 
--- a/src/gui/painting/qpdf.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/painting/qpdf.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -971,12 +971,17 @@
     if (!points)
         return;
 
+    Q_D(QPdfBaseEngine);
     QPainterPath p;
     for (int i=0; i!=pointCount;++i) {
         p.moveTo(points[i]);
         p.lineTo(points[i] + QPointF(0, 0.001));
     }
+
+    bool hadBrush = d->hasBrush;
+    d->hasBrush = false;
     drawPath(p);
+    d->hasBrush = hadBrush;
 }
 
 void QPdfBaseEngine::drawLines (const QLineF *lines, int lineCount)
@@ -984,12 +989,16 @@
     if (!lines)
         return;
 
+    Q_D(QPdfBaseEngine);
     QPainterPath p;
     for (int i=0; i!=lineCount;++i) {
         p.moveTo(lines[i].p1());
         p.lineTo(lines[i].p2());
     }
+    bool hadBrush = d->hasBrush;
+    d->hasBrush = false;
     drawPath(p);
+    d->hasBrush = hadBrush;
 }
 
 void QPdfBaseEngine::drawRects (const QRectF *rects, int rectCount)
--- a/src/gui/styles/qs60style.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/styles/qs60style.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -92,10 +92,10 @@
 
 const layoutHeader QS60StylePrivate::m_layoutHeaders[] = {
 // *** generated layout data ***
-{240,320,1,18,"QVGA Landscape"},
-{320,240,1,18,"QVGA Portrait"},
-{360,640,1,18,"NHD Landscape"},
-{640,360,1,18,"NHD Portrait"},
+{240,320,1,19,"QVGA Landscape"},
+{320,240,1,19,"QVGA Portrait"},
+{360,640,1,19,"NHD Landscape"},
+{640,360,1,19,"NHD Portrait"},
 {352,800,1,12,"E90 Landscape"}
 // *** End of generated data ***
 };
@@ -104,11 +104,11 @@
 
 const short QS60StylePrivate::data[][MAX_PIXELMETRICS] = {
 // *** generated pixel metrics ***
-{5,0,-909,0,0,2,0,0,-1,7,12,19,13,13,6,200,-909,-909,-909,20,13,2,0,0,21,7,18,30,3,3,1,-909,-909,0,1,0,0,12,20,15,15,18,18,1,115,18,0,-909,-909,-909,-909,0,0,16,2,-909,0,0,-909,16,-909,-909,-909,-909,32,18,55,24,55,4,4,4,9,13,-909,5,51,11,5,0,3,3,6,8,3,3,-909,2,-909,-909,-909,-909,5,5,3,1, 106},
-{5,0,-909,0,0,1,0,0,-1,8,14,22,15,15,7,164,-909,-909,-909,19,15,2,0,0,21,8,27,28,4,4,1,-909,-909,0,7,6,0,13,23,17,17,21,21,7,115,21,0,-909,-909,-909,-909,0,0,15,1,-909,0,0,-909,15,-909,-909,-909,-909,32,21,65,27,65,3,3,5,10,15,-909,5,58,13,5,0,4,4,7,9,4,4,-909,2,-909,-909,-909,-909,6,6,3,1, 106},
-{7,0,-909,0,0,2,0,0,-1,25,69,28,19,19,9,258,-909,-909,-909,23,19,26,0,0,32,25,72,44,5,5,2,-909,-909,0,7,21,0,17,29,22,22,27,27,7,173,29,0,-909,-909,-909,-909,0,0,25,2,-909,0,0,-909,25,-909,-909,-909,-909,87,27,77,35,77,13,13,6,8,19,-909,7,74,19,7,0,5,5,8,12,5,5,-909,3,-909,-909,-909,-909,7,7,3,1, 135},
-{7,0,-909,0,0,2,0,0,-1,25,68,28,19,19,9,258,-909,-909,-909,31,19,6,0,0,32,25,60,52,5,5,2,-909,-909,0,7,32,0,17,29,22,22,27,27,7,173,29,0,-909,-909,-909,-909,0,0,26,2,-909,0,0,-909,26,-909,-909,-909,-909,87,27,96,35,96,12,12,6,8,19,-909,7,74,22,7,0,5,5,8,12,5,5,-909,3,-909,-909,-909,-909,7,7,3,1, 135},
-{7,0,-909,0,0,2,0,0,-1,10,20,27,18,18,9,301,-909,-909,-909,29,18,5,0,0,35,7,32,30,5,5,2,-909,-909,0,2,8,0,16,28,21,21,26,26,2,170,26,0,-909,-909,-909,-909,0,0,21,6,-909,0,0,-909,-909,-909,-909,-909,-909,54,26,265,34,265,5,5,6,3,18,-909,7,72,19,7,0,5,6,8,11,6,5,-909,2,-909,-909,-909,-909,5,5,3,1, 106}
+{5,0,-909,0,0,2,0,0,-1,7,12,22,15,15,7,198,-909,-909,-909,20,13,2,0,0,21,7,18,30,3,3,1,-909,-909,0,1,0,0,12,20,15,15,18,18,1,115,18,0,-909,-909,-909,-909,0,0,16,2,-909,0,0,-909,16,-909,-909,-909,-909,32,18,55,24,55,4,4,4,9,13,-909,5,51,11,5,0,3,3,6,8,3,3,-909,2,-909,-909,-909,-909,5,5,3,1,106},
+{5,0,-909,0,0,1,0,0,-1,8,14,22,15,15,7,164,-909,-909,-909,19,15,2,0,0,21,8,27,28,4,4,1,-909,-909,0,7,6,0,13,23,17,17,21,21,7,115,21,0,-909,-909,-909,-909,0,0,15,1,-909,0,0,-909,15,-909,-909,-909,-909,32,21,65,27,65,3,3,5,10,15,-909,5,58,13,5,0,4,4,7,9,4,4,-909,2,-909,-909,-909,-909,6,6,3,1,106},
+{7,0,-909,0,0,2,0,0,-1,25,69,46,37,37,9,258,-909,-909,-909,23,19,26,0,0,32,25,72,44,5,5,2,-909,-909,0,7,21,0,17,29,22,22,27,27,7,173,29,0,-909,-909,-909,-909,0,0,25,2,-909,0,0,-909,25,-909,-909,-909,-909,87,27,77,35,77,13,13,6,8,19,-909,7,74,19,7,0,5,5,8,12,5,5,-909,3,-909,-909,-909,-909,7,7,3,1,135},
+{7,0,-909,0,0,2,0,0,-1,25,68,46,37,37,9,258,-909,-909,-909,31,19,6,0,0,32,25,60,52,5,5,2,-909,-909,0,7,32,0,17,29,22,22,27,27,7,173,29,0,-909,-909,-909,-909,0,0,26,2,-909,0,0,-909,26,-909,-909,-909,-909,87,27,96,35,96,12,12,6,8,19,-909,7,74,22,7,0,5,5,8,12,5,5,-909,3,-909,-909,-909,-909,7,7,3,1,135},
+{7,0,-909,0,0,2,0,0,-1,10,20,27,18,18,9,301,-909,-909,-909,29,18,5,0,0,35,7,32,30,5,5,2,-909,-909,0,2,8,0,16,28,21,21,26,26,2,170,26,0,-909,-909,-909,-909,0,0,21,6,-909,0,0,-909,-909,-909,-909,-909,-909,54,26,265,34,265,5,5,6,3,18,-909,7,72,19,7,0,5,6,8,11,6,5,-909,2,-909,-909,-909,-909,5,5,3,1,106}
 // *** End of generated data ***
 };
 
@@ -653,6 +653,8 @@
         fontCategory = QS60StyleEnums::FC_Primary;
     } else if (qobject_cast<QMenu *>(widget)){
         fontCategory = QS60StyleEnums::FC_Primary;
+    } else if (qobject_cast<QCalendarWidget *>(widget)){
+        fontCategory = QS60StyleEnums::FC_Secondary;
     }
     if (fontCategory != QS60StyleEnums::FC_Undefined) {
         const bool resolveFontSize = widget->testAttribute(Qt::WA_SetFont)
@@ -813,12 +815,6 @@
     widgetPalette.setColor(QPalette::HighlightedText,
         s60Color(QS60StyleEnums::CL_QsnTextColors, 24, 0));
     QApplication::setPalette(widgetPalette, "QLineEdit");
-    widgetPalette = *palette;
-
-    widgetPalette.setColor(QPalette::Text,
-        s60Color(QS60StyleEnums::CL_QsnTextColors, 27, 0));
-    widgetPalette.setColor(QPalette::HighlightedText,
-        s60Color(QS60StyleEnums::CL_QsnTextColors, 24, 0));
     QApplication::setPalette(widgetPalette, "QTextEdit");
     widgetPalette = *palette;
 
@@ -880,7 +876,6 @@
         case QS60StyleEnums::SP_QgnGrafNsliderEndLeft:
         case QS60StyleEnums::SP_QgnGrafNsliderEndRight:
         case QS60StyleEnums::SP_QgnGrafNsliderMiddle:
-            result.setWidth(result.height() >> 1);
             break;
 
         case QS60StyleEnums::SP_QgnGrafNsliderMarker:
@@ -1120,11 +1115,9 @@
                     tool.rect = button.unite(menuRect);
                     tool.state = bflags;
                     const QToolButton *toolButtonWidget = qobject_cast<const QToolButton *>(widget);
-                    QS60StylePrivate::SkinElements element;
-                    if (toolButtonWidget)
-                        element = (toolButtonWidget->isDown()) ? QS60StylePrivate::SE_ToolBarButtonPressed : QS60StylePrivate::SE_ToolBarButton;
-                    else
-                        element = (option->state & State_Sunken) ? QS60StylePrivate::SE_ToolBarButtonPressed : QS60StylePrivate::SE_ToolBarButton;
+                    const QS60StylePrivate::SkinElements element =
+                        ((toolButtonWidget && toolButtonWidget->isDown()) || (option->state & State_Sunken)) ?
+                            QS60StylePrivate::SE_ToolBarButtonPressed : QS60StylePrivate::SE_ToolBarButton;
                     QS60StylePrivate::drawSkinElement(element, painter, tool.rect, flags);
                     drawPrimitive(PE_PanelButtonTool, &tool, painter, widget);
                 }
@@ -1534,30 +1527,47 @@
                         QS60StylePrivate::SE_TabBarTabNorthInactive;
                     break;
             }
-            if (skinElement==QS60StylePrivate::SE_TabBarTabEastInactive||
-                    skinElement==QS60StylePrivate::SE_TabBarTabNorthInactive||
-                    skinElement==QS60StylePrivate::SE_TabBarTabSouthInactive||
-                    skinElement==QS60StylePrivate::SE_TabBarTabWestInactive||
-                    skinElement==QS60StylePrivate::SE_TabBarTabEastActive||
-                    skinElement==QS60StylePrivate::SE_TabBarTabNorthActive||
-                    skinElement==QS60StylePrivate::SE_TabBarTabSouthActive||
+            if (skinElement == QS60StylePrivate::SE_TabBarTabEastInactive ||
+                    skinElement == QS60StylePrivate::SE_TabBarTabNorthInactive ||
+                    skinElement == QS60StylePrivate::SE_TabBarTabSouthInactive ||
+                    skinElement == QS60StylePrivate::SE_TabBarTabWestInactive ||
+                    skinElement == QS60StylePrivate::SE_TabBarTabEastActive ||
+                    skinElement == QS60StylePrivate::SE_TabBarTabNorthActive ||
+                    skinElement == QS60StylePrivate::SE_TabBarTabSouthActive ||
                     skinElement==QS60StylePrivate::SE_TabBarTabWestActive) {
                 const int borderThickness =
                     QS60StylePrivate::pixelMetric(PM_DefaultFrameWidth);
                 const int tabOverlap =
                     QS60StylePrivate::pixelMetric(PM_TabBarTabOverlap) - borderThickness;
+                const bool usesScrollButtons = 
+                    (widget) ? (qobject_cast<const QTabBar*>(widget))->usesScrollButtons() : false;
+                const int roomForScrollButton = 
+                    usesScrollButtons ? QS60StylePrivate::pixelMetric(PM_TabBarScrollButtonWidth) : 0;
 
-                if (skinElement==QS60StylePrivate::SE_TabBarTabEastInactive||
-                        skinElement==QS60StylePrivate::SE_TabBarTabEastActive||
-                        skinElement==QS60StylePrivate::SE_TabBarTabWestInactive||
-                        skinElement==QS60StylePrivate::SE_TabBarTabWestActive){
-                    optionTabAdj.rect.adjust(0, 0, 0, tabOverlap);
+                // adjust for overlapping tabs and scrollbuttons, if necessary
+                if (skinElement == QS60StylePrivate::SE_TabBarTabEastInactive ||
+                        skinElement == QS60StylePrivate::SE_TabBarTabEastActive ||
+                        skinElement == QS60StylePrivate::SE_TabBarTabWestInactive ||
+                        skinElement == QS60StylePrivate::SE_TabBarTabWestActive){
+                    if (optionTabAdj.position == QStyleOptionTabV3::Beginning)
+                        optionTabAdj.rect.adjust(0, roomForScrollButton, 0, tabOverlap);
+                    else if (optionTabAdj.position == QStyleOptionTabV3::End)
+                        optionTabAdj.rect.adjust(0, 0, 0, tabOverlap);
+                    else
+                        optionTabAdj.rect.adjust(0, 0, 0, tabOverlap);
                 } else {
-                    if (directionMirrored)
-                        optionTabAdj.rect.adjust(-tabOverlap, 0, 0, 0);
-                    else
-                        optionTabAdj.rect.adjust(0, 0, tabOverlap, 0);
+                    if (directionMirrored) {
+                        if (optionTabAdj.position == QStyleOptionTabV3::Beginning)
+                            optionTabAdj.rect.adjust(-tabOverlap, 0, -roomForScrollButton, 0);
+                        else
+                            optionTabAdj.rect.adjust(-tabOverlap, 0, 0, 0);
+                    } else {
+                        if (optionTabAdj.position == QStyleOptionTabV3::Beginning)
+                            optionTabAdj.rect.adjust(roomForScrollButton, 0, tabOverlap, 0);
+                        else
+                            optionTabAdj.rect.adjust(0, 0, tabOverlap, 0);
                     }
+                }
             }
             QS60StylePrivate::drawSkinElement(skinElement, painter, optionTabAdj.rect, flags);
         }
@@ -1570,7 +1580,10 @@
             const int borderThickness = QS60StylePrivate::pixelMetric(PM_DefaultFrameWidth);
             const int tabOverlap =
                 QS60StylePrivate::pixelMetric(PM_TabBarTabOverlap) - borderThickness;
-            const QRect windowRect = painter->window();
+            const bool usesScrollButtons = 
+                (widget) ? (qobject_cast<const QTabBar*>(widget))->usesScrollButtons() : false;
+            const int roomForScrollButton = 
+                usesScrollButtons ? QS60StylePrivate::pixelMetric(PM_TabBarScrollButtonWidth) : 0;
 
             switch (tab->shape) {
                 case QTabBar::TriangularWest:
@@ -1605,6 +1618,17 @@
                                 || optionTab.shape == QTabBar::TriangularEast
                                 || optionTab.shape == QTabBar::TriangularWest;
 
+            //make room for scrollbuttons
+            if (!verticalTabs) {
+                if ((tab->position == QStyleOptionTabV3::Beginning && !directionMirrored))
+                    tr.adjust(roomForScrollButton, 0, 0, 0);
+                else if ((tab->position == QStyleOptionTabV3::Beginning && directionMirrored))
+                    tr.adjust(0, 0, -roomForScrollButton, 0);
+            } else {
+                if (tab->position == QStyleOptionTabV3::Beginning)
+                    tr.adjust(0, roomForScrollButton, 0, 0);
+            }
+
             if (verticalTabs) {
                 painter->save();
                 int newX, newY, newRotation;
@@ -1636,9 +1660,10 @@
                 alignment |= Qt::TextHideMnemonic;
             if (!optionTab.icon.isNull()) {
                 QSize iconSize = optionTab.iconSize;
-                int iconExtent = pixelMetric(PM_TabBarIconSize);
-                if (iconSize.height() > iconExtent || iconSize.width() > iconExtent)
+                if (!iconSize.isValid()) {
+                    const int iconExtent = pixelMetric(PM_TabBarIconSize);
                     iconSize = QSize(iconExtent, iconExtent);
+                }
                 QPixmap tabIcon = optionTab.icon.pixmap(iconSize,
                     (optionTab.state & State_Enabled) ? QIcon::Normal : QIcon::Disabled);
                 if (tab->text.isEmpty())
@@ -2020,16 +2045,17 @@
         case PE_FrameFocusRect: {
             //Draw themed highlight to radiobuttons and checkboxes.
             //For other widgets skip, unless palette has been modified. In that case, draw with commonstyle.
-            if (option->palette.highlight().color() == QS60StylePrivate::themePalette()->highlight().color())
+            if (option->palette.highlight().color() == QS60StylePrivate::themePalette()->highlight().color()) {
                 if ((qstyleoption_cast<const QStyleOptionFocusRect *>(option) &&
                     (qobject_cast<const QRadioButton *>(widget) || qobject_cast<const QCheckBox *>(widget))))
                         QS60StylePrivate::drawSkinElement(
                             QS60StylePrivate::isWidgetPressed(widget) ? 
                                 QS60StylePrivate::SE_ListItemPressed : 
                                 QS60StylePrivate::SE_ListHighlight, painter, option->rect, flags);
-            else
+            } else {
                 commonStyleDraws = true;
             }
+        }
         break;
 #ifndef QT_NO_LINEEDIT
     case PE_PanelLineEdit:
@@ -2329,41 +2355,43 @@
 #endif
             QCommonStyle::drawPrimitive(element, option, painter, widget);
         } else {
-            const bool rightLine = option->state & State_Item;
-            const bool downLine = option->state & State_Sibling;
-            const bool upLine = option->state & (State_Open | State_Children | State_Item | State_Sibling);
+            if (const QStyleOptionViewItemV2 *vopt = qstyleoption_cast<const QStyleOptionViewItemV2 *>(option)) {
+                const bool rightLine = option->state & State_Item;
+                const bool downLine = option->state & State_Sibling;
+                const bool upLine = option->state & (State_Open | State_Children | State_Item | State_Sibling);
+                QS60StylePrivate::SkinElementFlags adjustedFlags = flags;
 
-            QS60StyleEnums::SkinParts skinPart;
-            bool drawSkinPart = false;
-            if (rightLine && downLine && upLine) {
-                skinPart = QS60StyleEnums::SP_QgnIndiHlLineBranch;
-                drawSkinPart = true;
-            } else if (rightLine && upLine) {
-                skinPart = QS60StyleEnums::SP_QgnIndiHlLineEnd;
-                drawSkinPart = true;
-            } else if (upLine && downLine) {
-                skinPart = QS60StyleEnums::SP_QgnIndiHlLineStraight;
-                drawSkinPart = true;
-            }
+                QS60StyleEnums::SkinParts skinPart;
+                bool drawSkinPart = false;
+                if (rightLine && downLine && upLine) {
+                    skinPart = QS60StyleEnums::SP_QgnIndiHlLineBranch;
+                    drawSkinPart = true;
+                } else if (rightLine && upLine) {
+                    skinPart = QS60StyleEnums::SP_QgnIndiHlLineEnd;
+                    drawSkinPart = true;
+                } else if (upLine && downLine) {
+                    skinPart = QS60StyleEnums::SP_QgnIndiHlLineStraight;
+                    drawSkinPart = true;
+                }
 
-            if (drawSkinPart)
-                QS60StylePrivate::drawSkinPart(skinPart, painter, option->rect, flags);
+                if (option->direction == Qt::RightToLeft)
+                    adjustedFlags |= QS60StylePrivate::SF_Mirrored_X_Axis;
+
+                if (drawSkinPart)
+                    QS60StylePrivate::drawSkinPart(skinPart, painter, option->rect, adjustedFlags);
 
-            if (option->state & State_Children) {
-                QS60StyleEnums::SkinParts skinPart =
-                        (option->state & State_Open) ? QS60StyleEnums::SP_QgnIndiHlColSuper : QS60StyleEnums::SP_QgnIndiHlExpSuper;
-                int minDimension = qMin(option->rect.width(), option->rect.height());
-                QRect iconRect(option->rect.topLeft(), QSize(minDimension, minDimension));
-                const int magicTweak = 3;
-                int resizeValue = minDimension >> 1;
-                if (!QS60StylePrivate::isTouchSupported()) {
-                    minDimension += resizeValue; // Adjust the icon bigger because of empty space in svg icon.
-                    iconRect.setSize(QSize(minDimension, minDimension));
-                    const int verticalMagic = (option->rect.width() <= option->rect.height()) ? magicTweak : 0;
-                    resizeValue = verticalMagic - resizeValue;
+                if (option->state & State_Children) {
+                    QS60StyleEnums::SkinParts skinPart =
+                            (option->state & State_Open) ? QS60StyleEnums::SP_QgnIndiHlColSuper : QS60StyleEnums::SP_QgnIndiHlExpSuper;
+                    const QRect selectionRect = subElementRect(SE_ItemViewItemCheckIndicator, vopt, widget);
+                    const int minDimension = qMin(option->rect.width(), option->rect.height());
+                    const int magicTweak = (option->direction == Qt::RightToLeft) ? -3 : 3; //@todo: magic
+                    //The branch indicator icon in S60 is supposed to be superimposed on top of branch lines.
+                    QRect iconRect(QPoint(option->rect.left() + magicTweak, selectionRect.top() + 1), QSize(minDimension, minDimension));
+                    if (!QS60StylePrivate::isTouchSupported())
+                        iconRect.translate(0, -4); //@todo: magic
+                    QS60StylePrivate::drawSkinPart(skinPart, painter, iconRect, adjustedFlags);
                 }
-                iconRect.translate(magicTweak, resizeValue);
-                QS60StylePrivate::drawSkinPart(skinPart, painter, iconRect, flags);
             }
         }
         break;
@@ -2446,6 +2474,12 @@
             //double the top layout margin for dialogs, it is very close to real value
             //without having to define custom pixel metric
             metricValue *= 2;
+
+    if (widget && (metric == PM_FocusFrameHMargin))
+        if (qobject_cast<const QTableView *>(widget))
+            //Halve the focus frame margin for table items
+            metricValue /= 2;
+
     return metricValue;
 }
 
@@ -2471,7 +2505,7 @@
                     sz += QSize(pixelMetric(PM_IndicatorWidth) + pixelMetric(PM_CheckBoxLabelSpacing), 0);
                 const int iconHeight = (!buttonWidget->icon().isNull()) ? buttonWidget->iconSize().height() : 0;
                 const int textHeight = (buttonWidget->text().length() > 0) ?
-                    buttonWidget->fontMetrics().size(Qt::TextSingleLine, buttonWidget->text()).height() : 0;
+                    buttonWidget->fontMetrics().size(Qt::TextSingleLine, buttonWidget->text()).height() : opt->fontMetrics.height();
                 const int decoratorHeight = (buttonWidget->isCheckable()) ? pixelMetric(PM_IndicatorHeight) : 0;
 
                 const int contentHeight =
@@ -2490,6 +2524,19 @@
                 sz = QCommonStyle::sizeFromContents(ct, opt, csz, widget);
                 if (naviPaneSize.height() > sz.height())
                     sz.setHeight(naviPaneSize.height());
+                // Adjust beginning tabbar item size, if scrollbuttons are used. This is to ensure that the
+                // tabbar item content fits, since scrollbuttons are making beginning tabbar item smaller.
+                int scrollButtonSize = 0;
+                if (const QTabBar *tabBar = qobject_cast<const QTabBar *>(widget))
+                    scrollButtonSize = tabBar->usesScrollButtons() ? pixelMetric(PM_TabBarScrollButtonWidth) : 0;
+                if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(opt)) {
+                    const bool verticalTabs = tab->shape == QTabBar::RoundedEast
+                            || tab->shape == QTabBar::RoundedWest
+                            || tab->shape == QTabBar::TriangularEast
+                            || tab->shape == QTabBar::TriangularWest;
+                    if (tab->position == QStyleOptionTab::Beginning)
+                        sz += QSize(verticalTabs ? 0 : scrollButtonSize, !verticalTabs ? 0 : scrollButtonSize);
+                }
             }
             break;
         case CT_MenuItem:
@@ -2957,7 +3004,7 @@
             }
             break;
         case SE_ItemViewItemCheckIndicator:
-            if (const QStyleOptionViewItemV4 *vopt = qstyleoption_cast<const QStyleOptionViewItemV4 *>(opt)) {
+            if (const QStyleOptionViewItemV2 *vopt = qstyleoption_cast<const QStyleOptionViewItemV2 *>(opt)) {
                 const QListWidget *listItem = qobject_cast<const QListWidget *>(widget);
 
                 const bool singleSelection = listItem &&
--- a/src/gui/styles/qs60style_p.h	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/styles/qs60style_p.h	Fri Jun 11 14:24:45 2010 +0300
@@ -476,6 +476,8 @@
         SF_StateDisabled =    0x0020,
         SF_ColorSkinned =     0x0040, // pixmap is colored with foreground pen color
         SF_Animation =        0x0080,
+        SF_Mirrored_X_Axis =  0x0100,
+        SF_Mirrored_Y_Axis =  0x0200
     };
 
     enum CacheClearReason {
--- a/src/gui/styles/qs60style_s60.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/styles/qs60style_s60.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -654,6 +654,14 @@
 
         pixmap = QPixmap::fromImage(iconImage);
     }
+    if ((flags & QS60StylePrivate::SF_Mirrored_X_Axis) ||
+        (flags & QS60StylePrivate::SF_Mirrored_Y_Axis)) {
+        QImage iconImage = pixmap.toImage().mirrored(
+            flags & QS60StylePrivate::SF_Mirrored_X_Axis,
+            flags & QS60StylePrivate::SF_Mirrored_Y_Axis);
+        pixmap = QPixmap::fromImage(iconImage);
+    }
+
     return pixmap;
 }
 
@@ -969,7 +977,7 @@
 
     switch(frameElement) {
         case QS60StylePrivate::SF_ToolTip:
-            if (QSysInfo::s60Version()!=QSysInfo::SV_S60_3_1) {
+            if (QSysInfo::s60Version() != QSysInfo::SV_S60_3_1) {
                 centerId.Set(EAknsMajorGeneric, 0x19c2);
                 frameId.Set(EAknsMajorSkin, 0x5300);
             } else {
@@ -978,7 +986,8 @@
             }
             break;
         case QS60StylePrivate::SF_ToolBar:
-            if (QSysInfo::s60Version()==QSysInfo::SV_S60_3_1 || QSysInfo::s60Version()==QSysInfo::SV_S60_3_2) {
+            if (QSysInfo::s60Version() == QSysInfo::SV_S60_3_1 || 
+                QSysInfo::s60Version() == QSysInfo::SV_S60_3_2) {
                 centerId.Set(KAknsIIDQsnFrPopupCenterSubmenu);
                 frameId.Set(KAknsIIDQsnFrPopupSub);
             }
--- a/src/gui/styles/qwindowsmobilestyle.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/styles/qwindowsmobilestyle.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -5356,6 +5356,50 @@
         painter->setPen(option->palette.text().color());
         painter->drawLines(a);
         break; }
+    case PE_IndicatorBranch: {
+        // Copied from the Windows style.
+        static const int decoration_size = d->doubleControls ? 18 : 9;
+        static const int ofsA  = d->doubleControls ?  4 : 2;
+        static const int ofsB  = d->doubleControls ?  8 : 4;
+        static const int ofsC  = d->doubleControls ? 12 : 6;
+        static const int ofsD  = d->doubleControls ? 1 : 0;
+        int mid_h = option->rect.x() + option->rect.width() / 2;
+        int mid_v = option->rect.y() + option->rect.height() / 2;
+        int bef_h = mid_h;
+        int bef_v = mid_v;
+        int aft_h = mid_h;
+        int aft_v = mid_v;
+        if (option->state & State_Children) {
+            int delta = decoration_size / 2;
+            bef_h -= delta;
+            bef_v -= delta;
+            aft_h += delta;
+            aft_v += delta;
+            QPen oldPen = painter->pen();
+            QPen crossPen = oldPen;
+            crossPen.setWidth(2);
+            painter->setPen(crossPen);
+            painter->drawLine(bef_h + ofsA + ofsD, bef_v + ofsB + ofsD, bef_h + ofsC + ofsD, bef_v + ofsB + ofsD);
+            if (!(option->state & State_Open))
+                painter->drawLine(bef_h + ofsB + ofsD, bef_v + ofsA + ofsD, bef_h + ofsB + ofsD, bef_v + ofsC + ofsD);
+            painter->setPen(option->palette.dark().color());
+            painter->drawRect(bef_h, bef_v, decoration_size - 1, decoration_size - 1);
+            if (d->doubleControls)
+                painter->drawRect(bef_h + 1, bef_v + 1, decoration_size - 3, decoration_size - 3);
+            painter->setPen(oldPen);
+        }
+        QBrush brush(option->palette.dark().color(), Qt::Dense4Pattern);
+        if (option->state & State_Item) {
+            if (option->direction == Qt::RightToLeft)
+                painter->fillRect(option->rect.left(), mid_v, bef_h - option->rect.left(), 1, brush);
+            else
+                painter->fillRect(aft_h, mid_v, option->rect.right() - aft_h + 1, 1, brush);
+        }
+        if (option->state & State_Sibling)
+            painter->fillRect(mid_h, aft_v, 1, option->rect.bottom() - aft_v + 1, brush);
+        if (option->state & (State_Open | State_Children | State_Item | State_Sibling))
+            painter->fillRect(mid_h, option->rect.y(), 1, bef_v - option->rect.y(), brush);
+        break; }
     case PE_Frame:
         qDrawPlainRect(painter, option->rect, option->palette.shadow().color(),
                        d->doubleControls ? 2 : 1, &option->palette.background());
--- a/src/gui/text/qfont.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/text/qfont.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -805,6 +805,9 @@
         resolve_mask |= QFont::WeightResolved | QFont::StyleResolved;
     }
 
+    if (italic)
+        resolve_mask |= QFont::StyleResolved;
+
     d->request.family = family;
     d->request.pointSize = qreal(pointSize);
     d->request.pixelSize = -1;
--- a/src/gui/text/qfontdatabase.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/text/qfontdatabase.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -598,10 +598,10 @@
 
 #if defined(Q_OS_SYMBIAN) && defined(QT_NO_FREETYPE)
 // class with virtual destructor, derived in qfontdatabase_s60.cpp
-class QFontDatabaseS60Store
+class QSymbianFontDatabaseExtras
 {
 public:
-    virtual ~QFontDatabaseS60Store() {}
+    virtual ~QSymbianFontDatabaseExtras() {}
 };
 #endif
 
@@ -614,7 +614,7 @@
           , stream(0)
 #endif
 #if defined(Q_OS_SYMBIAN) && defined(QT_NO_FREETYPE)
-          , s60Store(0)
+          , symbianExtras(0)
 #endif
     { }
     ~QFontDatabasePrivate() {
@@ -628,9 +628,9 @@
         families = 0;
         count = 0;
 #if defined(Q_OS_SYMBIAN) && defined(QT_NO_FREETYPE)
-        if (s60Store) {
-            delete s60Store;
-            s60Store = 0;
+        if (symbianExtras) {
+            delete symbianExtras;
+            symbianExtras = 0;
         }
 #endif
         // don't clear the memory fonts!
@@ -675,7 +675,7 @@
     QDataStream *stream;
     QStringList fallbackFamilies;
 #elif defined(Q_OS_SYMBIAN) && defined(QT_NO_FREETYPE)
-    const QFontDatabaseS60Store *s60Store;
+    const QSymbianFontDatabaseExtras *symbianExtras;
 #endif
 };
 
--- a/src/gui/text/qfontdatabase_s60.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/text/qfontdatabase_s60.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -92,23 +92,23 @@
 }
 
 #if defined(QT_NO_FREETYPE)
-class QFontDatabaseS60StoreImplementation : public QFontDatabaseS60Store
+class QSymbianFontDatabaseExtrasImplementation : public QSymbianFontDatabaseExtras
 {
 public:
-    QFontDatabaseS60StoreImplementation();
-    ~QFontDatabaseS60StoreImplementation();
+    QSymbianFontDatabaseExtrasImplementation();
+    ~QSymbianFontDatabaseExtrasImplementation();
 
-    const QFontEngineS60Extensions *extension(const QString &typeface, bool bold, bool italic) const;
+    const QSymbianTypeFaceExtras *extras(const QString &typeface, bool bold, bool italic) const;
 
 private:
     RHeap* m_heap;
     CFontStore *m_store;
     COpenFontRasterizer *m_rasterizer;
-    mutable QList<const QFontEngineS60Extensions *> m_extensions;
-    mutable QHash<QString, const QFontEngineS60Extensions *> m_extensionsHash;
+    mutable QList<const QSymbianTypeFaceExtras *> m_extras;
+    mutable QHash<QString, const QSymbianTypeFaceExtras *> m_extrasHash;
 };
 
-QFontDatabaseS60StoreImplementation::QFontDatabaseS60StoreImplementation()
+QSymbianFontDatabaseExtrasImplementation::QSymbianFontDatabaseExtrasImplementation()
 {
     QStringList filters;
     filters.append(QLatin1String("*.ttf"));
@@ -131,10 +131,11 @@
         QT_TRAP_THROWING(m_store->AddFileL(fontFilePtr));
     }
 }
-QFontDatabaseS60StoreImplementation::~QFontDatabaseS60StoreImplementation()
+
+QSymbianFontDatabaseExtrasImplementation::~QSymbianFontDatabaseExtrasImplementation()
 {
-    typedef QList<const QFontEngineS60Extensions *>::iterator iterator;
-    for (iterator p = m_extensions.begin(); p != m_extensions.end(); ++p) {
+    typedef QList<const QSymbianTypeFaceExtras *>::iterator iterator;
+    for (iterator p = m_extras.begin(); p != m_extras.end(); ++p) {
         m_store->ReleaseFont((*p)->fontOwner());
         delete *p;
     }
@@ -160,11 +161,11 @@
 }
 #endif // FNTSTORE_H_INLINES_SUPPORT_FMM
 
-const QFontEngineS60Extensions *QFontDatabaseS60StoreImplementation::extension(const QString &typeface, 
+const QSymbianTypeFaceExtras *QSymbianFontDatabaseExtrasImplementation::extras(const QString &typeface,
                                                                                bool bold, bool italic) const
 {
     const QString searchKey = typeface + QString::number(int(bold)) + QString::number(int(italic));
-    if (!m_extensionsHash.contains(searchKey)) {
+    if (!m_extrasHash.contains(searchKey)) {
         CFont* font = NULL;
         TFontSpec searchSpec(qt_QString2TPtrC(typeface), 1);
         if (bold)
@@ -183,17 +184,17 @@
         const TOpenFontFaceAttrib* const attrib = openFont->FaceAttrib();
         const QString foundKey =
                 QString((const QChar*)attrib->FullName().Ptr(), attrib->FullName().Length());
-        if (!m_extensionsHash.contains(foundKey)) {
-            QFontEngineS60Extensions *extras = new QFontEngineS60Extensions(font, openFont);
-            m_extensions.append(extras);
-            m_extensionsHash.insert(searchKey, extras);
-            m_extensionsHash.insert(foundKey, extras);
+        if (!m_extrasHash.contains(foundKey)) {
+            QSymbianTypeFaceExtras *extras = new QSymbianTypeFaceExtras(font, openFont);
+            m_extras.append(extras);
+            m_extrasHash.insert(searchKey, extras);
+            m_extrasHash.insert(foundKey, extras);
         } else {
             m_store->ReleaseFont(font);
-            m_extensionsHash.insert(searchKey, m_extensionsHash.value(foundKey));
+            m_extrasHash.insert(searchKey, m_extrasHash.value(foundKey));
         }
     }
-    return m_extensionsHash.value(searchKey);
+    return m_extrasHash.value(searchKey);
 }
 #else
 class QFontEngineFTS60 : public QFontEngineFT
@@ -260,14 +261,14 @@
         return;
 
 #if defined(QT_NO_FREETYPE)
-    if (!db->s60Store)
-        db->s60Store = new QFontDatabaseS60StoreImplementation;
+    if (!db->symbianExtras)
+        db->symbianExtras = new QSymbianFontDatabaseExtrasImplementation;
 
     QSymbianFbsHeapLock lock(QSymbianFbsHeapLock::Unlock);
     
     const int numTypeFaces = QS60Data::screenDevice()->NumTypefaces();
-    const QFontDatabaseS60StoreImplementation *store =
-            static_cast<const QFontDatabaseS60StoreImplementation*>(db->s60Store);
+    const QSymbianFontDatabaseExtrasImplementation *dbExtras =
+            static_cast<const QSymbianFontDatabaseExtrasImplementation*>(db->symbianExtras);
     bool fontAdded = false;
     for (int i = 0; i < numTypeFaces; i++) {
         TTypefaceSupport typefaceSupport;
@@ -293,8 +294,9 @@
             style->smoothScalable = typefaceSupport.iIsScalable;
             style->pixelSize(0, true);
 
-            const QFontEngineS60Extensions *extension = store->extension(familyName, faceAttrib.IsBold(), faceAttrib.IsItalic());
-            const QByteArray os2Table = extension->getSfntTable(MAKE_TAG('O', 'S', '/', '2'));
+            const QSymbianTypeFaceExtras *typeFaceExtras =
+                    dbExtras->extras(familyName, faceAttrib.IsBold(), faceAttrib.IsItalic());
+            const QByteArray os2Table = typeFaceExtras->getSfntTable(MAKE_TAG('O', 'S', '/', '2'));
             const unsigned char* data = reinterpret_cast<const unsigned char*>(os2Table.constData());
             const unsigned char* ulUnicodeRange = data + 42;
             quint32 unicodeRange[4] = {
@@ -414,10 +416,11 @@
         QFontDef request = req;
         request.family = fontFamily;
 #if defined(QT_NO_FREETYPE)
-        const QFontDatabaseS60StoreImplementation *store =
-                static_cast<const QFontDatabaseS60StoreImplementation*>(db->s60Store);
-        const QFontEngineS60Extensions *extension = store->extension(fontFamily, request.weight > QFont::Normal, request.style != QFont::StyleNormal );
-        fe = new QFontEngineS60(request, extension);
+        const QSymbianFontDatabaseExtrasImplementation *dbExtras =
+                static_cast<const QSymbianFontDatabaseExtrasImplementation*>(db->symbianExtras);
+        const QSymbianTypeFaceExtras *typeFaceExtras =
+                dbExtras->extras(fontFamily, request.weight > QFont::Normal, request.style != QFont::StyleNormal);
+        fe = new QFontEngineS60(request, typeFaceExtras);
 #else
         QFontEngine::FaceId faceId;
         const QtFontFamily * const reqQtFontFamily = db->family(fontFamily);
--- a/src/gui/text/qfontengine_s60.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/text/qfontengine_s60.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -53,22 +53,19 @@
 
 QT_BEGIN_NAMESPACE
 
-QFontEngineS60Extensions::QFontEngineS60Extensions(CFont* fontOwner, COpenFont *font)
+QSymbianTypeFaceExtras::QSymbianTypeFaceExtras(CFont* fontOwner, COpenFont *font)
     : m_font(font)
     , m_cmap(0)
     , m_symbolCMap(false)
     , m_fontOwner(fontOwner)
 {
-    TAny *shapingExtension = NULL;
-    m_font->ExtendedInterface(KUidOpenFontShapingExtension, shapingExtension);
-    m_shapingExtension = static_cast<MOpenFontShapingExtension*>(shapingExtension);
     TAny *trueTypeExtension = NULL;
     m_font->ExtendedInterface(KUidOpenFontTrueTypeExtension, trueTypeExtension);
     m_trueTypeExtension = static_cast<MOpenFontTrueTypeExtension*>(trueTypeExtension);
-    Q_ASSERT(m_shapingExtension && m_trueTypeExtension);
+    Q_ASSERT(m_trueTypeExtension);
 }
 
-QByteArray QFontEngineS60Extensions::getSfntTable(uint tag) const
+QByteArray QSymbianTypeFaceExtras::getSfntTable(uint tag) const
 {
     Q_ASSERT(m_trueTypeExtension->HasTrueTypeTable(tag));
     TInt error = KErrNone;
@@ -79,7 +76,7 @@
     return result;
 }
 
-bool QFontEngineS60Extensions::getSfntTableData(uint tag, uchar *buffer, uint *length) const
+bool QSymbianTypeFaceExtras::getSfntTableData(uint tag, uchar *buffer, uint *length) const
 {
     if (!m_trueTypeExtension->HasTrueTypeTable(tag))
         return false;
@@ -104,7 +101,7 @@
     return result;
 }
 
-const unsigned char *QFontEngineS60Extensions::cmap() const
+const unsigned char *QSymbianTypeFaceExtras::cmap() const
 {
     if (!m_cmap) {
         m_cmapTable = getSfntTable(MAKE_TAG('c', 'm', 'a', 'p'));
@@ -114,27 +111,7 @@
     return m_cmap;
 }
 
-QPainterPath QFontEngineS60Extensions::glyphOutline(glyph_t glyph) const
-{
-    QPainterPath result;
-    QPolygonF polygon;
-    TInt glyphIndex = glyph;
-    TInt pointNumber = 0;
-    TInt x, y;
-    while (m_shapingExtension->GlyphPointInFontUnits(glyphIndex, pointNumber++, x, y)) {
-        const QPointF point(qreal(x) / 0xffff, qreal(y) / 0xffff);
-        if (polygon.contains(point)) {
-            result.addPolygon(polygon);
-            result.closeSubpath();
-            polygon.clear();
-        } else {
-            polygon.append(point);
-        }
-    }
-    return result;
-}
-
-CFont *QFontEngineS60Extensions::fontOwner() const
+CFont *QSymbianTypeFaceExtras::fontOwner() const
 {
     return m_fontOwner;
 }
@@ -192,8 +169,8 @@
     }
 }
 
-QFontEngineS60::QFontEngineS60(const QFontDef &request, const QFontEngineS60Extensions *extensions)
-    : m_extensions(extensions)
+QFontEngineS60::QFontEngineS60(const QFontDef &request, const QSymbianTypeFaceExtras *extras)
+    : m_extras(extras)
     , m_originalFont(0)
     , m_originalFontSizeInPixels((request.pixelSize >= 0)?
             request.pixelSize:pointsToPixels(request.pointSize))
@@ -220,7 +197,7 @@
     }
 
     HB_Glyph *g = glyphs->glyphs;
-    const unsigned char* cmap = m_extensions->cmap();
+    const unsigned char* cmap = m_extras->cmap();
     const bool isRtl = (flags & QTextEngine::RightToLeft);
     for (int i = 0; i < len; ++i) {
         const unsigned int uc = getChar(characters, i, len);
@@ -339,7 +316,7 @@
 
 bool QFontEngineS60::canRender(const QChar *string, int len)
 {
-    const unsigned char *cmap = m_extensions->cmap();
+    const unsigned char *cmap = m_extras->cmap();
     for (int i = 0; i < len; ++i) {
         const unsigned int uc = getChar(string, i, len);
         if (QFontEngine::getTrueTypeGlyphIndex(cmap, uc) == 0)
@@ -350,12 +327,12 @@
 
 QByteArray QFontEngineS60::getSfntTable(uint tag) const
 {
-    return m_extensions->getSfntTable(tag);
+    return m_extras->getSfntTable(tag);
 }
 
 bool QFontEngineS60::getSfntTableData(uint tag, uchar *buffer, uint *length) const
 {
-    return m_extensions->getSfntTableData(tag, buffer, length);
+    return m_extras->getSfntTableData(tag, buffer, length);
 }
 
 QFontEngine::Type QFontEngineS60::type() const
--- a/src/gui/text/qfontengine_s60_p.h	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/text/qfontengine_s60_p.h	Fri Jun 11 14:24:45 2010 +0300
@@ -62,21 +62,19 @@
 
 QT_BEGIN_NAMESPACE
 
-// ..gives us access to truetype tables, UTF-16<->GlyphID mapping, and glyph outlines
-class QFontEngineS60Extensions
+// ..gives us access to truetype tables
+class QSymbianTypeFaceExtras
 {
 public:
-    QFontEngineS60Extensions(CFont* fontOwner, COpenFont *font);
+    QSymbianTypeFaceExtras(CFont* fontOwner, COpenFont *font);
 
     QByteArray getSfntTable(uint tag) const;
     bool getSfntTableData(uint tag, uchar *buffer, uint *length) const;
     const unsigned char *cmap() const;
-    QPainterPath glyphOutline(glyph_t glyph) const;
     CFont *fontOwner() const;
 
 private:
     COpenFont *m_font;
-    const MOpenFontShapingExtension *m_shapingExtension;
     mutable MOpenFontTrueTypeExtension *m_trueTypeExtension;
     mutable const unsigned char *m_cmap;
     mutable bool m_symbolCMap;
@@ -87,7 +85,7 @@
 class QFontEngineS60 : public QFontEngine
 {
 public:
-    QFontEngineS60(const QFontDef &fontDef, const QFontEngineS60Extensions *extensions);
+    QFontEngineS60(const QFontDef &fontDef, const QSymbianTypeFaceExtras *extras);
     ~QFontEngineS60();
 
     bool stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs, int *nglyphs, QTextEngine::ShaperFlags flags) const;
@@ -128,7 +126,7 @@
     CFont *fontWithSize(qreal size) const;
     static void releaseFont(CFont *&font);
 
-    const QFontEngineS60Extensions *m_extensions;
+    const QSymbianTypeFaceExtras *m_extras;
     CFont* m_originalFont;
     const qreal m_originalFontSizeInPixels;
     CFont* m_scaledFont;
--- a/src/gui/text/qtextdocument.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/text/qtextdocument.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -1679,7 +1679,7 @@
         return;
 
     const QTextDocument *doc = this;
-    QTextDocument *clonedDoc = 0;
+    QScopedPointer<QTextDocument> clonedDoc;
     (void)doc->documentLayout(); // make sure that there is a layout
 
     QRectF body = QRectF(QPointF(0, 0), d->pageSize);
@@ -1712,7 +1712,7 @@
                 printerPageSize.height() / scaledPageSize.height());
     } else {
         doc = clone(const_cast<QTextDocument *>(this));
-        clonedDoc = const_cast<QTextDocument *>(doc);
+        clonedDoc.reset(const_cast<QTextDocument *>(doc));
 
         for (QTextBlock srcBlock = firstBlock(), dstBlock = clonedDoc->firstBlock();
              srcBlock.isValid() && dstBlock.isValid();
@@ -1787,7 +1787,7 @@
             for (int j = 0; j < pageCopies; ++j) {
                 if (printer->printerState() == QPrinter::Aborted
                     || printer->printerState() == QPrinter::Error)
-                    goto UserCanceled;
+                    return;
                 printPage(page, &p, doc, body, pageNumberPos);
                 if (j < pageCopies - 1)
                     printer->newPage();
@@ -1807,9 +1807,6 @@
         if ( i < docCopies - 1)
             printer->newPage();
     }
-
-UserCanceled:
-    delete clonedDoc;
 }
 #endif
 
--- a/src/gui/util/qsystemtrayicon_win.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/util/qsystemtrayicon_win.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -61,17 +61,9 @@
 #include <QDesktopWidget>
 #include <QSettings>
 
-#if defined(Q_WS_WINCE) && !defined(STANDARDSHELL_UI_MODEL)
-#   include <streams.h>
-#endif
-
 QT_BEGIN_NAMESPACE
 
-#if defined(Q_WS_WINCE)
-static const UINT q_uNOTIFYICONID = 13;     // IDs from 0 to 12 are reserved on WinCE.
-#else
 static const UINT q_uNOTIFYICONID = 0;
-#endif
 
 static uint MYWM_TASKBARCREATED = 0;
 #define MYWM_NOTIFYICON (WM_APP+101)
@@ -125,23 +117,15 @@
 
 bool QSystemTrayIconSys::supportsMessages()
 {
-#ifndef Q_OS_WINCE
     return allowsMessages();
-#endif
-    return false;
 }
 
 QSystemTrayIconSys::QSystemTrayIconSys(QSystemTrayIcon *object)
     : hIcon(0), q(object), ignoreNextMouseRelease(false)
 
 {
-#ifndef Q_OS_WINCE
     notifyIconSize = FIELD_OFFSET(NOTIFYICONDATA, guidItem); // NOTIFYICONDATAW_V2_SIZE;
     maxTipLength = 128;
-#else
-    notifyIconSize = FIELD_OFFSET(NOTIFYICONDATA, szTip[64]); // NOTIFYICONDATAW_V1_SIZE;
-    maxTipLength = 64;
-#endif
 
     // For restoring the tray icon after explorer crashes
     if (!MYWM_TASKBARCREATED) {
@@ -317,26 +301,15 @@
             case WM_RBUTTONUP:
                 if (q->contextMenu()) {
                     q->contextMenu()->popup(gpos);
-#if defined(Q_WS_WINCE)
-                    // We must ensure that the popup menu doesn't show up behind the task bar.
-                    QRect desktopRect = qApp->desktop()->availableGeometry();
-                    int maxY = desktopRect.y() + desktopRect.height() - q->contextMenu()->height();
-                    if (gpos.y() > maxY) {
-                        gpos.ry() = maxY;
-                        q->contextMenu()->move(gpos);
-                    }
-#endif
                     q->contextMenu()->activateWindow();
                     //Must be activated for proper keyboardfocus and menu closing on windows:
                 }
                 emit q->activated(QSystemTrayIcon::Context);
                 break;
 
-#if !defined(Q_WS_WINCE)
             case NIN_BALLOONUSERCLICK:
                 emit q->messageClicked();
                 break;
-#endif
 
             case WM_MBUTTONUP:
                 emit q->activated(QSystemTrayIcon::MiddleClick);
@@ -403,23 +376,11 @@
 
     //find the toolbar used in the notification area
     if (trayHandle) {
-#if defined(Q_OS_WINCE)
-        trayHandle = FindWindow(L"TrayNotifyWnd", NULL);
-#else
         trayHandle = FindWindowEx(trayHandle, NULL, L"TrayNotifyWnd", NULL);
-#endif
         if (trayHandle) {
-#if defined(Q_OS_WINCE)
-            HWND hwnd = FindWindow(L"SysPager", NULL);
-#else
             HWND hwnd = FindWindowEx(trayHandle, NULL, L"SysPager", NULL);
-#endif
             if (hwnd) {
-#if defined(Q_OS_WINCE)
-                hwnd = FindWindow(L"ToolbarWindow32", NULL);
-#else
                 hwnd = FindWindowEx(hwnd, NULL, L"ToolbarWindow32", NULL);
-#endif
                 if (hwnd)
                     trayHandle = hwnd;
             }
@@ -438,11 +399,7 @@
         return ret;
 
     int buttonCount = SendMessage(trayHandle, TB_BUTTONCOUNT, 0, 0);
-#if defined(Q_OS_WINCE)
-    LPVOID data = VirtualAlloc(NULL, sizeof(TBBUTTON), MEM_COMMIT, PAGE_READWRITE);
-#else
     LPVOID data = VirtualAllocEx(trayProcess, NULL, sizeof(TBBUTTON), MEM_COMMIT, PAGE_READWRITE);
-#endif
 
     if ( buttonCount < 1 || !data ) {
         CloseHandle(trayProcess);
@@ -480,11 +437,7 @@
             }
         }
     }
-#if defined(Q_OS_WINCE)
-    VirtualFree(data, 0, MEM_RELEASE);
-#else
     VirtualFreeEx(trayProcess, data, 0, MEM_RELEASE);
-#endif
     CloseHandle(trayProcess);
     return ret;
 }
@@ -558,16 +511,10 @@
 
 void QSystemTrayIconPrivate::updateToolTip_sys()
 {
-#ifdef Q_WS_WINCE
-    // Calling sys->trayMessage(NIM_MODIFY) on an existing icon is broken on Windows CE.
-    // So we need to call updateIcon_sys() which creates a new icon handle.
-    updateIcon_sys();
-#else
     if (!sys)
         return;
 
     sys->trayMessage(NIM_MODIFY);
-#endif
 }
 
 bool QSystemTrayIconPrivate::isSystemTrayAvailable_sys()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/gui/util/qsystemtrayicon_wince.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,299 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsystemtrayicon_p.h"
+#ifndef QT_NO_SYSTEMTRAYICON
+#define _WIN32_IE 0x0600 //required for NOTIFYICONDATA_V2_SIZE
+
+#include <qt_windows.h>
+#include <shlwapi.h>
+#include <QApplication>
+
+QT_BEGIN_NAMESPACE
+
+static const UINT q_uNOTIFYICONID = 13;     // IDs from 0 to 12 are reserved on WinCE.
+#define MYWM_NOTIFYICON (WM_APP+101)
+
+struct Q_NOTIFYICONIDENTIFIER {
+    DWORD cbSize;
+    HWND hWnd;
+    UINT uID;
+    GUID guidItem;
+};
+
+class QSystemTrayIconSys : QWidget
+{
+public:
+    QSystemTrayIconSys(QSystemTrayIcon *object);
+    ~QSystemTrayIconSys();
+    bool winEvent( MSG *m, long *result );
+    bool trayMessage(DWORD msg);
+    void setIconContents(NOTIFYICONDATA &data);
+    void createIcon();
+    QRect findTrayGeometry();
+    HICON hIcon;
+    QPoint globalPos;
+    QSystemTrayIcon *q;
+private:
+    uint notifyIconSize;
+    int maxTipLength;
+    bool ignoreNextMouseRelease;
+};
+
+QSystemTrayIconSys::QSystemTrayIconSys(QSystemTrayIcon *object)
+    : hIcon(0), q(object), ignoreNextMouseRelease(false)
+
+{
+    notifyIconSize = FIELD_OFFSET(NOTIFYICONDATA, szTip[64]); // NOTIFYICONDATAW_V1_SIZE;
+    maxTipLength = 64;
+}
+
+QSystemTrayIconSys::~QSystemTrayIconSys()
+{
+    if (hIcon)
+        DestroyIcon(hIcon);
+}
+
+QRect QSystemTrayIconSys::findTrayGeometry()
+{
+    // Use lower right corner as fallback
+    QPoint brCorner = qApp->desktop()->screenGeometry().bottomRight();
+    QRect ret(brCorner.x() - 10, brCorner.y() - 10, 10, 10);
+    return ret;
+}
+
+void QSystemTrayIconSys::setIconContents(NOTIFYICONDATA &tnd)
+{
+    tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
+    tnd.uCallbackMessage = MYWM_NOTIFYICON;
+    tnd.hIcon = hIcon;
+    QString tip = q->toolTip();
+
+    if (!tip.isNull()) {
+        tip = tip.left(maxTipLength - 1) + QChar();
+        memcpy(tnd.szTip, tip.utf16(), qMin(tip.length() + 1, maxTipLength) * sizeof(wchar_t));
+    }
+}
+
+bool QSystemTrayIconSys::trayMessage(DWORD msg)
+{
+    NOTIFYICONDATA tnd;
+    memset(&tnd, 0, notifyIconSize);
+    tnd.uID = q_uNOTIFYICONID;
+    tnd.cbSize = notifyIconSize;
+    tnd.hWnd = winId();
+
+    Q_ASSERT(testAttribute(Qt::WA_WState_Created));
+
+    if (msg != NIM_DELETE) {
+        setIconContents(tnd);
+    }
+
+    return Shell_NotifyIcon(msg, &tnd);
+}
+
+void QSystemTrayIconSys::createIcon()
+{
+    hIcon = 0;
+    QIcon icon = q->icon();
+    if (icon.isNull())
+        return;
+
+    //const QSize preferredSize(GetSystemMetrics(SM_CXSMICON) * 2, GetSystemMetrics(SM_CYSMICON) * 2);
+    const QSize preferredSize(GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON));
+    QPixmap pm = icon.pixmap(preferredSize);
+    if (pm.isNull())
+        return;
+
+    hIcon = pm.toWinHICON();
+}
+
+bool QSystemTrayIconSys::winEvent( MSG *m, long *result )
+{
+    switch(m->message) {
+    case WM_CREATE:
+        SetWindowLong(winId(), GWL_USERDATA, (LONG)((CREATESTRUCTW*)m->lParam)->lpCreateParams);
+        break;
+
+    case MYWM_NOTIFYICON:
+        {
+            RECT r;
+            GetWindowRect(winId(), &r);
+            QEvent *e = 0;
+            Qt::KeyboardModifiers keys = QApplication::keyboardModifiers();
+            QPoint gpos = QCursor::pos();
+
+            switch (m->lParam) {
+            case WM_LBUTTONUP:
+                if (ignoreNextMouseRelease)
+                    ignoreNextMouseRelease = false;
+                else
+                    emit q->activated(QSystemTrayIcon::Trigger);
+                break;
+
+            case WM_LBUTTONDBLCLK:
+                ignoreNextMouseRelease = true; // Since DBLCLICK Generates a second mouse 
+                                               // release we must ignore it
+                emit q->activated(QSystemTrayIcon::DoubleClick);
+                break;
+
+            case WM_RBUTTONUP:
+                if (q->contextMenu()) {
+                    q->contextMenu()->popup(gpos);
+
+                    // We must ensure that the popup menu doesn't show up behind the task bar.
+                    QRect desktopRect = qApp->desktop()->availableGeometry();
+                    int maxY = desktopRect.y() + desktopRect.height() - q->contextMenu()->height();
+                    if (gpos.y() > maxY) {
+                        gpos.ry() = maxY;
+                        q->contextMenu()->move(gpos);
+                    }
+
+                    q->contextMenu()->activateWindow();
+                    //Must be activated for proper keyboardfocus and menu closing on windows:
+                }
+                emit q->activated(QSystemTrayIcon::Context);
+                break;
+
+            case WM_MBUTTONUP:
+                emit q->activated(QSystemTrayIcon::MiddleClick);
+                break;
+            default:
+                break;
+            }
+            if (e) {
+                bool res = QApplication::sendEvent(q, e);
+                delete e;
+                return res;
+            }
+            break;
+        }
+    default:
+        return QWidget::winEvent(m, result);
+    }
+    return 0;
+}
+
+void QSystemTrayIconPrivate::install_sys()
+{
+    Q_Q(QSystemTrayIcon);
+    if (!sys) {
+        sys = new QSystemTrayIconSys(q);
+        sys->createIcon();
+        sys->trayMessage(NIM_ADD);
+    }
+}
+
+void QSystemTrayIconPrivate::showMessage_sys(const QString &title, const QString &message, QSystemTrayIcon::MessageIcon type, int timeOut)
+{
+    if (!sys)
+        return;
+
+    uint uSecs = 0;
+    if ( timeOut < 0)
+        uSecs = 10000; //10 sec default
+    else uSecs = (int)timeOut;
+
+    //message is limited to 255 chars + NULL
+    QString messageString;
+    if (message.isEmpty() && !title.isEmpty())
+        messageString = QLatin1Char(' '); //ensures that the message shows when only title is set
+    else
+        messageString = message.left(255) + QChar();
+
+    //title is limited to 63 chars + NULL
+    QString titleString = title.left(63) + QChar();
+
+    //show QBalloonTip
+    QRect trayRect = sys->findTrayGeometry();
+    QBalloonTip::showBalloon(type, title, message, sys->q, QPoint(trayRect.left(),
+                             trayRect.center().y()), uSecs, false);
+}
+
+QRect QSystemTrayIconPrivate::geometry_sys() const
+{
+    return QRect();
+}
+
+void QSystemTrayIconPrivate::remove_sys()
+{
+    if (!sys)
+        return;
+
+    sys->trayMessage(NIM_DELETE);
+    delete sys;
+    sys = 0;
+}
+
+void QSystemTrayIconPrivate::updateIcon_sys()
+{
+    if (!sys)
+        return;
+
+    HICON hIconToDestroy = sys->hIcon;
+
+    sys->createIcon();
+    sys->trayMessage(NIM_MODIFY);
+
+    if (hIconToDestroy)
+        DestroyIcon(hIconToDestroy);
+}
+
+void QSystemTrayIconPrivate::updateMenu_sys()
+{
+
+}
+
+void QSystemTrayIconPrivate::updateToolTip_sys()
+{
+    // Calling sys->trayMessage(NIM_MODIFY) on an existing icon is broken on Windows CE.
+    // So we need to call updateIcon_sys() which creates a new icon handle.
+    updateIcon_sys();
+}
+
+bool QSystemTrayIconPrivate::isSystemTrayAvailable_sys()
+{
+    return true;
+}
+
+QT_END_NAMESPACE
+
+#endif
--- a/src/gui/util/util.pri	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/util/util.pri	Fri Jun 11 14:24:45 2010 +0300
@@ -20,7 +20,10 @@
         util/qundoview.cpp
 
 
-win32 {
+wince* {
+		SOURCES += \
+				util/qsystemtrayicon_wince.cpp
+} else:win32 {
 		SOURCES += \
 				util/qsystemtrayicon_win.cpp
 }
--- a/src/gui/widgets/qcombobox.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/widgets/qcombobox.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -143,7 +143,10 @@
         menuOption.icon = qvariant_cast<QPixmap>(variant);
         break;
     }
-
+    if (qVariantCanConvert<QBrush>(index.data(Qt::BackgroundRole))) {
+        menuOption.palette.setBrush(QPalette::All, QPalette::Background,
+                                    qvariant_cast<QBrush>(index.data(Qt::BackgroundRole)));
+    }
     menuOption.text = index.model()->data(index, Qt::DisplayRole).toString()
                            .replace(QLatin1Char('&'), QLatin1String("&&"));
     menuOption.tabWidth = 0;
--- a/src/gui/widgets/qcombobox_p.h	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/widgets/qcombobox_p.h	Fri Jun 11 14:24:45 2010 +0300
@@ -200,7 +200,9 @@
         menuOpt.menuItemType = QStyleOptionMenuItem::Scroller;
         if (sliderAction == QAbstractSlider::SliderSingleStepAdd)
             menuOpt.state |= QStyle::State_DownArrow;
+#ifndef Q_WS_S60
         p.eraseRect(rect());
+#endif
         style()->drawControl(QStyle::CE_MenuScroller, &menuOpt, &p);
     }
 
--- a/src/gui/widgets/qmenu.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/widgets/qmenu.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -261,9 +261,6 @@
               icone = style->pixelMetric(QStyle::PM_SmallIconSize, &opt, q);
     const int fw = style->pixelMetric(QStyle::PM_MenuPanelWidth, &opt, q);
     const int deskFw = style->pixelMetric(QStyle::PM_MenuDesktopFrameWidth, &opt, q);
-
-    const int sfcMargin = style->sizeFromContents(QStyle::CT_Menu, &opt, QApplication::globalStrut(), q).width() - QApplication::globalStrut().width();
-    const int min_column_width = q->minimumWidth() - (sfcMargin + leftmargin + rightmargin + 2 * (fw + hmargin));
     const int tearoffHeight = tearoff ? style->pixelMetric(QStyle::PM_MenuTearoffHeight, &opt, q) : 0;
 
     //for compatability now - will have to refactor this away..
@@ -337,7 +334,7 @@
 
 
         if (!sz.isEmpty()) {
-            max_column_width = qMax(min_column_width, qMax(max_column_width, sz.width()));
+            max_column_width = qMax(max_column_width, sz.width());
             //wrapping
             if (!scroll &&
                y+sz.height()+vmargin > dh - (deskFw * 2)) {
@@ -351,6 +348,10 @@
     }
 
     max_column_width += tabWidth; //finally add in the tab width
+    const int sfcMargin = style->sizeFromContents(QStyle::CT_Menu, &opt, QApplication::globalStrut(), q).width() - QApplication::globalStrut().width();
+    const int min_column_width = q->minimumWidth() - (sfcMargin + leftmargin + rightmargin + 2 * (fw + hmargin));
+    max_column_width = qMax(min_column_width, max_column_width);
+
 
     //calculate position
     const int base_y = vmargin + fw + topmargin +
--- a/src/gui/widgets/qmenu.h	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/widgets/qmenu.h	Fri Jun 11 14:24:45 2010 +0300
@@ -142,7 +142,7 @@
 #endif
 
 #ifdef Q_WS_WINCE
-    HMENU wceMenu(bool create = false);
+    HMENU wceMenu();
 #endif
 
     bool separatorsCollapsible() const;
--- a/src/gui/widgets/qmenu_p.h	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/widgets/qmenu_p.h	Fri Jun 11 14:24:45 2010 +0300
@@ -358,7 +358,7 @@
             return 0;
         }
     } *wce_menu;
-    HMENU wceMenu(bool create = false);
+    HMENU wceMenu();
     QAction* wceCommands(uint command);
 #endif
 #if defined(Q_WS_S60)
--- a/src/gui/widgets/qmenu_symbian.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/widgets/qmenu_symbian.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -149,8 +149,12 @@
                 "Too many menu actions");
 
         const int underlineShortCut = QApplication::style()->styleHint(QStyle::SH_UnderlineShortcut);
-        QString iconText = action->action->iconText();
-        TPtrC menuItemText = qt_QString2TPtrC( underlineShortCut ? action->action->text() : iconText);
+        QString actionText;
+        if (underlineShortCut)
+            actionText = action->action->text().left(CEikMenuPaneItem::SData::ENominalTextLength);
+        else
+            actionText = action->action->iconText().left(CEikMenuPaneItem::SData::ENominalTextLength);
+        TPtrC menuItemText = qt_QString2TPtrC(actionText);
         if (action->action->menu()) {
             SymbianMenuItem* menuItem = new SymbianMenuItem();
             menuItem->menuItemData.iCascadeId = action->command;
--- a/src/gui/widgets/qmenu_wince.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/widgets/qmenu_wince.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -126,6 +126,7 @@
     if (ptrEnableSoftKey)
         ptrEnableSoftKey(handle, command, false, true);
 }
+
 static void qt_wce_disable_soft_key(HWND handle, uint command) 
 {
     resolveAygLibs();
@@ -133,7 +134,8 @@
         ptrEnableSoftKey(handle, command, false, false);
 }
 
-static void qt_wce_delete_action_list(QList<QWceMenuAction*> *list) {
+static void qt_wce_delete_action_list(QList<QWceMenuAction*> *list)
+{
     for(QList<QWceMenuAction*>::Iterator it = list->begin(); it != list->end(); ++it) {
         QWceMenuAction *action = (*it);
         delete action;
@@ -143,7 +145,8 @@
 }
 
 //search for first QuitRole in QMenuBar
-static QAction* qt_wce_get_quit_action(QList<QAction *> actionItems) {
+static QAction* qt_wce_get_quit_action(QList<QAction *> actionItems)
+{
     QAction *returnAction = 0;
     for (int i = 0; i < actionItems.size(); ++i) {
         QAction *action = actionItems.at(i);
@@ -158,7 +161,8 @@
     return 0; //nothing found;
 }
 
-static QAction* qt_wce_get_quit_action(QList<QWceMenuAction*> actionItems) {
+static QAction* qt_wce_get_quit_action(QList<QWceMenuAction*> actionItems)
+{
     for (int i = 0; i < actionItems.size(); ++i) {
         if (actionItems.at(i)->action->menuRole() == QAction::QuitRole)
             return actionItems.at(i)->action;
@@ -171,7 +175,8 @@
     return 0;
 }
 
-static HMODULE qt_wce_get_module_handle() {
+static HMODULE qt_wce_get_module_handle()
+{
     HMODULE module =  0; //handle to resources
     if (!(module = GetModuleHandle(L"QtGui4"))) //release dynamic
         if (!(module = GetModuleHandle(L"QtGuid4"))) //debug dynamic
@@ -180,7 +185,8 @@
     return module;
 }
 
-static void qt_wce_change_command(HWND menuHandle, int item, int command) {
+static void qt_wce_change_command(HWND menuHandle, int item, int command)
+{
 TBBUTTONINFOA tbbi;
     memset(&tbbi,0,sizeof(tbbi));
     tbbi.cbSize = sizeof(tbbi);
@@ -189,7 +195,8 @@
     SendMessage(menuHandle, TB_SETBUTTONINFO, item, (LPARAM)&tbbi);
 }
 
-static void qt_wce_rename_menu_item(HWND menuHandle, int item, const QString &newText) {
+static void qt_wce_rename_menu_item(HWND menuHandle, int item, const QString &newText)
+{
     TBBUTTONINFOA tbbi;
     memset(&tbbi,0,sizeof(tbbi));
     tbbi.cbSize = sizeof(tbbi);
@@ -200,7 +207,8 @@
     SendMessage(menuHandle, TB_SETBUTTONINFO, item, (LPARAM)&tbbi);
 }
 
-static HWND qt_wce_create_menubar(HWND parentHandle, HINSTANCE resourceHandle, int toolbarID, int flags = 0) {
+static HWND qt_wce_create_menubar(HWND parentHandle, HINSTANCE resourceHandle, int toolbarID, int flags = 0)
+{
     resolveAygLibs();
 
     if (ptrCreateMenuBar) {
@@ -225,8 +233,8 @@
     return 0;
 }
 
-static void qt_wce_insert_action(HMENU menu, QWceMenuAction *action, bool created) {
-
+static void qt_wce_insert_action(HMENU menu, QWceMenuAction *action)
+{
     Q_ASSERT_X(menu, "AppendMenu", "menu is 0");
     if (action->action->isVisible()) {
         int flags;
@@ -240,7 +248,7 @@
         else if (action->action->menu()) {
             text.remove(QChar::fromLatin1('&'));
             AppendMenu (menu, MF_STRING | flags | MF_POPUP,
-            (UINT) action->action->menu()->wceMenu(created), reinterpret_cast<const wchar_t *> (text.utf16()));
+            (UINT) action->action->menu()->wceMenu(), reinterpret_cast<const wchar_t *> (text.utf16()));
         }
         else {
             AppendMenu (menu, MF_STRING | flags, action->command, reinterpret_cast<const wchar_t *> (text.utf16()));
@@ -265,12 +273,14 @@
     This function refreshes the native Windows CE menu.
 */
 
-void QMenuBar::wceRefresh() {
+void QMenuBar::wceRefresh()
+{
     for (int i = 0; i < nativeMenuBars.size(); ++i)
         nativeMenuBars.at(i)->d_func()->wceRefresh();
 }
 
-void QMenuBarPrivate::wceRefresh() {
+void QMenuBarPrivate::wceRefresh()
+{
     DrawMenuBar(wce_menubar->menubarHandle);
 }
 
@@ -280,7 +290,8 @@
     This function sends native Windows CE commands to Qt menus.
 */
 
-QAction* QMenu::wceCommands(uint command) { 
+QAction* QMenu::wceCommands(uint command)
+{
     Q_D(QMenu);
     return d->wceCommands(command);
 }
@@ -292,22 +303,27 @@
     and all their child menus.
 */
 
-void QMenuBar::wceCommands(uint command, HWND) {
-    for (int i = 0; i < nativeMenuBars.size(); ++i)
-            nativeMenuBars.at(i)->d_func()->wceCommands(command);
+void QMenuBar::wceCommands(uint command)
+{
+    const HWND hwndActiveWindow = GetActiveWindow();
+    for (int i = 0; i < nativeMenuBars.size(); ++i) {
+        QMenuBarPrivate* nativeMenuBar = nativeMenuBars.at(i)->d_func();
+        if (hwndActiveWindow == nativeMenuBar->wce_menubar->parentWindowHandle)
+            nativeMenuBar->wceCommands(command);
+    }
 }
 
-bool QMenuBarPrivate::wceEmitSignals(QList<QWceMenuAction*> actions, uint command) {
+bool QMenuBarPrivate::wceEmitSignals(QList<QWceMenuAction*> actions, uint command)
+{
     QAction *foundAction = 0;
     for (int i = 0; i < actions.size(); ++i) {
-        if (foundAction)
-            break;
         QWceMenuAction *action = actions.at(i);
         if (action->action->menu()) {
             foundAction = action->action->menu()->wceCommands(command);
+            if (foundAction)
+                break;
         }
         else if (action->command == command) {
-            emit q_func()->triggered(action->action);
             action->action->activate(QAction::Trigger);
             return true;
         }
@@ -319,13 +335,14 @@
     return false;
 }
 
-void QMenuBarPrivate::wceCommands(uint command) {
+void QMenuBarPrivate::wceCommands(uint command)
+{
     if (wceClassicMenu) {
         for (int i = 0; i < wce_menubar->actionItemsClassic.size(); ++i)
             wceEmitSignals(wce_menubar->actionItemsClassic.at(i), command);
     } else {
         if (wceEmitSignals(wce_menubar->actionItems, command)) {
-            return ;
+            return;
         }
         else if (wce_menubar->leftButtonIsMenu) {//check if command is on the left quick button
             wceEmitSignals(wce_menubar->actionItemsLeftButton, command);
@@ -337,7 +354,8 @@
     }
 }
 
-QAction *QMenuPrivate::wceCommands(uint command) {
+QAction *QMenuPrivate::wceCommands(uint command)
+{
     QAction *foundAction = 0;
     for (int i  = 0; i < wce_menu->actionItems.size(); ++i) {
         if (foundAction)
@@ -347,7 +365,7 @@
             foundAction = action->action->menu()->d_func()->wceCommands(command);
         }
         else if (action->command == command) {
-            action->action->activate(QAction::Trigger);
+            activateAction(action->action, QAction::Trigger);
             return action->action;
         }
     }
@@ -356,8 +374,8 @@
     return foundAction;
 }
 
-void QMenuBarPrivate::wceCreateMenuBar(QWidget *parent) {
-
+void QMenuBarPrivate::wceCreateMenuBar(QWidget *parent)
+{
     Q_Q(QMenuBar);
     wce_menubar = new QWceMenuBarPrivate(this);
 
@@ -371,21 +389,25 @@
     wceClassicMenu = (!qt_wince_is_smartphone() && !qt_wince_is_pocket_pc());
 }
 
-void QMenuBarPrivate::wceDestroyMenuBar() {
+void QMenuBarPrivate::wceDestroyMenuBar()
+{
     Q_Q(QMenuBar);
     int index = nativeMenuBars.indexOf(q);
     nativeMenuBars.removeAt(index);
-    if (wce_menubar)
-      delete wce_menubar;
-    wce_menubar = 0;
+    if (wce_menubar) {
+        delete wce_menubar;
+        wce_menubar = 0;
+    }
 }
 
-QMenuBarPrivate::QWceMenuBarPrivate::QWceMenuBarPrivate(QMenuBarPrivate *menubar) : 
-                                     menubarHandle(0), menuHandle(0),leftButtonMenuHandle(0) , 
-                                     leftButtonAction(0), leftButtonIsMenu(false), d(menubar) {
+QMenuBarPrivate::QWceMenuBarPrivate::QWceMenuBarPrivate(QMenuBarPrivate *menubar)
+:   menubarHandle(0), menuHandle(0), leftButtonMenuHandle(0),
+    leftButtonAction(0), leftButtonIsMenu(false), d(menubar)
+{
 }
 
-QMenuBarPrivate::QWceMenuBarPrivate::~QWceMenuBarPrivate() {
+QMenuBarPrivate::QWceMenuBarPrivate::~QWceMenuBarPrivate()
+{
     if (menubarHandle)
         DestroyWindow(menubarHandle);
     qt_wce_delete_action_list(&actionItems);
@@ -403,24 +425,28 @@
     QMenuBar::wceRefresh();
 }
 
-QMenuPrivate::QWceMenuPrivate::QWceMenuPrivate() {
-    menuHandle = 0;
+QMenuPrivate::QWceMenuPrivate::QWceMenuPrivate()
+:   menuHandle(0)
+{
 }
 
-QMenuPrivate::QWceMenuPrivate::~QWceMenuPrivate() {
+QMenuPrivate::QWceMenuPrivate::~QWceMenuPrivate()
+{
     qt_wce_delete_action_list(&actionItems);
     if (menuHandle)
         DestroyMenu(menuHandle);
 }
 
-void QMenuPrivate::QWceMenuPrivate::addAction(QAction *a, QWceMenuAction *before) {
+void QMenuPrivate::QWceMenuPrivate::addAction(QAction *a, QWceMenuAction *before)
+{
     QWceMenuAction *action = new QWceMenuAction;
     action->action = a;
     action->command = qt_wce_menu_static_cmd_id++;
     addAction(action, before);
 }
 
-void QMenuPrivate::QWceMenuPrivate::addAction(QWceMenuAction *action, QWceMenuAction *before) {
+void QMenuPrivate::QWceMenuPrivate::addAction(QWceMenuAction *action, QWceMenuAction *before)
+{
     if (!action)
         return;
     int before_index = actionItems.indexOf(before);
@@ -439,12 +465,16 @@
     Windows CE menu bar bindings.
 */
 
-HMENU QMenu::wceMenu(bool create) { return d_func()->wceMenu(create); }
+HMENU QMenu::wceMenu()
+{
+    return d_func()->wceMenu();
+}
 
-HMENU QMenuPrivate::wceMenu(bool create) {
+HMENU QMenuPrivate::wceMenu()
+{
     if (!wce_menu)
         wce_menu = new QWceMenuPrivate;
-    if (!wce_menu->menuHandle || create) 
+    if (!wce_menu->menuHandle)
         wce_menu->rebuild();
     return wce_menu->menuHandle;
 }
@@ -459,30 +489,33 @@
     for (int i = 0; i < actionItems.size(); ++i) {
         QWceMenuAction *action = actionItems.at(i);
         action->menuHandle = menuHandle;
-        qt_wce_insert_action(menuHandle, action, true);
+        qt_wce_insert_action(menuHandle, action);
     }
     QMenuBar::wceRefresh();
 }
 
-void QMenuPrivate::QWceMenuPrivate::syncAction(QWceMenuAction *) {
+void QMenuPrivate::QWceMenuPrivate::syncAction(QWceMenuAction *)
+{
     rebuild();
 }
 
-void QMenuPrivate::QWceMenuPrivate::removeAction(QWceMenuAction *action) {
-        actionItems.removeAll(action);
-        delete action;
-        action = 0;
-        rebuild();
+void QMenuPrivate::QWceMenuPrivate::removeAction(QWceMenuAction *action)
+{
+    actionItems.removeAll(action);
+    delete action;
+    rebuild();
 }
 
-void QMenuBarPrivate::QWceMenuBarPrivate::addAction(QAction *a, QWceMenuAction *before) {
+void QMenuBarPrivate::QWceMenuBarPrivate::addAction(QAction *a, QWceMenuAction *before)
+{
     QWceMenuAction *action = new QWceMenuAction;
     action->action = a;
     action->command = qt_wce_menu_static_cmd_id++;
     addAction(action, before);
 }
 
-void QMenuBarPrivate::QWceMenuBarPrivate::addAction(QWceMenuAction *action, QWceMenuAction *before) {
+void QMenuBarPrivate::QWceMenuBarPrivate::addAction(QWceMenuAction *action, QWceMenuAction *before)
+{
     if (!action)
         return;
     int before_index = actionItems.indexOf(before);
@@ -494,25 +527,27 @@
     rebuild();
 }
 
-void QMenuBarPrivate::QWceMenuBarPrivate::syncAction(QWceMenuAction*) {
+void QMenuBarPrivate::QWceMenuBarPrivate::syncAction(QWceMenuAction*)
+{
     QMenuBar::wceRefresh();
     rebuild();
 }
 
-void QMenuBarPrivate::QWceMenuBarPrivate::removeAction(QWceMenuAction *action) {
+void QMenuBarPrivate::QWceMenuBarPrivate::removeAction(QWceMenuAction *action)
+{
     actionItems.removeAll(action);
     delete action;
-    action = 0;
     rebuild();
 }
 
-void QMenuBarPrivate::_q_updateDefaultAction() {
+void QMenuBarPrivate::_q_updateDefaultAction()
+{
     if (wce_menubar)
         wce_menubar->rebuild();
 }
 
-void QMenuBarPrivate::QWceMenuBarPrivate::rebuild() {
-
+void QMenuBarPrivate::QWceMenuBarPrivate::rebuild()
+{
     d->q_func()->resize(0,0);
     parentWindowHandle = d->q_func()->parentWidget() ? d->q_func()->parentWidget()->winId() : d->q_func()->winId();
     if (d->wceClassicMenu) {
@@ -559,7 +594,7 @@
                 action->command = qt_wce_menu_static_cmd_id++;
                 action->menuHandle = subMenuHandle;
                 actionItemsClassic.last().append(action);
-                qt_wce_insert_action(subMenuHandle, action, true);
+                qt_wce_insert_action(subMenuHandle, action);
             }
         }
         for (int i = actions.size();i<maxEntries;++i) {
@@ -602,7 +637,7 @@
         for (int i = 0; i < actionItems.size(); ++i) {
             QWceMenuAction *action = actionItems.at(i);
             action->menuHandle = menuHandle;
-            qt_wce_insert_action(menuHandle, action, true);
+            qt_wce_insert_action(menuHandle, action);
         }
         if (!leftButtonIsMenu) {
             if (leftButtonAction) {
@@ -622,7 +657,7 @@
                 action->command = qt_wce_menu_static_cmd_id++;
                 action->menuHandle = leftButtonMenuHandle;
                 actionItemsLeftButton.append(action);
-                qt_wce_insert_action(leftButtonMenuHandle, action, true);
+                qt_wce_insert_action(leftButtonMenuHandle, action);
             }
         }
     }
--- a/src/gui/widgets/qmenubar.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/widgets/qmenubar.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -1957,7 +1957,7 @@
   to the right soft key.
 
   Currently there is only support for the default action on Windows
-  Mobile. All other platforms ignore the default action.
+  Mobile. On all other platforms this method is not available.
 
   \sa defaultAction()
 */
--- a/src/gui/widgets/qmenubar.h	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/widgets/qmenubar.h	Fri Jun 11 14:24:45 2010 +0300
@@ -115,7 +115,7 @@
     void setDefaultAction(QAction *);
     QAction *defaultAction() const;
 
-    static void wceCommands(uint command, HWND controlHandle);
+    static void wceCommands(uint command);
     static void wceRefresh();
 #endif
 
--- a/src/gui/widgets/qtabbar.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/gui/widgets/qtabbar.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -67,6 +67,10 @@
 #include <private/qt_cocoa_helpers_mac_p.h>
 #endif
 
+#ifndef QT_NO_STYLE_S60
+#include "qs60style.h"
+#endif
+
 QT_BEGIN_NAMESPACE
 
 inline static bool verticalTabs(QTabBar::Shape shape)
@@ -478,6 +482,9 @@
 
     if (useScrollButtons && tabList.count() && last > available) {
         int extra = extraWidth();
+#ifndef QT_NO_STYLE_S60
+        QS60Style *s60Style = qobject_cast<QS60Style*>(QApplication::style());
+#endif
         if (!vertTabs) {
             Qt::LayoutDirection ld = q->layoutDirection();
             QRect arrows = QStyle::visualRect(ld, q->rect(),
@@ -485,25 +492,57 @@
             int buttonOverlap = q->style()->pixelMetric(QStyle::PM_TabBar_ScrollButtonOverlap, 0, q);
 
             if (ld == Qt::LeftToRight) {
+// In S60style, tab scroll buttons are layoutted separately, on the sides of the tabbar.
+#ifndef QT_NO_STYLE_S60
+                if (s60Style) {
+                    rightB->setGeometry(arrows.left() + extra / 2, arrows.top(), extra / 2, arrows.height());
+                    leftB->setGeometry(0, arrows.top(), extra / 2, arrows.height());
+                } else {
+#endif
                 leftB->setGeometry(arrows.left(), arrows.top(), extra/2, arrows.height());
                 rightB->setGeometry(arrows.right() - extra/2 + buttonOverlap, arrows.top(),
                                     extra/2, arrows.height());
+#ifndef QT_NO_STYLE_S60
+                }
+#endif
                 leftB->setArrowType(Qt::LeftArrow);
                 rightB->setArrowType(Qt::RightArrow);
             } else {
+#ifndef QT_NO_STYLE_S60
+                if (s60Style) {
+                    rightB->setGeometry(arrows.left() + extra / 2, arrows.top(), extra / 2, arrows.height());
+                    leftB->setGeometry(0, arrows.top(), extra / 2, arrows.height());
+                } else {
+#endif
                 rightB->setGeometry(arrows.left(), arrows.top(), extra/2, arrows.height());
                 leftB->setGeometry(arrows.right() - extra/2 + buttonOverlap, arrows.top(),
                                     extra/2, arrows.height());
+#ifndef QT_NO_STYLE_S60
+                }
+#endif
                 rightB->setArrowType(Qt::LeftArrow);
                 leftB->setArrowType(Qt::RightArrow);
             }
         } else {
+#ifndef QT_NO_STYLE_S60
+            if (s60Style) {
+                QRect arrows = QRect(0, 0, size.width(), available );
+                leftB->setGeometry(arrows.left(), arrows.top(), arrows.width(), extra / 2);
+                leftB->setArrowType(Qt::UpArrow);
+                rightB->setGeometry(arrows.left(), arrows.bottom() - extra / 2 + 1,
+                                    arrows.width(), extra / 2);
+                rightB->setArrowType(Qt::DownArrow);
+            } else {
+#endif
             QRect arrows = QRect(0, available - extra, size.width(), extra );
             leftB->setGeometry(arrows.left(), arrows.top(), arrows.width(), extra/2);
             leftB->setArrowType(Qt::UpArrow);
             rightB->setGeometry(arrows.left(), arrows.bottom() - extra/2 + 1,
                                 arrows.width(), extra/2);
             rightB->setArrowType(Qt::DownArrow);
+#ifndef QT_NO_STYLE_S60
+            }
+#endif
         }
         leftB->setEnabled(scrollOffset > 0);
         rightB->setEnabled(last - scrollOffset >= available - extra);
--- a/src/multimedia/audio/qaudio_symbian_p.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/multimedia/audio/qaudio_symbian_p.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -45,41 +45,6 @@
 QT_BEGIN_NAMESPACE
 
 namespace SymbianAudio {
-
-DevSoundCapabilities::DevSoundCapabilities(CMMFDevSound &devsound,
-                                           QAudio::Mode mode)
-{
-    QT_TRAP_THROWING(constructL(devsound, mode));
-}
-
-DevSoundCapabilities::~DevSoundCapabilities()
-{
-    m_fourCC.Close();
-}
-
-void DevSoundCapabilities::constructL(CMMFDevSound &devsound,
-                                      QAudio::Mode mode)
-{
-    m_caps = devsound.Capabilities();
-
-    TMMFPrioritySettings settings;
-
-    switch (mode) {
-    case QAudio::AudioOutput:
-        settings.iState = EMMFStatePlaying;
-        devsound.GetSupportedInputDataTypesL(m_fourCC, settings);
-        break;
-
-    case QAudio::AudioInput:
-        settings.iState = EMMFStateRecording;
-        devsound.GetSupportedInputDataTypesL(m_fourCC, settings);
-        break;
-
-    default:
-        Q_ASSERT_X(false, Q_FUNC_INFO, "Invalid mode");
-    }
-}
-
 namespace Utils {
 
 //-----------------------------------------------------------------------------
@@ -274,11 +239,8 @@
     return found;
 }
 
-//-----------------------------------------------------------------------------
-// Public functions
-//-----------------------------------------------------------------------------
-
-void capabilitiesNativeToQt(const DevSoundCapabilities &caps,
+void capabilitiesNativeToQt(const TMMFCapabilities &caps,
+                            const TFourCC &fourcc,
                             QList<int> &frequencies,
                             QList<int> &channels,
                             QList<int> &sampleSizes,
@@ -292,37 +254,20 @@
     channels.clear();
 
     for (int i=0; i<SampleRateCount; ++i)
-        if (caps.caps().iRate & SampleRateListNative[i])
+        if (caps.iRate & SampleRateListNative[i])
             frequencies += SampleRateListQt[i];
 
     for (int i=0; i<ChannelsCount; ++i)
-        if (caps.caps().iChannels & ChannelsListNative[i])
+        if (caps.iChannels & ChannelsListNative[i])
             channels += ChannelsListQt[i];
 
     for (int i=0; i<EncodingCount; ++i) {
-        if (caps.fourCC().Find(EncodingFourCC[i]) != KErrNotFound) {
+        if (fourcc == EncodingFourCC[i]) {
             sampleSizes += EncodingSampleSize[i];
             byteOrders += EncodingByteOrder[i];
             sampleTypes += EncodingSampleType[i];
         }
     }
-
-}
-
-bool isFormatSupported(const QAudioFormat &formatQt,
-                       const DevSoundCapabilities &caps) {
-    TMMFCapabilities formatNative;
-    TUint32 fourCC;
-
-    bool result = false;
-    if (formatQt.codec() == QString::fromAscii("audio/pcm") &&
-        formatQtToNative(formatQt, fourCC, formatNative)) {
-        result =
-                (formatNative.iRate & caps.caps().iRate)
-            &&  (formatNative.iChannels & caps.caps().iChannels)
-            &&  (caps.fourCC().Find(fourCC) != KErrNotFound);
-    }
-    return result;
 }
 
 bool formatQtToNative(const QAudioFormat &inputFormat,
@@ -337,7 +282,7 @@
     TMMFMonoStereo outputChannels;
     TMMFSoundEncoding outputEncoding;
 
-    if (inputFormat.codec() == QString::fromAscii("audio/pcm")) {
+    if (inputFormat.codec() == QLatin1String("audio/pcm")) {
         result =
                 sampleRateQtToNative(inputFormat.frequency(), outputSampleRate)
             &&  channelsQtToNative(inputFormat.channels(), outputChannels)
@@ -357,14 +302,13 @@
     return result;
 }
 
-QAudio::State stateNativeToQt(State nativeState,
-                              QAudio::State initializingState)
+QAudio::State stateNativeToQt(State nativeState)
 {
     switch (nativeState) {
     case ClosedState:
         return QAudio::StoppedState;
     case InitializingState:
-        return initializingState;
+        return QAudio::StoppedState;
     case ActiveState:
         return QAudio::ActiveState;
     case IdleState:
@@ -388,6 +332,291 @@
 }
 
 } // namespace Utils
+
+
+//-----------------------------------------------------------------------------
+// DevSoundWrapper
+//-----------------------------------------------------------------------------
+
+DevSoundWrapper::DevSoundWrapper(QAudio::Mode mode, QObject *parent)
+    :   QObject(parent)
+    ,   m_mode(mode)
+    ,   m_state(StateIdle)
+    ,   m_devsound(0)
+    ,   m_fourcc(0)
+{
+    QT_TRAP_THROWING(m_devsound = CMMFDevSound::NewL());
+
+    switch (mode) {
+    case QAudio::AudioOutput:
+        m_nativeMode = EMMFStatePlaying;
+        break;
+
+    case QAudio::AudioInput:
+        m_nativeMode = EMMFStateRecording;
+        break;
+
+    default:
+        Q_ASSERT_X(false, Q_FUNC_INFO, "Invalid mode");
+    }
+
+    getSupportedCodecs();
+}
+
+DevSoundWrapper::~DevSoundWrapper()
+{
+    delete m_devsound;
+}
+
+const QList<QString>& DevSoundWrapper::supportedCodecs() const
+{
+    return m_supportedCodecs;
+}
+
+void DevSoundWrapper::initialize(const QString& codec)
+{
+    Q_ASSERT(StateInitializing != m_state);
+    m_state = StateInitializing;
+    if (QLatin1String("audio/pcm") == codec) {
+        m_fourcc = KMMFFourCCCodePCM16;
+        TRAPD(err, m_devsound->InitializeL(*this, m_fourcc, m_nativeMode));
+        if (KErrNone != err) {
+            m_state = StateIdle;
+            emit initializeComplete(err);
+        }
+    } else {
+        emit initializeComplete(KErrNotSupported);
+    }
+}
+
+const QList<int>& DevSoundWrapper::supportedFrequencies() const
+{
+    Q_ASSERT(StateInitialized == m_state);
+    return m_supportedFrequencies;
+}
+
+const QList<int>& DevSoundWrapper::supportedChannels() const
+{
+    Q_ASSERT(StateInitialized == m_state);
+    return m_supportedChannels;
+}
+
+const QList<int>& DevSoundWrapper::supportedSampleSizes() const
+{
+    Q_ASSERT(StateInitialized == m_state);
+    return m_supportedSampleSizes;
+}
+
+const QList<QAudioFormat::Endian>& DevSoundWrapper::supportedByteOrders() const
+{
+    Q_ASSERT(StateInitialized == m_state);
+    return m_supportedByteOrders;
+}
+
+const QList<QAudioFormat::SampleType>& DevSoundWrapper::supportedSampleTypes() const
+{
+    Q_ASSERT(StateInitialized == m_state);
+    return m_supportedSampleTypes;
+}
+
+bool DevSoundWrapper::isFormatSupported(const QAudioFormat &format) const
+{
+    Q_ASSERT(StateInitialized == m_state);
+    return m_supportedCodecs.contains(format.codec())
+        && m_supportedFrequencies.contains(format.frequency())
+        && m_supportedChannels.contains(format.channels())
+        && m_supportedSampleSizes.contains(format.sampleSize())
+        && m_supportedSampleTypes.contains(format.sampleType())
+        && m_supportedByteOrders.contains(format.byteOrder());
+}
+
+int DevSoundWrapper::samplesProcessed() const
+{
+    Q_ASSERT(StateInitialized == m_state);
+    int result = 0;
+    switch (m_mode) {
+    case QAudio::AudioInput:
+        result = m_devsound->SamplesRecorded();
+        break;
+    case QAudio::AudioOutput:
+        result = m_devsound->SamplesPlayed();
+        break;
+    }
+    return result;
+}
+
+bool DevSoundWrapper::setFormat(const QAudioFormat &format)
+{
+    Q_ASSERT(StateInitialized == m_state);
+    bool result = false;
+    TUint32 fourcc;
+    TMMFCapabilities nativeFormat;
+    if (Utils::formatQtToNative(format, fourcc, nativeFormat)) {
+        TMMFCapabilities currentNativeFormat = m_devsound->Config();
+        nativeFormat.iBufferSize = currentNativeFormat.iBufferSize;
+        TRAPD(err, m_devsound->SetConfigL(nativeFormat));
+        result = (KErrNone == err);
+    }
+    return result;
+}
+
+bool DevSoundWrapper::start()
+{
+    Q_ASSERT(StateInitialized == m_state);
+    int err = KErrArgument;
+    switch (m_mode) {
+    case QAudio::AudioInput:
+        TRAP(err, m_devsound->RecordInitL());
+        break;
+    case QAudio::AudioOutput:
+        TRAP(err, m_devsound->PlayInitL());
+        break;
+    }
+    return (KErrNone == err);
+}
+
+void DevSoundWrapper::pause()
+{
+    Q_ASSERT(StateInitialized == m_state);
+    m_devsound->Pause();
+}
+
+void DevSoundWrapper::stop()
+{
+    m_devsound->Stop();
+}
+
+void DevSoundWrapper::bufferProcessed()
+{
+    Q_ASSERT(StateInitialized == m_state);
+    switch (m_mode) {
+    case QAudio::AudioInput:
+        m_devsound->RecordData();
+        break;
+    case QAudio::AudioOutput:
+        m_devsound->PlayData();
+        break;
+    }
+}
+
+void DevSoundWrapper::getSupportedCodecs()
+{
+/*
+ * TODO: once we support formats other than PCM, this function should
+ * convert the array of FourCC codes into MIME types for each codec.
+ *
+    RArray<TFourCC> fourcc;
+    QT_TRAP_THROWING(CleanupClosePushL(&fourcc));
+
+    TMMFPrioritySettings settings;
+    switch (mode) {
+    case QAudio::AudioOutput:
+        settings.iState = EMMFStatePlaying;
+        m_devsound->GetSupportedInputDataTypesL(fourcc, settings);
+        break;
+
+    case QAudio::AudioInput:
+        settings.iState = EMMFStateRecording;
+        m_devsound->GetSupportedInputDataTypesL(fourcc, settings);
+        break;
+
+    default:
+        Q_ASSERT_X(false, Q_FUNC_INFO, "Invalid mode");
+    }
+
+    CleanupStack::PopAndDestroy(); // fourcc
+*/
+
+    m_supportedCodecs.append(QLatin1String("audio/pcm"));
+}
+
+void DevSoundWrapper::populateCapabilities()
+{
+    m_supportedFrequencies.clear();
+    m_supportedChannels.clear();
+    m_supportedSampleSizes.clear();
+    m_supportedByteOrders.clear();
+    m_supportedSampleTypes.clear();
+
+    const TMMFCapabilities caps = m_devsound->Capabilities();
+
+    for (int i=0; i<Utils::SampleRateCount; ++i)
+        if (caps.iRate & Utils::SampleRateListNative[i])
+            m_supportedFrequencies += Utils::SampleRateListQt[i];
+
+    for (int i=0; i<Utils::ChannelsCount; ++i)
+        if (caps.iChannels & Utils::ChannelsListNative[i])
+            m_supportedChannels += Utils::ChannelsListQt[i];
+
+    for (int i=0; i<Utils::EncodingCount; ++i) {
+        if (m_fourcc == Utils::EncodingFourCC[i]) {
+            m_supportedSampleSizes += Utils::EncodingSampleSize[i];
+            m_supportedByteOrders += Utils::EncodingByteOrder[i];
+            m_supportedSampleTypes += Utils::EncodingSampleType[i];
+        }
+    }
+}
+
+void DevSoundWrapper::InitializeComplete(TInt aError)
+{
+    Q_ASSERT(StateInitializing == m_state);
+    if (KErrNone == aError) {
+        m_state = StateInitialized;
+        populateCapabilities();
+    } else {
+        m_state = StateIdle;
+    }
+    emit initializeComplete(aError);
+}
+
+void DevSoundWrapper::ToneFinished(TInt aError)
+{
+    Q_UNUSED(aError)
+    // This class doesn't use DevSound's tone playback functions, so should
+    // never receive this callback.
+    Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback");
+}
+
+void DevSoundWrapper::BufferToBeFilled(CMMFBuffer *aBuffer)
+{
+    Q_ASSERT(QAudio::AudioOutput == m_mode);
+    emit bufferToBeProcessed(aBuffer);
+}
+
+void DevSoundWrapper::PlayError(TInt aError)
+{
+    Q_ASSERT(QAudio::AudioOutput == m_mode);
+    emit processingError(aError);
+}
+
+void DevSoundWrapper::BufferToBeEmptied(CMMFBuffer *aBuffer)
+{
+    Q_ASSERT(QAudio::AudioInput == m_mode);
+    emit bufferToBeProcessed(aBuffer);
+}
+
+void DevSoundWrapper::RecordError(TInt aError)
+{
+    Q_ASSERT(QAudio::AudioInput == m_mode);
+    emit processingError(aError);
+}
+
+void DevSoundWrapper::ConvertError(TInt aError)
+{
+    Q_UNUSED(aError)
+    // This class doesn't use DevSound's format conversion functions, so
+    // should never receive this callback.
+    Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback");
+}
+
+void DevSoundWrapper::DeviceMessage(TUid aMessageType, const TDesC8 &aMsg)
+{
+    Q_UNUSED(aMessageType)
+    Q_UNUSED(aMsg)
+    // Ignore this callback.
+}
+
+
 } // namespace SymbianAudio
 
 QT_END_NAMESPACE
--- a/src/multimedia/audio/qaudio_symbian_p.h	Thu May 27 13:40:48 2010 +0300
+++ b/src/multimedia/audio/qaudio_symbian_p.h	Fri Jun 11 14:24:45 2010 +0300
@@ -53,7 +53,8 @@
 #ifndef QAUDIO_SYMBIAN_P_H
 #define QAUDIO_SYMBIAN_P_H
 
-#include <QtCore/qnamespace.h>
+#include <QtCore/QList>
+#include <QtCore/QString>
 #include <QtMultimedia/qaudioformat.h>
 #include <QtMultimedia/qaudio.h>
 #include <sounddevice.h>
@@ -83,60 +84,92 @@
     ,   SuspendedState
 };
 
-/*
- * Helper class for querying DevSound codec / format support
+/**
+ * Wrapper around DevSound instance
  */
-class DevSoundCapabilities {
+class DevSoundWrapper
+    :   public QObject
+    ,   public MDevSoundObserver
+{
+    Q_OBJECT
+
+public:
+    DevSoundWrapper(QAudio::Mode mode, QObject *parent = 0);
+    ~DevSoundWrapper();
+
 public:
-    DevSoundCapabilities(CMMFDevSound &devsound, QAudio::Mode mode);
-    ~DevSoundCapabilities();
+    // List of supported codecs; can be called once object is constructed
+    const QList<QString>& supportedCodecs() const;
+
+    // Asynchronous initialization function; emits devsoundInitializeComplete
+    void initialize(const QString& codec);
+
+    // Capabilities, for selected codec.  Can be called once initialize has returned
+    // successfully.
+    const QList<int>& supportedFrequencies() const;
+    const QList<int>& supportedChannels() const;
+    const QList<int>& supportedSampleSizes() const;
+    const QList<QAudioFormat::Endian>& supportedByteOrders() const;
+    const QList<QAudioFormat::SampleType>& supportedSampleTypes() const;
+
+    bool isFormatSupported(const QAudioFormat &format) const;
 
-    const RArray<TFourCC>& fourCC() const   { return m_fourCC; }
-    const TMMFCapabilities& caps() const    { return m_caps; }
+    int samplesProcessed() const;
+    bool setFormat(const QAudioFormat &format);
+    bool start();
+    void pause();
+    void stop();
+    void bufferProcessed();
+
+public:
+    // MDevSoundObserver
+    void InitializeComplete(TInt aError);
+    void ToneFinished(TInt aError);
+    void BufferToBeFilled(CMMFBuffer *aBuffer);
+    void PlayError(TInt aError);
+    void BufferToBeEmptied(CMMFBuffer *aBuffer);
+    void RecordError(TInt aError);
+    void ConvertError(TInt aError);
+    void DeviceMessage(TUid aMessageType, const TDesC8 &aMsg);
+
+signals:
+    void initializeComplete(int error);
+    void bufferToBeProcessed(CMMFBuffer *buffer);
+    void processingError(int error);
 
 private:
-    void constructL(CMMFDevSound &devsound, QAudio::Mode mode);
+    void getSupportedCodecs();
+    void populateCapabilities();
 
 private:
-    RArray<TFourCC> m_fourCC;
-    TMMFCapabilities m_caps;
+    const QAudio::Mode              m_mode;
+    TMMFState                       m_nativeMode;
+
+    enum State {
+        StateIdle,
+        StateInitializing,
+        StateInitialized
+    }                               m_state;
+
+    CMMFDevSound*                   m_devsound;
+    TFourCC                         m_fourcc;
+
+    QList<QString>                  m_supportedCodecs;
+    QList<int>                      m_supportedFrequencies;
+    QList<int>                      m_supportedChannels;
+    QList<int>                      m_supportedSampleSizes;
+    QList<QAudioFormat::Endian>     m_supportedByteOrders;
+    QList<QAudioFormat::SampleType> m_supportedSampleTypes;
+
 };
 
+
 namespace Utils {
 
 /**
- * Convert native audio capabilities to QAudio lists.
- */
-void capabilitiesNativeToQt(const DevSoundCapabilities &caps,
-                            QList<int> &frequencies,
-                            QList<int> &channels,
-                            QList<int> &sampleSizes,
-                            QList<QAudioFormat::Endian> &byteOrders,
-                            QList<QAudioFormat::SampleType> &sampleTypes);
-
-/**
- * Check whether format is supported.
- */
-bool isFormatSupported(const QAudioFormat &format,
-                       const DevSoundCapabilities &caps);
-
-/**
- * Convert QAudioFormat to native format types.
- *
- * Note that, despite the name, DevSound uses TMMFCapabilities to specify
- * single formats as well as capabilities.
- *
- * Note that this function does not modify outputFormat.iBufferSize.
- */
-bool formatQtToNative(const QAudioFormat &inputFormat,
-                      TUint32 &outputFourCC,
-                      TMMFCapabilities &outputFormat);
-
-/**
  * Convert internal states to QAudio states.
  */
-QAudio::State stateNativeToQt(State nativeState,
-                              QAudio::State initializingState);
+QAudio::State stateNativeToQt(State nativeState);
 
 /**
  * Convert data length to number of samples.
--- a/src/multimedia/audio/qaudiodeviceinfo_symbian_p.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/multimedia/audio/qaudiodeviceinfo_symbian_p.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -39,6 +39,7 @@
 **
 ****************************************************************************/
 
+#include <QtCore/QCoreApplication>
 #include "qaudiodeviceinfo_symbian_p.h"
 #include "qaudio_symbian_p.h"
 
@@ -50,7 +51,7 @@
     ,   m_mode(mode)
     ,   m_updated(false)
 {
-    QT_TRAP_THROWING(m_devsound.reset(CMMFDevSound::NewL()));
+
 }
 
 QAudioDeviceInfoInternal::~QAudioDeviceInfoInternal()
@@ -85,16 +86,21 @@
     }
 
     if (!isFormatSupported(format)) {
-        if (m_frequencies.size())
-            format.setFrequency(m_frequencies[0]);
-        if (m_channels.size())
-            format.setChannels(m_channels[0]);
-        if (m_sampleSizes.size())
-            format.setSampleSize(m_sampleSizes[0]);
-        if (m_byteOrders.size())
-            format.setByteOrder(m_byteOrders[0]);
-        if (m_sampleTypes.size())
-            format.setSampleType(m_sampleTypes[0]);
+        format = QAudioFormat();
+        format.setCodec(QLatin1String("audio/pcm"));
+        if (m_capabilities.contains(format.codec())) {
+            const Capabilities &codecCaps = m_capabilities[format.codec()];
+            if (codecCaps.m_frequencies.size())
+                format.setFrequency(codecCaps.m_frequencies[0]);
+            if (codecCaps.m_channels.size())
+                format.setChannels(codecCaps.m_channels[0]);
+            if (codecCaps.m_sampleSizes.size())
+                format.setSampleSize(codecCaps.m_sampleSizes[0]);
+            if (codecCaps.m_byteOrders.size())
+                format.setByteOrder(codecCaps.m_byteOrders[0]);
+            if (codecCaps.m_sampleTypes.size())
+                format.setSampleType(codecCaps.m_sampleTypes[0]);
+        }
     }
 
     return format;
@@ -104,14 +110,15 @@
                                  const QAudioFormat &format) const
 {
     getSupportedFormats();
-    const bool supported =
-            m_codecs.contains(format.codec())
-        &&  m_frequencies.contains(format.frequency())
-        &&  m_channels.contains(format.channels())
-        &&  m_sampleSizes.contains(format.sampleSize())
-        &&  m_byteOrders.contains(format.byteOrder())
-        &&  m_sampleTypes.contains(format.sampleType());
-
+    bool supported = false;
+    if (m_capabilities.contains(format.codec())) {
+        const Capabilities &codecCaps = m_capabilities[format.codec()];
+        supported = codecCaps.m_frequencies.contains(format.frequency())
+                &&  codecCaps.m_channels.contains(format.channels())
+                &&  codecCaps.m_sampleSizes.contains(format.sampleSize())
+                &&  codecCaps.m_byteOrders.contains(format.byteOrder())
+                &&  codecCaps.m_sampleTypes.contains(format.sampleType());
+    }
     return supported;
 }
 
@@ -131,37 +138,37 @@
 QStringList QAudioDeviceInfoInternal::codecList()
 {
     getSupportedFormats();
-    return m_codecs;
+    return m_capabilities.keys();
 }
 
 QList<int> QAudioDeviceInfoInternal::frequencyList()
 {
     getSupportedFormats();
-    return m_frequencies;
+    return m_unionCapabilities.m_frequencies;
 }
 
 QList<int> QAudioDeviceInfoInternal::channelsList()
 {
     getSupportedFormats();
-    return m_channels;
+    return m_unionCapabilities.m_channels;
 }
 
 QList<int> QAudioDeviceInfoInternal::sampleSizeList()
 {
     getSupportedFormats();
-    return m_sampleSizes;
+    return m_unionCapabilities.m_sampleSizes;
 }
 
 QList<QAudioFormat::Endian> QAudioDeviceInfoInternal::byteOrderList()
 {
     getSupportedFormats();
-    return m_byteOrders;
+    return m_unionCapabilities.m_byteOrders;
 }
 
 QList<QAudioFormat::SampleType> QAudioDeviceInfoInternal::sampleTypeList()
 {
     getSupportedFormats();
-    return m_sampleTypes;
+    return m_unionCapabilities.m_sampleTypes;
 }
 
 QByteArray QAudioDeviceInfoInternal::defaultInputDevice()
@@ -181,17 +188,50 @@
     return result;
 }
 
+void QAudioDeviceInfoInternal::devsoundInitializeComplete(int err)
+{
+    m_intializationResult = err;
+    m_initializing = false;
+}
+
+// Helper function
+template<typename T>
+void appendUnique(QList<T> &left, const QList<T> &right)
+{
+    foreach (const T &value, right)
+        if (!left.contains(value))
+            left += value;
+}
+
 void QAudioDeviceInfoInternal::getSupportedFormats() const
 {
     if (!m_updated) {
-        QScopedPointer<SymbianAudio::DevSoundCapabilities> caps(
-            new SymbianAudio::DevSoundCapabilities(*m_devsound, m_mode));
+        QScopedPointer<SymbianAudio::DevSoundWrapper> devsound(new SymbianAudio::DevSoundWrapper(m_mode));
+        connect(devsound.data(), SIGNAL(initializeComplete(int)),
+                this, SLOT(devsoundInitializeComplete(int)));
+
+        foreach (const QString& codec, devsound->supportedCodecs()) {
+            m_initializing = true;
+            devsound->initialize(codec);
+            while (m_initializing)
+                QCoreApplication::instance()->processEvents(QEventLoop::WaitForMoreEvents);
+            if (KErrNone == m_intializationResult) {
+                m_capabilities[codec].m_frequencies = devsound->supportedFrequencies();
+                appendUnique(m_unionCapabilities.m_frequencies, devsound->supportedFrequencies());
 
-        SymbianAudio::Utils::capabilitiesNativeToQt(*caps,
-            m_frequencies, m_channels, m_sampleSizes,
-            m_byteOrders, m_sampleTypes);
+                m_capabilities[codec].m_channels = devsound->supportedChannels();
+                appendUnique(m_unionCapabilities.m_channels, devsound->supportedChannels());
+
+                m_capabilities[codec].m_sampleSizes = devsound->supportedSampleSizes();
+                appendUnique(m_unionCapabilities.m_sampleSizes, devsound->supportedSampleSizes());
 
-        m_codecs.append(QLatin1String("audio/pcm"));
+                m_capabilities[codec].m_byteOrders = devsound->supportedByteOrders();
+                appendUnique(m_unionCapabilities.m_byteOrders, devsound->supportedByteOrders());
+
+                m_capabilities[codec].m_sampleTypes = devsound->supportedSampleTypes();
+                appendUnique(m_unionCapabilities.m_sampleTypes, devsound->supportedSampleTypes());
+            }
+        }
 
         m_updated = true;
     }
--- a/src/multimedia/audio/qaudiodeviceinfo_symbian_p.h	Thu May 27 13:40:48 2010 +0300
+++ b/src/multimedia/audio/qaudiodeviceinfo_symbian_p.h	Fri Jun 11 14:24:45 2010 +0300
@@ -53,11 +53,16 @@
 #ifndef QAUDIODEVICEINFO_SYMBIAN_P_H
 #define QAUDIODEVICEINFO_SYMBIAN_P_H
 
+#include <QtCore/QMap>
 #include <QtMultimedia/qaudioengine.h>
 #include <sounddevice.h>
 
 QT_BEGIN_NAMESPACE
 
+namespace SymbianAudio {
+class DevSoundWrapper;
+}
+
 class QAudioDeviceInfoInternal
     :   public QAbstractAudioDeviceInfo
 {
@@ -82,24 +87,33 @@
     static QByteArray defaultOutputDevice();
     static QList<QByteArray> availableDevices(QAudio::Mode);
 
+private slots:
+    void devsoundInitializeComplete(int err);
+
 private:
     void getSupportedFormats() const;
 
 private:
-    QScopedPointer<CMMFDevSound> m_devsound;
+    mutable bool m_initializing;
+    int m_intializationResult;
 
     QString m_deviceName;
     QAudio::Mode m_mode;
 
+    struct Capabilities
+    {
+        QList<int> m_frequencies;
+        QList<int> m_channels;
+        QList<int> m_sampleSizes;
+        QList<QAudioFormat::Endian> m_byteOrders;
+        QList<QAudioFormat::SampleType> m_sampleTypes;
+    };
+
     // Mutable to allow lazy initialization when called from const-qualified
     // public functions (isFormatSupported, nearestFormat)
     mutable bool m_updated;
-    mutable QStringList m_codecs;
-    mutable QList<int> m_frequencies;
-    mutable QList<int> m_channels;
-    mutable QList<int> m_sampleSizes;
-    mutable QList<QAudioFormat::Endian> m_byteOrders;
-    mutable QList<QAudioFormat::SampleType> m_sampleTypes;
+    mutable QMap<QString, Capabilities> m_capabilities;
+    mutable Capabilities m_unionCapabilities;
 };
 
 QT_END_NAMESPACE
--- a/src/multimedia/audio/qaudioinput.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/multimedia/audio/qaudioinput.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -211,6 +211,10 @@
      If a problem occurs during this process the error() is set to QAudio::OpenError,
      state() is set to QAudio::StoppedState and stateChanged() signal is emitted.
 
+    In either case, the stateChanged() signal may be emitted either synchronously
+    during execution of the start() function or asynchronously after start() has
+    returned to the caller.
+
      \sa {Symbian Platform Security Requirements}
 
      \sa QIODevice
@@ -233,6 +237,10 @@
     If a problem occurs during this process the error() is set to QAudio::OpenError,
     state() is set to QAudio::StoppedState and stateChanged() signal is emitted.
 
+    In either case, the stateChanged() signal may be emitted either synchronously
+    during execution of the start() function or asynchronously after start() has
+    returned to the caller.
+
     \sa {Symbian Platform Security Requirements}
 
     \sa QIODevice
@@ -278,6 +286,8 @@
 
     Sets error() to QAudio::NoError, state() to QAudio::SuspendedState and
     emit stateChanged() signal.
+
+    Note: signal will always be emitted during execution of the resume() function.
 */
 
 void QAudioInput::suspend()
@@ -300,7 +310,7 @@
 }
 
 /*!
-    Sets the audio buffer size to \a value milliseconds.
+    Sets the audio buffer size to \a value bytes.
 
     Note: This function can be called anytime before start(), calls to this
     are ignored after start(). It should not be assumed that the buffer size
@@ -315,7 +325,7 @@
 }
 
 /*!
-    Returns the audio buffer size in milliseconds.
+    Returns the audio buffer size in bytes.
 
     If called before start(), returns platform default value.
     If called before start() but setBufferSize() was called prior, returns value set by setBufferSize().
--- a/src/multimedia/audio/qaudioinput_symbian_p.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/multimedia/audio/qaudioinput_symbian_p.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -116,16 +116,16 @@
     ,   m_pullMode(false)
     ,   m_sink(0)
     ,   m_pullTimer(new QTimer(this))
+    ,   m_devSound(0)
     ,   m_devSoundBuffer(0)
     ,   m_devSoundBufferSize(0)
     ,   m_totalBytesReady(0)
     ,   m_devSoundBufferPos(0)
     ,   m_totalSamplesRecorded(0)
 {
-    connect(m_notifyTimer.data(), SIGNAL(timeout()), this, SIGNAL(notify()));
+    qRegisterMetaType<CMMFBuffer *>("CMMFBuffer *");
 
-    SymbianAudio::Utils::formatQtToNative(m_format, m_nativeFourCC,
-                                          m_nativeFormat);
+    connect(m_notifyTimer.data(), SIGNAL(timeout()), this, SIGNAL(notify()));
 
     m_pullTimer->setInterval(PushInterval);
     connect(m_pullTimer.data(), SIGNAL(timeout()), this, SLOT(pullData()));
@@ -164,7 +164,7 @@
 void QAudioInputPrivate::reset()
 {
     m_totalSamplesRecorded += getSamplesRecorded();
-    m_devSound->Stop();
+    m_devSound->stop();
     startRecording();
 }
 
@@ -174,7 +174,7 @@
         || SymbianAudio::IdleState == m_internalState) {
         m_notifyTimer->stop();
         m_pullTimer->stop();
-        m_devSound->Pause();
+        m_devSound->pause();
         const qint64 samplesRecorded = getSamplesRecorded();
         m_totalSamplesRecorded += samplesRecorded;
 
@@ -189,8 +189,11 @@
 
 void QAudioInputPrivate::resume()
 {
-    if (SymbianAudio::SuspendedState == m_internalState)
+    if (SymbianAudio::SuspendedState == m_internalState) {
+        if (!m_pullMode && !bytesReady())
+            m_devSound->start();
         startDataTransfer();
+    }
 }
 
 int QAudioInputPrivate::bytesReady() const
@@ -224,11 +227,14 @@
 
 void QAudioInputPrivate::setNotifyInterval(int ms)
 {
-    if (ms > 0) {
+    if (ms >= 0) {
         const int oldNotifyInterval = m_notifyInterval;
         m_notifyInterval = ms;
-        if (m_notifyTimer->isActive() && ms != oldNotifyInterval)
+        if (m_notifyInterval && (SymbianAudio::ActiveState == m_internalState ||
+                                 SymbianAudio::IdleState == m_internalState))
             m_notifyTimer->start(m_notifyInterval);
+        else
+            m_notifyTimer->stop();
     }
 }
 
@@ -275,88 +281,6 @@
     return m_format;
 }
 
-//-----------------------------------------------------------------------------
-// MDevSoundObserver implementation
-//-----------------------------------------------------------------------------
-
-void QAudioInputPrivate::InitializeComplete(TInt aError)
-{
-    Q_ASSERT_X(SymbianAudio::InitializingState == m_internalState,
-        Q_FUNC_INFO, "Invalid state");
-
-    if (KErrNone == aError)
-        startRecording();
-}
-
-void QAudioInputPrivate::ToneFinished(TInt aError)
-{
-    Q_UNUSED(aError)
-    // This class doesn't use DevSound's tone playback functions, so should
-    // never receive this callback.
-    Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback");
-}
-
-void QAudioInputPrivate::BufferToBeFilled(CMMFBuffer *aBuffer)
-{
-    Q_UNUSED(aBuffer)
-    // This class doesn't use DevSound in play mode, so should never receive
-    // this callback.
-    Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback");
-}
-
-void QAudioInputPrivate::PlayError(TInt aError)
-{
-    Q_UNUSED(aError)
-    // This class doesn't use DevSound in play mode, so should never receive
-    // this callback.
-    Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback");
-}
-
-void QAudioInputPrivate::BufferToBeEmptied(CMMFBuffer *aBuffer)
-{
-    // Following receipt of this callback, DevSound should not provide another
-    // buffer until we have returned the current one.
-    Q_ASSERT_X(!m_devSoundBuffer, Q_FUNC_INFO, "Buffer already held");
-
-    CMMFDataBuffer *const buffer = static_cast<CMMFDataBuffer*>(aBuffer);
-
-    if (!m_devSoundBufferSize)
-        m_devSoundBufferSize = buffer->Data().MaxLength();
-
-    m_totalBytesReady += buffer->Data().Length();
-
-    if (SymbianAudio::SuspendedState == m_internalState) {
-        m_devSoundBufferQ.append(buffer);
-    } else {
-        // Will be returned to DevSound by bufferEmptied().
-        m_devSoundBuffer = buffer;
-        m_devSoundBufferPos = 0;
-
-        if (bytesReady() && !m_pullMode)
-            pushData();
-    }
-}
-
-void QAudioInputPrivate::RecordError(TInt aError)
-{
-    Q_UNUSED(aError)
-    setError(QAudio::IOError);
-}
-
-void QAudioInputPrivate::ConvertError(TInt aError)
-{
-    Q_UNUSED(aError)
-    // This class doesn't use DevSound's format conversion functions, so
-    // should never receive this callback.
-    Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback");
-}
-
-void QAudioInputPrivate::DeviceMessage(TUid aMessageType, const TDesC8 &aMsg)
-{
-    Q_UNUSED(aMessageType)
-    Q_UNUSED(aMsg)
-    // Ignore this callback.
-}
 
 //-----------------------------------------------------------------------------
 // Private functions
@@ -367,33 +291,30 @@
     Q_ASSERT_X(SymbianAudio::ClosedState == m_internalState,
         Q_FUNC_INFO, "DevSound already opened");
 
-    QT_TRAP_THROWING( m_devSound.reset(CMMFDevSound::NewL()) )
-
-    QScopedPointer<SymbianAudio::DevSoundCapabilities> caps(
-        new SymbianAudio::DevSoundCapabilities(*m_devSound, QAudio::AudioInput));
-
-    int err = SymbianAudio::Utils::isFormatSupported(m_format, *caps) ?
-                  KErrNone : KErrNotSupported;
+    Q_ASSERT(!m_devSound);
+    m_devSound = new SymbianAudio::DevSoundWrapper(QAudio::AudioInput, this);
 
-    if (KErrNone == err) {
-        setState(SymbianAudio::InitializingState);
-        TRAP(err, m_devSound->InitializeL(*this, m_nativeFourCC,
-                                          EMMFStateRecording));
-    }
+    connect(m_devSound, SIGNAL(initializeComplete(int)),
+            this, SLOT(devsoundInitializeComplete(int)));
+    connect(m_devSound, SIGNAL(bufferToBeProcessed(CMMFBuffer *)),
+            this, SLOT(devsoundBufferToBeEmptied(CMMFBuffer *)));
+    connect(m_devSound, SIGNAL(processingError(int)),
+            this, SLOT(devsoundRecordError(int)));
 
-    if (KErrNone != err) {
-        setError(QAudio::OpenError);
-        m_devSound.reset();
-    }
+    setState(SymbianAudio::InitializingState);
+    m_devSound->initialize(m_format.codec());
 }
 
 void QAudioInputPrivate::startRecording()
 {
-    const int samplesRecorded = m_devSound->SamplesRecorded();
+    const int samplesRecorded = m_devSound->samplesProcessed();
     Q_ASSERT(samplesRecorded == 0);
 
-    TRAPD(err, startDevSoundL());
-    if (KErrNone == err) {
+    bool ok = m_devSound->setFormat(m_format);
+    if (ok)
+        ok = m_devSound->start();
+
+    if (ok) {
         startDataTransfer();
     } else {
         setError(QAudio::OpenError);
@@ -401,17 +322,10 @@
     }
 }
 
-void QAudioInputPrivate::startDevSoundL()
-{
-    TMMFCapabilities nativeFormat = m_devSound->Config();
-    m_nativeFormat.iBufferSize = nativeFormat.iBufferSize;
-    m_devSound->SetConfigL(m_nativeFormat);
-    m_devSound->RecordInitL();
-}
-
 void QAudioInputPrivate::startDataTransfer()
 {
-    m_notifyTimer->start(m_notifyInterval);
+    if (m_notifyInterval)
+        m_notifyTimer->start(m_notifyInterval);
 
     if (m_pullMode)
         m_pullTimer->start();
@@ -503,6 +417,48 @@
     }
 }
 
+void QAudioInputPrivate::devsoundInitializeComplete(int err)
+{
+    Q_ASSERT_X(SymbianAudio::InitializingState == m_internalState,
+        Q_FUNC_INFO, "Invalid state");
+
+    if (!err && m_devSound->isFormatSupported(m_format))
+        startRecording();
+    else
+        setError(QAudio::OpenError);
+}
+
+void QAudioInputPrivate::devsoundBufferToBeEmptied(CMMFBuffer *baseBuffer)
+{
+    // Following receipt of this signal, DevSound should not provide another
+    // buffer until we have returned the current one.
+    Q_ASSERT_X(!m_devSoundBuffer, Q_FUNC_INFO, "Buffer already held");
+
+    CMMFDataBuffer *const buffer = static_cast<CMMFDataBuffer*>(baseBuffer);
+
+    if (!m_devSoundBufferSize)
+        m_devSoundBufferSize = buffer->Data().MaxLength();
+
+    m_totalBytesReady += buffer->Data().Length();
+
+    if (SymbianAudio::SuspendedState == m_internalState) {
+        m_devSoundBufferQ.append(buffer);
+    } else {
+        // Will be returned to DevSoundWrapper by bufferProcessed().
+        m_devSoundBuffer = buffer;
+        m_devSoundBufferPos = 0;
+
+        if (bytesReady() && !m_pullMode)
+            pushData();
+    }
+}
+
+void QAudioInputPrivate::devsoundRecordError(int err)
+{
+    Q_UNUSED(err)
+    setError(QAudio::IOError);
+}
+
 void QAudioInputPrivate::bufferEmptied()
 {
     m_devSoundBufferPos = 0;
@@ -510,7 +466,7 @@
     if (m_devSoundBuffer) {
         m_totalBytesReady -= m_devSoundBuffer->Data().Length();
         m_devSoundBuffer = 0;
-        m_devSound->RecordData();
+        m_devSound->bufferProcessed();
     } else {
         Q_ASSERT(!m_devSoundBufferQ.empty());
         m_totalBytesReady -= m_devSoundBufferQ.front()->Data().Length();
@@ -518,7 +474,8 @@
 
         // If the queue has been emptied, resume transfer from the hardware
         if (m_devSoundBufferQ.empty())
-            m_devSound->RecordInitL();
+            if (!m_devSound->start())
+                setError(QAudio::IOError);
     }
 
     Q_ASSERT(m_totalBytesReady >= 0);
@@ -532,8 +489,10 @@
     m_error = QAudio::NoError;
 
     if (m_devSound)
-        m_devSound->Stop();
-    m_devSound.reset();
+        m_devSound->stop();
+    delete m_devSound;
+    m_devSound = 0;
+
     m_devSoundBuffer = 0;
     m_devSoundBufferSize = 0;
     m_totalBytesReady = 0;
@@ -554,7 +513,7 @@
 {
     qint64 result = 0;
     if (m_devSound)
-        result = qint64(m_devSound->SamplesRecorded());
+        result = qint64(m_devSound->samplesProcessed());
     return result;
 }
 
@@ -565,30 +524,28 @@
     // Although no state transition actually occurs here, a stateChanged event
     // must be emitted to inform the client that the call to start() was
     // unsuccessful.
-    if (QAudio::OpenError == error)
+    if (QAudio::OpenError == error) {
         emit stateChanged(QAudio::StoppedState);
-
-    // Close the DevSound instance.  This causes a transition to StoppedState.
-    // This must be done asynchronously in case the current function was called
-    // from a DevSound event handler, in which case deleting the DevSound
-    // instance may cause an exception.
-    QMetaObject::invokeMethod(this, "close", Qt::QueuedConnection);
+    } else {
+        if (QAudio::UnderrunError == error)
+            setState(SymbianAudio::IdleState);
+        else
+            // Close the DevSound instance.  This causes a transition to
+            // StoppedState.  This must be done asynchronously in case the
+            // current function was called from a DevSound event handler, in which
+            // case deleting the DevSound instance may cause an exception.
+            QMetaObject::invokeMethod(this, "close", Qt::QueuedConnection);
+    }
 }
 
 void QAudioInputPrivate::setState(SymbianAudio::State newInternalState)
 {
     const QAudio::State oldExternalState = m_externalState;
     m_internalState = newInternalState;
-    m_externalState = SymbianAudio::Utils::stateNativeToQt(
-                            m_internalState, initializingState());
+    m_externalState = SymbianAudio::Utils::stateNativeToQt(m_internalState);
 
     if (m_externalState != oldExternalState)
         emit stateChanged(m_externalState);
 }
 
-QAudio::State QAudioInputPrivate::initializingState() const
-{
-    return QAudio::IdleState;
-}
-
 QT_END_NAMESPACE
--- a/src/multimedia/audio/qaudioinput_symbian_p.h	Thu May 27 13:40:48 2010 +0300
+++ b/src/multimedia/audio/qaudioinput_symbian_p.h	Fri Jun 11 14:24:45 2010 +0300
@@ -56,7 +56,6 @@
 #include <QtMultimedia/qaudioengine.h>
 #include <QTime>
 #include <QTimer>
-#include <sounddevice.h>
 #include "qaudio_symbian_p.h"
 
 QT_BEGIN_NAMESPACE
@@ -82,7 +81,6 @@
 
 class QAudioInputPrivate
     :   public QAbstractAudioInput
-    ,   public MDevSoundObserver
 {
     friend class SymbianAudioInputPrivate;
     Q_OBJECT
@@ -109,23 +107,15 @@
     QAudio::State state() const;
     QAudioFormat format() const;
 
-    // MDevSoundObserver
-    void InitializeComplete(TInt aError);
-    void ToneFinished(TInt aError);
-    void BufferToBeFilled(CMMFBuffer *aBuffer);
-    void PlayError(TInt aError);
-    void BufferToBeEmptied(CMMFBuffer *aBuffer);
-    void RecordError(TInt aError);
-    void ConvertError(TInt aError);
-    void DeviceMessage(TUid aMessageType, const TDesC8 &aMsg);
-
 private slots:
     void pullData();
+    void devsoundInitializeComplete(int err);
+    void devsoundBufferToBeEmptied(CMMFBuffer *);
+    void devsoundRecordError(int err);
 
 private:
    void open();
    void startRecording();
-   void startDevSoundL();
    void startDataTransfer();
    CMMFDataBuffer* currentBuffer() const;
    void pushData();
@@ -138,8 +128,6 @@
    void setError(QAudio::Error error);
    void setState(SymbianAudio::State state);
 
-   QAudio::State initializingState() const;
-
 private:
     const QByteArray m_device;
     const QAudioFormat m_format;
@@ -158,9 +146,7 @@
 
     QScopedPointer<QTimer> m_pullTimer;
 
-    QScopedPointer<CMMFDevSound> m_devSound;
-    TUint32 m_nativeFourCC;
-    TMMFCapabilities m_nativeFormat;
+    SymbianAudio::DevSoundWrapper* m_devSound;
 
     // Latest buffer provided by DevSound, to be empied of data.
     CMMFDataBuffer *m_devSoundBuffer;
--- a/src/multimedia/audio/qaudiooutput.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/multimedia/audio/qaudiooutput.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -209,6 +209,10 @@
     If a problem occurs during this process the error() is set to QAudio::OpenError,
     state() is set to QAudio::StoppedState and stateChanged() signal is emitted.
 
+    In either case, the stateChanged() signal may be emitted either synchronously
+    during execution of the start() function or asynchronously after start() has
+    returned to the caller.
+
     \sa QIODevice
 */
 
@@ -228,6 +232,10 @@
     If a problem occurs during this process the error() is set to QAudio::OpenError,
     state() is set to QAudio::StoppedState and stateChanged() signal is emitted.
 
+    In either case, the stateChanged() signal may be emitted either synchronously
+    during execution of the start() function or asynchronously after start() has
+    returned to the caller.
+
     \sa QIODevice
 */
 
@@ -276,6 +284,8 @@
     Sets state() to QAudio::ActiveState if you previously called start(QIODevice*).
     Sets state() to QAudio::IdleState if you previously called start().
     emits stateChanged() signal.
+
+    Note: signal will always be emitted during execution of the resume() function.
 */
 
 void QAudioOutput::resume()
--- a/src/multimedia/audio/qaudiooutput_symbian_p.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/multimedia/audio/qaudiooutput_symbian_p.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -110,6 +110,7 @@
     ,   m_externalState(QAudio::StoppedState)
     ,   m_pullMode(false)
     ,   m_source(0)
+    ,   m_devSound(0)
     ,   m_devSoundBuffer(0)
     ,   m_devSoundBufferSize(0)
     ,   m_bytesWritten(0)
@@ -121,10 +122,9 @@
     ,   m_samplesPlayed(0)
     ,   m_totalSamplesPlayed(0)
 {
-    connect(m_notifyTimer.data(), SIGNAL(timeout()), this, SIGNAL(notify()));
+    qRegisterMetaType<CMMFBuffer *>("CMMFBuffer *");
 
-    SymbianAudio::Utils::formatQtToNative(m_format, m_nativeFourCC,
-                                          m_nativeFormat);
+    connect(m_notifyTimer.data(), SIGNAL(timeout()), this, SIGNAL(notify()));
 
     m_underflowTimer->setInterval(UnderflowTimerInterval);
     connect(m_underflowTimer.data(), SIGNAL(timeout()), this,
@@ -140,8 +140,6 @@
 {
     stop();
 
-    // We have to set these before the call to open() because of the
-    // logic in initializingState()
     if (device) {
         m_pullMode = true;
         m_source = device;
@@ -171,7 +169,7 @@
 void QAudioOutputPrivate::reset()
 {
     m_totalSamplesPlayed += getSamplesPlayed();
-    m_devSound->Stop();
+    m_devSound->stop();
     m_bytesPadding = 0;
     startPlayback();
 }
@@ -196,11 +194,12 @@
         // Because this causes buffered data to be dropped, we replace the
         // lost data with silence following a call to resume(), in order to
         // ensure that processedUSecs() returns the correct value.
-        m_devSound->Stop();
+        m_devSound->stop();
         m_totalSamplesPlayed += samplesPlayed;
 
         // Calculate the amount of data dropped
         const qint64 paddingSamples = samplesWritten - samplesPlayed;
+        Q_ASSERT(paddingSamples >= 0);
         m_bytesPadding = SymbianAudio::Utils::samplesToBytes(m_format,
                                                              paddingSamples);
 
@@ -210,8 +209,11 @@
 
 void QAudioOutputPrivate::resume()
 {
-    if (SymbianAudio::SuspendedState == m_internalState)
+    if (SymbianAudio::SuspendedState == m_internalState) {
+        if (!m_pullMode && m_devSoundBuffer && m_devSoundBuffer->Data().Length())
+            bufferFilled();
         startPlayback();
+    }
 }
 
 int QAudioOutputPrivate::bytesFree() const
@@ -249,11 +251,14 @@
 
 void QAudioOutputPrivate::setNotifyInterval(int ms)
 {
-    if (ms > 0) {
+    if (ms >= 0) {
         const int oldNotifyInterval = m_notifyInterval;
         m_notifyInterval = ms;
-        if (m_notifyTimer->isActive() && ms != oldNotifyInterval)
+        if (m_notifyInterval && (SymbianAudio::ActiveState == m_internalState ||
+                                 SymbianAudio::IdleState == m_internalState))
             m_notifyTimer->start(m_notifyInterval);
+        else
+            m_notifyTimer->stop();
     }
 }
 
@@ -300,91 +305,6 @@
     return m_format;
 }
 
-//-----------------------------------------------------------------------------
-// MDevSoundObserver implementation
-//-----------------------------------------------------------------------------
-
-void QAudioOutputPrivate::InitializeComplete(TInt aError)
-{
-    Q_ASSERT_X(SymbianAudio::InitializingState == m_internalState,
-        Q_FUNC_INFO, "Invalid state");
-
-    if (KErrNone == aError)
-        startPlayback();
-}
-
-void QAudioOutputPrivate::ToneFinished(TInt aError)
-{
-    Q_UNUSED(aError)
-    // This class doesn't use DevSound's tone playback functions, so should
-    // never receive this callback.
-    Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback");
-}
-
-void QAudioOutputPrivate::BufferToBeFilled(CMMFBuffer *aBuffer)
-{
-    // Following receipt of this callback, DevSound should not provide another
-    // buffer until we have returned the current one.
-    Q_ASSERT_X(!m_devSoundBuffer, Q_FUNC_INFO, "Buffer already held");
-
-    // Will be returned to DevSound by bufferFilled().
-    m_devSoundBuffer = static_cast<CMMFDataBuffer*>(aBuffer);
-
-    if (!m_devSoundBufferSize)
-        m_devSoundBufferSize = m_devSoundBuffer->Data().MaxLength();
-
-    writePaddingData();
-
-    if (m_pullMode && isDataReady() && !m_bytesPadding)
-        pullData();
-}
-
-void QAudioOutputPrivate::PlayError(TInt aError)
-{
-    switch (aError) {
-    case KErrUnderflow:
-        m_underflow = true;
-        if (m_pullMode && !m_lastBuffer)
-            setError(QAudio::UnderrunError);
-        else
-            setState(SymbianAudio::IdleState);
-        break;
-    default:
-        setError(QAudio::IOError);
-        break;
-    }
-}
-
-void QAudioOutputPrivate::BufferToBeEmptied(CMMFBuffer *aBuffer)
-{
-    Q_UNUSED(aBuffer)
-    // This class doesn't use DevSound in record mode, so should never receive
-    // this callback.
-    Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback");
-}
-
-void QAudioOutputPrivate::RecordError(TInt aError)
-{
-    Q_UNUSED(aError)
-    // This class doesn't use DevSound in record mode, so should never receive
-    // this callback.
-    Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback");
-}
-
-void QAudioOutputPrivate::ConvertError(TInt aError)
-{
-    Q_UNUSED(aError)
-    // This class doesn't use DevSound's format conversion functions, so
-    // should never receive this callback.
-    Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback");
-}
-
-void QAudioOutputPrivate::DeviceMessage(TUid aMessageType, const TDesC8 &aMsg)
-{
-    Q_UNUSED(aMessageType)
-    Q_UNUSED(aMsg)
-    // Ignore this callback.
-}
 
 //-----------------------------------------------------------------------------
 // Private functions
@@ -412,45 +332,87 @@
     }
 }
 
+void QAudioOutputPrivate::devsoundInitializeComplete(int err)
+{
+    Q_ASSERT_X(SymbianAudio::InitializingState == m_internalState,
+        Q_FUNC_INFO, "Invalid state");
+
+    if (!err && m_devSound->isFormatSupported(m_format))
+        startPlayback();
+    else
+        setError(QAudio::OpenError);
+}
+
+void QAudioOutputPrivate::devsoundBufferToBeFilled(CMMFBuffer *bufferBase)
+{
+    // Following receipt of this signal, DevSound should not provide another
+    // buffer until we have returned the current one.
+    Q_ASSERT_X(!m_devSoundBuffer, Q_FUNC_INFO, "Buffer already held");
+
+    // Will be returned to DevSoundWrapper by bufferProcessed().
+    m_devSoundBuffer = static_cast<CMMFDataBuffer*>(bufferBase);
+
+    if (!m_devSoundBufferSize)
+        m_devSoundBufferSize = m_devSoundBuffer->Data().MaxLength();
+
+    writePaddingData();
+
+    if (m_pullMode && isDataReady() && !m_bytesPadding)
+        pullData();
+}
+
+void QAudioOutputPrivate::devsoundPlayError(int err)
+{
+    switch (err) {
+    case KErrUnderflow:
+        m_underflow = true;
+        if (m_pullMode && !m_lastBuffer)
+            setError(QAudio::UnderrunError);
+        else
+            setState(SymbianAudio::IdleState);
+        break;
+    default:
+        setError(QAudio::IOError);
+        break;
+    }
+}
+
 void QAudioOutputPrivate::open()
 {
     Q_ASSERT_X(SymbianAudio::ClosedState == m_internalState,
         Q_FUNC_INFO, "DevSound already opened");
 
-    QT_TRAP_THROWING( m_devSound.reset(CMMFDevSound::NewL()) )
-
-    QScopedPointer<SymbianAudio::DevSoundCapabilities> caps(
-        new SymbianAudio::DevSoundCapabilities(*m_devSound,
-                                               QAudio::AudioOutput));
-
-    int err = SymbianAudio::Utils::isFormatSupported(m_format, *caps) ?
-                  KErrNone : KErrNotSupported;
+    Q_ASSERT(!m_devSound);
+    m_devSound = new SymbianAudio::DevSoundWrapper(QAudio::AudioOutput, this);
 
-    if (KErrNone == err) {
-        setState(SymbianAudio::InitializingState);
-        TRAP(err, m_devSound->InitializeL(*this, m_nativeFourCC,
-                                          EMMFStatePlaying));
-    }
+    connect(m_devSound, SIGNAL(initializeComplete(int)),
+            this, SLOT(devsoundInitializeComplete(int)));
+    connect(m_devSound, SIGNAL(bufferToBeProcessed(CMMFBuffer *)),
+            this, SLOT(devsoundBufferToBeFilled(CMMFBuffer *)));
+    connect(m_devSound, SIGNAL(processingError(int)),
+            this, SLOT(devsoundPlayError(int)));
 
-    if (KErrNone != err) {
-        setError(QAudio::OpenError);
-        m_devSound.reset();
-    }
+    setState(SymbianAudio::InitializingState);
+    m_devSound->initialize(m_format.codec());
 }
 
 void QAudioOutputPrivate::startPlayback()
 {
-    TRAPD(err, startDevSoundL());
-    if (KErrNone == err) {
+    bool ok = m_devSound->setFormat(m_format);
+    if (ok)
+        ok = m_devSound->start();
+
+    if (ok) {
         if (isDataReady())
             setState(SymbianAudio::ActiveState);
         else
             setState(SymbianAudio::IdleState);
 
-        m_notifyTimer->start(m_notifyInterval);
+        if (m_notifyInterval)
+            m_notifyTimer->start(m_notifyInterval);
         m_underflow = false;
 
-        Q_ASSERT(m_devSound->SamplesPlayed() == 0);
+        Q_ASSERT(m_devSound->samplesProcessed() == 0);
 
         writePaddingData();
 
@@ -462,14 +424,6 @@
     }
 }
 
-void QAudioOutputPrivate::startDevSoundL()
-{
-    TMMFCapabilities nativeFormat = m_devSound->Config();
-    m_nativeFormat.iBufferSize = nativeFormat.iBufferSize;
-    m_devSound->SetConfigL(m_nativeFormat);
-    m_devSound->PlayInitL();
-}
-
 void QAudioOutputPrivate::writePaddingData()
 {
     // See comments in suspend()
@@ -486,10 +440,11 @@
         Mem::FillZ(ptr, paddingBytes);
         outputBuffer.SetLength(outputBuffer.Length() + paddingBytes);
         m_bytesPadding -= paddingBytes;
+        Q_ASSERT(m_bytesPadding >= 0);
 
         if (m_pullMode && m_source->atEnd())
             lastBufferFilled();
-        if (paddingBytes == outputBytes)
+        if ((paddingBytes == outputBytes) || !m_bytesPadding)
             bufferFilled();
     }
 }
@@ -543,9 +498,6 @@
     Q_ASSERT_X(m_pullMode, Q_FUNC_INFO,
         "pullData called when in push mode");
 
-    if (m_bytesPadding)
-        m_bytesPadding = 1;
-
     // writePaddingData() is called by BufferToBeFilled() before pullData(),
     // so we should never have any padding data left at this point.
     Q_ASSERT_X(0 == m_bytesPadding, Q_FUNC_INFO,
@@ -590,7 +542,7 @@
     if (QAudio::UnderrunError == m_error)
         m_error = QAudio::NoError;
 
-    m_devSound->PlayData();
+    m_devSound->bufferProcessed();
 }
 
 void QAudioOutputPrivate::lastBufferFilled()
@@ -610,8 +562,10 @@
     m_error = QAudio::NoError;
 
     if (m_devSound)
-        m_devSound->Stop();
-    m_devSound.reset();
+        m_devSound->stop();
+    delete m_devSound;
+    m_devSound = 0;
+
     m_devSoundBuffer = 0;
     m_devSoundBufferSize = 0;
 
@@ -644,7 +598,7 @@
             // This is necessary because some DevSound implementations report
             // that they have played more data than has actually been provided to them
             // by the client.
-            const qint64 devSoundSamplesPlayed(m_devSound->SamplesPlayed());
+            const qint64 devSoundSamplesPlayed(m_devSound->samplesProcessed());
             result = qMin(devSoundSamplesPlayed, samplesWritten);
         }
     }
@@ -658,25 +612,25 @@
     // Although no state transition actually occurs here, a stateChanged event
     // must be emitted to inform the client that the call to start() was
     // unsuccessful.
-    if (QAudio::OpenError == error)
+    if (QAudio::OpenError == error) {
         emit stateChanged(QAudio::StoppedState);
-
-    if (QAudio::UnderrunError == error)
-        setState(SymbianAudio::IdleState);
-    else
-        // Close the DevSound instance.  This causes a transition to
-        // StoppedState.  This must be done asynchronously in case the
-        // current function was called from a DevSound event handler, in which
-        // case deleting the DevSound instance may cause an exception.
-        QMetaObject::invokeMethod(this, "close", Qt::QueuedConnection);
+    } else {
+        if (QAudio::UnderrunError == error)
+            setState(SymbianAudio::IdleState);
+        else
+            // Close the DevSound instance.  This causes a transition to
+            // StoppedState.  This must be done asynchronously in case the
+            // current function was called from a DevSound event handler, in which
+            // case deleting the DevSound instance may cause an exception.
+            QMetaObject::invokeMethod(this, "close", Qt::QueuedConnection);
+    }
 }
 
 void QAudioOutputPrivate::setState(SymbianAudio::State newInternalState)
 {
     const QAudio::State oldExternalState = m_externalState;
     m_internalState = newInternalState;
-    m_externalState = SymbianAudio::Utils::stateNativeToQt(
-                            m_internalState, initializingState());
+    m_externalState = SymbianAudio::Utils::stateNativeToQt(m_internalState);
 
     if (m_externalState != oldExternalState)
         emit stateChanged(m_externalState);
@@ -689,9 +643,4 @@
         ||  m_pushDataReady;
 }
 
-QAudio::State QAudioOutputPrivate::initializingState() const
-{
-    return isDataReady() ? QAudio::ActiveState : QAudio::IdleState;
-}
-
 QT_END_NAMESPACE
--- a/src/multimedia/audio/qaudiooutput_symbian_p.h	Thu May 27 13:40:48 2010 +0300
+++ b/src/multimedia/audio/qaudiooutput_symbian_p.h	Fri Jun 11 14:24:45 2010 +0300
@@ -80,7 +80,6 @@
 
 class QAudioOutputPrivate
     :   public QAbstractAudioOutput
-    ,   public MDevSoundObserver
 {
     friend class SymbianAudioOutputPrivate;
     Q_OBJECT
@@ -107,24 +106,16 @@
     QAudio::State state() const;
     QAudioFormat format() const;
 
-    // MDevSoundObserver
-    void InitializeComplete(TInt aError);
-    void ToneFinished(TInt aError);
-    void BufferToBeFilled(CMMFBuffer *aBuffer);
-    void PlayError(TInt aError);
-    void BufferToBeEmptied(CMMFBuffer *aBuffer);
-    void RecordError(TInt aError);
-    void ConvertError(TInt aError);
-    void DeviceMessage(TUid aMessageType, const TDesC8 &aMsg);
-
 private slots:
     void dataReady();
     void underflowTimerExpired();
+    void devsoundInitializeComplete(int err);
+    void devsoundBufferToBeFilled(CMMFBuffer *);
+    void devsoundPlayError(int err);
 
 private:
    void open();
    void startPlayback();
-   void startDevSoundL();
    void writePaddingData();
    qint64 pushData(const char *data, qint64 len);
    void pullData();
@@ -138,7 +129,6 @@
    void setState(SymbianAudio::State state);
 
    bool isDataReady() const;
-   QAudio::State initializingState() const;
 
 private:
     const QByteArray m_device;
@@ -156,9 +146,7 @@
     bool m_pullMode;
     QIODevice *m_source;
 
-    QScopedPointer<CMMFDevSound> m_devSound;
-    TUint32 m_nativeFourCC;
-    TMMFCapabilities m_nativeFormat;
+    SymbianAudio::DevSoundWrapper* m_devSound;
 
     // Buffer provided by DevSound, to be filled with data.
     CMMFDataBuffer *m_devSoundBuffer;
--- a/src/network/access/qhttpnetworkconnection.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/network/access/qhttpnetworkconnection.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -716,6 +716,7 @@
 
 // This function must be called from the event loop. The only
 // exception is documented in QHttpNetworkConnectionPrivate::queueRequest
+// although it is called _q_startNextRequest, it will actually start multiple requests when possible
 void QHttpNetworkConnectionPrivate::_q_startNextRequest()
 {
     //resend the necessary ones.
@@ -733,26 +734,23 @@
 
     // dequeue new ones
 
-    QAbstractSocket *socket = 0;
+    // return fast if there is nothing to do
+    if (highPriorityQueue.isEmpty() && lowPriorityQueue.isEmpty())
+        return;
+    // try to get a free AND connected socket
     for (int i = 0; i < channelCount; ++i) {
-        QAbstractSocket *chSocket = channels[i].socket;
-        // try to get a free AND connected socket
         if (!channels[i].isSocketBusy() && channels[i].socket->state() == QAbstractSocket::ConnectedState) {
-            socket = chSocket;
-            dequeueAndSendRequest(socket);
-            break;
+            dequeueAndSendRequest(channels[i].socket);
         }
     }
 
-    if (!socket) {
-        for (int i = 0; i < channelCount; ++i) {
-            QAbstractSocket *chSocket = channels[i].socket;
-            // try to get a free unconnected socket
-            if (!channels[i].isSocketBusy()) {
-                socket = chSocket;
-                dequeueAndSendRequest(socket);
-                break;
-            }
+    // return fast if there is nothing to do
+    if (highPriorityQueue.isEmpty() && lowPriorityQueue.isEmpty())
+        return;
+    // try to get a free unconnected socket
+    for (int i = 0; i < channelCount; ++i) {
+        if (!channels[i].isSocketBusy()) {
+            dequeueAndSendRequest(channels[i].socket);
         }
     }
 
--- a/src/network/access/qhttpnetworkconnectionchannel.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/network/access/qhttpnetworkconnectionchannel.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -291,7 +291,8 @@
         // ensure we try to receive a reply in all cases, even if _q_readyRead_ hat not been called
         // this is needed if the sends an reply before we have finished sending the request. In that
         // case receiveReply had been called before but ignored the server reply
-        QMetaObject::invokeMethod(this, "_q_receiveReply", Qt::QueuedConnection);
+        if (socket->bytesAvailable())
+            QMetaObject::invokeMethod(this, "_q_receiveReply", Qt::QueuedConnection);
         break;
     }
     case QHttpNetworkConnectionChannel::ReadingState:
--- a/src/network/access/qhttpnetworkreply.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/network/access/qhttpnetworkreply.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -179,6 +179,9 @@
 QByteArray QHttpNetworkReply::readAny()
 {
     Q_D(QHttpNetworkReply);
+    if (d->responseData.bufferCount() == 0)
+        return QByteArray();
+
     // we'll take the last buffer, so schedule another read from http
     if (d->downstreamLimited && d->responseData.bufferCount() == 1)
         d->connection->d_func()->readMoreLater(this);
--- a/src/network/kernel/qhostinfo.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/network/kernel/qhostinfo.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -44,14 +44,10 @@
 
 #include "QtCore/qscopedpointer.h"
 #include <qabstracteventdispatcher.h>
-#include <private/qunicodetables_p.h>
 #include <qcoreapplication.h>
 #include <qmetaobject.h>
-#include <qregexp.h>
-#include <private/qnativesocketengine_p.h>
 #include <qstringlist.h>
 #include <qthread.h>
-#include <qtimer.h>
 #include <qurl.h>
 
 #ifdef Q_OS_UNIX
--- a/src/network/kernel/qhostinfo_unix.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/network/kernel/qhostinfo_unix.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -44,6 +44,7 @@
 #include "qplatformdefs.h"
 
 #include "qhostinfo_p.h"
+#include "private/qnativesocketengine_p.h"
 #include "qiodevice.h"
 #include <qbytearray.h>
 #include <qlibrary.h>
--- a/src/network/kernel/qhostinfo_win.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/network/kernel/qhostinfo_win.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -50,7 +50,6 @@
 #include "private/qnativesocketengine_p.h"
 #include <ws2tcpip.h>
 #include <qlibrary.h>
-#include <qtimer.h>
 #include <qmutex.h>
 #include <qurl.h>
 #include <private/qmutexpool_p.h>
--- a/src/network/socket/qlocalserver_win.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/network/socket/qlocalserver_win.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -167,8 +167,8 @@
             q->incomingConnection((quintptr)handle);
         } else {
             if (GetLastError() != ERROR_IO_INCOMPLETE) {
+                q->close();
                 setError(QLatin1String("QLocalServerPrivate::_q_onNewConnection"));
-                closeServer();
                 return;
             }
 
--- a/src/network/socket/qnativesocketengine_unix.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/network/socket/qnativesocketengine_unix.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -425,6 +425,9 @@
         case EBADF:
         case EFAULT:
         case ENOTSOCK:
+#ifdef Q_OS_SYMBIAN
+        case EPIPE:
+#endif
             socketState = QAbstractSocket::UnconnectedState;
         default:
             break;
--- a/src/opengl/gl2paintengineex/qglengineshadermanager.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/opengl/gl2paintengineex/qglengineshadermanager.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -265,10 +265,12 @@
 
     do {
         QByteArray source;
+        // Insert the custom stage before the srcPixel shader to work around an ATI driver bug
+        // where you cannot forward declare a function that takes a sampler as argument.
+        if (prog.srcPixelFragShader == CustomImageSrcFragmentShader)
+            source.append(prog.customStageSource);
         source.append(qShaderSnippets[prog.mainFragShader]);
         source.append(qShaderSnippets[prog.srcPixelFragShader]);
-        if (prog.srcPixelFragShader == CustomImageSrcFragmentShader)
-            source.append(prog.customStageSource);
         if (prog.compositionFragShader)
             source.append(qShaderSnippets[prog.compositionFragShader]);
         if (prog.maskFragShader)
@@ -765,8 +767,8 @@
     // doesn't use are disabled)
     QGLContextPrivate* ctx_d = ctx->d_func();
     ctx_d->setVertexAttribArrayEnabled(QT_VERTEX_COORDS_ATTR, true);
-    ctx_d->setVertexAttribArrayEnabled(QT_TEXTURE_COORDS_ATTR, currentShaderProg->useTextureCoords);
-    ctx_d->setVertexAttribArrayEnabled(QT_OPACITY_ATTR, currentShaderProg->useOpacityAttribute);
+    ctx_d->setVertexAttribArrayEnabled(QT_TEXTURE_COORDS_ATTR, currentShaderProg && currentShaderProg->useTextureCoords);
+    ctx_d->setVertexAttribArrayEnabled(QT_OPACITY_ATTR, currentShaderProg && currentShaderProg->useOpacityAttribute);
 
     shaderProgNeedsChanging = false;
     return true;
--- a/src/opengl/gl2paintengineex/qglengineshadersource_p.h	Thu May 27 13:40:48 2010 +0300
+++ b/src/opengl/gl2paintengineex/qglengineshadersource_p.h	Fri Jun 11 14:24:45 2010 +0300
@@ -343,7 +343,6 @@
 static const char* const qglslCustomSrcFragmentShader = "\n\
     varying   highp   vec2      textureCoords; \n\
     uniform   lowp    sampler2D imageTexture; \n\
-    lowp vec4 customShader(lowp sampler2D texture, highp vec2 coords); \n\
     lowp vec4 srcPixel() \n\
     { \n\
         return customShader(imageTexture, textureCoords); \n\
--- a/src/opengl/qglpixmapfilter.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/opengl/qglpixmapfilter.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -591,10 +591,11 @@
 
         qt_blurImage(image, r * qreal(0.5), false, 1);
 
-        GLuint texture = generateBlurTexture(image.size(), GL_ALPHA);
-
-        glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, image.width(), image.height(), GL_ALPHA,
-                        GL_UNSIGNED_BYTE, image.bits());
+        GLuint texture;
+        glGenTextures(1, &texture);
+        glBindTexture(GL_TEXTURE_2D, texture);
+        glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, image.width(), image.height(),
+                     0, GL_ALPHA, GL_UNSIGNED_BYTE, image.bits());
 
         info = new QGLBlurTextureInfo(image, texture, r);
     }
--- a/src/opengl/qpaintengine_opengl.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/opengl/qpaintengine_opengl.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -1453,6 +1453,11 @@
     d->device->endPaint();
     qt_mask_texture_cache()->maintainCache();
 
+#if defined(Q_WS_X11)
+    // clear out the references we hold for textures bound with the
+    // texture_from_pixmap extension
+    ctx->d_func()->boundPixmaps.clear();
+#endif
     return true;
 }
 
--- a/src/openvg/qpaintengine_vg.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/openvg/qpaintengine_vg.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -120,6 +120,35 @@
 class QVGPaintEnginePrivate : public QPaintEngineExPrivate
 {
 public:
+    // Extra blending modes from VG_KHR_advanced_blending extension.
+    // Use the QT_VG prefix to avoid conflicts with any definitions
+    // that may come in via <VG/vgext.h>.
+    enum AdvancedBlending {
+        QT_VG_BLEND_OVERLAY_KHR       = 0x2010,
+        QT_VG_BLEND_HARDLIGHT_KHR     = 0x2011,
+        QT_VG_BLEND_SOFTLIGHT_SVG_KHR = 0x2012,
+        QT_VG_BLEND_SOFTLIGHT_KHR     = 0x2013,
+        QT_VG_BLEND_COLORDODGE_KHR    = 0x2014,
+        QT_VG_BLEND_COLORBURN_KHR     = 0x2015,
+        QT_VG_BLEND_DIFFERENCE_KHR    = 0x2016,
+        QT_VG_BLEND_SUBTRACT_KHR      = 0x2017,
+        QT_VG_BLEND_INVERT_KHR        = 0x2018,
+        QT_VG_BLEND_EXCLUSION_KHR     = 0x2019,
+        QT_VG_BLEND_LINEARDODGE_KHR   = 0x201a,
+        QT_VG_BLEND_LINEARBURN_KHR    = 0x201b,
+        QT_VG_BLEND_VIVIDLIGHT_KHR    = 0x201c,
+        QT_VG_BLEND_LINEARLIGHT_KHR   = 0x201d,
+        QT_VG_BLEND_PINLIGHT_KHR      = 0x201e,
+        QT_VG_BLEND_HARDMIX_KHR       = 0x201f,
+        QT_VG_BLEND_CLEAR_KHR         = 0x2020,
+        QT_VG_BLEND_DST_KHR           = 0x2021,
+        QT_VG_BLEND_SRC_OUT_KHR       = 0x2022,
+        QT_VG_BLEND_DST_OUT_KHR       = 0x2023,
+        QT_VG_BLEND_SRC_ATOP_KHR      = 0x2024,
+        QT_VG_BLEND_DST_ATOP_KHR      = 0x2025,
+        QT_VG_BLEND_XOR_KHR           = 0x2026
+    };
+
     QVGPaintEnginePrivate();
     ~QVGPaintEnginePrivate();
 
@@ -217,6 +246,8 @@
     QVGFontEngineCleaner *fontEngineCleaner;
 #endif
 
+    bool hasAdvancedBlending;
+
     QScopedPointer<QPixmapFilter> convolutionFilter;
     QScopedPointer<QPixmapFilter> colorizeFilter;
     QScopedPointer<QPixmapFilter> dropShadowFilter;
@@ -370,6 +401,8 @@
     fontEngineCleaner = 0;
 #endif
 
+    hasAdvancedBlending = false;
+
     clearModes();
 }
 
@@ -446,6 +479,10 @@
                             VG_PATH_CAPABILITY_ALL);
     vgAppendPathData(linePath, 2, segments, coords);
 #endif
+
+    const char *extensions = reinterpret_cast<const char *>(vgGetString(VG_EXTENSIONS));
+    if (extensions)
+        hasAdvancedBlending = strstr(extensions, "VG_KHR_advanced_blending") != 0;
 }
 
 void QVGPaintEnginePrivate::destroy()
@@ -2292,7 +2329,7 @@
     Q_D(QVGPaintEngine);
     d->dirty |= QPaintEngine::DirtyCompositionMode;
 
-    VGBlendMode vgMode = VG_BLEND_SRC_OVER;
+    VGint vgMode = VG_BLEND_SRC_OVER;
 
     switch (state()->composition_mode) {
     case QPainter::CompositionMode_SourceOver:
@@ -2326,11 +2363,53 @@
         vgMode = VG_BLEND_LIGHTEN;
         break;
     default:
-        qWarning() << "QVGPaintEngine::compositionModeChanged unsupported mode" << state()->composition_mode;
-        break;  // Fall back to VG_BLEND_SRC_OVER.
+        if (d->hasAdvancedBlending) {
+            switch (state()->composition_mode) {
+            case QPainter::CompositionMode_Overlay:
+                vgMode = QVGPaintEnginePrivate::QT_VG_BLEND_OVERLAY_KHR;
+                break;
+            case QPainter::CompositionMode_ColorDodge:
+                vgMode = QVGPaintEnginePrivate::QT_VG_BLEND_COLORDODGE_KHR;
+                break;
+            case QPainter::CompositionMode_ColorBurn:
+                vgMode = QVGPaintEnginePrivate::QT_VG_BLEND_COLORBURN_KHR;
+                break;
+            case QPainter::CompositionMode_HardLight:
+                vgMode = QVGPaintEnginePrivate::QT_VG_BLEND_HARDLIGHT_KHR;
+                break;
+            case QPainter::CompositionMode_SoftLight:
+                vgMode = QVGPaintEnginePrivate::QT_VG_BLEND_SOFTLIGHT_KHR;
+                break;
+            case QPainter::CompositionMode_Difference:
+                vgMode = QVGPaintEnginePrivate::QT_VG_BLEND_DIFFERENCE_KHR;
+                break;
+            case QPainter::CompositionMode_Exclusion:
+                vgMode = QVGPaintEnginePrivate::QT_VG_BLEND_EXCLUSION_KHR;
+                break;
+            case QPainter::CompositionMode_SourceOut:
+                vgMode = QVGPaintEnginePrivate::QT_VG_BLEND_SRC_OUT_KHR;
+                break;
+            case QPainter::CompositionMode_DestinationOut:
+                vgMode = QVGPaintEnginePrivate::QT_VG_BLEND_DST_OUT_KHR;
+                break;
+            case QPainter::CompositionMode_SourceAtop:
+                vgMode = QVGPaintEnginePrivate::QT_VG_BLEND_SRC_ATOP_KHR;
+                break;
+            case QPainter::CompositionMode_DestinationAtop:
+                vgMode = QVGPaintEnginePrivate::QT_VG_BLEND_DST_ATOP_KHR;
+                break;
+            case QPainter::CompositionMode_Xor:
+                vgMode = QVGPaintEnginePrivate::QT_VG_BLEND_XOR_KHR;
+                break;
+            default: break; // Fall back to VG_BLEND_SRC_OVER.
+            }
+        }
+        if (vgMode == VG_BLEND_SRC_OVER)
+            qWarning() << "QVGPaintEngine::compositionModeChanged unsupported mode" << state()->composition_mode;
+        break;
     }
 
-    d->setBlendMode(vgMode);
+    d->setBlendMode(VGBlendMode(vgMode));
 }
 
 void QVGPaintEngine::renderHintsChanged()
--- a/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreen.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreen.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -259,7 +259,7 @@
     if (parent->classId() != QScreen::TransformedClass)
         return 0;
     return 90 * static_cast<const QTransformedScreen *>(parent)
-                    ->transformation();
+                    ->transformOrientation();
 }
 
 #else
--- a/src/qt3support/widgets/q3spinwidget.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/qt3support/widgets/q3spinwidget.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -340,11 +340,13 @@
     QPainter p(this);
     QStyleOptionSpinBox opt = getStyleOption(this);
 
-    if (d->theButton & 1)
+    if (d->theButton & 1) {
         opt.activeSubControls = QStyle::SC_SpinBoxDown;
-    else if (d->theButton & 2)
+        opt.state |= QStyle::State_Sunken;
+    } else if (d->theButton & 2) {
         opt.activeSubControls = QStyle::SC_SpinBoxUp;
-    else
+        opt.state |= QStyle::State_Sunken;
+    } else
         opt.activeSubControls = QStyle::SC_None;
     opt.rect = style()->subControlRect(QStyle::CC_SpinBox, &opt, QStyle::SC_SpinBoxFrame, this);
     opt.subControls = QStyle::SC_All;
--- a/src/s60installs/deviceconfiguration/qtconfig.flm	Thu May 27 13:40:48 2010 +0300
+++ b/src/s60installs/deviceconfiguration/qtconfig.flm	Fri Jun 11 14:24:45 2010 +0300
@@ -78,9 +78,9 @@
 ifeq ($($(GUARD)),)
 $(GUARD):=1
 ifneq ($(filter linux,$(HOSTPLATFORM)),)
-ALL:: $(QT_TOOLS) $(TARGET_TOOLS)
+EXPORT:: $(QT_TOOLS) $(TARGET_TOOLS)
 else
-ALL:: $(TARGET_TOOLS)
+EXPORT:: $(TARGET_TOOLS)
 endif
 $(eval $(call QtConfiguration))
 $(eval $(call whatmacro,$(TARGET_TOOLS)))
--- a/src/testlib/qplaintestlogger.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/src/testlib/qplaintestlogger.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -181,6 +181,7 @@
                 hbuffer->Des().Copy(ptr.Mid(i, size));
                 RDebug::Print(format, hbuffer);
             }
+            delete hbuffer;
         }
         else {
             // fast, no allocations, but truncates silently
--- a/tests/auto/dbus.pro	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/dbus.pro	Fri Jun 11 14:24:45 2010 +0300
@@ -13,7 +13,6 @@
            qdbuspendingreply \
            qdbusperformance \
            qdbusreply \
-           qdbusserver \
            qdbusservicewatcher \
            qdbusthreading \
            qdbusxmlparser \
--- a/tests/auto/qbuffer/tst_qbuffer.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/qbuffer/tst_qbuffer.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -76,6 +76,7 @@
     void atEnd();
     void readLineBoundaries();
     void writeAfterQByteArrayResize();
+    void read_null();
 
 protected slots:
     void readyReadSlot();
@@ -529,5 +530,30 @@
     QCOMPARE(buffer.buffer().size(), 1000);
 }
 
+void tst_QBuffer::read_null()
+{
+    QByteArray buffer;
+    buffer.resize(32000);
+    for (int i = 0; i < buffer.size(); ++i)
+        buffer[i] = char(i & 0xff);
+
+    QBuffer in(&buffer);
+    in.open(QIODevice::ReadOnly);
+
+    QByteArray chunk;
+
+    chunk.resize(16380);
+    in.read(chunk.data(), 16380);
+
+    QCOMPARE(chunk, buffer.mid(0, chunk.size()));
+
+    in.read(chunk.data(), 0);
+
+    chunk.resize(8);
+    in.read(chunk.data(), chunk.size());
+
+    QCOMPARE(chunk, buffer.mid(16380, chunk.size()));
+}
+
 QTEST_MAIN(tst_QBuffer)
 #include "tst_qbuffer.moc"
--- a/tests/auto/qdbusinterface/tst_qdbusinterface.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/qdbusinterface/tst_qdbusinterface.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -157,6 +157,18 @@
     }
 };
 
+class DerivedFromQDBusInterface: public QDBusInterface
+{
+    Q_OBJECT
+public:
+    DerivedFromQDBusInterface()
+        : QDBusInterface("com.example.Test", "/")
+    {}
+
+public slots:
+    void method() {}
+};
+
 // helper function
 void emitSignal(const QString &interface, const QString &name, const QString &arg)
 {
@@ -183,6 +195,7 @@
 
     void notConnected();
     void notValid();
+    void notValidDerived();
     void invalidAfterServiceOwnerChanged();
     void introspect();
     void callMethod();
@@ -219,6 +232,7 @@
                              connection);
 
     QVERIFY(!interface.isValid());
+    QVERIFY(!QMetaObject::invokeMethod(&interface, "ListNames", Qt::DirectConnection));
 }
 
 void tst_QDBusInterface::notValid()
@@ -230,6 +244,14 @@
                              connection);
 
     QVERIFY(!interface.isValid());
+    QVERIFY(!QMetaObject::invokeMethod(&interface, "ListNames", Qt::DirectConnection));
+}
+
+void tst_QDBusInterface::notValidDerived()
+{
+    DerivedFromQDBusInterface c;
+    QVERIFY(!c.isValid());
+    QMetaObject::invokeMethod(&c, "method", Qt::DirectConnection);
 }
 
 void tst_QDBusInterface::invalidAfterServiceOwnerChanged()
--- a/tests/auto/qdbusserver/.gitignore	Thu May 27 13:40:48 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-tst_qdbusserver
--- a/tests/auto/qdbusserver/qdbusserver.pro	Thu May 27 13:40:48 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-load(qttest_p4)
-QT = core
-
-contains(QT_CONFIG,dbus): {
-	SOURCES += tst_qdbusserver.cpp
-	QT += dbus
-} else {
-	SOURCES += ../qdbusmarshall/dummy.cpp
-}
-
-
--- a/tests/auto/qdbusserver/server.cpp	Thu May 27 13:40:48 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-#include <QtCore/QtCore>
-#include <QtDBus/QtDBus>
-
-int main(int argc, char *argv[])
-{
-    QCoreApplication app(argc, argv);
-    QDBusServer server("unix:path=/tmp/qdbus-test");
-    return app.exec();
-}
--- a/tests/auto/qdbusserver/tst_qdbusserver.cpp	Thu May 27 13:40:48 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,78 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-#include <qcoreapplication.h>
-#include <qdebug.h>
-
-#include <QtTest/QtTest>
-#include <QtDBus/QtDBus>
-
-static const QString bus = "unix:path=/tmp/qdbus-test";
-static const QString service = "com.trolltech.Qt.Autotests.QDBusServer";
-static const QString path = "/com/trolltech/test";
-
-class tst_QDBusServer : public QObject
-{
-    Q_OBJECT
-
-    void connectToServer();
-    void callMethod();
-private slots:
-};
-
-void tst_QDBusServer::connectToServer()
-{
-    QDBusConnection connection = QDBusConnection::connectToBus(bus, "test-connection");
-    QTest::qWait(100);
-    QVERIFY(connection.isConnected());
-}
-
-void tst_QDBusServer::callMethod()
-{
-    QDBusConnection connection = QDBusConnection::connectToBus(bus, "test-connection");
-    QTest::qWait(100);
-    QVERIFY(connection.isConnected());
-    //QDBusMessage msg = QDBusMessage::createMethodCall(bus, path, /*service*/"", "method");
-    //QDBusMessage reply = connection.call(msg, QDBus::Block);
-}
-
-QTEST_MAIN(tst_QDBusServer)
-
-#include "tst_qdbusserver.moc"
--- a/tests/auto/qgraphicsview/tst_qgraphicsview.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/qgraphicsview/tst_qgraphicsview.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -3664,6 +3664,22 @@
 #endif
 }
 
+class FocusItem : public QGraphicsRectItem
+{
+public:
+    FocusItem() : QGraphicsRectItem(0, 0, 20, 20) {
+        m_viewHasIMEnabledInFocusInEvent = false;
+    }
+
+    void focusInEvent(QFocusEvent *event)
+    {
+        QGraphicsView *view = scene()->views().first();
+        m_viewHasIMEnabledInFocusInEvent = view->testAttribute(Qt::WA_InputMethodEnabled);
+    }
+
+    bool m_viewHasIMEnabledInFocusInEvent;
+};
+
 void tst_QGraphicsView::inputMethodSensitivity()
 {
     QGraphicsScene scene;
@@ -3673,7 +3689,7 @@
     QApplication::setActiveWindow(&view);
     QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view));
 
-    QGraphicsRectItem *item = new QGraphicsRectItem;
+    FocusItem *item = new FocusItem;
 
     view.setAttribute(Qt::WA_InputMethodEnabled, true);
 
@@ -3702,6 +3718,7 @@
     scene.setFocusItem(item);
     QCOMPARE(scene.focusItem(), static_cast<QGraphicsItem *>(item));
     QCOMPARE(view.testAttribute(Qt::WA_InputMethodEnabled), true);
+    QCOMPARE(item->m_viewHasIMEnabledInFocusInEvent, true);
 
     item->setFlag(QGraphicsItem::ItemAcceptsInputMethod, false);
     QCOMPARE(view.testAttribute(Qt::WA_InputMethodEnabled), false);
@@ -3710,15 +3727,17 @@
     QCOMPARE(view.testAttribute(Qt::WA_InputMethodEnabled), true);
 
     // introduce another item that is focusable but does not accept input methods
-    QGraphicsRectItem *item2 = new QGraphicsRectItem;
+    FocusItem *item2 = new FocusItem;
     item2->setFlag(QGraphicsItem::ItemIsFocusable);
     scene.addItem(item2);
     scene.setFocusItem(item2);
     QCOMPARE(view.testAttribute(Qt::WA_InputMethodEnabled), false);
+    QCOMPARE(item2->m_viewHasIMEnabledInFocusInEvent, false);
     QCOMPARE(scene.focusItem(), static_cast<QGraphicsItem *>(item2));
 
     scene.setFocusItem(item);
     QCOMPARE(view.testAttribute(Qt::WA_InputMethodEnabled), true);
+    QCOMPARE(item->m_viewHasIMEnabledInFocusInEvent, true);
     QCOMPARE(scene.focusItem(), static_cast<QGraphicsItem *>(item));
 
     view.setScene(0);
@@ -3727,10 +3746,12 @@
 
     view.setScene(&scene);
     QCOMPARE(view.testAttribute(Qt::WA_InputMethodEnabled), true);
+    QCOMPARE(item->m_viewHasIMEnabledInFocusInEvent, true);
     QCOMPARE(scene.focusItem(), static_cast<QGraphicsItem *>(item));
 
     scene.setFocusItem(item2);
     QCOMPARE(view.testAttribute(Qt::WA_InputMethodEnabled), false);
+    QCOMPARE(item2->m_viewHasIMEnabledInFocusInEvent, false);
     QCOMPARE(scene.focusItem(), static_cast<QGraphicsItem *>(item2));
 
     view.setScene(0);
@@ -3743,6 +3764,7 @@
 
     view.setScene(&scene);
     QCOMPARE(view.testAttribute(Qt::WA_InputMethodEnabled), true);
+    QCOMPARE(item->m_viewHasIMEnabledInFocusInEvent, true);
     QCOMPARE(scene.focusItem(), static_cast<QGraphicsItem *>(item));
 }
 
--- a/tests/auto/qgraphicswidget/tst_qgraphicswidget.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/qgraphicswidget/tst_qgraphicswidget.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -166,6 +166,7 @@
     void initialShow();
     void initialShow2();
     void itemChangeEvents();
+    void itemSendGeometryPosChangesDeactivated();
 
     // Task fixes
     void task236127_bspTreeIndexFails();
@@ -2972,6 +2973,34 @@
     QTRY_VERIFY(!item->valueDuringEvents.value(QEvent::EnabledChange).toBool());
 }
 
+void tst_QGraphicsWidget::itemSendGeometryPosChangesDeactivated()
+{
+    QGraphicsScene scene;
+    QGraphicsView view(&scene);
+    QGraphicsWidget *item = new QGraphicsWidget;
+    scene.addItem(item);
+    view.show();
+    QTest::qWaitForWindowShown(&view);
+    item->setGeometry(QRectF(0, 0, 50, 50));
+    QTRY_COMPARE(item->geometry(), QRectF(0, 0, 50, 50));
+
+    item->setFlag(QGraphicsItem::ItemSendsGeometryChanges, false);
+    item->setGeometry(QRectF(0, 0, 60, 60));
+    QCOMPARE(item->geometry(), QRectF(0, 0, 60, 60));
+    QCOMPARE(item->pos(), QPointF(0, 0));
+    item->setPos(QPointF(10, 10));
+    QCOMPARE(item->pos(), QPointF(10, 10));
+    QCOMPARE(item->geometry(), QRectF(10, 10, 60, 60));
+
+    item->setFlag(QGraphicsItem::ItemSendsScenePositionChanges, false);
+    item->setGeometry(QRectF(0, 0, 60, 60));
+    QCOMPARE(item->geometry(), QRectF(0, 0, 60, 60));
+    QCOMPARE(item->pos(), QPointF(0, 0));
+    item->setPos(QPointF(10, 10));
+    QCOMPARE(item->pos(), QPointF(10, 10));
+    QCOMPARE(item->geometry(), QRectF(10, 10, 60, 60));
+}
+
 void tst_QGraphicsWidget::QT_BUG_6544_tabFocusFirstUnsetWhenRemovingItems()
 {
     QGraphicsScene scene;
--- a/tests/auto/qhostinfo/qhostinfo.pro	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/qhostinfo/qhostinfo.pro	Fri Jun 11 14:24:45 2010 +0300
@@ -2,7 +2,7 @@
 
 SOURCES  += tst_qhostinfo.cpp
 
-QT = core network core
+QT = core network
 
 wince*: {
   LIBS += ws2.lib
@@ -10,4 +10,8 @@
   win32:LIBS += -lws2_32
 }
 
+symbian: {
+  INCLUDEPATH *= $$MW_LAYER_SYSTEMINCLUDE
+}
 
+
--- a/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -109,6 +109,9 @@
     void getMultipleWithPriorities();
 
     void getEmptyWithPipelining();
+
+    void getAndThenDeleteObject();
+    void getAndThenDeleteObject_data();
 };
 
 tst_QHttpNetworkConnection::tst_QHttpNetworkConnection()
@@ -1033,6 +1036,47 @@
     qDeleteAll(replies);
 }
 
+void tst_QHttpNetworkConnection::getAndThenDeleteObject_data()
+{
+    QTest::addColumn<bool>("replyFirst");
+
+    QTest::newRow("delete-reply-first") << true;
+    QTest::newRow("delete-connection-first") << false;
+}
+
+void tst_QHttpNetworkConnection::getAndThenDeleteObject()
+{
+    // yes, this will leak if the testcase fails. I don't care. It must not fail then :P
+    QHttpNetworkConnection *connection = new QHttpNetworkConnection(QtNetworkSettings::serverName());
+    QHttpNetworkRequest request("http://" + QtNetworkSettings::serverName() + "/qtest/bigfile");
+    QHttpNetworkReply *reply = connection->sendRequest(request);
+    reply->setDownstreamLimited(true);
+
+    QTime stopWatch;
+    stopWatch.start();
+    forever {
+        QCoreApplication::instance()->processEvents();
+        if (reply->bytesAvailable())
+            break;
+        if (stopWatch.elapsed() >= 30000)
+            break;
+    }
+
+    QVERIFY(reply->bytesAvailable());
+    QCOMPARE(reply->statusCode() ,200);
+    QVERIFY(!reply->isFinished()); // must not be finished
+
+    QFETCH(bool, replyFirst);
+
+    if (replyFirst) {
+        delete reply;
+        delete connection;
+    } else {
+        delete connection;
+        delete reply;
+    }
+}
+
 
 
 QTEST_MAIN(tst_QHttpNetworkConnection)
--- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -276,6 +276,9 @@
     void ignoreSslErrorsListWithSlot();
 #endif
 
+    void getAndThenDeleteObject_data();
+    void getAndThenDeleteObject();
+
     // NOTE: This test must be last!
     void parentingRepliesToTheApp();
 };
@@ -4108,6 +4111,50 @@
 
 #endif // QT_NO_OPENSSL
 
+void tst_QNetworkReply::getAndThenDeleteObject_data()
+{
+    QTest::addColumn<bool>("replyFirst");
+
+    QTest::newRow("delete-reply-first") << true;
+    QTest::newRow("delete-qnam-first") << false;
+}
+
+void tst_QNetworkReply::getAndThenDeleteObject()
+{
+    // yes, this will leak if the testcase fails. I don't care. It must not fail then :P
+    QNetworkAccessManager *manager = new QNetworkAccessManager();
+    QNetworkRequest request("http://" + QtNetworkSettings::serverName() + "/qtest/bigfile");
+    QNetworkReply *reply = manager->get(request);
+    reply->setReadBufferSize(1);
+    reply->setParent((QObject*)0); // must be 0 because else it is the manager
+
+    QTime stopWatch;
+    stopWatch.start();
+    forever {
+        QCoreApplication::instance()->processEvents();
+        if (reply->bytesAvailable())
+            break;
+        if (stopWatch.elapsed() >= 30000)
+            break;
+    }
+
+    QVERIFY(reply->bytesAvailable());
+    QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200);
+    QVERIFY(!reply->isFinished()); // must not be finished
+
+    QFETCH(bool, replyFirst);
+
+    if (replyFirst) {
+        delete reply;
+        delete manager;
+    } else {
+        delete manager;
+        delete reply;
+    }
+}
+
+
+
 // NOTE: This test must be last testcase in tst_qnetworkreply!
 void tst_QNetworkReply::parentingRepliesToTheApp()
 {
--- a/tests/auto/qurl/tst_qurl.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/qurl/tst_qurl.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -3189,6 +3189,32 @@
 
     QTest::newRow("separator-3002") << QString::fromUtf8("example\343\200\202com")
                                     << "example.com" << "." << "example.com";
+
+    QString egyptianIDN =
+        QString::fromUtf8("\331\210\330\262\330\247\330\261\330\251\055\330\247\331\204\330"
+                          "\243\330\252\330\265\330\247\331\204\330\247\330\252.\331\205"
+                          "\330\265\330\261");
+    QTest::newRow("egyptian-tld-ace")
+        << "xn----rmckbbajlc6dj7bxne2c.xn--wgbh1c"
+        << "xn----rmckbbajlc6dj7bxne2c.xn--wgbh1c"
+        << "."
+        << egyptianIDN;
+    QTest::newRow("egyptian-tld-unicode")
+        << egyptianIDN
+        << "xn----rmckbbajlc6dj7bxne2c.xn--wgbh1c"
+        << "."
+        << egyptianIDN;
+    QTest::newRow("egyptian-tld-mix1")
+        << QString::fromUtf8("\331\210\330\262\330\247\330\261\330\251\055\330\247\331\204\330"
+                             "\243\330\252\330\265\330\247\331\204\330\247\330\252.xn--wgbh1c")
+        << "xn----rmckbbajlc6dj7bxne2c.xn--wgbh1c"
+        << "."
+        << egyptianIDN;
+    QTest::newRow("egyptian-tld-mix2")
+        << QString::fromUtf8("xn----rmckbbajlc6dj7bxne2c.\331\205\330\265\330\261")
+        << "xn----rmckbbajlc6dj7bxne2c.xn--wgbh1c"
+        << "."
+        << egyptianIDN;
 }
 
 void tst_QUrl::ace_testsuite()
--- a/tests/auto/selftests/expected_assert.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_assert.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0"/>
--- a/tests/auto/selftests/expected_assert.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_assert.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_Assert">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0" />
--- a/tests/auto/selftests/expected_assert.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_assert.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="1" failures="1" tests="3" name="tst_Assert">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase result="pass" name="initTestCase"/>
   <testcase result="pass" name="testNumber1"/>
--- a/tests/auto/selftests/expected_badxml.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_badxml.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0"/>
--- a/tests/auto/selftests/expected_badxml.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_badxml.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_BadXml">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0" />
--- a/tests/auto/selftests/expected_badxml.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_badxml.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="8" failures="5" tests="5" name="tst_BadXml">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase result="pass" name="initTestCase"/>
   <testcase result="fail" name="badDataTag">
--- a/tests/auto/selftests/expected_benchlibcallgrind.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_benchlibcallgrind.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0"/>
--- a/tests/auto/selftests/expected_benchlibcallgrind.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_benchlibcallgrind.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_BenchlibCallgrind">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0" />
--- a/tests/auto/selftests/expected_benchlibcallgrind.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_benchlibcallgrind.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="0" failures="0" tests="3" name="tst_BenchlibCallgrind">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase result="pass" name="initTestCase"/>
   <testcase result="pass" name="twoHundredMillionInstructions">
--- a/tests/auto/selftests/expected_benchlibeventcounter.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_benchlibeventcounter.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0"/>
--- a/tests/auto/selftests/expected_benchlibeventcounter.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_benchlibeventcounter.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_BenchlibEventCounter">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0" />
--- a/tests/auto/selftests/expected_benchlibeventcounter.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_benchlibeventcounter.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="0" failures="0" tests="3" name="tst_BenchlibEventCounter">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase result="pass" name="initTestCase"/>
   <testcase result="pass" name="events">
--- a/tests/auto/selftests/expected_benchliboptions.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_benchliboptions.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0"/>
--- a/tests/auto/selftests/expected_benchliboptions.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_benchliboptions.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_BenchlibOneHundredMinimum">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0" />
--- a/tests/auto/selftests/expected_benchliboptions.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_benchliboptions.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="0" failures="0" tests="3" name="tst_BenchlibOneHundredMinimum">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase result="pass" name="initTestCase"/>
   <testcase result="pass" name="threeEvents">
--- a/tests/auto/selftests/expected_benchlibtickcounter.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_benchlibtickcounter.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0"/>
--- a/tests/auto/selftests/expected_benchlibtickcounter.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_benchlibtickcounter.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_BenchlibTickCounter">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0" />
--- a/tests/auto/selftests/expected_benchlibtickcounter.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_benchlibtickcounter.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="0" failures="0" tests="3" name="tst_BenchlibTickCounter">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase result="pass" name="initTestCase"/>
   <testcase result="pass" name="threeBillionTicks">
--- a/tests/auto/selftests/expected_benchlibwalltime.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_benchlibwalltime.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0"/>
--- a/tests/auto/selftests/expected_benchlibwalltime.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_benchlibwalltime.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_BenchlibWalltime">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0" />
--- a/tests/auto/selftests/expected_benchlibwalltime.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_benchlibwalltime.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="0" failures="0" tests="5" name="tst_BenchlibWalltime">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase result="pass" name="initTestCase"/>
   <testcase result="pass" name="waitForOneThousand">
--- a/tests/auto/selftests/expected_cmptest.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_cmptest.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0"/>
--- a/tests/auto/selftests/expected_cmptest.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_cmptest.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_Cmptest">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0" />
--- a/tests/auto/selftests/expected_cmptest.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_cmptest.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="0" failures="4" tests="5" name="tst_Cmptest">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase result="pass" name="initTestCase"/>
   <testcase result="pass" name="compare_boolfuncs"/>
--- a/tests/auto/selftests/expected_commandlinedata.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_commandlinedata.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0"/>
--- a/tests/auto/selftests/expected_commandlinedata.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_commandlinedata.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_DataTable">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0" />
--- a/tests/auto/selftests/expected_commandlinedata.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_commandlinedata.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="6" failures="0" tests="4" name="tst_DataTable">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase result="pass" name="initTestCase"/>
   <testcase result="pass" name="fiveTablePasses">
--- a/tests/auto/selftests/expected_crashes.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_crashes.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0"/>
--- a/tests/auto/selftests/expected_crashes.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_crashes.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_Crashes">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0" />
--- a/tests/auto/selftests/expected_crashes.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_crashes.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="1" failures="1" tests="2" name="tst_Crashes">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase result="pass" name="initTestCase"/>
   <testcase result="fail" name="crash">
--- a/tests/auto/selftests/expected_datatable.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_datatable.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0"/>
--- a/tests/auto/selftests/expected_datatable.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_datatable.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_DataTable">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0" />
--- a/tests/auto/selftests/expected_datatable.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_datatable.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="0" failures="13" tests="10" name="tst_DataTable">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase result="pass" name="initTestCase"/>
   <testcase result="pass" name="singleTestFunction1"/>
--- a/tests/auto/selftests/expected_datetime.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_datetime.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0"/>
--- a/tests/auto/selftests/expected_datetime.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_datetime.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_DateTime">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0" />
--- a/tests/auto/selftests/expected_datetime.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_datetime.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="0" failures="3" tests="4" name="tst_DateTime">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase result="pass" name="initTestCase"/>
   <testcase result="fail" name="dateTime">
--- a/tests/auto/selftests/expected_exceptionthrow.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_exceptionthrow.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0"/>
--- a/tests/auto/selftests/expected_exceptionthrow.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_exceptionthrow.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_Exception">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0" />
--- a/tests/auto/selftests/expected_exceptionthrow.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_exceptionthrow.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="0" failures="1" tests="2" name="tst_Exception">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase result="pass" name="initTestCase"/>
   <testcase result="fail" name="throwException">
--- a/tests/auto/selftests/expected_expectfail.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_expectfail.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0"/>
--- a/tests/auto/selftests/expected_expectfail.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_expectfail.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_ExpectFail">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0" />
--- a/tests/auto/selftests/expected_expectfail.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_expectfail.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="7" failures="0" tests="5" name="tst_ExpectFail">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase result="pass" name="initTestCase"/>
   <testcase result="xfail" name="expectAndContinue">
--- a/tests/auto/selftests/expected_failinit.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_failinit.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="fail" file="/local/user_builds/qt/4.6/tests/auto/selftests/failinit/tst_failinit.cpp" line="55">
--- a/tests/auto/selftests/expected_failinit.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_failinit.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_FailInit">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="fail" file="/local/user_builds/qt/4.6/tests/auto/selftests/failinit/tst_failinit.cpp" line="55">
--- a/tests/auto/selftests/expected_failinit.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_failinit.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="0" failures="1" tests="2" name="tst_FailInit">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase result="fail" name="initTestCase">
     <failure message="&apos;false&apos; returned FALSE. ()" result="fail"/>
--- a/tests/auto/selftests/expected_failinitdata.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_failinitdata.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="fail" file="/local/user_builds/qt/4.6/tests/auto/selftests/failinitdata/tst_failinitdata.cpp" line="56">
--- a/tests/auto/selftests/expected_failinitdata.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_failinitdata.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_FailInitData">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="fail" file="/local/user_builds/qt/4.6/tests/auto/selftests/failinitdata/tst_failinitdata.cpp" line="56">
--- a/tests/auto/selftests/expected_failinitdata.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_failinitdata.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="0" failures="1" tests="1" name="tst_FailInitData">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase result="fail" name="initTestCase">
     <failure message="&apos;false&apos; returned FALSE. ()" result="fail"/>
--- a/tests/auto/selftests/expected_fetchbogus.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_fetchbogus.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0"/>
--- a/tests/auto/selftests/expected_fetchbogus.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_fetchbogus.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_FetchBogus">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0" />
--- a/tests/auto/selftests/expected_fetchbogus.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_fetchbogus.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="1" failures="1" tests="2" name="tst_FetchBogus">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase result="pass" name="initTestCase"/>
   <testcase result="fail" name="fetchBogus">
--- a/tests/auto/selftests/expected_globaldata.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_globaldata.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0"/>
--- a/tests/auto/selftests/expected_globaldata.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_globaldata.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_Subtest">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0" />
--- a/tests/auto/selftests/expected_globaldata.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_globaldata.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="3" failures="0" tests="6" name="tst_Subtest">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase result="pass" name="initTestCase"/>
   <testcase result="pass" name="testGlobal"/>
--- a/tests/auto/selftests/expected_longstring.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_longstring.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0"/>
--- a/tests/auto/selftests/expected_longstring.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_longstring.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_LongString">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0" />
--- a/tests/auto/selftests/expected_longstring.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_longstring.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="0" failures="1" tests="3" name="tst_LongString">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase result="pass" name="initTestCase"/>
   <testcase result="fail" name="failWithLongString">
--- a/tests/auto/selftests/expected_maxwarnings.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_maxwarnings.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0"/>
--- a/tests/auto/selftests/expected_maxwarnings.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_maxwarnings.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="MaxWarnings">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0" />
--- a/tests/auto/selftests/expected_maxwarnings.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_maxwarnings.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="2002" failures="0" tests="3" name="MaxWarnings">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase result="pass" name="initTestCase"/>
   <testcase result="pass" name="warn">
--- a/tests/auto/selftests/expected_multiexec.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_multiexec.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0"/>
--- a/tests/auto/selftests/expected_multiexec.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_multiexec.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_Nothing">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0" />
--- a/tests/auto/selftests/expected_multiexec.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_multiexec.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="0" failures="0" tests="3" name="tst_Nothing">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase result="pass" name="initTestCase"/>
   <testcase result="pass" name="nothing"/>
--- a/tests/auto/selftests/expected_singleskip.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_singleskip.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0"/>
--- a/tests/auto/selftests/expected_singleskip.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_singleskip.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_SingleSkip">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0" />
--- a/tests/auto/selftests/expected_singleskip.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_singleskip.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="1" failures="0" tests="3" name="tst_SingleSkip">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase result="pass" name="initTestCase"/>
   <testcase name="myTest">
--- a/tests/auto/selftests/expected_skip.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_skip.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0"/>
--- a/tests/auto/selftests/expected_skip.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_skip.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_Skip">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0" />
--- a/tests/auto/selftests/expected_skip.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_skip.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="4" failures="0" tests="5" name="tst_Skip">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase result="pass" name="initTestCase"/>
   <testcase name="test">
--- a/tests/auto/selftests/expected_skipglobal.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_skipglobal.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Message type="skip" file="/local/user_builds/qt/4.6/tests/auto/selftests/skipglobal/tst_skipglobal.cpp" line="72">
--- a/tests/auto/selftests/expected_skipglobal.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_skipglobal.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_SkipGlobal">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Message type="skip" file="/local/user_builds/qt/4.6/tests/auto/selftests/skipglobal/tst_skipglobal.cpp" line="72">
--- a/tests/auto/selftests/expected_skipglobal.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_skipglobal.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="1" failures="0" tests="1" name="tst_SkipGlobal">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase name="initTestCase">
     <!-- message="Skippy Skippy" type="skip" -->
--- a/tests/auto/selftests/expected_skipinit.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_skipinit.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Message type="skip" file="/local/user_builds/qt/4.6/tests/auto/selftests/skipinit/tst_skipinit.cpp" line="55">
--- a/tests/auto/selftests/expected_skipinit.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_skipinit.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_SkipInit">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Message type="skip" file="/local/user_builds/qt/4.6/tests/auto/selftests/skipinit/tst_skipinit.cpp" line="55">
--- a/tests/auto/selftests/expected_skipinit.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_skipinit.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="1" failures="0" tests="2" name="tst_SkipInit">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase name="initTestCase">
     <!-- message="Skip inside initTestCase. This should skip all tests in the class." type="skip" -->
--- a/tests/auto/selftests/expected_skipinitdata.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_skipinitdata.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Message type="skip" file="/local/user_builds/qt/4.6/tests/auto/selftests/skipinitdata/tst_skipinitdata.cpp" line="56">
--- a/tests/auto/selftests/expected_skipinitdata.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_skipinitdata.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_SkipInitData">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Message type="skip" file="/local/user_builds/qt/4.6/tests/auto/selftests/skipinitdata/tst_skipinitdata.cpp" line="56">
--- a/tests/auto/selftests/expected_skipinitdata.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_skipinitdata.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="1" failures="0" tests="1" name="tst_SkipInitData">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase name="initTestCase">
     <!-- message="Skip inside initTestCase. This should skip all tests in the class." type="skip" -->
--- a/tests/auto/selftests/expected_sleep.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_sleep.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0"/>
--- a/tests/auto/selftests/expected_sleep.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_sleep.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_Sleep">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0" />
--- a/tests/auto/selftests/expected_sleep.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_sleep.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="0" failures="0" tests="3" name="tst_Sleep">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase result="pass" name="initTestCase"/>
   <testcase result="pass" name="sleep"/>
--- a/tests/auto/selftests/expected_strcmp.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_strcmp.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0"/>
--- a/tests/auto/selftests/expected_strcmp.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_strcmp.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_StrCmp">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0" />
--- a/tests/auto/selftests/expected_strcmp.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_strcmp.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="3" failures="5" tests="8" name="tst_StrCmp">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase result="pass" name="initTestCase"/>
   <testcase result="pass" name="compareCharStars"/>
--- a/tests/auto/selftests/expected_subtest.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_subtest.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0"/>
--- a/tests/auto/selftests/expected_subtest.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_subtest.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_Subtest">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0" />
--- a/tests/auto/selftests/expected_subtest.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_subtest.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="0" failures="7" tests="7" name="tst_Subtest">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase result="pass" name="initTestCase"/>
   <testcase result="pass" name="test1"/>
--- a/tests/auto/selftests/expected_warnings.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_warnings.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0"/>
--- a/tests/auto/selftests/expected_warnings.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_warnings.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_Warnings">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0" />
--- a/tests/auto/selftests/expected_warnings.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_warnings.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="8" failures="1" tests="4" name="tst_Warnings">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase result="pass" name="initTestCase"/>
   <testcase result="pass" name="testWarnings">
--- a/tests/auto/selftests/expected_xunit.lightxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_xunit.lightxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,6 +1,6 @@
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0"/>
--- a/tests/auto/selftests/expected_xunit.xml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_xunit.xml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <TestCase name="tst_Xunit">
 <Environment>
-    <QtVersion>4.6.3</QtVersion>
-    <QTestVersion>4.6.3</QTestVersion>
+    <QtVersion>@INSERT_QT_VERSION_HERE@</QtVersion>
+    <QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
 </Environment>
 <TestFunction name="initTestCase">
 <Incident type="pass" file="" line="0" />
--- a/tests/auto/selftests/expected_xunit.xunitxml	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/expected_xunit.xunitxml	Fri Jun 11 14:24:45 2010 +0300
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <testsuite errors="5" failures="3" tests="9" name="tst_Xunit">
   <properties>
-    <property value="4.6.3" name="QTestVersion"/>
-    <property value="4.6.3" name="QtVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
+    <property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
   </properties>
   <testcase result="pass" name="initTestCase"/>
   <testcase result="pass" name="testFunc1">
--- a/tests/auto/selftests/tst_selftests.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/selftests/tst_selftests.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -117,19 +117,26 @@
     ba.replace('\r', "");
     QList<QByteArray> out = ba.split('\n');
 
-    // Replace any ` file="..."' in XML with a generic location.
-    static const char marker[] = " file=\"";
+    // Replace any ` file="..."' or ` line="..."'  in XML with a generic location.
+    static const char *markers[][2] = {
+        { " file=\"", " file=\"__FILE__\"" },
+        { " line=\"", " line=\"__LINE__\"" }
+    };
+    static const int markerCount = sizeof markers / sizeof markers[0];
+
     for (int i = 0; i < out.size(); ++i) {
         QByteArray& line = out[i];
-        int index = line.indexOf(marker);
-        if (index == -1) {
-            continue;
+        for (int j = 0; j < markerCount; ++j) {
+            int index = line.indexOf(markers[j][0]);
+            if (index == -1) {
+                continue;
+            }
+            int end = line.indexOf('"', index + strlen(markers[j][0]));
+            if (end == -1) {
+                continue;
+            }
+            line.replace(index, end-index + 1, markers[j][1]);
         }
-        int end = line.indexOf('"', index + sizeof(marker));
-        if (end == -1) {
-            continue;
-        }
-        line.replace(index, end-index, " file=\"__FILE__\"");
     }
 
     return out;
@@ -396,7 +403,7 @@
             continue;
 
         const QString output(QString::fromLatin1(line));
-        const QString expected(QString::fromLatin1(exp.at(i)).replace("<INSERT_QT_VERSION_HERE>", QT_VERSION_STR));
+        const QString expected(QString::fromLatin1(exp.at(i)).replace("@INSERT_QT_VERSION_HERE@", QT_VERSION_STR));
 
         if (line.contains("ASSERT") && output != expected) {
             QEXPECT_FAIL("assert",          "QTestLib prints out the absolute path.", Continue);
@@ -421,7 +428,7 @@
                    Are we expecting this line to be a benchmark result?
                    If so, don't do a literal comparison, since results have some natural variance.
                 */
-                if (benchmark) {
+                if (benchmark || line.startsWith("<BenchmarkResult")) {
                     QString error;
 
                     BenchmarkResult actualResult = BenchmarkResult::parse(output, &error);
@@ -451,6 +458,22 @@
     doRunSubTest(subdir, logger, arguments);
 }
 
+// attribute must contain ="
+QString extractXmlAttribute(const QString &line, const char *attribute)
+{
+    int index = line.indexOf(attribute);
+    if (index == -1)
+        return QString();
+    int end = line.indexOf('"', index + strlen(attribute));
+    if (end == -1)
+        return QString();
+
+    QString result = line.mid(index + strlen(attribute), end - index - strlen(attribute));
+    if (result.isEmpty())
+        return ""; // ensure empty but not null
+    return result;
+}
+
 /* Parse line into the BenchmarkResult it represents. */
 BenchmarkResult BenchmarkResult::parse(QString const& line, QString* error)
 {
@@ -464,6 +487,56 @@
         return out;
     }
 
+    if (line.startsWith("<BenchmarkResult ")) {
+        // XML result
+        // format:
+        //   <BenchmarkResult metric="$unit" tag="$tag" value="$total" iterations="$iterations" />
+        if (!line.endsWith("/>")) {
+            if (error) *error = "unterminated XML";
+            return out;
+        }
+
+        QString unit = extractXmlAttribute(line, " metric=\"");
+        QString sTotal = extractXmlAttribute(line, " value=\"");
+        QString sIterations = extractXmlAttribute(line, " iterations=\"");
+        if (unit.isNull() || sTotal.isNull() || sIterations.isNull()) {
+            if (error) *error = "XML snippet did not contain all required values";
+            return out;
+        }
+
+        bool ok;
+#if QT_VERSION >= 0x040700
+        // Qt 4.7 uses floating point
+        double total = sTotal.toDouble(&ok);
+        if (!ok) {
+            if (error) *error = sTotal + " is not a valid number";
+            return out;
+        }
+        double iterations = sIterations.toDouble(&ok);
+        if (!ok) {
+            if (error) *error = sIterations + " is not a valid number";
+            return out;
+        }
+#else
+        qlonglong total = sTotal.toLongLong(&ok);
+        if (!ok) {
+            if (error) *error = sTotal + " is not a valid integer";
+            return out;
+        }
+        qlonglong iterations = sIterations.toLongLong(&ok);
+        if (!ok) {
+            if (error) *error = sIterations + " is not a valid integer";
+            return out;
+        }
+#endif
+
+        out.unit = unit;
+        out.total = total;
+        out.iterations = iterations;
+        return out;
+    }
+    // Text result
+
     /* This code avoids using a QRegExp because QRegExp might be broken. */
 
     /* Sample format: 4,000 msec per iteration (total: 4000, iterations: 1) */
--- a/tests/auto/xmlpatterns.pro	Thu May 27 13:40:48 2010 +0300
+++ b/tests/auto/xmlpatterns.pro	Fri Jun 11 14:24:45 2010 +0300
@@ -36,6 +36,7 @@
 xmlpatternsdiagnosticsts.depends = xmlpatternssdk
 xmlpatternsview.depends = xmlpatternssdk
 xmlpatternsxslts.depends = xmlpatternssdk
+xmlpatternsxqts.depends = xmlpatternssdk
 xmlpatternsschemats.depends = xmlpatternssdk
 
 !contains(QT_CONFIG, private_tests): SUBDIRS -= \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/translations/qt_he.ts	Fri Jun 11 14:24:45 2010 +0300
@@ -0,0 +1,7781 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+    <name>AudioOutput</name>
+    <message>
+        <location filename="../src/3rdparty/phonon/phonon/audiooutput.cpp" line="+375"/>
+        <source>&lt;html&gt;The audio playback device &lt;b&gt;%1&lt;/b&gt; does not work.&lt;br/&gt;Falling back to &lt;b&gt;%2&lt;/b&gt;.&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+13"/>
+        <source>&lt;html&gt;Switching to the audio playback device &lt;b&gt;%1&lt;/b&gt;&lt;br/&gt;which just became available and has higher preference.&lt;/html&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Revert back to device &apos;%1&apos;</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>CloseButton</name>
+    <message>
+        <location filename="../src/gui/widgets/qtabbar.cpp" line="+2251"/>
+        <source>Close Tab</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>PPDOptionsModel</name>
+    <message>
+        <source>Name</source>
+        <translation type="obsolete">שם</translation>
+    </message>
+</context>
+<context>
+    <name>Phonon::</name>
+    <message>
+        <location filename="../src/3rdparty/phonon/phonon/phononnamespace.cpp" line="+55"/>
+        <source>Notifications</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Music</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Video</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Communication</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Games</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Accessibility</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>Phonon::Gstreamer::Backend</name>
+    <message>
+        <location filename="../src/3rdparty/phonon/gstreamer/backend.cpp" line="+171"/>
+        <source>Warning: You do not seem to have the package gstreamer0.10-plugins-good installed.
+          Some video features have been disabled.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Warning: You do not seem to have the base GStreamer plugins installed.
+          All audio and video support has been disabled</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>Phonon::Gstreamer::MediaObject</name>
+    <message>
+        <location filename="../src/3rdparty/phonon/gstreamer/mediaobject.cpp" line="+90"/>
+        <source>Cannot start playback. 
+
+Check your Gstreamer installation and make sure you 
+have libgstreamer-plugins-base installed.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+113"/>
+        <source>A required codec is missing. You need to install the following codec(s) to play this content: %0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+676"/>
+        <location line="+8"/>
+        <location line="+15"/>
+        <location line="+9"/>
+        <location line="+6"/>
+        <location line="+19"/>
+        <location line="+335"/>
+        <location line="+24"/>
+        <source>Could not open media source.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-403"/>
+        <source>Invalid source type.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+377"/>
+        <source>Could not locate media source.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+10"/>
+        <source>Could not open audio device. The device is already in use.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+13"/>
+        <source>Could not decode media source.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>Phonon::VolumeSlider</name>
+    <message>
+        <location filename="../src/3rdparty/phonon/phonon/volumeslider.cpp" line="+42"/>
+        <location line="+18"/>
+        <source>Volume: %1%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-15"/>
+        <location line="+18"/>
+        <location line="+54"/>
+        <source>Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1%</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>Q3Accel</name>
+    <message>
+        <location filename="../src/qt3support/other/q3accel.cpp" line="+481"/>
+        <source>%1, %2 not defined</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+36"/>
+        <source>Ambiguous %1 not handled</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>Q3DataTable</name>
+    <message>
+        <location filename="../src/qt3support/sql/q3datatable.cpp" line="+285"/>
+        <source>True</source>
+        <translation type="unfinished">אמת</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>False</source>
+        <translation type="unfinished">שקר</translation>
+    </message>
+    <message>
+        <location line="+505"/>
+        <source>Insert</source>
+        <translation type="unfinished">הוסף</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Update</source>
+        <translation type="unfinished">עדכן</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Delete</source>
+        <translation type="unfinished">מחק</translation>
+    </message>
+</context>
+<context>
+    <name>Q3FileDialog</name>
+    <message>
+        <location filename="../src/qt3support/dialogs/q3filedialog.cpp" line="+864"/>
+        <source>Copy or Move a File</source>
+        <translation type="unfinished">העתק או העבר קובץ</translation>
+    </message>
+    <message>
+        <location line="+8"/>
+        <source>Read: %1</source>
+        <translation type="unfinished">קרא: %1</translation>
+    </message>
+    <message>
+        <location line="+6"/>
+        <location line="+30"/>
+        <source>Write: %1</source>
+        <translation type="unfinished">כתוב: %1</translation>
+    </message>
+    <message>
+        <location line="-22"/>
+        <location line="+1575"/>
+        <source>Cancel</source>
+        <translation type="unfinished">ביטול</translation>
+    </message>
+    <message>
+        <location line="-157"/>
+        <location line="+49"/>
+        <location line="+2153"/>
+        <location filename="../src/qt3support/dialogs/q3filedialog_mac.cpp" line="+110"/>
+        <source>All Files (*)</source>
+        <translation type="unfinished">כל הקבצים (*)</translation>
+    </message>
+    <message>
+        <location line="-2089"/>
+        <source>Name</source>
+        <translation type="unfinished">שם</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Size</source>
+        <translation type="unfinished">גודל</translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Type</source>
+        <translation type="unfinished">סוג</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Date</source>
+        <translation type="unfinished">תאריך</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Attributes</source>
+        <translation type="unfinished">מאפיינים</translation>
+    </message>
+    <message>
+        <location line="+35"/>
+        <location line="+2031"/>
+        <source>&amp;OK</source>
+        <translation type="unfinished">&amp;אישור</translation>
+    </message>
+    <message>
+        <location line="-1991"/>
+        <source>Look &amp;in:</source>
+        <translation type="unfinished">&amp;חפש ב:</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <location line="+1981"/>
+        <location line="+16"/>
+        <source>File &amp;name:</source>
+        <translation type="unfinished">&amp;שם הקובץ:</translation>
+    </message>
+    <message>
+        <location line="-1996"/>
+        <source>File &amp;type:</source>
+        <translation type="unfinished">&amp;סוג הקובץ:</translation>
+    </message>
+    <message>
+        <location line="+7"/>
+        <source>Back</source>
+        <translation type="unfinished">אחורה</translation>
+    </message>
+    <message>
+        <location line="+7"/>
+        <source>One directory up</source>
+        <translation type="unfinished">ספריה אחת למעלה</translation>
+    </message>
+    <message>
+        <location line="+9"/>
+        <source>Create New Folder</source>
+        <translation type="unfinished">צור תיקיה חדשה</translation>
+    </message>
+    <message>
+        <location line="+18"/>
+        <source>List View</source>
+        <translation type="unfinished">תצוגת רשימה</translation>
+    </message>
+    <message>
+        <location line="+8"/>
+        <source>Detail View</source>
+        <translation type="unfinished">תצוגת פרטים</translation>
+    </message>
+    <message>
+        <location line="+9"/>
+        <source>Preview File Info</source>
+        <translation type="unfinished">תצוגה מקדימה של פרטי הקובץ</translation>
+    </message>
+    <message>
+        <location line="+23"/>
+        <source>Preview File Contents</source>
+        <translation type="unfinished">תצוגה מקדימה של תוכן הקובץ</translation>
+    </message>
+    <message>
+        <location line="+88"/>
+        <source>Read-write</source>
+        <translation type="unfinished">קריאה-כתיבה</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Read-only</source>
+        <translation type="unfinished">קריאה-בלבד</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Write-only</source>
+        <translation type="unfinished">כתיבה-בלבד</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Inaccessible</source>
+        <translation type="unfinished">לא נגיש</translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Symlink to File</source>
+        <translation type="unfinished">קישור סמלי לקובץ</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Symlink to Directory</source>
+        <translation type="unfinished">קישור סמלי לספריה</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Symlink to Special</source>
+        <translation type="unfinished">קישור סמלי לפריט מיוחד</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>File</source>
+        <translation type="unfinished">קובץ</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Dir</source>
+        <translation type="unfinished">ספריה</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Special</source>
+        <translation type="unfinished">מיוחד</translation>
+    </message>
+    <message>
+        <location line="+704"/>
+        <location line="+2100"/>
+        <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+337"/>
+        <source>Open</source>
+        <translation type="unfinished">פתח</translation>
+    </message>
+    <message>
+        <location line="-1990"/>
+        <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+84"/>
+        <source>Save As</source>
+        <translation type="unfinished">שמירה בשם</translation>
+    </message>
+    <message>
+        <location line="+642"/>
+        <location line="+5"/>
+        <location line="+355"/>
+        <source>&amp;Open</source>
+        <translation type="unfinished">&amp;פתח</translation>
+    </message>
+    <message>
+        <location line="-357"/>
+        <location line="+341"/>
+        <source>&amp;Save</source>
+        <translation type="unfinished">&amp;שמור</translation>
+    </message>
+    <message>
+        <location line="-334"/>
+        <source>&amp;Rename</source>
+        <translation type="unfinished">ש&amp;נה שם</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>&amp;Delete</source>
+        <translation type="unfinished">&amp;מחק</translation>
+    </message>
+    <message>
+        <location line="+20"/>
+        <source>R&amp;eload</source>
+        <translation type="unfinished">&amp;טען מחדש</translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>Sort by &amp;Name</source>
+        <translation type="unfinished">סדר לפי ש&amp;ם</translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Sort by &amp;Size</source>
+        <translation type="unfinished">סדר לפי &amp;גודל</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Sort by &amp;Date</source>
+        <translation type="unfinished">סדר לפי &amp;תאריך</translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>&amp;Unsorted</source>
+        <translation type="unfinished">&amp;ללא סדר</translation>
+    </message>
+    <message>
+        <location line="+15"/>
+        <source>Sort</source>
+        <translation type="unfinished">סדר</translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>Show &amp;hidden files</source>
+        <translation type="unfinished">הצג קבצים &amp;מוסתרים</translation>
+    </message>
+    <message>
+        <location line="+31"/>
+        <source>the file</source>
+        <translation type="unfinished">הקובץ</translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>the directory</source>
+        <translation type="unfinished">הספריה</translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>the symlink</source>
+        <translation type="unfinished">הקישור הסמלי</translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Delete %1</source>
+        <translation type="unfinished">מחק את %1</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>&lt;qt&gt;Are you sure you wish to delete %1 &quot;%2&quot;?&lt;/qt&gt;</source>
+        <translation type="unfinished">&lt;qt&gt;האם אתה בטוח שברצונך למחוק %1 &quot;%2&quot;?&lt;/qt&gt;</translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>&amp;Yes</source>
+        <translation type="unfinished">&amp;כן</translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>&amp;No</source>
+        <translation type="unfinished">&amp;לא</translation>
+    </message>
+    <message>
+        <location line="+36"/>
+        <source>New Folder 1</source>
+        <translation type="unfinished">תיקיה חדשה 1</translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>New Folder</source>
+        <translation type="unfinished">תיקיה חדשה</translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>New Folder %1</source>
+        <translation type="unfinished">תיקיה חדשה %1</translation>
+    </message>
+    <message>
+        <location line="+98"/>
+        <source>Find Directory</source>
+        <translation type="unfinished">חפש ספריה</translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <location line="+108"/>
+        <source>Directories</source>
+        <translation type="unfinished">ספריות</translation>
+    </message>
+    <message>
+        <location line="-2"/>
+        <source>Directory:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+40"/>
+        <location line="+1110"/>
+        <source>Error</source>
+        <translation type="unfinished">שגיאה</translation>
+    </message>
+    <message>
+        <location line="-1109"/>
+        <source>%1
+File not found.
+Check path and filename.</source>
+        <translation type="unfinished">%1
+הקובץ לא נמצא.
+בדוק את הנתיב ואת שם הקובץ.</translation>
+    </message>
+    <message>
+        <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="-289"/>
+        <source>All Files (*.*)</source>
+        <translation type="unfinished">כל הקבצים (*.*)</translation>
+    </message>
+    <message>
+        <location line="+375"/>
+        <source>Open </source>
+        <translation type="unfinished">פתח</translation>
+    </message>
+    <message>
+        <location line="+155"/>
+        <source>Select a Directory</source>
+        <translation type="unfinished">בחר ספריה</translation>
+    </message>
+</context>
+<context>
+    <name>Q3LocalFs</name>
+    <message>
+        <location filename="../src/qt3support/network/q3localfs.cpp" line="+130"/>
+        <location line="+10"/>
+        <source>Could not read directory
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+45"/>
+        <source>Could not create directory
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+34"/>
+        <source>Could not remove file or directory
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+27"/>
+        <source>Could not rename
+%1
+to
+%2</source>
+        <translation type="unfinished">לא ניתן לשנות את השם של
+%1
+אל
+%2</translation>
+    </message>
+    <message>
+        <location line="+25"/>
+        <source>Could not open
+%1</source>
+        <translation type="unfinished">לא ניתן לפתוח את
+%1</translation>
+    </message>
+    <message>
+        <location line="+68"/>
+        <source>Could not write
+%1</source>
+        <translation type="unfinished">לא ניתן לכתוב את
+%1</translation>
+    </message>
+</context>
+<context>
+    <name>Q3MainWindow</name>
+    <message>
+        <location filename="../src/qt3support/widgets/q3mainwindow.cpp" line="+2051"/>
+        <source>Line up</source>
+        <translation type="unfinished">סדר בשורה</translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Customize...</source>
+        <translation type="unfinished">התאמה אישית...</translation>
+    </message>
+</context>
+<context>
+    <name>Q3NetworkProtocol</name>
+    <message>
+        <location filename="../src/qt3support/network/q3networkprotocol.cpp" line="+854"/>
+        <source>Operation stopped by the user</source>
+        <translation type="unfinished">הפעולה הופסקה על ידי המשתמש</translation>
+    </message>
+</context>
+<context>
+    <name>Q3ProgressDialog</name>
+    <message>
+        <location filename="../src/qt3support/dialogs/q3progressdialog.cpp" line="+224"/>
+        <location line="+61"/>
+        <source>Cancel</source>
+        <translation type="unfinished">ביטול</translation>
+    </message>
+</context>
+<context>
+    <name>Q3TabDialog</name>
+    <message>
+        <location filename="../src/qt3support/dialogs/q3tabdialog.cpp" line="+189"/>
+        <location line="+814"/>
+        <source>OK</source>
+        <translation type="unfinished">אישור</translation>
+    </message>
+    <message>
+        <location line="-356"/>
+        <source>Apply</source>
+        <translation type="unfinished">החל</translation>
+    </message>
+    <message>
+        <location line="+43"/>
+        <source>Help</source>
+        <translation type="unfinished">עזרה</translation>
+    </message>
+    <message>
+        <location line="+45"/>
+        <source>Defaults</source>
+        <translation type="unfinished">ברירות מחדל</translation>
+    </message>
+    <message>
+        <location line="+50"/>
+        <source>Cancel</source>
+        <translation type="unfinished">ביטול</translation>
+    </message>
+</context>
+<context>
+    <name>Q3TextEdit</name>
+    <message>
+        <location filename="../src/qt3support/text/q3textedit.cpp" line="+5429"/>
+        <source>&amp;Undo</source>
+        <translation type="unfinished">&amp;בטל</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>&amp;Redo</source>
+        <translation type="unfinished">בצע &amp;שוב</translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Cu&amp;t</source>
+        <translation type="unfinished">&amp;גזור</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>&amp;Copy</source>
+        <translation type="unfinished">הע&amp;תק</translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>&amp;Paste</source>
+        <translation type="unfinished">ה&amp;דבק</translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Clear</source>
+        <translation type="unfinished">נקה</translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <location line="+2"/>
+        <source>Select All</source>
+        <translation type="unfinished">בחר הכל</translation>
+    </message>
+</context>
+<context>
+    <name>Q3TitleBar</name>
+    <message>
+        <location filename="../src/plugins/accessible/compat/q3complexwidgets.cpp" line="+246"/>
+        <source>System</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Restore up</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Minimize</source>
+        <translation type="unfinished">מזער</translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Restore down</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Maximize</source>
+        <translation type="unfinished">הגדל</translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Close</source>
+        <translation type="unfinished">סגור</translation>
+    </message>
+    <message>
+        <location line="+18"/>
+        <source>Contains commands to manipulate the window</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Puts a minimized back to normal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Moves the window out of the way</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Puts a maximized window back to normal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Makes the window full screen</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Closes the window</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Displays the name of the window and contains controls to manipulate it</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>Q3ToolBar</name>
+    <message>
+        <location filename="../src/qt3support/widgets/q3toolbar.cpp" line="+692"/>
+        <source>More...</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>Q3UrlOperator</name>
+    <message>
+        <location filename="../src/qt3support/network/q3urloperator.cpp" line="+386"/>
+        <location line="+260"/>
+        <location line="+4"/>
+        <source>The protocol `%1&apos; is not supported</source>
+        <translation type="unfinished">הפרוטוקול &quot;%1&quot; אינו נתמך</translation>
+    </message>
+    <message>
+        <location line="-260"/>
+        <source>The protocol `%1&apos; does not support listing directories</source>
+        <translation type="unfinished">הפרוטוקול &quot;%1&quot; לא תומך בהצגת ספריות</translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>The protocol `%1&apos; does not support creating new directories</source>
+        <translation type="unfinished">הפרוטוקול &quot;%1&quot; לא תומך ביצירת ספריית חדשות</translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>The protocol `%1&apos; does not support removing files or directories</source>
+        <translation type="unfinished">הפרוטוקול &quot;%1&quot; לא תומך בהסרת קבצים או ספריות</translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>The protocol `%1&apos; does not support renaming files or directories</source>
+        <translation type="unfinished">הפרוטוקול &quot;%1&quot; לא תומך בשינוי שמותיהם של קבצים או ספריות</translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>The protocol `%1&apos; does not support getting files</source>
+        <translation type="unfinished">הפרוטוקול &quot;%1&quot; לא תומך בהורדת קבצים</translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>The protocol `%1&apos; does not support putting files</source>
+        <translation type="unfinished">הפרוטוקול &quot;%1&quot; לא תומך בהעלאת קבצים</translation>
+    </message>
+    <message>
+        <location line="+243"/>
+        <location line="+4"/>
+        <source>The protocol `%1&apos; does not support copying or moving files or directories</source>
+        <translation type="unfinished">הפרוטוקול &quot;%1&quot; לא תומך בהעתקה או העברה של קבצים או ספריות</translation>
+    </message>
+    <message>
+        <location line="+237"/>
+        <location line="+1"/>
+        <source>(unknown)</source>
+        <translation type="unfinished">(לא ידוע)</translation>
+    </message>
+</context>
+<context>
+    <name>Q3Wizard</name>
+    <message>
+        <location filename="../src/qt3support/dialogs/q3wizard.cpp" line="+177"/>
+        <source>&amp;Cancel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>&lt; &amp;Back</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>&amp;Next &gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>&amp;Finish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>&amp;Help</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QAbstractSocket</name>
+    <message>
+        <location filename="../src/network/socket/qabstractsocket.cpp" line="+868"/>
+        <location filename="../src/network/socket/qhttpsocketengine.cpp" line="+615"/>
+        <location filename="../src/network/socket/qsocks5socketengine.cpp" line="+657"/>
+        <location line="+26"/>
+        <source>Host not found</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+50"/>
+        <location filename="../src/network/socket/qhttpsocketengine.cpp" line="+3"/>
+        <location filename="../src/network/socket/qsocks5socketengine.cpp" line="+4"/>
+        <source>Connection refused</source>
+        <translation type="unfinished">החיבור נדחה</translation>
+    </message>
+    <message>
+        <location line="+141"/>
+        <source>Connection timed out</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-547"/>
+        <location line="+787"/>
+        <location line="+208"/>
+        <source>Operation on socket is not supported</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+137"/>
+        <source>Socket operation timed out</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+380"/>
+        <source>Socket is not connected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/network/socket/qsocks5socketengine.cpp" line="-8"/>
+        <source>Network unreachable</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QAbstractSpinBox</name>
+    <message>
+        <location filename="../src/gui/widgets/qabstractspinbox.cpp" line="+1199"/>
+        <source>&amp;Step up</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Step &amp;down</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-8"/>
+        <source>&amp;Select All</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QApplication</name>
+    <message>
+        <location filename="../src/gui/kernel/qapplication.cpp" line="+2248"/>
+        <source>QT_LAYOUT_DIRECTION</source>
+        <comment>Translate this string to the string &apos;LTR&apos; in left-to-right languages or to &apos;RTL&apos; in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment>
+        <translation>RTL</translation>
+    </message>
+    <message>
+        <location filename="../src/gui/dialogs/qmessagebox.h" line="+352"/>
+        <source>Executable &apos;%1&apos; requires Qt %2, found Qt %3.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Incompatible Qt Library Error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/gui/accessible/qaccessibleobject.cpp" line="+376"/>
+        <source>Activate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Activates the program&apos;s main window</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QAxSelect</name>
+    <message>
+        <location filename="../src/activeqt/container/qaxselect.ui"/>
+        <source>Select ActiveX Control</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>OK</source>
+        <translation type="unfinished">אישור</translation>
+    </message>
+    <message>
+        <location/>
+        <source>&amp;Cancel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>COM &amp;Object:</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QCheckBox</name>
+    <message>
+        <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="+114"/>
+        <source>Uncheck</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Check</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Toggle</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QColorDialog</name>
+    <message>
+        <location filename="../src/gui/dialogs/qcolordialog.cpp" line="+1253"/>
+        <source>Hu&amp;e:</source>
+        <translation>&amp;גוון:</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>&amp;Sat:</source>
+        <translation>&amp;הרוויה:</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>&amp;Val:</source>
+        <translation>&amp;ערך:</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>&amp;Red:</source>
+        <translation>&amp;אדום:</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>&amp;Green:</source>
+        <translation>&amp;ירוק:</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Bl&amp;ue:</source>
+        <translation>&amp;כחול:</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>A&amp;lpha channel:</source>
+        <translation>ע&amp;רוץ אלפא:</translation>
+    </message>
+    <message>
+        <location line="+101"/>
+        <source>Select Color</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+137"/>
+        <source>&amp;Basic colors</source>
+        <translation>&amp;צבעים בסיסיים</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>&amp;Custom colors</source>
+        <translation>צבעים &amp;מותאמים אישית</translation>
+    </message>
+    <message>
+        <source>&amp;Define Custom Colors &gt;&gt;</source>
+        <translation type="obsolete">&amp;הגדר צבעים מותאמים אישית &gt;&gt;</translation>
+    </message>
+    <message>
+        <source>OK</source>
+        <translation type="obsolete">אישור</translation>
+    </message>
+    <message>
+        <source>Cancel</source>
+        <translation type="obsolete">ביטול</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>&amp;Add to Custom Colors</source>
+        <translation>ה&amp;וסף לצבעים מותאמים אישית</translation>
+    </message>
+    <message>
+        <source>Select color</source>
+        <translation type="obsolete">בחירת צבע</translation>
+    </message>
+</context>
+<context>
+    <name>QComboBox</name>
+    <message>
+        <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="+1771"/>
+        <location line="+65"/>
+        <source>Open</source>
+        <translation type="unfinished">פתח</translation>
+    </message>
+    <message>
+        <location filename="../src/gui/itemviews/qitemeditorfactory.cpp" line="+544"/>
+        <source>False</source>
+        <translation type="unfinished">שקר</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>True</source>
+        <translation type="unfinished">אמת</translation>
+    </message>
+    <message>
+        <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="+0"/>
+        <source>Close</source>
+        <translation type="unfinished">סגור</translation>
+    </message>
+</context>
+<context>
+    <name>QCoreApplication</name>
+    <message>
+        <location filename="../src/corelib/kernel/qsystemsemaphore_unix.cpp" line="+119"/>
+        <source>%1: key is empty</source>
+        <comment>QSystemSemaphore</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+12"/>
+        <source>%1: unable to make key</source>
+        <comment>QSystemSemaphore</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+9"/>
+        <source>%1: ftok failed</source>
+        <comment>QSystemSemaphore</comment>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QDB2Driver</name>
+    <message>
+        <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+1276"/>
+        <source>Unable to connect</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+303"/>
+        <source>Unable to commit transaction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+17"/>
+        <source>Unable to rollback transaction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+15"/>
+        <source>Unable to set autocommit</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QDB2Result</name>
+    <message>
+        <location line="-1043"/>
+        <location line="+243"/>
+        <source>Unable to execute statement</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-206"/>
+        <source>Unable to prepare statement</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+196"/>
+        <source>Unable to bind variable</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+92"/>
+        <source>Unable to fetch record %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+17"/>
+        <source>Unable to fetch next</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+20"/>
+        <source>Unable to fetch first</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QDateTimeEdit</name>
+    <message>
+        <location filename="../src/gui/widgets/qdatetimeedit.cpp" line="+2295"/>
+        <source>AM</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>am</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>PM</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>pm</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QDial</name>
+    <message>
+        <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+951"/>
+        <source>QDial</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>SpeedoMeter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>SliderHandle</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QDialog</name>
+    <message>
+        <location filename="../src/gui/dialogs/qdialog.cpp" line="+597"/>
+        <source>What&apos;s This?</source>
+        <translation>מה זה?</translation>
+    </message>
+    <message>
+        <location line="-115"/>
+        <source>Done</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QDialogButtonBox</name>
+    <message>
+        <location filename="../src/gui/dialogs/qmessagebox.cpp" line="+1866"/>
+        <location line="+464"/>
+        <location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="+561"/>
+        <source>OK</source>
+        <translation type="unfinished">אישור</translation>
+    </message>
+    <message>
+        <location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="+3"/>
+        <source>Save</source>
+        <translation type="unfinished">שמור</translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>&amp;Save</source>
+        <translation type="unfinished">&amp;שמור</translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Open</source>
+        <translation type="unfinished">פתח</translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Cancel</source>
+        <translation type="unfinished">ביטול</translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>&amp;Cancel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Close</source>
+        <translation type="unfinished">סגור</translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>&amp;Close</source>
+        <translation type="unfinished">&amp;סגור</translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Apply</source>
+        <translation type="unfinished">החל</translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Reset</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Help</source>
+        <translation type="unfinished">עזרה</translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>Don&apos;t Save</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>Discard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>&amp;Yes</source>
+        <translation type="unfinished">&amp;כן</translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Yes to &amp;All</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>&amp;No</source>
+        <translation type="unfinished">&amp;לא</translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>N&amp;o to All</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Save All</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Abort</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Retry</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Ignore</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Restore Defaults</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-29"/>
+        <source>Close without Saving</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-27"/>
+        <source>&amp;OK</source>
+        <translation type="unfinished">&amp;אישור</translation>
+    </message>
+</context>
+<context>
+    <name>QDirModel</name>
+    <message>
+        <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+453"/>
+        <source>Name</source>
+        <translation type="unfinished">שם</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Size</source>
+        <translation type="unfinished">גודל</translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Kind</source>
+        <comment>Match OS X Finder</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Type</source>
+        <comment>All other platforms</comment>
+        <translation type="unfinished">סוג</translation>
+    </message>
+    <message>
+        <location line="+6"/>
+        <source>Date Modified</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QDockWidget</name>
+    <message>
+        <location filename="../src/plugins/accessible/widgets/qaccessiblewidgets.cpp" line="+1239"/>
+        <source>Close</source>
+        <translation type="unfinished">סגור</translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Dock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Float</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QDoubleSpinBox</name>
+    <message>
+        <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-537"/>
+        <source>More</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Less</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QErrorMessage</name>
+    <message>
+        <location filename="../src/gui/dialogs/qerrormessage.cpp" line="+391"/>
+        <source>&amp;Show this message again</source>
+        <translation>&amp;הצג הודעה זו שנית</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>&amp;OK</source>
+        <translation>&amp;אישור</translation>
+    </message>
+    <message>
+        <location line="-200"/>
+        <source>Debug Message:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Warning:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Fatal Error:</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QFile</name>
+    <message>
+        <location filename="../src/corelib/io/qfile.cpp" line="+708"/>
+        <location line="+141"/>
+        <source>Destination file exists</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-108"/>
+        <source>Cannot remove source file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+120"/>
+        <source>Cannot open %1 for input</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+17"/>
+        <source>Cannot open for output</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+10"/>
+        <source>Failure to write block</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+13"/>
+        <source>Cannot create %1 for output</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QFileDialog</name>
+    <message>
+        <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+515"/>
+        <location line="+444"/>
+        <source>All Files (*)</source>
+        <translation>כל הקבצים (*)</translation>
+    </message>
+    <message>
+        <location filename="../src/gui/dialogs/qfiledialog.ui"/>
+        <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
+        <source>Back</source>
+        <translation type="unfinished">אחורה</translation>
+    </message>
+    <message>
+        <location/>
+        <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
+        <source>List View</source>
+        <translation type="unfinished">תצוגת רשימה</translation>
+    </message>
+    <message>
+        <location/>
+        <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
+        <source>Detail View</source>
+        <translation type="unfinished">תצוגת פרטים</translation>
+    </message>
+    <message>
+        <location filename="../src/gui/itemviews/qfileiconprovider.cpp" line="+414"/>
+        <location line="+1"/>
+        <source>File</source>
+        <translation type="unfinished">קובץ</translation>
+    </message>
+    <message>
+        <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-461"/>
+        <source>Open</source>
+        <translation>פתח</translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Save As</source>
+        <translation type="unfinished">שמירה בשם</translation>
+    </message>
+    <message>
+        <location line="+678"/>
+        <location line="+50"/>
+        <location line="+1471"/>
+        <location line="+75"/>
+        <source>&amp;Open</source>
+        <translation>&amp;פתח</translation>
+    </message>
+    <message>
+        <location line="-1596"/>
+        <location line="+50"/>
+        <source>&amp;Save</source>
+        <translation>&amp;שמור</translation>
+    </message>
+    <message>
+        <location line="-699"/>
+        <source>&amp;Rename</source>
+        <translation type="unfinished">ש&amp;נה שם</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>&amp;Delete</source>
+        <translation type="unfinished">&amp;מחק</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Show &amp;hidden files</source>
+        <translation type="unfinished">הצג קבצים &amp;מוסתרים</translation>
+    </message>
+    <message>
+        <location line="+1964"/>
+        <source>New Folder</source>
+        <translation type="unfinished">תיקיה חדשה</translation>
+    </message>
+    <message>
+        <location line="-1999"/>
+        <source>Find Directory</source>
+        <translation type="unfinished">חפש ספריה</translation>
+    </message>
+    <message>
+        <location line="+685"/>
+        <source>Directories</source>
+        <translation>ספריות</translation>
+    </message>
+    <message>
+        <location filename="../src/gui/dialogs/qfiledialog_win.cpp" line="+160"/>
+        <source>All Files (*.*)</source>
+        <translation type="unfinished">כל הקבצים (*.*)</translation>
+    </message>
+    <message>
+        <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+832"/>
+        <source>%1 already exists.
+Do you want to replace it?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+20"/>
+        <source>%1
+File not found.
+Please verify the correct file name was given.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+402"/>
+        <source>My Computer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/gui/dialogs/qfiledialog.ui"/>
+        <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
+        <source>Parent Directory</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
+        <source>Files of type:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-1496"/>
+        <location line="+648"/>
+        <source>Directory:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+794"/>
+        <location line="+862"/>
+        <source>%1
+Directory not found.
+Please verify the correct directory name was given.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-218"/>
+        <source>&apos;%1&apos; is write protected.
+Do you want to delete it anyway?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Are sure you want to delete &apos;%1&apos;?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+15"/>
+        <source>Could not delete directory.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+407"/>
+        <source>Recent Places</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/gui/itemviews/qfileiconprovider.cpp" line="-4"/>
+        <source>Drive</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+33"/>
+        <source>Unknown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-2525"/>
+        <source>Show </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/gui/dialogs/qfiledialog.ui"/>
+        <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
+        <source>Forward</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+7"/>
+        <source>&amp;New Folder</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+656"/>
+        <location line="+38"/>
+        <source>&amp;Choose</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/gui/dialogs/qsidebar.cpp" line="+418"/>
+        <source>Remove</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-687"/>
+        <location line="+652"/>
+        <source>File &amp;name:</source>
+        <translation type="unfinished">&amp;שם הקובץ:</translation>
+    </message>
+    <message>
+        <location filename="../src/gui/dialogs/qfiledialog.ui"/>
+        <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
+        <source>Look in:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
+        <source>Create New Folder</source>
+        <translation type="unfinished">צור תיקיה חדשה</translation>
+    </message>
+</context>
+<context>
+    <name>QFileSystemModel</name>
+    <message>
+        <location filename="../src/gui/dialogs/qfilesystemmodel.cpp" line="+744"/>
+        <source>%1 TB</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>%1 GB</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>%1 MB</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>%1 KB</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>%1 bytes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+77"/>
+        <source>Invalid filename</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>&lt;b&gt;The name &quot;%1&quot; can not be used.&lt;/b&gt;&lt;p&gt;Try using another name, with fewer characters or no punctuations marks.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+63"/>
+        <source>Name</source>
+        <translation type="unfinished">שם</translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Size</source>
+        <translation type="unfinished">גודל</translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>Kind</source>
+        <comment>Match OS X Finder</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Type</source>
+        <comment>All other platforms</comment>
+        <translation type="unfinished">סוג</translation>
+    </message>
+    <message>
+        <location line="+7"/>
+        <source>Date Modified</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/gui/dialogs/qfilesystemmodel_p.h" line="+234"/>
+        <source>My Computer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Computer</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QFontDatabase</name>
+    <message>
+        <location filename="../src/gui/text/qfontdatabase.cpp" line="+90"/>
+        <location line="+1176"/>
+        <source>Normal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-1173"/>
+        <location line="+12"/>
+        <location line="+1149"/>
+        <source>Bold</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-1158"/>
+        <location line="+1160"/>
+        <source>Demi Bold</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-1157"/>
+        <location line="+18"/>
+        <location line="+1135"/>
+        <source>Black</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-1145"/>
+        <source>Demi</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+6"/>
+        <location line="+1145"/>
+        <source>Light</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-1004"/>
+        <location line="+1007"/>
+        <source>Italic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-1004"/>
+        <location line="+1006"/>
+        <source>Oblique</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+705"/>
+        <source>Any</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Latin</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Greek</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Cyrillic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Armenian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Hebrew</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Arabic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Syriac</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Thaana</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Devanagari</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Bengali</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Gurmukhi</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Gujarati</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Oriya</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Tamil</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Telugu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Kannada</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Malayalam</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Sinhala</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Thai</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Lao</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Tibetan</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Myanmar</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Georgian</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Khmer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Simplified Chinese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Traditional Chinese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Japanese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Korean</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Vietnamese</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Symbol</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Ogham</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Runic</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QFontDialog</name>
+    <message>
+        <location filename="../src/gui/dialogs/qfontdialog.cpp" line="+772"/>
+        <source>&amp;Font</source>
+        <translation>&amp;גופן</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Font st&amp;yle</source>
+        <translation>&amp;סגנון גופן</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>&amp;Size</source>
+        <translation>גו&amp;דל</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Effects</source>
+        <translation>אפקטים</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Stri&amp;keout</source>
+        <translation>קו &amp;חוצה</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>&amp;Underline</source>
+        <translation>קו &amp;תחתי</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Sample</source>
+        <translation>דוגמה</translation>
+    </message>
+    <message>
+        <location line="-603"/>
+        <location line="+247"/>
+        <source>Select Font</source>
+        <translation>בחר גופן</translation>
+    </message>
+    <message>
+        <location line="+357"/>
+        <source>Wr&amp;iting System</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QFtp</name>
+    <message>
+        <location filename="../src/qt3support/network/q3ftp.cpp" line="+2303"/>
+        <source>Host %1 found</source>
+        <translation type="unfinished">המארח %1 נמצא</translation>
+    </message>
+    <message>
+        <location line="+7"/>
+        <source>Host found</source>
+        <translation type="unfinished">המארח נמצא</translation>
+    </message>
+    <message>
+        <location filename="../src/network/access/qftp.cpp" line="+1003"/>
+        <location filename="../src/qt3support/network/q3ftp.cpp" line="-1456"/>
+        <location line="+1451"/>
+        <source>Connected to host %1</source>
+        <translation>מחובר למארח %1</translation>
+    </message>
+    <message>
+        <location filename="../src/qt3support/network/q3ftp.cpp" line="+7"/>
+        <source>Connected to host</source>
+        <translation type="unfinished">מחובר למארח</translation>
+    </message>
+    <message>
+        <location line="-5"/>
+        <source>Connection to %1 closed</source>
+        <translation type="unfinished">החיבור אל %1 נסגר</translation>
+    </message>
+    <message>
+        <location filename="../src/network/access/qftp.cpp" line="+1375"/>
+        <location filename="../src/qt3support/network/q3ftp.cpp" line="-243"/>
+        <location line="+250"/>
+        <source>Connection closed</source>
+        <translation>החיבור נסגר</translation>
+    </message>
+    <message>
+        <location line="-1487"/>
+        <location filename="../src/qt3support/network/q3ftp.cpp" line="-1566"/>
+        <source>Host %1 not found</source>
+        <translation type="unfinished">המארח %1 לא נמצא</translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <location filename="../src/qt3support/network/q3ftp.cpp" line="+4"/>
+        <source>Connection refused to host %1</source>
+        <translation type="unfinished">החיבור אל המארח %1 נדחה</translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>Connection timed out to host %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+501"/>
+        <location line="+29"/>
+        <location filename="../src/qt3support/network/q3ftp.cpp" line="+458"/>
+        <location line="+728"/>
+        <source>Unknown error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+889"/>
+        <location filename="../src/qt3support/network/q3ftp.cpp" line="+77"/>
+        <source>Connecting to host failed:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
+        <source>Login failed:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
+        <source>Listing directory failed:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
+        <source>Changing directory failed:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
+        <source>Downloading file failed:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
+        <source>Uploading file failed:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
+        <source>Removing file failed:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
+        <source>Creating directory failed:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
+        <source>Removing directory failed:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-1524"/>
+        <location filename="../src/qt3support/network/q3ftp.cpp" line="-1356"/>
+        <source>Not connected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+396"/>
+        <location filename="../src/qt3support/network/q3ftp.cpp" line="+332"/>
+        <source>Connection refused for data connection</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QHostInfo</name>
+    <message>
+        <location filename="../src/network/kernel/qhostinfo_p.h" line="+183"/>
+        <source>Unknown error</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QHostInfoAgent</name>
+    <message>
+        <location filename="../src/network/kernel/qhostinfo_unix.cpp" line="+178"/>
+        <location line="+9"/>
+        <location line="+64"/>
+        <location line="+31"/>
+        <location filename="../src/network/kernel/qhostinfo_win.cpp" line="+180"/>
+        <location line="+9"/>
+        <location line="+40"/>
+        <location line="+27"/>
+        <source>Host not found</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-44"/>
+        <location line="+39"/>
+        <location filename="../src/network/kernel/qhostinfo_win.cpp" line="-34"/>
+        <location line="+29"/>
+        <source>Unknown address type</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+8"/>
+        <location filename="../src/network/kernel/qhostinfo_win.cpp" line="-19"/>
+        <location line="+27"/>
+        <source>Unknown error</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QHttp</name>
+    <message>
+        <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+876"/>
+        <location filename="../src/qt3support/network/q3http.cpp" line="+1836"/>
+        <source>Connection refused</source>
+        <translation>החיבור נדחה</translation>
+    </message>
+    <message>
+        <location filename="../src/network/access/qhttp.cpp" line="+2631"/>
+        <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-4"/>
+        <location filename="../src/qt3support/network/q3http.cpp" line="+3"/>
+        <source>Host %1 not found</source>
+        <translation>המארח %1 לא נמצא</translation>
+    </message>
+    <message>
+        <location line="-62"/>
+        <location filename="../src/qt3support/network/q3http.cpp" line="-45"/>
+        <source>Wrong content length</source>
+        <translation>אורך תוכן שגוי</translation>
+    </message>
+    <message>
+        <location line="-2204"/>
+        <source>HTTPS connection requested but SSL support not compiled in</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2286"/>
+        <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+10"/>
+        <location line="+19"/>
+        <location filename="../src/qt3support/network/q3http.cpp" line="+48"/>
+        <source>HTTP request failed</source>
+        <translation>בקשת ה-HTTP נכשלה</translation>
+    </message>
+    <message>
+        <location filename="../src/qt3support/network/q3http.cpp" line="+450"/>
+        <source>Host %1 found</source>
+        <translation type="unfinished">המארח %1 נמצא</translation>
+    </message>
+    <message>
+        <location line="+14"/>
+        <source>Host found</source>
+        <translation type="unfinished">המארח נמצא</translation>
+    </message>
+    <message>
+        <location line="-11"/>
+        <source>Connected to host %1</source>
+        <translation type="unfinished">מחובר למארח %1</translation>
+    </message>
+    <message>
+        <location line="+14"/>
+        <source>Connected to host</source>
+        <translation type="unfinished">מחובר למארח</translation>
+    </message>
+    <message>
+        <location line="-11"/>
+        <source>Connection to %1 closed</source>
+        <translation type="unfinished">החיבור אל %1 נסגר</translation>
+    </message>
+    <message>
+        <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-22"/>
+        <location filename="../src/qt3support/network/q3http.cpp" line="+14"/>
+        <source>Connection closed</source>
+        <translation type="unfinished">החיבור נסגר</translation>
+    </message>
+    <message>
+        <location filename="../src/network/access/qhttp.cpp" line="-1077"/>
+        <location line="+820"/>
+        <location filename="../src/qt3support/network/q3http.cpp" line="-1152"/>
+        <location line="+567"/>
+        <source>Unknown error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-568"/>
+        <location filename="../src/qt3support/network/q3http.cpp" line="-370"/>
+        <source>Request aborted</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+579"/>
+        <location filename="../src/qt3support/network/q3http.cpp" line="+381"/>
+        <source>No server set to connect to</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+168"/>
+        <location filename="../src/qt3support/network/q3http.cpp" line="+60"/>
+        <source>Server closed connection unexpectedly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+151"/>
+        <location filename="../src/qt3support/network/q3http.cpp" line="+113"/>
+        <source>Invalid HTTP response header</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+28"/>
+        <source>Unknown authentication method</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+97"/>
+        <location line="+48"/>
+        <location filename="../src/qt3support/network/q3http.cpp" line="+40"/>
+        <location line="+47"/>
+        <source>Invalid HTTP chunked body</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+38"/>
+        <source>Error writing response to device</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-173"/>
+        <source>Proxy authentication required</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>Authentication required</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-138"/>
+        <source>Connection refused (or timed out)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+6"/>
+        <source>Proxy requires authentication</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Host requires authentication</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Data corrupted</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Unknown protocol specified</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>SSL handshake failed</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QHttpSocketEngine</name>
+    <message>
+        <location filename="../src/network/socket/qhttpsocketengine.cpp" line="-89"/>
+        <source>Did not receive HTTP response from proxy</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+25"/>
+        <source>Error parsing authentication request from proxy</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+31"/>
+        <source>Authentication required</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+27"/>
+        <source>Proxy denied connection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+10"/>
+        <source>Error communicating with HTTP proxy</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+23"/>
+        <source>Proxy server not found</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Proxy connection refused</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Proxy server connection timed out</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Proxy connection closed prematurely</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QIBaseDriver</name>
+    <message>
+        <location filename="../src/sql/drivers/ibase/qsql_ibase.cpp" line="+1428"/>
+        <source>Error opening database</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+54"/>
+        <source>Could not start transaction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+13"/>
+        <source>Unable to commit transaction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+13"/>
+        <source>Unable to rollback transaction</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QIBaseResult</name>
+    <message>
+        <location line="-1097"/>
+        <source>Unable to create BLOB</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+6"/>
+        <source>Unable to write BLOB</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+14"/>
+        <source>Unable to open BLOB</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+16"/>
+        <source>Unable to read BLOB</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+125"/>
+        <location line="+189"/>
+        <source>Could not find array</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-157"/>
+        <source>Could not get array data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+212"/>
+        <source>Could not get query info</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+20"/>
+        <source>Could not start transaction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+19"/>
+        <source>Unable to commit transaction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+33"/>
+        <source>Could not allocate statement</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Could not prepare statement</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <location line="+7"/>
+        <source>Could not describe input statement</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+10"/>
+        <source>Could not describe statement</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+115"/>
+        <source>Unable to close statement</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+8"/>
+        <source>Unable to execute query</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+46"/>
+        <source>Could not fetch next item</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+160"/>
+        <source>Could not get statement info</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QIODevice</name>
+    <message>
+        <location filename="../src/corelib/global/qglobal.cpp" line="+1869"/>
+        <source>Permission denied</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Too many open files</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>No such file or directory</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>No space left on device</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/corelib/io/qiodevice.cpp" line="+1536"/>
+        <source>Unknown error</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QInputContext</name>
+    <message>
+        <location filename="../src/gui/inputmethod/qinputcontextfactory.cpp" line="+242"/>
+        <source>XIM</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+23"/>
+        <source>XIM input method</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>Windows input method</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>Mac OS X input method</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QInputDialog</name>
+    <message>
+        <location filename="../src/gui/dialogs/qinputdialog.cpp" line="+223"/>
+        <source>Enter a value:</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QLibrary</name>
+    <message>
+        <location filename="../src/corelib/plugin/qlibrary.cpp" line="+378"/>
+        <source>Could not mmap &apos;%1&apos;: %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+22"/>
+        <source>Plugin verification data mismatch in &apos;%1&apos;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+6"/>
+        <source>Could not unmap &apos;%1&apos;: %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+302"/>
+        <source>The plugin &apos;%1&apos; uses incompatible Qt library. (%2.%3.%4) [%5]</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+20"/>
+        <source>The plugin &apos;%1&apos; uses incompatible Qt library. Expected build key &quot;%2&quot;, got &quot;%3&quot;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+340"/>
+        <source>Unknown error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-377"/>
+        <location filename="../src/corelib/plugin/qpluginloader.cpp" line="+280"/>
+        <source>The shared library was not found.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>The file &apos;%1&apos; is not a valid Qt plugin.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+43"/>
+        <source>The plugin &apos;%1&apos; uses incompatible Qt library. (Cannot mix debug and release libraries.)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/corelib/plugin/qlibrary_unix.cpp" line="+209"/>
+        <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+99"/>
+        <source>Cannot load library %1: %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+16"/>
+        <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+26"/>
+        <source>Cannot unload library %1: %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+31"/>
+        <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+15"/>
+        <source>Cannot resolve symbol &quot;%1&quot; in %2: %3</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QLineEdit</name>
+    <message>
+        <location filename="../src/gui/widgets/qlineedit.cpp" line="+2680"/>
+        <source>&amp;Undo</source>
+        <translation type="unfinished">&amp;בטל</translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>&amp;Redo</source>
+        <translation type="unfinished">בצע &amp;שוב</translation>
+    </message>
+    <message>
+        <location line="+7"/>
+        <source>Cu&amp;t</source>
+        <translation type="unfinished">&amp;גזור</translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>&amp;Copy</source>
+        <translation type="unfinished">הע&amp;תק</translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>&amp;Paste</source>
+        <translation type="unfinished">ה&amp;דבק</translation>
+    </message>
+    <message>
+        <location line="+11"/>
+        <source>Select All</source>
+        <translation type="unfinished">בחר הכל</translation>
+    </message>
+    <message>
+        <location line="-6"/>
+        <source>Delete</source>
+        <translation type="unfinished">מחק</translation>
+    </message>
+</context>
+<context>
+    <name>QLocalServer</name>
+    <message>
+        <location filename="../src/network/socket/qlocalserver.cpp" line="+226"/>
+        <location filename="../src/network/socket/qlocalserver_unix.cpp" line="+231"/>
+        <source>%1: Name error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/network/socket/qlocalserver_unix.cpp" line="-8"/>
+        <source>%1: Permission denied</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+12"/>
+        <source>%1: Address in use</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <location filename="../src/network/socket/qlocalserver_win.cpp" line="+158"/>
+        <source>%1: Unknown error %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QLocalSocket</name>
+    <message>
+        <location filename="../src/network/socket/qlocalsocket_tcp.cpp" line="+132"/>
+        <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+134"/>
+        <source>%1: Connection refused</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
+        <source>%1: Remote closed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
+        <location filename="../src/network/socket/qlocalsocket_win.cpp" line="+80"/>
+        <location line="+43"/>
+        <source>%1: Invalid name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
+        <source>%1: Socket access error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
+        <source>%1: Socket resource error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
+        <source>%1: Socket operation timed out</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
+        <source>%1: Datagram too large</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
+        <location filename="../src/network/socket/qlocalsocket_win.cpp" line="-48"/>
+        <source>%1: Connection error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
+        <source>%1: The socket operation is not supported</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>%1: Unknown error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+4"/>
+        <location filename="../src/network/socket/qlocalsocket_win.cpp" line="+10"/>
+        <source>%1: Unknown error %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QMYSQLDriver</name>
+    <message>
+        <location filename="../src/sql/drivers/mysql/qsql_mysql.cpp" line="+1231"/>
+        <source>Unable to open database &apos;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+7"/>
+        <source>Unable to connect</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+127"/>
+        <source>Unable to begin transaction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+17"/>
+        <source>Unable to commit transaction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+17"/>
+        <source>Unable to rollback transaction</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QMYSQLResult</name>
+    <message>
+        <location line="-922"/>
+        <source>Unable to fetch data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+176"/>
+        <source>Unable to execute query</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+6"/>
+        <source>Unable to store result</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+190"/>
+        <location line="+8"/>
+        <source>Unable to prepare statement</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+34"/>
+        <source>Unable to reset statement</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+87"/>
+        <source>Unable to bind value</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+11"/>
+        <source>Unable to execute statement</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+14"/>
+        <location line="+21"/>
+        <source>Unable to bind outvalues</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-12"/>
+        <source>Unable to store statement results</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-253"/>
+        <source>Unable to execute next query</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+10"/>
+        <source>Unable to store next result</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QMdiArea</name>
+    <message>
+        <location filename="../src/gui/widgets/qmdiarea.cpp" line="+290"/>
+        <source>(Untitled)</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QMdiSubWindow</name>
+    <message>
+        <location filename="../src/gui/widgets/qmdisubwindow.cpp" line="+280"/>
+        <source>%1 - [%2]</source>
+        <translation type="unfinished">%1 - [%2]</translation>
+    </message>
+    <message>
+        <location line="+72"/>
+        <source>Close</source>
+        <translation type="unfinished">סגור</translation>
+    </message>
+    <message>
+        <location line="-18"/>
+        <source>Minimize</source>
+        <translation type="unfinished">מזער</translation>
+    </message>
+    <message>
+        <location line="+13"/>
+        <source>Restore Down</source>
+        <translation type="unfinished">שחזר למטה</translation>
+    </message>
+    <message>
+        <location line="+707"/>
+        <source>&amp;Restore</source>
+        <translation type="unfinished">ש&amp;חזר</translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>&amp;Move</source>
+        <translation type="unfinished">ה&amp;זז</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>&amp;Size</source>
+        <translation type="unfinished">גו&amp;דל</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Mi&amp;nimize</source>
+        <translation type="unfinished">&amp;מזער</translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Ma&amp;ximize</source>
+        <translation type="unfinished">&amp;הגדל</translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Stay on &amp;Top</source>
+        <translation type="unfinished">&amp;תמיד עליון</translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>&amp;Close</source>
+        <translation type="unfinished">&amp;סגור</translation>
+    </message>
+    <message>
+        <location line="-787"/>
+        <source>- [%1]</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+58"/>
+        <source>Maximize</source>
+        <translation type="unfinished">הגדל</translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Unshade</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Shade</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+6"/>
+        <source>Restore</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+6"/>
+        <source>Help</source>
+        <translation type="unfinished">עזרה</translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QMenu</name>
+    <message>
+        <location filename="../src/plugins/accessible/widgets/qaccessiblemenu.cpp" line="+157"/>
+        <location line="+225"/>
+        <source>Close</source>
+        <translation type="unfinished">סגור</translation>
+    </message>
+    <message>
+        <location line="-224"/>
+        <location line="+225"/>
+        <source>Open</source>
+        <translation type="unfinished">פתח</translation>
+    </message>
+    <message>
+        <location line="-223"/>
+        <location line="+225"/>
+        <location line="+51"/>
+        <source>Execute</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QMenuBar</name>
+    <message>
+        <source>Options</source>
+        <translation type="obsolete">אפשרויות</translation>
+    </message>
+</context>
+<context>
+    <name>QMessageBox</name>
+    <message>
+        <location filename="../src/gui/dialogs/qmessagebox.cpp" line="-1964"/>
+        <location line="+852"/>
+        <location filename="../src/gui/dialogs/qmessagebox.h" line="-52"/>
+        <location line="+8"/>
+        <source>OK</source>
+        <translation>אישור</translation>
+    </message>
+    <message>
+        <location line="+509"/>
+        <source>About Qt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-508"/>
+        <source>Help</source>
+        <translation type="unfinished">עזרה</translation>
+    </message>
+    <message>
+        <location line="-1097"/>
+        <source>Show Details...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Hide Details...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1570"/>
+        <source>&lt;h3&gt;About Qt&lt;/h3&gt;&lt;p&gt;This program uses Qt version %1.&lt;/p&gt;&lt;p&gt;Qt is a C++ toolkit for cross-platform application development.&lt;/p&gt;&lt;p&gt;Qt provides single-source portability across MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.&lt;/p&gt;&lt;p&gt;Qt is available under three different licensing options designed to accommodate the needs of our various users.&lt;/p&gt;Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Please see &lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt; for an overview of Qt licensing.&lt;/p&gt;&lt;p&gt;Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).&lt;/p&gt;&lt;p&gt;Qt is a Nokia product. See &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt; for more information.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QMultiInputContext</name>
+    <message>
+        <location filename="../src/plugins/inputmethods/imsw-multi/qmultiinputcontext.cpp" line="+88"/>
+        <source>Select IM</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QMultiInputContextPlugin</name>
+    <message>
+        <location filename="../src/plugins/inputmethods/imsw-multi/qmultiinputcontextplugin.cpp" line="+95"/>
+        <source>Multiple input method switcher</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+7"/>
+        <source>Multiple input method switcher that uses the context menu of the text widgets</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QNativeSocketEngine</name>
+    <message>
+        <location filename="../src/network/socket/qnativesocketengine.cpp" line="+206"/>
+        <source>The remote host closed the connection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Network operation timed out</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Out of resources</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Unsupported socket operation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Protocol type not supported</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Invalid socket descriptor</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+6"/>
+        <source>Network unreachable</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Permission denied</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Connection timed out</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Connection refused</source>
+        <translation type="unfinished">החיבור נדחה</translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>The bound address is already in use</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>The address is not available</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>The address is protected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+6"/>
+        <source>Unable to send a message</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Unable to receive a message</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Unable to write</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Network error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Another socket is already listening on the same port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-66"/>
+        <source>Unable to initialize non-blocking socket</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Unable to initialize broadcast socket</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Attempt to use IPv6 socket on a platform with no IPv6 support</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+21"/>
+        <source>Host unreachable</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+24"/>
+        <source>Datagram was too large to send</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+18"/>
+        <source>Operation on non-socket</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+6"/>
+        <source>Unknown error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-3"/>
+        <source>The proxy type is invalid for this operation</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QNetworkAccessCacheBackend</name>
+    <message>
+        <location filename="../src/network/access/qnetworkaccesscachebackend.cpp" line="+65"/>
+        <source>Error opening %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QNetworkAccessFileBackend</name>
+    <message>
+        <location filename="../src/network/access/qnetworkaccessfilebackend.cpp" line="+99"/>
+        <source>Request for opening non-local file %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+42"/>
+        <source>Error opening %1: %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+56"/>
+        <source>Write error writing to %1: %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+33"/>
+        <source>Cannot open %1: Path is a directory</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+21"/>
+        <source>Read error reading from %1: %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QNetworkAccessFtpBackend</name>
+    <message>
+        <location filename="../src/network/access/qnetworkaccessftpbackend.cpp" line="+165"/>
+        <source>No suitable proxy found</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+14"/>
+        <source>Cannot open %1: is a directory</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+130"/>
+        <source>Logging in to %1 failed: authentication required</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+39"/>
+        <source>Error while downloading %1: %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Error while uploading %1: %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QNetworkAccessHttpBackend</name>
+    <message>
+        <location filename="../src/network/access/qnetworkaccesshttpbackend.cpp" line="+597"/>
+        <source>No suitable proxy found</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QNetworkReply</name>
+    <message>
+        <location line="+128"/>
+        <source>Error downloading %1 - server replied: %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/network/access/qnetworkreplyimpl.cpp" line="+68"/>
+        <source>Protocol &quot;%1&quot; is unknown</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QNetworkReplyImpl</name>
+    <message>
+        <location line="+432"/>
+        <location line="+22"/>
+        <source>Operation canceled</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QOCIDriver</name>
+    <message>
+        <location filename="../src/sql/drivers/oci/qsql_oci.cpp" line="+2069"/>
+        <source>Unable to logon</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-144"/>
+        <source>Unable to initialize</source>
+        <comment>QOCIDriver</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+215"/>
+        <source>Unable to begin transaction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+19"/>
+        <source>Unable to commit transaction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+19"/>
+        <source>Unable to rollback transaction</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QOCIResult</name>
+    <message>
+        <location line="-963"/>
+        <location line="+161"/>
+        <location line="+15"/>
+        <source>Unable to bind column for batch execute</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+15"/>
+        <source>Unable to execute batch statement</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+302"/>
+        <source>Unable to goto next</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+59"/>
+        <source>Unable to alloc statement</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+15"/>
+        <source>Unable to prepare statement</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+36"/>
+        <source>Unable to bind value</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+19"/>
+        <source>Unable to execute statement</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QODBCDriver</name>
+    <message>
+        <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="+1785"/>
+        <source>Unable to connect</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+6"/>
+        <source>Unable to connect - Driver doesn&apos;t support all needed functionality</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+242"/>
+        <source>Unable to disable autocommit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+17"/>
+        <source>Unable to commit transaction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+17"/>
+        <source>Unable to rollback transaction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+15"/>
+        <source>Unable to enable autocommit</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QODBCResult</name>
+    <message>
+        <location line="-1218"/>
+        <location line="+349"/>
+        <source>QODBCResult::reset: Unable to set &apos;SQL_CURSOR_STATIC&apos; as statement attribute. Please check your ODBC driver configuration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-332"/>
+        <location line="+626"/>
+        <source>Unable to execute statement</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-555"/>
+        <source>Unable to fetch next</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+279"/>
+        <source>Unable to prepare statement</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+268"/>
+        <source>Unable to bind variable</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+194"/>
+        <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="-475"/>
+        <location line="+578"/>
+        <source>Unable to fetch last</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="-672"/>
+        <source>Unable to fetch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+44"/>
+        <source>Unable to fetch first</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+19"/>
+        <source>Unable to fetch previous</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QObject</name>
+    <message>
+        <location filename="../src/gui/util/qdesktopservices_mac.cpp" line="+165"/>
+        <source>Home</source>
+        <translation type="unfinished">Home</translation>
+    </message>
+    <message>
+        <location filename="../src/network/access/qnetworkaccessdatabackend.cpp" line="+74"/>
+        <source>Operation not supported on %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+53"/>
+        <source>Invalid URI: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/network/access/qnetworkaccessdebugpipebackend.cpp" line="+175"/>
+        <source>Write error writing to %1: %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+57"/>
+        <source>Read error reading from %1: %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+31"/>
+        <source>Socket error on %1: %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+15"/>
+        <source>Remote host closed the connection prematurely on %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+53"/>
+        <source>Protocol error: packet of size 0 received</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/network/kernel/qhostinfo.cpp" line="+177"/>
+        <location line="+57"/>
+        <source>No host name given</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QPPDOptionsModel</name>
+    <message>
+        <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="+1195"/>
+        <source>Name</source>
+        <translation type="unfinished">שם</translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Value</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QPSQLDriver</name>
+    <message>
+        <location filename="../src/sql/drivers/psql/qsql_psql.cpp" line="+763"/>
+        <source>Unable to connect</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+49"/>
+        <source>Could not begin transaction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+17"/>
+        <source>Could not commit transaction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+16"/>
+        <source>Could not rollback transaction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+358"/>
+        <source>Unable to subscribe</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+32"/>
+        <source>Unable to unsubscribe</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QPSQLResult</name>
+    <message>
+        <location line="-1058"/>
+        <source>Unable to create query</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+374"/>
+        <source>Unable to prepare statement</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QPageSetupWidget</name>
+    <message>
+        <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="+304"/>
+        <source>Centimeters (cm)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>Millimeters (mm)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>Inches (in)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>Points (pt)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/gui/dialogs/qpagesetupwidget.ui"/>
+        <source>Form</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>Paper</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>Page size:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>Width:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>Height:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>Paper source:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>Orientation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>Portrait</source>
+        <translation type="unfinished">לאורך</translation>
+    </message>
+    <message>
+        <location/>
+        <source>Landscape</source>
+        <translation type="unfinished">לרוחב</translation>
+    </message>
+    <message>
+        <location/>
+        <source>Reverse landscape</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>Reverse portrait</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>Margins</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>top margin</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>left margin</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>right margin</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>bottom margin</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QPluginLoader</name>
+    <message>
+        <location filename="../src/corelib/plugin/qpluginloader.cpp" line="+24"/>
+        <source>Unknown error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-68"/>
+        <source>The plugin was not loaded.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QPrintDialog</name>
+    <message>
+        <location filename="../src/gui/painting/qprinterinfo_unix.cpp" line="+98"/>
+        <source>locally connected</source>
+        <translation>מחוברת מקומית</translation>
+    </message>
+    <message>
+        <location line="+23"/>
+        <location line="+225"/>
+        <source>Aliases: %1</source>
+        <translation>שמות נוספים: %1</translation>
+    </message>
+    <message>
+        <location line="+223"/>
+        <location line="+199"/>
+        <source>unknown</source>
+        <translation>לא ידוע</translation>
+    </message>
+    <message>
+        <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="+268"/>
+        <source>OK</source>
+        <translation type="unfinished">אישור</translation>
+    </message>
+    <message>
+        <source>Cancel</source>
+        <translation type="obsolete">ביטול</translation>
+    </message>
+    <message>
+        <source>Print in color if available</source>
+        <translation type="obsolete">הדפס בצבע אם הדבר זמין</translation>
+    </message>
+    <message>
+        <source>Printer</source>
+        <translation type="obsolete">מדפסת</translation>
+    </message>
+    <message>
+        <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="+375"/>
+        <source>Print all</source>
+        <translation type="unfinished">הדפס הכל</translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Print range</source>
+        <translation type="unfinished">טווח הדפסה</translation>
+    </message>
+    <message>
+        <source>Print last page first</source>
+        <translation type="obsolete">הדפס את העמוד הראשון אחרון</translation>
+    </message>
+    <message>
+        <source>Number of copies:</source>
+        <translation type="obsolete">מספר עותקים:</translation>
+    </message>
+    <message>
+        <source>Paper format</source>
+        <translation type="obsolete">תבנית נייר</translation>
+    </message>
+    <message>
+        <source>Portrait</source>
+        <translation type="obsolete">לאורך</translation>
+    </message>
+    <message>
+        <source>Landscape</source>
+        <translation type="obsolete">לרוחב</translation>
+    </message>
+    <message>
+        <location line="-48"/>
+        <source>A0 (841 x 1189 mm)</source>
+        <translation>A0 (841 x 1189 mm)</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>A1 (594 x 841 mm)</source>
+        <translation>A1 (594 x 841 mm)</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>A2 (420 x 594 mm)</source>
+        <translation>A2 (420 x 594 mm)</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>A3 (297 x 420 mm)</source>
+        <translation>A3 (297 x 420 mm)</translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>A5 (148 x 210 mm)</source>
+        <translation>A5 (148 x 210 mm)</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>A6 (105 x 148 mm)</source>
+        <translation>A6 (105 x 148 mm)</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>A7 (74 x 105 mm)</source>
+        <translation>A7 (74 x 105 mm)</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>A8 (52 x 74 mm)</source>
+        <translation>A8 (52 x 74 mm)</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>A9 (37 x 52 mm)</source>
+        <translation>A9 (37 x 52 mm)</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>B0 (1000 x 1414 mm)</source>
+        <translation>B0 (1000 x 1414 mm)</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>B1 (707 x 1000 mm)</source>
+        <translation>B1 (707 x 1000 mm)</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>B2 (500 x 707 mm)</source>
+        <translation>B2 (500 x 707 mm)</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>B3 (353 x 500 mm)</source>
+        <translation>B3 (353 x 500 mm)</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>B4 (250 x 353 mm)</source>
+        <translation>B4 (250 x 353 mm)</translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>B6 (125 x 176 mm)</source>
+        <translation>B6 (125 x 176 mm)</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>B7 (88 x 125 mm)</source>
+        <translation>B7 (88 x 125 mm)</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>B8 (62 x 88 mm)</source>
+        <translation>B8 (62 x 88 mm)</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>B9 (44 x 62 mm)</source>
+        <translation>B9 (44 x 62 mm)</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>B10 (31 x 44 mm)</source>
+        <translation>B10 (31 x 44 mm)</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>C5E (163 x 229 mm)</source>
+        <translation>C5E (163 x 229 mm)</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>DLE (110 x 220 mm)</source>
+        <translation>DLE (110 x 220 mm)</translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Folio (210 x 330 mm)</source>
+        <translation>Folio (210 x 330 mm)</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Ledger (432 x 279 mm)</source>
+        <translation>Ledger (432 x 279 mm)</translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Tabloid (279 x 432 mm)</source>
+        <translation>Tabloid (279 x 432 mm)</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>US Common #10 Envelope (105 x 241 mm)</source>
+        <translation>US Common #10 Envelope (105 x 241 mm)</translation>
+    </message>
+    <message>
+        <location line="-25"/>
+        <source>A4 (210 x 297 mm, 8.26 x 11.7 inches)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+11"/>
+        <source>B5 (176 x 250 mm, 6.93 x 9.84 inches)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+8"/>
+        <source>Executive (7.5 x 10 inches, 191 x 254 mm)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Legal (8.5 x 14 inches, 216 x 356 mm)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Letter (8.5 x 11 inches, 216 x 279 mm)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/gui/dialogs/qabstractprintdialog.cpp" line="+110"/>
+        <location line="+13"/>
+        <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="-2"/>
+        <source>Print</source>
+        <translation type="unfinished">הדפס</translation>
+    </message>
+    <message>
+        <source>File</source>
+        <translation type="obsolete">קובץ</translation>
+    </message>
+    <message>
+        <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-357"/>
+        <source>Print To File ...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other</source>
+        <translation type="obsolete">אחר</translation>
+    </message>
+    <message>
+        <location line="+80"/>
+        <source>File %1 is not writable.
+Please choose a different file name.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>%1 already exists.
+Do you want to overwrite it?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="-208"/>
+        <source>File exists</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>&lt;qt&gt;Do you want to overwrite it?&lt;/qt&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+227"/>
+        <source>Print selection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-8"/>
+        <source>%1 is a directory.
+Please choose a different file name.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="-232"/>
+        <source>A0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>A1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>A2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>A3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>A4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>A5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>A6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>A7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>A8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>A9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>B0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>B1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>B2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>B3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>B4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>B5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>B6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>B7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>B8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>B9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>B10</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>C5E</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>DLE</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Executive</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Folio</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Ledger</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Legal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Letter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Tabloid</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>US Common #10 Envelope</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Custom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-522"/>
+        <location line="+68"/>
+        <source>&amp;Options &gt;&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-63"/>
+        <source>&amp;Print</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+67"/>
+        <source>&amp;Options &lt;&lt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+253"/>
+        <source>Print to File (PDF)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Print to File (Postscript)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+45"/>
+        <source>Local file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Write %1 file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="+1"/>
+        <source>The &apos;From&apos; value cannot be greater than the &apos;To&apos; value.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QPrintPreviewDialog</name>
+    <message>
+        <location filename="../src/gui/dialogs/qabstractpagesetupdialog.cpp" line="+68"/>
+        <location line="+12"/>
+        <source>Page Setup</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/gui/dialogs/qprintpreviewdialog.cpp" line="+252"/>
+        <source>%1%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+79"/>
+        <source>Print Preview</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+29"/>
+        <source>Next page</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Previous page</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>First page</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Last page</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+9"/>
+        <source>Fit width</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Fit page</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+11"/>
+        <source>Zoom in</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Zoom out</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+6"/>
+        <source>Portrait</source>
+        <translation type="unfinished">לאורך</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Landscape</source>
+        <translation type="unfinished">לרוחב</translation>
+    </message>
+    <message>
+        <location line="+10"/>
+        <source>Show single page</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Show facing pages</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Show overview of all pages</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+15"/>
+        <source>Print</source>
+        <translation type="unfinished">הדפס</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Page setup</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Close</source>
+        <translation type="unfinished">סגור</translation>
+    </message>
+    <message>
+        <location line="+151"/>
+        <source>Export to PDF</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Export to PostScript</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QPrintPropertiesDialog</name>
+    <message>
+        <source>Save</source>
+        <translation type="obsolete">שמור</translation>
+    </message>
+    <message>
+        <source>OK</source>
+        <translation type="obsolete">אישור</translation>
+    </message>
+</context>
+<context>
+    <name>QPrintPropertiesWidget</name>
+    <message>
+        <location filename="../src/gui/dialogs/qprintpropertieswidget.ui"/>
+        <source>Form</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>Page</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>Advanced</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QPrintSettingsOutput</name>
+    <message>
+        <location filename="../src/gui/dialogs/qprintsettingsoutput.ui"/>
+        <source>Form</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>Copies</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>Print range</source>
+        <translation type="unfinished">טווח הדפסה</translation>
+    </message>
+    <message>
+        <location/>
+        <source>Print all</source>
+        <translation type="unfinished">הדפס הכל</translation>
+    </message>
+    <message>
+        <location/>
+        <source>Pages from</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>to</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>Selection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>Output Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>Copies:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>Collate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>Reverse</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>Options</source>
+        <translation type="unfinished">אפשרויות</translation>
+    </message>
+    <message>
+        <location/>
+        <source>Color Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>Color</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>Grayscale</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>Duplex Printing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>None</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>Long side</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>Short side</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QPrintWidget</name>
+    <message>
+        <location filename="../src/gui/dialogs/qprintwidget.ui"/>
+        <source>Form</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>Printer</source>
+        <translation type="unfinished">מדפסת</translation>
+    </message>
+    <message>
+        <location/>
+        <source>&amp;Name:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>P&amp;roperties</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>Location:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>Preview</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>Type:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>Output &amp;file:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location/>
+        <source>...</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QProcess</name>
+    <message>
+        <location filename="../src/corelib/io/qprocess_unix.cpp" line="+475"/>
+        <location filename="../src/corelib/io/qprocess_win.cpp" line="+147"/>
+        <source>Could not open input redirection for reading</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+12"/>
+        <location filename="../src/corelib/io/qprocess_win.cpp" line="+36"/>
+        <source>Could not open output redirection for writing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+235"/>
+        <source>Resource error (fork failure): %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+259"/>
+        <location line="+53"/>
+        <location line="+74"/>
+        <location line="+67"/>
+        <location filename="../src/corelib/io/qprocess_win.cpp" line="+422"/>
+        <location line="+50"/>
+        <location line="+75"/>
+        <location line="+42"/>
+        <location line="+54"/>
+        <source>Process operation timed out</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/corelib/io/qprocess.cpp" line="+533"/>
+        <location line="+52"/>
+        <location filename="../src/corelib/io/qprocess_win.cpp" line="-211"/>
+        <location line="+50"/>
+        <source>Error reading from process</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+47"/>
+        <location line="+779"/>
+        <location filename="../src/corelib/io/qprocess_win.cpp" line="+140"/>
+        <source>Error writing to process</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-709"/>
+        <source>Process crashed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+912"/>
+        <source>No program defined</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/corelib/io/qprocess_win.cpp" line="-341"/>
+        <source>Process failed to start</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QProgressDialog</name>
+    <message>
+        <location filename="../src/gui/dialogs/qprogressdialog.cpp" line="+182"/>
+        <source>Cancel</source>
+        <translation>ביטול</translation>
+    </message>
+</context>
+<context>
+    <name>QPushButton</name>
+    <message>
+        <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="-8"/>
+        <source>Open</source>
+        <translation type="unfinished">פתח</translation>
+    </message>
+</context>
+<context>
+    <name>QRadioButton</name>
+    <message>
+        <location line="+12"/>
+        <source>Check</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QRegExp</name>
+    <message>
+        <location filename="../src/corelib/tools/qregexp.cpp" line="+64"/>
+        <source>no error occurred</source>
+        <translation type="unfinished">לא אירעה כל שגיאה</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>disabled feature used</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>bad char class syntax</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>bad lookahead syntax</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>bad repetition syntax</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>invalid octal value</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>missing left delim</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>unexpected end</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>met internal limit</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QSQLite2Driver</name>
+    <message>
+        <location filename="../src/sql/drivers/sqlite2/qsql_sqlite2.cpp" line="+396"/>
+        <source>Error to open database</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+41"/>
+        <source>Unable to begin transaction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+17"/>
+        <source>Unable to commit transaction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+17"/>
+        <source>Unable to rollback Transaction</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QSQLite2Result</name>
+    <message>
+        <location line="-323"/>
+        <source>Unable to fetch results</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+147"/>
+        <source>Unable to execute statement</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QSQLiteDriver</name>
+    <message>
+        <location filename="../src/sql/drivers/sqlite/qsql_sqlite.cpp" line="+528"/>
+        <source>Error opening database</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+11"/>
+        <source>Error closing database</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+20"/>
+        <source>Unable to begin transaction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+15"/>
+        <source>Unable to commit transaction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+15"/>
+        <source>Unable to rollback transaction</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QSQLiteResult</name>
+    <message>
+        <location line="-400"/>
+        <location line="+66"/>
+        <location line="+8"/>
+        <source>Unable to fetch row</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+63"/>
+        <source>Unable to execute statement</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+20"/>
+        <source>Unable to reset statement</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+45"/>
+        <source>Unable to bind parameters</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+7"/>
+        <source>Parameter count mismatch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-208"/>
+        <source>No query</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QScrollBar</name>
+    <message>
+        <location filename="../src/gui/widgets/qscrollbar.cpp" line="+448"/>
+        <source>Scroll here</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Left edge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>Top</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Right edge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>Bottom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Page left</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+143"/>
+        <source>Page up</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Page right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+4"/>
+        <source>Page down</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Scroll left</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>Scroll up</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Scroll right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>Scroll down</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-6"/>
+        <source>Line up</source>
+        <translation type="unfinished">סדר בשורה</translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>Position</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>Line down</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QSharedMemory</name>
+    <message>
+        <location filename="../src/corelib/kernel/qsharedmemory.cpp" line="+207"/>
+        <source>%1: unable to set key on lock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+81"/>
+        <source>%1: create size is less then 0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+168"/>
+        <location filename="../src/corelib/kernel/qsharedmemory_p.h" line="+148"/>
+        <source>%1: unable to lock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+22"/>
+        <source>%1: unable to unlock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+78"/>
+        <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+87"/>
+        <source>%1: permission denied</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-22"/>
+        <source>%1: already exists</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+9"/>
+        <source>%1: doesn&apos;t exists</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+6"/>
+        <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+9"/>
+        <source>%1: out of resources</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+7"/>
+        <source>%1: unknown error %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+21"/>
+        <source>%1: key is empty</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+8"/>
+        <source>%1: unix key file doesn&apos;t exists</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+7"/>
+        <source>%1: ftok failed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+51"/>
+        <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+15"/>
+        <source>%1: unable to make key</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+20"/>
+        <source>%1: system-imposed size restrictions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+53"/>
+        <source>%1: not attached</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-27"/>
+        <source>%1: invalid size</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+68"/>
+        <source>%1: key error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+38"/>
+        <source>%1: size query failed</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QShortcut</name>
+    <message>
+        <location filename="../src/gui/kernel/qkeysequence.cpp" line="+373"/>
+        <source>Space</source>
+        <translation type="unfinished">רווח</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Esc</source>
+        <translation type="unfinished">Esc</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Tab</source>
+        <translation type="unfinished">Tab</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Backtab</source>
+        <translation type="unfinished">Backtab</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Backspace</source>
+        <translation type="unfinished">Backspace</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Return</source>
+        <translation type="unfinished">Return</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Enter</source>
+        <translation type="unfinished">Enter</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Ins</source>
+        <translation type="unfinished">Ins</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Del</source>
+        <translation type="unfinished">Del</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Pause</source>
+        <translation type="unfinished">Pause</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Print</source>
+        <translation type="unfinished">הדפס</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>SysReq</source>
+        <translation type="unfinished">SysReq</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Home</source>
+        <translation type="unfinished">Home</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>End</source>
+        <translation type="unfinished">End</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Left</source>
+        <translation type="unfinished">שמאלה</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Up</source>
+        <translation type="unfinished">למעלה</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Right</source>
+        <translation type="unfinished">ימינה</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Down</source>
+        <translation type="unfinished">למטה</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>PgUp</source>
+        <translation type="unfinished">PgUp</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>PgDown</source>
+        <translation type="unfinished">PgDown</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>CapsLock</source>
+        <translation type="unfinished">CapsLock</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>NumLock</source>
+        <translation type="unfinished">NumLock</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>ScrollLock</source>
+        <translation type="unfinished">ScrollLock</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Help</source>
+        <translation type="unfinished">עזרה</translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Back</source>
+        <translation type="unfinished">אחורה</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Forward</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Stop</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Refresh</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Volume Down</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Volume Mute</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Volume Up</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Bass Boost</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Bass Up</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Bass Down</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Treble Up</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Treble Down</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Media Play</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Media Stop</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Media Previous</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Media Next</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Media Record</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Favorites</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Search</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Standby</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Open URL</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Launch Mail</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Launch Media</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Launch (0)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Launch (1)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Launch (2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Launch (3)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Launch (4)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Launch (5)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Launch (6)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Launch (7)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Launch (8)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Launch (9)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Launch (A)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Launch (B)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Launch (C)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Launch (D)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Launch (E)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Launch (F)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>Print Screen</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Page Up</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Page Down</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Caps Lock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Num Lock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Number Lock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Scroll Lock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Insert</source>
+        <translation type="unfinished">הוסף</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Delete</source>
+        <translation type="unfinished">מחק</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Escape</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>System Request</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>Select</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Yes</source>
+        <translation type="unfinished">כן</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>No</source>
+        <translation type="unfinished">לא</translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>Context1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Context2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Context3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Context4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Call</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Hangup</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Flip</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+527"/>
+        <location line="+122"/>
+        <source>Ctrl</source>
+        <translation type="unfinished">Ctrl</translation>
+    </message>
+    <message>
+        <location line="-121"/>
+        <location line="+125"/>
+        <source>Shift</source>
+        <translation type="unfinished">Shift</translation>
+    </message>
+    <message>
+        <location line="-124"/>
+        <location line="+122"/>
+        <source>Alt</source>
+        <translation type="unfinished">Alt</translation>
+    </message>
+    <message>
+        <location line="-121"/>
+        <location line="+117"/>
+        <source>Meta</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-25"/>
+        <source>+</source>
+        <translation type="unfinished">+</translation>
+    </message>
+    <message>
+        <location line="+46"/>
+        <source>F%1</source>
+        <translation type="unfinished">F%1</translation>
+    </message>
+    <message>
+        <location line="-720"/>
+        <source>Home Page</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QSlider</name>
+    <message>
+        <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+151"/>
+        <source>Page left</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>Page up</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Position</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Page right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>Page down</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QSocks5SocketEngine</name>
+    <message>
+        <location filename="../src/network/socket/qsocks5socketengine.cpp" line="-67"/>
+        <source>Connection to proxy refused</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>Connection to proxy closed prematurely</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>Proxy host not found</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Connection to proxy timed out</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+17"/>
+        <source>Proxy authentication failed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Proxy authentication failed: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+9"/>
+        <source>SOCKS version 5 protocol error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+19"/>
+        <source>General SOCKSv5 server failure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>Connection not allowed by SOCKSv5 server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+16"/>
+        <source>TTL expired</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>SOCKSv5 command not supported</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>Address type not supported</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Unknown SOCKSv5 proxy error code 0x%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+685"/>
+        <source>Network operation timed out</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QSpinBox</name>
+    <message>
+        <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-574"/>
+        <source>More</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Less</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QSql</name>
+    <message>
+        <location filename="../src/qt3support/sql/q3sqlmanager_p.cpp" line="+890"/>
+        <source>Delete</source>
+        <translation type="unfinished">מחק</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Delete this record?</source>
+        <translation type="unfinished">האם למחוק רשומה זו?</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <location line="+16"/>
+        <location line="+36"/>
+        <source>Yes</source>
+        <translation type="unfinished">כן</translation>
+    </message>
+    <message>
+        <location line="-51"/>
+        <location line="+16"/>
+        <location line="+36"/>
+        <source>No</source>
+        <translation type="unfinished">לא</translation>
+    </message>
+    <message>
+        <location line="-44"/>
+        <source>Insert</source>
+        <translation type="unfinished">הוסף</translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Update</source>
+        <translation type="unfinished">עדכן</translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>Save edits?</source>
+        <translation type="unfinished">האם לשמור את העריכה?</translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Cancel</source>
+        <translation type="unfinished">ביטול</translation>
+    </message>
+    <message>
+        <location line="+32"/>
+        <source>Confirm</source>
+        <translation type="unfinished">אישור</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Cancel your edits?</source>
+        <translation type="unfinished">האם לבטל את העריכה שלך?</translation>
+    </message>
+</context>
+<context>
+    <name>QSslSocket</name>
+    <message>
+        <location filename="../src/network/ssl/qsslsocket_openssl.cpp" line="+569"/>
+        <source>Unable to write data: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+119"/>
+        <source>Error while reading: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+96"/>
+        <source>Error during SSL handshake: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-524"/>
+        <source>Error creating SSL context (%1)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+25"/>
+        <source>Invalid or empty cipher list (%1)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+62"/>
+        <source>Error creating SSL session, %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+15"/>
+        <source>Error creating SSL session: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-61"/>
+        <source>Cannot provide a certificate with no key, %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+7"/>
+        <source>Error loading local certificate, %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+12"/>
+        <source>Error loading private key, %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+7"/>
+        <source>Private key does not certificate public key, %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QSystemSemaphore</name>
+    <message>
+        <location filename="../src/corelib/kernel/qsystemsemaphore_unix.cpp" line="-41"/>
+        <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="+66"/>
+        <source>%1: out of resources</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-13"/>
+        <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="+4"/>
+        <source>%1: permission denied</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>%1: already exists</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>%1: does not exist</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+9"/>
+        <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="+3"/>
+        <source>%1: unknown error %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QTDSDriver</name>
+    <message>
+        <location filename="../src/sql/drivers/tds/qsql_tds.cpp" line="+584"/>
+        <source>Unable to open connection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Unable to use database</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QTabBar</name>
+    <message>
+        <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="-326"/>
+        <source>Scroll Left</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>Scroll Right</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QTcpServer</name>
+    <message>
+        <location filename="../src/network/socket/qtcpserver.cpp" line="+282"/>
+        <source>Operation on socket is not supported</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QTextControl</name>
+    <message>
+        <location filename="../src/gui/text/qtextcontrol.cpp" line="+1973"/>
+        <source>&amp;Undo</source>
+        <translation type="unfinished">&amp;בטל</translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>&amp;Redo</source>
+        <translation type="unfinished">בצע &amp;שוב</translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>Cu&amp;t</source>
+        <translation type="unfinished">&amp;גזור</translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>&amp;Copy</source>
+        <translation type="unfinished">הע&amp;תק</translation>
+    </message>
+    <message>
+        <location line="+7"/>
+        <source>Copy &amp;Link Location</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+6"/>
+        <source>&amp;Paste</source>
+        <translation type="unfinished">ה&amp;דבק</translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Delete</source>
+        <translation type="unfinished">מחק</translation>
+    </message>
+    <message>
+        <location line="+7"/>
+        <source>Select All</source>
+        <translation type="unfinished">בחר הכל</translation>
+    </message>
+</context>
+<context>
+    <name>QToolButton</name>
+    <message>
+        <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="+254"/>
+        <location line="+6"/>
+        <source>Press</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-4"/>
+        <location line="+8"/>
+        <source>Open</source>
+        <translation type="unfinished">פתח</translation>
+    </message>
+</context>
+<context>
+    <name>QUdpSocket</name>
+    <message>
+        <location filename="../src/network/socket/qudpsocket.cpp" line="+169"/>
+        <source>This platform does not support IPv6</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QUndoGroup</name>
+    <message>
+        <location filename="../src/gui/util/qundogroup.cpp" line="+386"/>
+        <source>Undo</source>
+        <translation type="unfinished">בטל</translation>
+    </message>
+    <message>
+        <location line="+28"/>
+        <source>Redo</source>
+        <translation type="unfinished">שחזר</translation>
+    </message>
+</context>
+<context>
+    <name>QUndoModel</name>
+    <message>
+        <location filename="../src/gui/util/qundoview.cpp" line="+101"/>
+        <source>&lt;empty&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QUndoStack</name>
+    <message>
+        <location filename="../src/gui/util/qundostack.cpp" line="+834"/>
+        <source>Undo</source>
+        <translation type="unfinished">בטל</translation>
+    </message>
+    <message>
+        <location line="+27"/>
+        <source>Redo</source>
+        <translation type="unfinished">שחזר</translation>
+    </message>
+</context>
+<context>
+    <name>QUnicodeControlCharacterMenu</name>
+    <message>
+        <location filename="../src/gui/text/qtextcontrol.cpp" line="+884"/>
+        <source>LRM Left-to-right mark</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>RLM Right-to-left mark</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>ZWJ Zero width joiner</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>ZWNJ Zero width non-joiner</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>ZWSP Zero width space</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>LRE Start of left-to-right embedding</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>RLE Start of right-to-left embedding</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>LRO Start of left-to-right override</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>RLO Start of right-to-left override</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>PDF Pop directional formatting</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+6"/>
+        <source>Insert Unicode control character</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QWebFrame</name>
+    <message>
+        <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp" line="+692"/>
+        <source>Request cancelled</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+17"/>
+        <source>Request blocked</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+7"/>
+        <source>Cannot show URL</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+6"/>
+        <source>Frame load interruped by policy change</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+6"/>
+        <source>Cannot show mimetype</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+6"/>
+        <source>File does not exist</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QWebPage</name>
+    <message>
+        <location filename="../src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp" line="+382"/>
+        <source>Bad HTTP request</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/3rdparty/webkit/WebCore/platform/qt/Localizations.cpp" line="+42"/>
+        <source>Submit</source>
+        <comment>default label for Submit buttons in forms on web pages</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Submit</source>
+        <comment>Submit (input element) alt text for &lt;input&gt; elements with no alt, title, or value</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Reset</source>
+        <comment>default label for Reset buttons in forms on web pages</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+10"/>
+        <source>This is a searchable index. Enter search keywords: </source>
+        <comment>text that appears at the start of nearly-obsolete web pages in the form of a &apos;searchable index&apos;</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Choose File</source>
+        <comment>title for file button used in HTML forms</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>No file selected</source>
+        <comment>text to display in file button used in HTML forms when no file is selected</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Open in New Window</source>
+        <comment>Open in New Window context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Save Link...</source>
+        <comment>Download Linked File context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Copy Link</source>
+        <comment>Copy Link context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Open Image</source>
+        <comment>Open Image in New Window context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Save Image</source>
+        <comment>Download Image context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Copy Image</source>
+        <comment>Copy Link context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Open Frame</source>
+        <comment>Open Frame in New Window context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Copy</source>
+        <comment>Copy context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Go Back</source>
+        <comment>Back context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Go Forward</source>
+        <comment>Forward context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Stop</source>
+        <comment>Stop context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Reload</source>
+        <comment>Reload context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Cut</source>
+        <comment>Cut context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Paste</source>
+        <comment>Paste context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>No Guesses Found</source>
+        <comment>No Guesses Found context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Ignore</source>
+        <comment>Ignore Spelling context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Add To Dictionary</source>
+        <comment>Learn Spelling context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Search The Web</source>
+        <comment>Search The Web context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Look Up In Dictionary</source>
+        <comment>Look Up in Dictionary context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Open Link</source>
+        <comment>Open Link context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Ignore</source>
+        <comment>Ignore Grammar context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Spelling</source>
+        <comment>Spelling and Grammar context sub-menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Show Spelling and Grammar</source>
+        <comment>menu item title</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Hide Spelling and Grammar</source>
+        <comment>menu item title</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Check Spelling</source>
+        <comment>Check spelling context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Check Spelling While Typing</source>
+        <comment>Check spelling while typing context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Check Grammar With Spelling</source>
+        <comment>Check grammar with spelling context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Fonts</source>
+        <comment>Font context sub-menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Bold</source>
+        <comment>Bold context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Italic</source>
+        <comment>Italic context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Underline</source>
+        <comment>Underline context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Outline</source>
+        <comment>Outline context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Direction</source>
+        <comment>Writing direction context sub-menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Text Direction</source>
+        <comment>Text direction context sub-menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Default</source>
+        <comment>Default writing direction context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>LTR</source>
+        <comment>Left to Right context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>RTL</source>
+        <comment>Right to Left context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Inspect</source>
+        <comment>Inspect Element context menu item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>No recent searches</source>
+        <comment>Label for only item in menu that appears when clicking on the search field image, when no searches have been performed</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Recent searches</source>
+        <comment>label for first item in the menu that appears when clicking on the search field image, used as embedded menu title</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Clear recent searches</source>
+        <comment>menu item in Recent Searches menu that empties menu&apos;s contents</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+75"/>
+        <source>Unknown</source>
+        <comment>Unknown filesize FTP directory listing item</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>%1 (%2x%3 pixels)</source>
+        <comment>Title string for images</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/InspectorClientQt.cpp" line="+185"/>
+        <source>Web Inspector - %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/3rdparty/webkit/WebCore/platform/qt/ScrollbarQt.cpp" line="+58"/>
+        <source>Scroll here</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Left edge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>Top</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Right edge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>Bottom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Page left</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>Page up</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Page right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>Page down</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Scroll left</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>Scroll up</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Scroll right</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>Scroll down</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message numerus="yes">
+        <location filename="../src/3rdparty/webkit/WebCore/platform/qt/FileChooserQt.cpp" line="+45"/>
+        <source>%n file(s)</source>
+        <comment>number of chosen file</comment>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message>
+        <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="+1322"/>
+        <source>JavaScript Alert - %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+15"/>
+        <source>JavaScript Confirm - %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+17"/>
+        <source>JavaScript Prompt - %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+333"/>
+        <source>Move the cursor to the next character</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Move the cursor to the previous character</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Move the cursor to the next word</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Move the cursor to the previous word</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Move the cursor to the next line</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Move the cursor to the previous line</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Move the cursor to the start of the line</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Move the cursor to the end of the line</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Move the cursor to the start of the block</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Move the cursor to the end of the block</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Move the cursor to the start of the document</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Move the cursor to the end of the document</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Select all</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Select to the next character</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Select to the previous character</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Select to the next word</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Select to the previous word</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Select to the next line</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Select to the previous line</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Select to the start of the line</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Select to the end of the line</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Select to the start of the block</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Select to the end of the block</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Select to the start of the document</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Select to the end of the document</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Delete to the start of the word</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Delete to the end of the word</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+33"/>
+        <source>Insert a new paragraph</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Insert a new line</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QWhatsThisAction</name>
+    <message>
+        <location filename="../src/gui/kernel/qwhatsthis.cpp" line="+522"/>
+        <source>What&apos;s This?</source>
+        <translation type="unfinished">מה זה?</translation>
+    </message>
+</context>
+<context>
+    <name>QWidget</name>
+    <message>
+        <location filename="../src/gui/kernel/qwidget.cpp" line="+5326"/>
+        <source>*</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QWizard</name>
+    <message>
+        <location filename="../src/gui/dialogs/qwizard.cpp" line="+649"/>
+        <source>Cancel</source>
+        <translation type="unfinished">ביטול</translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Help</source>
+        <translation type="unfinished">עזרה</translation>
+    </message>
+    <message>
+        <location line="-14"/>
+        <source>Go Back</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <source>Continue</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Commit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Done</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-10"/>
+        <source>&lt; &amp;Back</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+10"/>
+        <source>&amp;Finish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>&amp;Help</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-8"/>
+        <source>&amp;Next</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>&amp;Next &gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QWorkspace</name>
+    <message>
+        <location filename="../src/gui/widgets/qworkspace.cpp" line="+1094"/>
+        <source>&amp;Restore</source>
+        <translation type="unfinished">ש&amp;חזר</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>&amp;Move</source>
+        <translation type="unfinished">ה&amp;זז</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>&amp;Size</source>
+        <translation type="unfinished">&amp;שנה גודל</translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Mi&amp;nimize</source>
+        <translation type="unfinished">&amp;מזער</translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Ma&amp;ximize</source>
+        <translation type="unfinished">&amp;הגדל</translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>&amp;Close</source>
+        <translation type="unfinished">&amp;סגור</translation>
+    </message>
+    <message>
+        <location line="+6"/>
+        <source>Stay on &amp;Top</source>
+        <translation type="unfinished">&amp;תמיד עליון</translation>
+    </message>
+    <message>
+        <location line="+3"/>
+        <location line="+1059"/>
+        <source>Sh&amp;ade</source>
+        <translation type="unfinished">&amp;גלול</translation>
+    </message>
+    <message>
+        <location line="-278"/>
+        <location line="+60"/>
+        <source>%1 - [%2]</source>
+        <translation>%1 - [%2]</translation>
+    </message>
+    <message>
+        <location line="-1837"/>
+        <source>Minimize</source>
+        <translation type="unfinished">מזער</translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Restore Down</source>
+        <translation type="unfinished">שחזר למטה</translation>
+    </message>
+    <message>
+        <location line="-4"/>
+        <source>Close</source>
+        <translation type="unfinished">סגור</translation>
+    </message>
+    <message>
+        <location line="+2053"/>
+        <source>&amp;Unshade</source>
+        <translation type="unfinished">&amp;בטל גלילה</translation>
+    </message>
+</context>
+<context>
+    <name>QXml</name>
+    <message>
+        <location filename="../src/xml/sax/qxml.cpp" line="+58"/>
+        <source>no error occurred</source>
+        <translation>לא אירעה כל שגיאה</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>error triggered by consumer</source>
+        <translation>נגרמה שגיאה על ידי הצרכן</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>unexpected end of file</source>
+        <translation>סוף קובץ לא צפוי</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>more than one document type definition</source>
+        <translation>יותר מהגדרה אחת של סוג מסמך</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>error occurred while parsing element</source>
+        <translation>אירעה שגיאה בעת עיבוד המרכיב</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>tag mismatch</source>
+        <translation>אי-התאמה בתגית</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>error occurred while parsing content</source>
+        <translation>אירעה שגיאה בעת עיבוד התוכן</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>unexpected character</source>
+        <translation>תו לא צפוי</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>invalid name for processing instruction</source>
+        <translation>שם לא תקף עבור הוראת העיבוד</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>version expected while reading the XML declaration</source>
+        <translation>הייתה צפויה גירסה בעת קריאה ההכרזה על XML</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>wrong value for standalone declaration</source>
+        <translation>ערך שגוי עבור ההגדרה העצמאית</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>encoding declaration or standalone declaration expected while reading the XML declaration</source>
+        <translation>הייתה צפויה הכרזה על קידוד או הכרזה עצמאית בעת קריאת ההכרזה על XML</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>standalone declaration expected while reading the XML declaration</source>
+        <translation>הייתה צפויה הכרזה עצמאית בעת קריאת ההכרזה על XML</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>error occurred while parsing document type definition</source>
+        <translation>אירעה שגיאה בעת עיבוד הגדרת סוג המסמך</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>letter is expected</source>
+        <translation>הייתה צפויה אות</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>error occurred while parsing comment</source>
+        <translation>אירעה שגיאה בעת עיבוד ההערה</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>error occurred while parsing reference</source>
+        <translation>אירעה שגיאה בעת עיבוד ההתייחסות</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>internal general entity reference not allowed in DTD</source>
+        <translation>התייחסות ליישות כללית פנימית אינה מותרת ב-DTD</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>external parsed general entity reference not allowed in attribute value</source>
+        <translation>התייחסות ליישות כללית מעובדת חיצונית אינה מותרת בערך המאפיין</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>external parsed general entity reference not allowed in DTD</source>
+        <translation>התייחסות ליישות כללית מעובדת חיצונית אינה מותרת ב-DTD</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>unparsed entity reference in wrong context</source>
+        <translation>התייחסות ליישות לא מעובדת בהקשר שגוי</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>recursive entities</source>
+        <translation>יישות רקורסיבית</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>error in the text declaration of an external entity</source>
+        <translation>שגיאה בהכרזת טקסט של יישות חיצונית</translation>
+    </message>
+</context>
+<context>
+    <name>QXmlStream</name>
+    <message>
+        <location filename="../src/corelib/xml/qxmlstream.cpp" line="+592"/>
+        <location filename="../src/corelib/xml/qxmlstream_p.h" line="+1769"/>
+        <source>Extra content at end of document.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+222"/>
+        <source>Invalid entity value.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+107"/>
+        <source>Invalid XML character.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+259"/>
+        <source>Sequence &apos;]]&gt;&apos; not allowed in content.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+309"/>
+        <source>Namespace prefix &apos;%1&apos; not declared</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+78"/>
+        <source>Attribute redefined.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+115"/>
+        <source>Unexpected character &apos;%1&apos; in public id literal.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+28"/>
+        <source>Invalid XML version string.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Unsupported XML version.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+23"/>
+        <source>%1 is an invalid encoding name.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+7"/>
+        <source>Encoding %1 is unsupported</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+16"/>
+        <source>Standalone accepts only yes or no.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Invalid attribute in XML declaration.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+16"/>
+        <source>Premature end of document.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>Invalid document.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+40"/>
+        <source>Expected </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+11"/>
+        <source>, but got &apos;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>Unexpected &apos;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+210"/>
+        <source>Expected character data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/corelib/xml/qxmlstream_p.h" line="-995"/>
+        <source>Recursive entity detected.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+516"/>
+        <source>Start tag expected.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+222"/>
+        <source>XML declaration not at start of document.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-31"/>
+        <source>NDATA in parameter entity declaration.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+34"/>
+        <source>%1 is an invalid processing instruction name.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+11"/>
+        <source>Invalid processing instruction name.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/corelib/xml/qxmlstream.cpp" line="-521"/>
+        <location line="+12"/>
+        <location filename="../src/corelib/xml/qxmlstream_p.h" line="+164"/>
+        <location line="+53"/>
+        <source>Illegal namespace declaration.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/corelib/xml/qxmlstream_p.h" line="+15"/>
+        <source>Invalid XML name.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+23"/>
+        <source>Opening and ending tag mismatch.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+18"/>
+        <source>Reference to unparsed entity &apos;%1&apos;.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-13"/>
+        <location line="+61"/>
+        <location line="+40"/>
+        <source>Entity &apos;%1&apos; not declared.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-26"/>
+        <source>Reference to external entity &apos;%1&apos; in attribute value.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+40"/>
+        <source>Invalid character reference.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/corelib/xml/qxmlstream.cpp" line="-75"/>
+        <location filename="../src/corelib/xml/qxmlstream_p.h" line="-823"/>
+        <source>Encountered incorrectly encoded content.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+274"/>
+        <source>The standalone pseudo attribute must appear after the encoding.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/corelib/xml/qxmlstream_p.h" line="+562"/>
+        <source>%1 is an invalid PUBLIC identifier.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QtXmlPatterns</name>
+    <message>
+        <location filename="../src/xmlpatterns/acceltree/qacceltreebuilder.cpp" line="+205"/>
+        <source>An %1-attribute with value %2 has already been declared.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+13"/>
+        <source>An %1-attribute must have a valid %2 as value, which %3 isn&apos;t.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/api/qiodevicedelegate.cpp" line="+84"/>
+        <source>Network timeout.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/api/qxmlserializer.cpp" line="+320"/>
+        <source>Element %1 can&apos;t be serialized because it appears outside the document element.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+60"/>
+        <source>Attribute %1 can&apos;t be serialized because it appears at the top level.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/data/qabstractdatetime.cpp" line="+80"/>
+        <source>Year %1 is invalid because it begins with %2.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+19"/>
+        <source>Day %1 is outside the range %2..%3.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+7"/>
+        <source>Month %1 is outside the range %2..%3.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+10"/>
+        <source>Overflow: Can&apos;t represent date %1.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+9"/>
+        <source>Day %1 is invalid for month %2.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+49"/>
+        <source>Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+13"/>
+        <source>Time %1:%2:%3.%4 is invalid.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+115"/>
+        <source>Overflow: Date can&apos;t be represented.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/data/qabstractduration.cpp" line="+99"/>
+        <location line="+15"/>
+        <source>At least one component must be present.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-7"/>
+        <source>At least one time component must appear after the %1-delimiter.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/data/qabstractfloatmathematician.cpp" line="+64"/>
+        <source>No operand in an integer division, %1, can be %2.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+7"/>
+        <source>The first operand in an integer division, %1, cannot be infinity (%2).</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+6"/>
+        <source>The second operand in a division, %1, cannot be zero (%2).</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/data/qanyuri_p.h" line="+132"/>
+        <source>%1 is not a valid value of type %2.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/data/qatomiccasters_p.h" line="+223"/>
+        <source>When casting to %1 from %2, the source value cannot be %3.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/data/qatomicmathematicians.cpp" line="+65"/>
+        <source>Integer division (%1) by zero (%2) is undefined.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+7"/>
+        <source>Division (%1) by zero (%2) is undefined.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+7"/>
+        <source>Modulus division (%1) by zero (%2) is undefined.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+122"/>
+        <location line="+32"/>
+        <source>Dividing a value of type %1 by %2 (not-a-number) is not allowed.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-20"/>
+        <source>Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+32"/>
+        <source>Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/data/qatomicvalue.cpp" line="+79"/>
+        <source>A value of type %1 cannot have an Effective Boolean Value.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/data/qboolean.cpp" line="+78"/>
+        <source>Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/data/qderivedinteger_p.h" line="+402"/>
+        <source>Value %1 of type %2 exceeds maximum (%3).</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+9"/>
+        <source>Value %1 of type %2 is below minimum (%3).</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/data/qhexbinary.cpp" line="+91"/>
+        <source>A value of type %1 must contain an even number of digits. The value %2 does not.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+19"/>
+        <source>%1 is not valid as a value of type %2.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/expr/qarithmeticexpression.cpp" line="+207"/>
+        <source>Operator %1 cannot be used on type %2.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+17"/>
+        <source>Operator %1 cannot be used on atomic values of type %2 and %3.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/expr/qattributenamevalidator.cpp" line="+66"/>
+        <source>The namespace URI in the name for a computed attribute cannot be %1.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+9"/>
+        <source>The name for a computed attribute cannot have the namespace URI %1 with the local name %2.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/expr/qcastas.cpp" line="+88"/>
+        <source>Type error in cast, expected %1, received %2.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+29"/>
+        <source>When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/expr/qcastingplatform.cpp" line="+134"/>
+        <source>No casting is possible with %1 as the target type.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+15"/>
+        <source>It is not possible to cast from %1 to %2.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+27"/>
+        <source>Casting to %1 is not possible because it is an abstract type, and can therefore never be instantiated.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+23"/>
+        <source>It&apos;s not possible to cast the value %1 of type %2 to %3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+8"/>
+        <source>Failure when casting from %1 to %2: %3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/expr/qcommentconstructor.cpp" line="+67"/>
+        <source>A comment cannot contain %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+6"/>
+        <source>A comment cannot end with a %1.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/expr/qcomparisonplatform.cpp" line="+167"/>
+        <source>No comparisons can be done involving the type %1.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+14"/>
+        <source>Operator %1 is not available between atomic values of type %2 and %3.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/expr/qdocumentcontentvalidator.cpp" line="+86"/>
+        <source>An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/expr/qexpressionfactory.cpp" line="+169"/>
+        <source>A library module cannot be evaluated directly. It must be imported from a main module.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+40"/>
+        <source>No template by name %1 exists.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/expr/qgenericpredicate.cpp" line="+106"/>
+        <source>A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+32"/>
+        <source>A positional predicate must evaluate to a single numeric value.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/expr/qncnameconstructor_p.h" line="+113"/>
+        <source>The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, is %2 invalid.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+24"/>
+        <source>%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/expr/qpath.cpp" line="+109"/>
+        <source>The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/expr/qprocessinginstructionconstructor.cpp" line="+84"/>
+        <source>The data of a processing instruction cannot contain the string %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/expr/qqnameconstructor.cpp" line="+82"/>
+        <source>No namespace binding exists for the prefix %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/expr/qqnameconstructor_p.h" line="+156"/>
+        <source>No namespace binding exists for the prefix %1 in %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+12"/>
+        <location filename="../src/xmlpatterns/functions/qqnamefns.cpp" line="+69"/>
+        <source>%1 is an invalid %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message numerus="yes">
+        <location filename="../src/xmlpatterns/functions/qabstractfunctionfactory.cpp" line="+77"/>
+        <source>%1 takes at most %n argument(s). %2 is therefore invalid.</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message numerus="yes">
+        <location line="+11"/>
+        <source>%1 requires at least %n argument(s). %2 is therefore invalid.</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/functions/qaggregatefns.cpp" line="+120"/>
+        <source>The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+74"/>
+        <source>The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+91"/>
+        <source>The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/functions/qassemblestringfns.cpp" line="+88"/>
+        <source>%1 is not a valid XML 1.0 character.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/functions/qcomparingaggregator.cpp" line="+197"/>
+        <source>The first argument to %1 cannot be of type %2.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/functions/qdatetimefn.cpp" line="+86"/>
+        <source>If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/functions/qerrorfn.cpp" line="+61"/>
+        <source>%1 was called.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/functions/qpatternmatchingfns.cpp" line="+94"/>
+        <source>%1 must be followed by %2 or %3, not at the end of the replacement string.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+39"/>
+        <source>In the replacement string, %1 must be followed by at least one digit when not escaped.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+26"/>
+        <source>In the replacement string, %1 can only be used to escape itself or %2, not %3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/functions/qpatternplatform.cpp" line="+92"/>
+        <source>%1 matches newline characters</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>%1 and %2 match the start and end of a line.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+6"/>
+        <source>Matches are case insensitive</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>Whitespace characters are removed, except when they appear in character classes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+99"/>
+        <source>%1 is an invalid regular expression pattern: %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+30"/>
+        <source>%1 is an invalid flag for regular expressions. Valid flags are:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/functions/qqnamefns.cpp" line="+17"/>
+        <source>If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/functions/qsequencefns.cpp" line="+347"/>
+        <source>It will not be possible to retrieve %1.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/functions/qcontextnodechecker.cpp" line="+54"/>
+        <source>The root node of the second argument to function %1 must be a document node. %2 is not a document node.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/functions/qsequencegeneratingfns.cpp" line="+279"/>
+        <source>The default collection is undefined</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+13"/>
+        <source>%1 cannot be retrieved</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/functions/qstringvaluefns.cpp" line="+252"/>
+        <source>The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization).</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/functions/qtimezonefns.cpp" line="+87"/>
+        <source>A zone offset must be in the range %1..%2 inclusive. %3 is out of range.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+12"/>
+        <source>%1 is not a whole number of minutes.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/janitors/qcardinalityverifier.cpp" line="+58"/>
+        <source>Required cardinality is %1; got cardinality %2.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/janitors/qitemverifier.cpp" line="+67"/>
+        <source>The item %1 did not match the required type %2.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+379"/>
+        <location line="+7253"/>
+        <source>%1 is an unknown schema type.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-6971"/>
+        <source>Only one %1 declaration can occur in the query prolog.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+188"/>
+        <source>The initialization of variable %1 depends on itself</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+63"/>
+        <source>No variable by name %1 exists</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/parser/qparsercontext.cpp" line="+93"/>
+        <source>The variable %1 is unused</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+2841"/>
+        <source>Version %1 is not supported. The supported XQuery version is 1.0.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+16"/>
+        <source>The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+55"/>
+        <source>No function with signature %1 is available</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+72"/>
+        <location line="+10"/>
+        <source>A default namespace declaration must occur before function, variable, and option declarations.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+10"/>
+        <source>Namespace declarations must occur before function, variable, and option declarations.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+11"/>
+        <source>Module imports must occur before function, variable, and option declarations.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+200"/>
+        <source>It is not possible to redeclare prefix %1.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+18"/>
+        <source>Prefix %1 is already declared in the prolog.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+95"/>
+        <source>The name of an option must have a prefix. There is no default namespace for options.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+171"/>
+        <source>The Schema Import feature is not supported, and therefore %1 declarations cannot occur.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+13"/>
+        <source>The target namespace of a %1 cannot be empty.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+8"/>
+        <source>The module import feature is not supported</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+52"/>
+        <source>No value is available for the external variable by name %1.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-4154"/>
+        <source>A construct was encountered which only is allowed in XQuery.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+118"/>
+        <source>A template by name %1 has already been declared.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+3581"/>
+        <source>The keyword %1 cannot occur with any other mode name.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+29"/>
+        <source>The value of attribute %1 must of type %2, which %3 isn&apos;t.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+75"/>
+        <source>The prefix %1 can not be bound. By default, it is already bound to the namespace %2.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+312"/>
+        <source>A variable by name %1 has already been declared.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+135"/>
+        <source>A stylesheet function must have a prefixed name.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+9"/>
+        <source>The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+9"/>
+        <source>The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+12"/>
+        <source>The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+34"/>
+        <source>A function already exists with the signature %1.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+23"/>
+        <source>No external functions are supported. All supported functions can be used directly, without first declaring them as external</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+37"/>
+        <source>An argument by name %1 has already been declared. Every argument name must be unique.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+179"/>
+        <source>When function %1 is used for matching inside a pattern, the argument must be a variable reference or a string literal.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+11"/>
+        <source>In an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+14"/>
+        <source>In an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+9"/>
+        <source>In an XSL-T pattern, function %1 cannot have a third argument.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+10"/>
+        <source>In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+63"/>
+        <source>In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+126"/>
+        <source>%1 is an invalid template mode name.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+44"/>
+        <source>The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+758"/>
+        <source>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+39"/>
+        <source>None of the pragma expressions are supported. Therefore, a fallback expression must be present</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+267"/>
+        <source>Each name of a template parameter must be unique; %1 is duplicated.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+129"/>
+        <source>The %1-axis is unsupported in XQuery</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1150"/>
+        <source>%1 is not a valid name for a processing-instruction.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-7029"/>
+        <source>%1 is not a valid numeric literal.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+6165"/>
+        <source>No function by name %1 is available.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+102"/>
+        <source>The namespace URI cannot be the empty string when binding to a prefix, %1.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+7"/>
+        <source>%1 is an invalid namespace URI.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+6"/>
+        <source>It is not possible to bind to the prefix %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+7"/>
+        <source>Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+8"/>
+        <source>Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+15"/>
+        <source>Two namespace declaration attributes have the same name: %1.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+89"/>
+        <source>The namespace URI must be a constant and cannot use enclosed expressions.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+16"/>
+        <source>An attribute by name %1 has already appeared on this element.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+61"/>
+        <source>A direct element constructor is not well-formed. %1 is ended with %2.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+458"/>
+        <source>The name %1 does not refer to any schema type.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+10"/>
+        <source>%1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+9"/>
+        <source>%1 is not an atomic type. Casting is only possible to atomic types.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+145"/>
+        <location line="+71"/>
+        <source>%1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+48"/>
+        <source>The name of an extension expression must be in a namespace.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/type/qcardinality.cpp" line="+55"/>
+        <source>empty</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>zero or one</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>exactly one</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>one or more</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+2"/>
+        <source>zero or more</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/type/qtypechecker.cpp" line="+63"/>
+        <source>Required type is %1, but %2 was found.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+44"/>
+        <source>Promoting %1 to %2 may cause loss of precision.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+49"/>
+        <source>The focus is undefined.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/utils/qoutputvalidator.cpp" line="+86"/>
+        <source>It&apos;s not possible to add attributes after any other kind of node.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+7"/>
+        <source>An attribute by name %1 has already been created.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/utils/qxpathhelper_p.h" line="+120"/>
+        <source>Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/acceltree/qacceltreeresourceloader.cpp" line="+314"/>
+        <source>%1 is an unsupported encoding.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+16"/>
+        <source>%1 contains octets which are disallowed in the requested encoding %2.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+18"/>
+        <source>The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/expr/qapplytemplate.cpp" line="+119"/>
+        <source>Ambiguous rule match.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/expr/qcomputednamespaceconstructor.cpp" line="+69"/>
+        <source>In a namespace constructor, the value for a namespace cannot be an empty string.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+11"/>
+        <source>The prefix must be a valid %1, which %2 is not.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+14"/>
+        <source>The prefix %1 cannot be bound.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+10"/>
+        <source>Only the prefix %1 can be bound to %2 and vice versa.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/expr/qevaluationcache.cpp" line="+117"/>
+        <source>Circularity detected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/expr/qtemplate.cpp" line="+145"/>
+        <source>The parameter %1 is required, but no corresponding %2 is supplied.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-71"/>
+        <source>The parameter %1 is passed, but no corresponding %2 exists.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/functions/qunparsedtextfn.cpp" line="+65"/>
+        <source>The URI cannot have a fragment</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+519"/>
+        <source>Element %1 is not allowed at this location.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+9"/>
+        <source>Text nodes are not allowed at this location.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+20"/>
+        <source>Parse error: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+62"/>
+        <source>The value of the XSL-T version attribute must be a value of type %1, which %2 isn&apos;t.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+20"/>
+        <source>Running an XSL-T 1.0 stylesheet with a 2.0 processor.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+108"/>
+        <source>Unknown XSL-T attribute %1.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+23"/>
+        <source>Attribute %1 and %2 are mutually exclusive.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+166"/>
+        <source>In a simplified stylesheet module, attribute %1 must be present.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+72"/>
+        <source>If element %1 has no attribute %2, it cannot have attribute %3 or %4.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+9"/>
+        <source>Element %1 must have at least one of the attributes %2 or %3.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+28"/>
+        <source>At least one mode must be specified in the %1-attribute on element %2.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/parser/qmaintainingreader.cpp" line="+183"/>
+        <source>Attribute %1 cannot appear on the element %2. Only the standard attributes can appear.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+6"/>
+        <source>Attribute %1 cannot appear on the element %2. Only %3 is allowed, and the standard attributes.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+8"/>
+        <source>Attribute %1 cannot appear on the element %2. Allowed is %3, %4, and the standard attributes.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+9"/>
+        <source>Attribute %1 cannot appear on the element %2. Allowed is %3, and the standard attributes.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+13"/>
+        <source>XSL-T attributes on XSL-T elements must be in the null namespace, not in the XSL-T namespace which %1 is.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+12"/>
+        <source>The attribute %1 must appear on element %2.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+8"/>
+        <source>The element with local name %1 does not exist in XSL-T.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+123"/>
+        <source>Element %1 must come last.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+24"/>
+        <source>At least one %1-element must occur before %2.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+7"/>
+        <source>Only one %1-element can appear.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+31"/>
+        <source>At least one %1-element must occur inside %2.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+58"/>
+        <source>When attribute %1 is present on %2, a sequence constructor cannot be used.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+13"/>
+        <source>Element %1 must have either a %2-attribute or a sequence constructor.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+125"/>
+        <source>When a parameter is required, a default value cannot be supplied through a %1-attribute or a sequence constructor.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+270"/>
+        <source>Element %1 cannot have children.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+434"/>
+        <source>Element %1 cannot have a sequence constructor.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+86"/>
+        <location line="+9"/>
+        <source>The attribute %1 cannot appear on %2, when it is a child of %3.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+15"/>
+        <source>A parameter in a function cannot be declared to be a tunnel.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+149"/>
+        <source>This processor is not Schema-aware and therefore %1 cannot be used.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+57"/>
+        <source>Top level stylesheet elements must be in a non-null namespace, which %1 isn&apos;t.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+48"/>
+        <source>The value for attribute %1 on element %2 must either be %3 or %4, not %5.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+20"/>
+        <source>Attribute %1 cannot have the value %2.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+58"/>
+        <source>The attribute %1 can only appear on the first %2 element.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+99"/>
+        <source>At least one %1 element must appear as child of %2.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>VolumeSlider</name>
+    <message>
+        <location filename="../src/3rdparty/phonon/phonon/volumeslider.cpp" line="+67"/>
+        <source>Muted</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <location line="+15"/>
+        <source>Volume: %1%</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+</TS>
--- a/translations/qt_iw.ts	Thu May 27 13:40:48 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7781 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.0">
-<context>
-    <name>AudioOutput</name>
-    <message>
-        <location filename="../src/3rdparty/phonon/phonon/audiooutput.cpp" line="+375"/>
-        <source>&lt;html&gt;The audio playback device &lt;b&gt;%1&lt;/b&gt; does not work.&lt;br/&gt;Falling back to &lt;b&gt;%2&lt;/b&gt;.&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+13"/>
-        <source>&lt;html&gt;Switching to the audio playback device &lt;b&gt;%1&lt;/b&gt;&lt;br/&gt;which just became available and has higher preference.&lt;/html&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Revert back to device &apos;%1&apos;</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>CloseButton</name>
-    <message>
-        <location filename="../src/gui/widgets/qtabbar.cpp" line="+2251"/>
-        <source>Close Tab</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>PPDOptionsModel</name>
-    <message>
-        <source>Name</source>
-        <translation type="obsolete">שם</translation>
-    </message>
-</context>
-<context>
-    <name>Phonon::</name>
-    <message>
-        <location filename="../src/3rdparty/phonon/phonon/phononnamespace.cpp" line="+55"/>
-        <source>Notifications</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Music</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Video</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Communication</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Games</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Accessibility</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>Phonon::Gstreamer::Backend</name>
-    <message>
-        <location filename="../src/3rdparty/phonon/gstreamer/backend.cpp" line="+171"/>
-        <source>Warning: You do not seem to have the package gstreamer0.10-plugins-good installed.
-          Some video features have been disabled.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Warning: You do not seem to have the base GStreamer plugins installed.
-          All audio and video support has been disabled</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>Phonon::Gstreamer::MediaObject</name>
-    <message>
-        <location filename="../src/3rdparty/phonon/gstreamer/mediaobject.cpp" line="+90"/>
-        <source>Cannot start playback. 
-
-Check your Gstreamer installation and make sure you 
-have libgstreamer-plugins-base installed.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+113"/>
-        <source>A required codec is missing. You need to install the following codec(s) to play this content: %0</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+676"/>
-        <location line="+8"/>
-        <location line="+15"/>
-        <location line="+9"/>
-        <location line="+6"/>
-        <location line="+19"/>
-        <location line="+335"/>
-        <location line="+24"/>
-        <source>Could not open media source.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-403"/>
-        <source>Invalid source type.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+377"/>
-        <source>Could not locate media source.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+10"/>
-        <source>Could not open audio device. The device is already in use.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+13"/>
-        <source>Could not decode media source.</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>Phonon::VolumeSlider</name>
-    <message>
-        <location filename="../src/3rdparty/phonon/phonon/volumeslider.cpp" line="+42"/>
-        <location line="+18"/>
-        <source>Volume: %1%</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-15"/>
-        <location line="+18"/>
-        <location line="+54"/>
-        <source>Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1%</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>Q3Accel</name>
-    <message>
-        <location filename="../src/qt3support/other/q3accel.cpp" line="+481"/>
-        <source>%1, %2 not defined</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+36"/>
-        <source>Ambiguous %1 not handled</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>Q3DataTable</name>
-    <message>
-        <location filename="../src/qt3support/sql/q3datatable.cpp" line="+285"/>
-        <source>True</source>
-        <translation type="unfinished">אמת</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>False</source>
-        <translation type="unfinished">שקר</translation>
-    </message>
-    <message>
-        <location line="+505"/>
-        <source>Insert</source>
-        <translation type="unfinished">הוסף</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Update</source>
-        <translation type="unfinished">עדכן</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Delete</source>
-        <translation type="unfinished">מחק</translation>
-    </message>
-</context>
-<context>
-    <name>Q3FileDialog</name>
-    <message>
-        <location filename="../src/qt3support/dialogs/q3filedialog.cpp" line="+864"/>
-        <source>Copy or Move a File</source>
-        <translation type="unfinished">העתק או העבר קובץ</translation>
-    </message>
-    <message>
-        <location line="+8"/>
-        <source>Read: %1</source>
-        <translation type="unfinished">קרא: %1</translation>
-    </message>
-    <message>
-        <location line="+6"/>
-        <location line="+30"/>
-        <source>Write: %1</source>
-        <translation type="unfinished">כתוב: %1</translation>
-    </message>
-    <message>
-        <location line="-22"/>
-        <location line="+1575"/>
-        <source>Cancel</source>
-        <translation type="unfinished">ביטול</translation>
-    </message>
-    <message>
-        <location line="-157"/>
-        <location line="+49"/>
-        <location line="+2153"/>
-        <location filename="../src/qt3support/dialogs/q3filedialog_mac.cpp" line="+110"/>
-        <source>All Files (*)</source>
-        <translation type="unfinished">כל הקבצים (*)</translation>
-    </message>
-    <message>
-        <location line="-2089"/>
-        <source>Name</source>
-        <translation type="unfinished">שם</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Size</source>
-        <translation type="unfinished">גודל</translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Type</source>
-        <translation type="unfinished">סוג</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Date</source>
-        <translation type="unfinished">תאריך</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Attributes</source>
-        <translation type="unfinished">מאפיינים</translation>
-    </message>
-    <message>
-        <location line="+35"/>
-        <location line="+2031"/>
-        <source>&amp;OK</source>
-        <translation type="unfinished">&amp;אישור</translation>
-    </message>
-    <message>
-        <location line="-1991"/>
-        <source>Look &amp;in:</source>
-        <translation type="unfinished">&amp;חפש ב:</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <location line="+1981"/>
-        <location line="+16"/>
-        <source>File &amp;name:</source>
-        <translation type="unfinished">&amp;שם הקובץ:</translation>
-    </message>
-    <message>
-        <location line="-1996"/>
-        <source>File &amp;type:</source>
-        <translation type="unfinished">&amp;סוג הקובץ:</translation>
-    </message>
-    <message>
-        <location line="+7"/>
-        <source>Back</source>
-        <translation type="unfinished">אחורה</translation>
-    </message>
-    <message>
-        <location line="+7"/>
-        <source>One directory up</source>
-        <translation type="unfinished">ספריה אחת למעלה</translation>
-    </message>
-    <message>
-        <location line="+9"/>
-        <source>Create New Folder</source>
-        <translation type="unfinished">צור תיקיה חדשה</translation>
-    </message>
-    <message>
-        <location line="+18"/>
-        <source>List View</source>
-        <translation type="unfinished">תצוגת רשימה</translation>
-    </message>
-    <message>
-        <location line="+8"/>
-        <source>Detail View</source>
-        <translation type="unfinished">תצוגת פרטים</translation>
-    </message>
-    <message>
-        <location line="+9"/>
-        <source>Preview File Info</source>
-        <translation type="unfinished">תצוגה מקדימה של פרטי הקובץ</translation>
-    </message>
-    <message>
-        <location line="+23"/>
-        <source>Preview File Contents</source>
-        <translation type="unfinished">תצוגה מקדימה של תוכן הקובץ</translation>
-    </message>
-    <message>
-        <location line="+88"/>
-        <source>Read-write</source>
-        <translation type="unfinished">קריאה-כתיבה</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Read-only</source>
-        <translation type="unfinished">קריאה-בלבד</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Write-only</source>
-        <translation type="unfinished">כתיבה-בלבד</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Inaccessible</source>
-        <translation type="unfinished">לא נגיש</translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Symlink to File</source>
-        <translation type="unfinished">קישור סמלי לקובץ</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Symlink to Directory</source>
-        <translation type="unfinished">קישור סמלי לספריה</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Symlink to Special</source>
-        <translation type="unfinished">קישור סמלי לפריט מיוחד</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>File</source>
-        <translation type="unfinished">קובץ</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Dir</source>
-        <translation type="unfinished">ספריה</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Special</source>
-        <translation type="unfinished">מיוחד</translation>
-    </message>
-    <message>
-        <location line="+704"/>
-        <location line="+2100"/>
-        <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+337"/>
-        <source>Open</source>
-        <translation type="unfinished">פתח</translation>
-    </message>
-    <message>
-        <location line="-1990"/>
-        <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+84"/>
-        <source>Save As</source>
-        <translation type="unfinished">שמירה בשם</translation>
-    </message>
-    <message>
-        <location line="+642"/>
-        <location line="+5"/>
-        <location line="+355"/>
-        <source>&amp;Open</source>
-        <translation type="unfinished">&amp;פתח</translation>
-    </message>
-    <message>
-        <location line="-357"/>
-        <location line="+341"/>
-        <source>&amp;Save</source>
-        <translation type="unfinished">&amp;שמור</translation>
-    </message>
-    <message>
-        <location line="-334"/>
-        <source>&amp;Rename</source>
-        <translation type="unfinished">ש&amp;נה שם</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>&amp;Delete</source>
-        <translation type="unfinished">&amp;מחק</translation>
-    </message>
-    <message>
-        <location line="+20"/>
-        <source>R&amp;eload</source>
-        <translation type="unfinished">&amp;טען מחדש</translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>Sort by &amp;Name</source>
-        <translation type="unfinished">סדר לפי ש&amp;ם</translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Sort by &amp;Size</source>
-        <translation type="unfinished">סדר לפי &amp;גודל</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Sort by &amp;Date</source>
-        <translation type="unfinished">סדר לפי &amp;תאריך</translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>&amp;Unsorted</source>
-        <translation type="unfinished">&amp;ללא סדר</translation>
-    </message>
-    <message>
-        <location line="+15"/>
-        <source>Sort</source>
-        <translation type="unfinished">סדר</translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>Show &amp;hidden files</source>
-        <translation type="unfinished">הצג קבצים &amp;מוסתרים</translation>
-    </message>
-    <message>
-        <location line="+31"/>
-        <source>the file</source>
-        <translation type="unfinished">הקובץ</translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>the directory</source>
-        <translation type="unfinished">הספריה</translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>the symlink</source>
-        <translation type="unfinished">הקישור הסמלי</translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Delete %1</source>
-        <translation type="unfinished">מחק את %1</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>&lt;qt&gt;Are you sure you wish to delete %1 &quot;%2&quot;?&lt;/qt&gt;</source>
-        <translation type="unfinished">&lt;qt&gt;האם אתה בטוח שברצונך למחוק %1 &quot;%2&quot;?&lt;/qt&gt;</translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>&amp;Yes</source>
-        <translation type="unfinished">&amp;כן</translation>
-    </message>
-    <message>
-        <location line="+0"/>
-        <source>&amp;No</source>
-        <translation type="unfinished">&amp;לא</translation>
-    </message>
-    <message>
-        <location line="+36"/>
-        <source>New Folder 1</source>
-        <translation type="unfinished">תיקיה חדשה 1</translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>New Folder</source>
-        <translation type="unfinished">תיקיה חדשה</translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>New Folder %1</source>
-        <translation type="unfinished">תיקיה חדשה %1</translation>
-    </message>
-    <message>
-        <location line="+98"/>
-        <source>Find Directory</source>
-        <translation type="unfinished">חפש ספריה</translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <location line="+108"/>
-        <source>Directories</source>
-        <translation type="unfinished">ספריות</translation>
-    </message>
-    <message>
-        <location line="-2"/>
-        <source>Directory:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+40"/>
-        <location line="+1110"/>
-        <source>Error</source>
-        <translation type="unfinished">שגיאה</translation>
-    </message>
-    <message>
-        <location line="-1109"/>
-        <source>%1
-File not found.
-Check path and filename.</source>
-        <translation type="unfinished">%1
-הקובץ לא נמצא.
-בדוק את הנתיב ואת שם הקובץ.</translation>
-    </message>
-    <message>
-        <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="-289"/>
-        <source>All Files (*.*)</source>
-        <translation type="unfinished">כל הקבצים (*.*)</translation>
-    </message>
-    <message>
-        <location line="+375"/>
-        <source>Open </source>
-        <translation type="unfinished">פתח</translation>
-    </message>
-    <message>
-        <location line="+155"/>
-        <source>Select a Directory</source>
-        <translation type="unfinished">בחר ספריה</translation>
-    </message>
-</context>
-<context>
-    <name>Q3LocalFs</name>
-    <message>
-        <location filename="../src/qt3support/network/q3localfs.cpp" line="+130"/>
-        <location line="+10"/>
-        <source>Could not read directory
-%1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+45"/>
-        <source>Could not create directory
-%1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+34"/>
-        <source>Could not remove file or directory
-%1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+27"/>
-        <source>Could not rename
-%1
-to
-%2</source>
-        <translation type="unfinished">לא ניתן לשנות את השם של
-%1
-אל
-%2</translation>
-    </message>
-    <message>
-        <location line="+25"/>
-        <source>Could not open
-%1</source>
-        <translation type="unfinished">לא ניתן לפתוח את
-%1</translation>
-    </message>
-    <message>
-        <location line="+68"/>
-        <source>Could not write
-%1</source>
-        <translation type="unfinished">לא ניתן לכתוב את
-%1</translation>
-    </message>
-</context>
-<context>
-    <name>Q3MainWindow</name>
-    <message>
-        <location filename="../src/qt3support/widgets/q3mainwindow.cpp" line="+2051"/>
-        <source>Line up</source>
-        <translation type="unfinished">סדר בשורה</translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Customize...</source>
-        <translation type="unfinished">התאמה אישית...</translation>
-    </message>
-</context>
-<context>
-    <name>Q3NetworkProtocol</name>
-    <message>
-        <location filename="../src/qt3support/network/q3networkprotocol.cpp" line="+854"/>
-        <source>Operation stopped by the user</source>
-        <translation type="unfinished">הפעולה הופסקה על ידי המשתמש</translation>
-    </message>
-</context>
-<context>
-    <name>Q3ProgressDialog</name>
-    <message>
-        <location filename="../src/qt3support/dialogs/q3progressdialog.cpp" line="+224"/>
-        <location line="+61"/>
-        <source>Cancel</source>
-        <translation type="unfinished">ביטול</translation>
-    </message>
-</context>
-<context>
-    <name>Q3TabDialog</name>
-    <message>
-        <location filename="../src/qt3support/dialogs/q3tabdialog.cpp" line="+189"/>
-        <location line="+814"/>
-        <source>OK</source>
-        <translation type="unfinished">אישור</translation>
-    </message>
-    <message>
-        <location line="-356"/>
-        <source>Apply</source>
-        <translation type="unfinished">החל</translation>
-    </message>
-    <message>
-        <location line="+43"/>
-        <source>Help</source>
-        <translation type="unfinished">עזרה</translation>
-    </message>
-    <message>
-        <location line="+45"/>
-        <source>Defaults</source>
-        <translation type="unfinished">ברירות מחדל</translation>
-    </message>
-    <message>
-        <location line="+50"/>
-        <source>Cancel</source>
-        <translation type="unfinished">ביטול</translation>
-    </message>
-</context>
-<context>
-    <name>Q3TextEdit</name>
-    <message>
-        <location filename="../src/qt3support/text/q3textedit.cpp" line="+5429"/>
-        <source>&amp;Undo</source>
-        <translation type="unfinished">&amp;בטל</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>&amp;Redo</source>
-        <translation type="unfinished">בצע &amp;שוב</translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Cu&amp;t</source>
-        <translation type="unfinished">&amp;גזור</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>&amp;Copy</source>
-        <translation type="unfinished">הע&amp;תק</translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>&amp;Paste</source>
-        <translation type="unfinished">ה&amp;דבק</translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Clear</source>
-        <translation type="unfinished">נקה</translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <location line="+2"/>
-        <source>Select All</source>
-        <translation type="unfinished">בחר הכל</translation>
-    </message>
-</context>
-<context>
-    <name>Q3TitleBar</name>
-    <message>
-        <location filename="../src/plugins/accessible/compat/q3complexwidgets.cpp" line="+246"/>
-        <source>System</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Restore up</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Minimize</source>
-        <translation type="unfinished">מזער</translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Restore down</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Maximize</source>
-        <translation type="unfinished">הגדל</translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Close</source>
-        <translation type="unfinished">סגור</translation>
-    </message>
-    <message>
-        <location line="+18"/>
-        <source>Contains commands to manipulate the window</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Puts a minimized back to normal</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Moves the window out of the way</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Puts a maximized window back to normal</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Makes the window full screen</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Closes the window</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Displays the name of the window and contains controls to manipulate it</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>Q3ToolBar</name>
-    <message>
-        <location filename="../src/qt3support/widgets/q3toolbar.cpp" line="+692"/>
-        <source>More...</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>Q3UrlOperator</name>
-    <message>
-        <location filename="../src/qt3support/network/q3urloperator.cpp" line="+386"/>
-        <location line="+260"/>
-        <location line="+4"/>
-        <source>The protocol `%1&apos; is not supported</source>
-        <translation type="unfinished">הפרוטוקול &quot;%1&quot; אינו נתמך</translation>
-    </message>
-    <message>
-        <location line="-260"/>
-        <source>The protocol `%1&apos; does not support listing directories</source>
-        <translation type="unfinished">הפרוטוקול &quot;%1&quot; לא תומך בהצגת ספריות</translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>The protocol `%1&apos; does not support creating new directories</source>
-        <translation type="unfinished">הפרוטוקול &quot;%1&quot; לא תומך ביצירת ספריית חדשות</translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>The protocol `%1&apos; does not support removing files or directories</source>
-        <translation type="unfinished">הפרוטוקול &quot;%1&quot; לא תומך בהסרת קבצים או ספריות</translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>The protocol `%1&apos; does not support renaming files or directories</source>
-        <translation type="unfinished">הפרוטוקול &quot;%1&quot; לא תומך בשינוי שמותיהם של קבצים או ספריות</translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>The protocol `%1&apos; does not support getting files</source>
-        <translation type="unfinished">הפרוטוקול &quot;%1&quot; לא תומך בהורדת קבצים</translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>The protocol `%1&apos; does not support putting files</source>
-        <translation type="unfinished">הפרוטוקול &quot;%1&quot; לא תומך בהעלאת קבצים</translation>
-    </message>
-    <message>
-        <location line="+243"/>
-        <location line="+4"/>
-        <source>The protocol `%1&apos; does not support copying or moving files or directories</source>
-        <translation type="unfinished">הפרוטוקול &quot;%1&quot; לא תומך בהעתקה או העברה של קבצים או ספריות</translation>
-    </message>
-    <message>
-        <location line="+237"/>
-        <location line="+1"/>
-        <source>(unknown)</source>
-        <translation type="unfinished">(לא ידוע)</translation>
-    </message>
-</context>
-<context>
-    <name>Q3Wizard</name>
-    <message>
-        <location filename="../src/qt3support/dialogs/q3wizard.cpp" line="+177"/>
-        <source>&amp;Cancel</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>&lt; &amp;Back</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>&amp;Next &gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>&amp;Finish</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>&amp;Help</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QAbstractSocket</name>
-    <message>
-        <location filename="../src/network/socket/qabstractsocket.cpp" line="+868"/>
-        <location filename="../src/network/socket/qhttpsocketengine.cpp" line="+615"/>
-        <location filename="../src/network/socket/qsocks5socketengine.cpp" line="+657"/>
-        <location line="+26"/>
-        <source>Host not found</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+50"/>
-        <location filename="../src/network/socket/qhttpsocketengine.cpp" line="+3"/>
-        <location filename="../src/network/socket/qsocks5socketengine.cpp" line="+4"/>
-        <source>Connection refused</source>
-        <translation type="unfinished">החיבור נדחה</translation>
-    </message>
-    <message>
-        <location line="+141"/>
-        <source>Connection timed out</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-547"/>
-        <location line="+787"/>
-        <location line="+208"/>
-        <source>Operation on socket is not supported</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+137"/>
-        <source>Socket operation timed out</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+380"/>
-        <source>Socket is not connected</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/network/socket/qsocks5socketengine.cpp" line="-8"/>
-        <source>Network unreachable</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QAbstractSpinBox</name>
-    <message>
-        <location filename="../src/gui/widgets/qabstractspinbox.cpp" line="+1199"/>
-        <source>&amp;Step up</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Step &amp;down</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-8"/>
-        <source>&amp;Select All</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QApplication</name>
-    <message>
-        <location filename="../src/gui/kernel/qapplication.cpp" line="+2248"/>
-        <source>QT_LAYOUT_DIRECTION</source>
-        <comment>Translate this string to the string &apos;LTR&apos; in left-to-right languages or to &apos;RTL&apos; in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment>
-        <translation>RTL</translation>
-    </message>
-    <message>
-        <location filename="../src/gui/dialogs/qmessagebox.h" line="+352"/>
-        <source>Executable &apos;%1&apos; requires Qt %2, found Qt %3.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Incompatible Qt Library Error</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/gui/accessible/qaccessibleobject.cpp" line="+376"/>
-        <source>Activate</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Activates the program&apos;s main window</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QAxSelect</name>
-    <message>
-        <location filename="../src/activeqt/container/qaxselect.ui"/>
-        <source>Select ActiveX Control</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>OK</source>
-        <translation type="unfinished">אישור</translation>
-    </message>
-    <message>
-        <location/>
-        <source>&amp;Cancel</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>COM &amp;Object:</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QCheckBox</name>
-    <message>
-        <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="+114"/>
-        <source>Uncheck</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Check</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Toggle</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QColorDialog</name>
-    <message>
-        <location filename="../src/gui/dialogs/qcolordialog.cpp" line="+1253"/>
-        <source>Hu&amp;e:</source>
-        <translation>&amp;גוון:</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>&amp;Sat:</source>
-        <translation>&amp;הרוויה:</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>&amp;Val:</source>
-        <translation>&amp;ערך:</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>&amp;Red:</source>
-        <translation>&amp;אדום:</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>&amp;Green:</source>
-        <translation>&amp;ירוק:</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Bl&amp;ue:</source>
-        <translation>&amp;כחול:</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>A&amp;lpha channel:</source>
-        <translation>ע&amp;רוץ אלפא:</translation>
-    </message>
-    <message>
-        <location line="+101"/>
-        <source>Select Color</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+137"/>
-        <source>&amp;Basic colors</source>
-        <translation>&amp;צבעים בסיסיים</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>&amp;Custom colors</source>
-        <translation>צבעים &amp;מותאמים אישית</translation>
-    </message>
-    <message>
-        <source>&amp;Define Custom Colors &gt;&gt;</source>
-        <translation type="obsolete">&amp;הגדר צבעים מותאמים אישית &gt;&gt;</translation>
-    </message>
-    <message>
-        <source>OK</source>
-        <translation type="obsolete">אישור</translation>
-    </message>
-    <message>
-        <source>Cancel</source>
-        <translation type="obsolete">ביטול</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>&amp;Add to Custom Colors</source>
-        <translation>ה&amp;וסף לצבעים מותאמים אישית</translation>
-    </message>
-    <message>
-        <source>Select color</source>
-        <translation type="obsolete">בחירת צבע</translation>
-    </message>
-</context>
-<context>
-    <name>QComboBox</name>
-    <message>
-        <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="+1771"/>
-        <location line="+65"/>
-        <source>Open</source>
-        <translation type="unfinished">פתח</translation>
-    </message>
-    <message>
-        <location filename="../src/gui/itemviews/qitemeditorfactory.cpp" line="+544"/>
-        <source>False</source>
-        <translation type="unfinished">שקר</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>True</source>
-        <translation type="unfinished">אמת</translation>
-    </message>
-    <message>
-        <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="+0"/>
-        <source>Close</source>
-        <translation type="unfinished">סגור</translation>
-    </message>
-</context>
-<context>
-    <name>QCoreApplication</name>
-    <message>
-        <location filename="../src/corelib/kernel/qsystemsemaphore_unix.cpp" line="+119"/>
-        <source>%1: key is empty</source>
-        <comment>QSystemSemaphore</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+12"/>
-        <source>%1: unable to make key</source>
-        <comment>QSystemSemaphore</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+9"/>
-        <source>%1: ftok failed</source>
-        <comment>QSystemSemaphore</comment>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QDB2Driver</name>
-    <message>
-        <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+1276"/>
-        <source>Unable to connect</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+303"/>
-        <source>Unable to commit transaction</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+17"/>
-        <source>Unable to rollback transaction</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+15"/>
-        <source>Unable to set autocommit</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QDB2Result</name>
-    <message>
-        <location line="-1043"/>
-        <location line="+243"/>
-        <source>Unable to execute statement</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-206"/>
-        <source>Unable to prepare statement</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+196"/>
-        <source>Unable to bind variable</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+92"/>
-        <source>Unable to fetch record %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+17"/>
-        <source>Unable to fetch next</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+20"/>
-        <source>Unable to fetch first</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QDateTimeEdit</name>
-    <message>
-        <location filename="../src/gui/widgets/qdatetimeedit.cpp" line="+2295"/>
-        <source>AM</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+0"/>
-        <source>am</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>PM</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+0"/>
-        <source>pm</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QDial</name>
-    <message>
-        <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+951"/>
-        <source>QDial</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>SpeedoMeter</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>SliderHandle</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QDialog</name>
-    <message>
-        <location filename="../src/gui/dialogs/qdialog.cpp" line="+597"/>
-        <source>What&apos;s This?</source>
-        <translation>מה זה?</translation>
-    </message>
-    <message>
-        <location line="-115"/>
-        <source>Done</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QDialogButtonBox</name>
-    <message>
-        <location filename="../src/gui/dialogs/qmessagebox.cpp" line="+1866"/>
-        <location line="+464"/>
-        <location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="+561"/>
-        <source>OK</source>
-        <translation type="unfinished">אישור</translation>
-    </message>
-    <message>
-        <location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="+3"/>
-        <source>Save</source>
-        <translation type="unfinished">שמור</translation>
-    </message>
-    <message>
-        <location line="+0"/>
-        <source>&amp;Save</source>
-        <translation type="unfinished">&amp;שמור</translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Open</source>
-        <translation type="unfinished">פתח</translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Cancel</source>
-        <translation type="unfinished">ביטול</translation>
-    </message>
-    <message>
-        <location line="+0"/>
-        <source>&amp;Cancel</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Close</source>
-        <translation type="unfinished">סגור</translation>
-    </message>
-    <message>
-        <location line="+0"/>
-        <source>&amp;Close</source>
-        <translation type="unfinished">&amp;סגור</translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Apply</source>
-        <translation type="unfinished">החל</translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Reset</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Help</source>
-        <translation type="unfinished">עזרה</translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>Don&apos;t Save</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>Discard</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>&amp;Yes</source>
-        <translation type="unfinished">&amp;כן</translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Yes to &amp;All</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>&amp;No</source>
-        <translation type="unfinished">&amp;לא</translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>N&amp;o to All</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Save All</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Abort</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Retry</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Ignore</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Restore Defaults</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-29"/>
-        <source>Close without Saving</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-27"/>
-        <source>&amp;OK</source>
-        <translation type="unfinished">&amp;אישור</translation>
-    </message>
-</context>
-<context>
-    <name>QDirModel</name>
-    <message>
-        <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+453"/>
-        <source>Name</source>
-        <translation type="unfinished">שם</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Size</source>
-        <translation type="unfinished">גודל</translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Kind</source>
-        <comment>Match OS X Finder</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Type</source>
-        <comment>All other platforms</comment>
-        <translation type="unfinished">סוג</translation>
-    </message>
-    <message>
-        <location line="+6"/>
-        <source>Date Modified</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QDockWidget</name>
-    <message>
-        <location filename="../src/plugins/accessible/widgets/qaccessiblewidgets.cpp" line="+1239"/>
-        <source>Close</source>
-        <translation type="unfinished">סגור</translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Dock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Float</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QDoubleSpinBox</name>
-    <message>
-        <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-537"/>
-        <source>More</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Less</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QErrorMessage</name>
-    <message>
-        <location filename="../src/gui/dialogs/qerrormessage.cpp" line="+391"/>
-        <source>&amp;Show this message again</source>
-        <translation>&amp;הצג הודעה זו שנית</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>&amp;OK</source>
-        <translation>&amp;אישור</translation>
-    </message>
-    <message>
-        <location line="-200"/>
-        <source>Debug Message:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Warning:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Fatal Error:</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QFile</name>
-    <message>
-        <location filename="../src/corelib/io/qfile.cpp" line="+708"/>
-        <location line="+141"/>
-        <source>Destination file exists</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-108"/>
-        <source>Cannot remove source file</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+120"/>
-        <source>Cannot open %1 for input</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+17"/>
-        <source>Cannot open for output</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+10"/>
-        <source>Failure to write block</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+13"/>
-        <source>Cannot create %1 for output</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QFileDialog</name>
-    <message>
-        <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+515"/>
-        <location line="+444"/>
-        <source>All Files (*)</source>
-        <translation>כל הקבצים (*)</translation>
-    </message>
-    <message>
-        <location filename="../src/gui/dialogs/qfiledialog.ui"/>
-        <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
-        <source>Back</source>
-        <translation type="unfinished">אחורה</translation>
-    </message>
-    <message>
-        <location/>
-        <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
-        <source>List View</source>
-        <translation type="unfinished">תצוגת רשימה</translation>
-    </message>
-    <message>
-        <location/>
-        <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
-        <source>Detail View</source>
-        <translation type="unfinished">תצוגת פרטים</translation>
-    </message>
-    <message>
-        <location filename="../src/gui/itemviews/qfileiconprovider.cpp" line="+414"/>
-        <location line="+1"/>
-        <source>File</source>
-        <translation type="unfinished">קובץ</translation>
-    </message>
-    <message>
-        <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-461"/>
-        <source>Open</source>
-        <translation>פתח</translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Save As</source>
-        <translation type="unfinished">שמירה בשם</translation>
-    </message>
-    <message>
-        <location line="+678"/>
-        <location line="+50"/>
-        <location line="+1471"/>
-        <location line="+75"/>
-        <source>&amp;Open</source>
-        <translation>&amp;פתח</translation>
-    </message>
-    <message>
-        <location line="-1596"/>
-        <location line="+50"/>
-        <source>&amp;Save</source>
-        <translation>&amp;שמור</translation>
-    </message>
-    <message>
-        <location line="-699"/>
-        <source>&amp;Rename</source>
-        <translation type="unfinished">ש&amp;נה שם</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>&amp;Delete</source>
-        <translation type="unfinished">&amp;מחק</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Show &amp;hidden files</source>
-        <translation type="unfinished">הצג קבצים &amp;מוסתרים</translation>
-    </message>
-    <message>
-        <location line="+1964"/>
-        <source>New Folder</source>
-        <translation type="unfinished">תיקיה חדשה</translation>
-    </message>
-    <message>
-        <location line="-1999"/>
-        <source>Find Directory</source>
-        <translation type="unfinished">חפש ספריה</translation>
-    </message>
-    <message>
-        <location line="+685"/>
-        <source>Directories</source>
-        <translation>ספריות</translation>
-    </message>
-    <message>
-        <location filename="../src/gui/dialogs/qfiledialog_win.cpp" line="+160"/>
-        <source>All Files (*.*)</source>
-        <translation type="unfinished">כל הקבצים (*.*)</translation>
-    </message>
-    <message>
-        <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+832"/>
-        <source>%1 already exists.
-Do you want to replace it?</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+20"/>
-        <source>%1
-File not found.
-Please verify the correct file name was given.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+402"/>
-        <source>My Computer</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/gui/dialogs/qfiledialog.ui"/>
-        <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
-        <source>Parent Directory</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
-        <source>Files of type:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-1496"/>
-        <location line="+648"/>
-        <source>Directory:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+794"/>
-        <location line="+862"/>
-        <source>%1
-Directory not found.
-Please verify the correct directory name was given.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-218"/>
-        <source>&apos;%1&apos; is write protected.
-Do you want to delete it anyway?</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Are sure you want to delete &apos;%1&apos;?</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+15"/>
-        <source>Could not delete directory.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+407"/>
-        <source>Recent Places</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/gui/itemviews/qfileiconprovider.cpp" line="-4"/>
-        <source>Drive</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+33"/>
-        <source>Unknown</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-2525"/>
-        <source>Show </source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/gui/dialogs/qfiledialog.ui"/>
-        <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
-        <source>Forward</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+7"/>
-        <source>&amp;New Folder</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+656"/>
-        <location line="+38"/>
-        <source>&amp;Choose</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/gui/dialogs/qsidebar.cpp" line="+418"/>
-        <source>Remove</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-687"/>
-        <location line="+652"/>
-        <source>File &amp;name:</source>
-        <translation type="unfinished">&amp;שם הקובץ:</translation>
-    </message>
-    <message>
-        <location filename="../src/gui/dialogs/qfiledialog.ui"/>
-        <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
-        <source>Look in:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/>
-        <source>Create New Folder</source>
-        <translation type="unfinished">צור תיקיה חדשה</translation>
-    </message>
-</context>
-<context>
-    <name>QFileSystemModel</name>
-    <message>
-        <location filename="../src/gui/dialogs/qfilesystemmodel.cpp" line="+744"/>
-        <source>%1 TB</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>%1 GB</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>%1 MB</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>%1 KB</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>%1 bytes</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+77"/>
-        <source>Invalid filename</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>&lt;b&gt;The name &quot;%1&quot; can not be used.&lt;/b&gt;&lt;p&gt;Try using another name, with fewer characters or no punctuations marks.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+63"/>
-        <source>Name</source>
-        <translation type="unfinished">שם</translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Size</source>
-        <translation type="unfinished">גודל</translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>Kind</source>
-        <comment>Match OS X Finder</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Type</source>
-        <comment>All other platforms</comment>
-        <translation type="unfinished">סוג</translation>
-    </message>
-    <message>
-        <location line="+7"/>
-        <source>Date Modified</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/gui/dialogs/qfilesystemmodel_p.h" line="+234"/>
-        <source>My Computer</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Computer</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QFontDatabase</name>
-    <message>
-        <location filename="../src/gui/text/qfontdatabase.cpp" line="+90"/>
-        <location line="+1176"/>
-        <source>Normal</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-1173"/>
-        <location line="+12"/>
-        <location line="+1149"/>
-        <source>Bold</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-1158"/>
-        <location line="+1160"/>
-        <source>Demi Bold</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-1157"/>
-        <location line="+18"/>
-        <location line="+1135"/>
-        <source>Black</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-1145"/>
-        <source>Demi</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+6"/>
-        <location line="+1145"/>
-        <source>Light</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-1004"/>
-        <location line="+1007"/>
-        <source>Italic</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-1004"/>
-        <location line="+1006"/>
-        <source>Oblique</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+705"/>
-        <source>Any</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Latin</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Greek</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Cyrillic</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Armenian</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Hebrew</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Arabic</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Syriac</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Thaana</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Devanagari</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Bengali</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Gurmukhi</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Gujarati</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Oriya</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Tamil</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Telugu</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Kannada</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Malayalam</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Sinhala</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Thai</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Lao</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Tibetan</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Myanmar</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Georgian</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Khmer</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Simplified Chinese</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Traditional Chinese</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Japanese</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Korean</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Vietnamese</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Symbol</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Ogham</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Runic</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QFontDialog</name>
-    <message>
-        <location filename="../src/gui/dialogs/qfontdialog.cpp" line="+772"/>
-        <source>&amp;Font</source>
-        <translation>&amp;גופן</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Font st&amp;yle</source>
-        <translation>&amp;סגנון גופן</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>&amp;Size</source>
-        <translation>גו&amp;דל</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Effects</source>
-        <translation>אפקטים</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Stri&amp;keout</source>
-        <translation>קו &amp;חוצה</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>&amp;Underline</source>
-        <translation>קו &amp;תחתי</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Sample</source>
-        <translation>דוגמה</translation>
-    </message>
-    <message>
-        <location line="-603"/>
-        <location line="+247"/>
-        <source>Select Font</source>
-        <translation>בחר גופן</translation>
-    </message>
-    <message>
-        <location line="+357"/>
-        <source>Wr&amp;iting System</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QFtp</name>
-    <message>
-        <location filename="../src/qt3support/network/q3ftp.cpp" line="+2303"/>
-        <source>Host %1 found</source>
-        <translation type="unfinished">המארח %1 נמצא</translation>
-    </message>
-    <message>
-        <location line="+7"/>
-        <source>Host found</source>
-        <translation type="unfinished">המארח נמצא</translation>
-    </message>
-    <message>
-        <location filename="../src/network/access/qftp.cpp" line="+1003"/>
-        <location filename="../src/qt3support/network/q3ftp.cpp" line="-1456"/>
-        <location line="+1451"/>
-        <source>Connected to host %1</source>
-        <translation>מחובר למארח %1</translation>
-    </message>
-    <message>
-        <location filename="../src/qt3support/network/q3ftp.cpp" line="+7"/>
-        <source>Connected to host</source>
-        <translation type="unfinished">מחובר למארח</translation>
-    </message>
-    <message>
-        <location line="-5"/>
-        <source>Connection to %1 closed</source>
-        <translation type="unfinished">החיבור אל %1 נסגר</translation>
-    </message>
-    <message>
-        <location filename="../src/network/access/qftp.cpp" line="+1375"/>
-        <location filename="../src/qt3support/network/q3ftp.cpp" line="-243"/>
-        <location line="+250"/>
-        <source>Connection closed</source>
-        <translation>החיבור נסגר</translation>
-    </message>
-    <message>
-        <location line="-1487"/>
-        <location filename="../src/qt3support/network/q3ftp.cpp" line="-1566"/>
-        <source>Host %1 not found</source>
-        <translation type="unfinished">המארח %1 לא נמצא</translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <location filename="../src/qt3support/network/q3ftp.cpp" line="+4"/>
-        <source>Connection refused to host %1</source>
-        <translation type="unfinished">החיבור אל המארח %1 נדחה</translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>Connection timed out to host %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+501"/>
-        <location line="+29"/>
-        <location filename="../src/qt3support/network/q3ftp.cpp" line="+458"/>
-        <location line="+728"/>
-        <source>Unknown error</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+889"/>
-        <location filename="../src/qt3support/network/q3ftp.cpp" line="+77"/>
-        <source>Connecting to host failed:
-%1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
-        <source>Login failed:
-%1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
-        <source>Listing directory failed:
-%1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
-        <source>Changing directory failed:
-%1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
-        <source>Downloading file failed:
-%1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
-        <source>Uploading file failed:
-%1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
-        <source>Removing file failed:
-%1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
-        <source>Creating directory failed:
-%1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/>
-        <source>Removing directory failed:
-%1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-1524"/>
-        <location filename="../src/qt3support/network/q3ftp.cpp" line="-1356"/>
-        <source>Not connected</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+396"/>
-        <location filename="../src/qt3support/network/q3ftp.cpp" line="+332"/>
-        <source>Connection refused for data connection</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QHostInfo</name>
-    <message>
-        <location filename="../src/network/kernel/qhostinfo_p.h" line="+183"/>
-        <source>Unknown error</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QHostInfoAgent</name>
-    <message>
-        <location filename="../src/network/kernel/qhostinfo_unix.cpp" line="+178"/>
-        <location line="+9"/>
-        <location line="+64"/>
-        <location line="+31"/>
-        <location filename="../src/network/kernel/qhostinfo_win.cpp" line="+180"/>
-        <location line="+9"/>
-        <location line="+40"/>
-        <location line="+27"/>
-        <source>Host not found</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-44"/>
-        <location line="+39"/>
-        <location filename="../src/network/kernel/qhostinfo_win.cpp" line="-34"/>
-        <location line="+29"/>
-        <source>Unknown address type</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+8"/>
-        <location filename="../src/network/kernel/qhostinfo_win.cpp" line="-19"/>
-        <location line="+27"/>
-        <source>Unknown error</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QHttp</name>
-    <message>
-        <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+876"/>
-        <location filename="../src/qt3support/network/q3http.cpp" line="+1836"/>
-        <source>Connection refused</source>
-        <translation>החיבור נדחה</translation>
-    </message>
-    <message>
-        <location filename="../src/network/access/qhttp.cpp" line="+2631"/>
-        <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-4"/>
-        <location filename="../src/qt3support/network/q3http.cpp" line="+3"/>
-        <source>Host %1 not found</source>
-        <translation>המארח %1 לא נמצא</translation>
-    </message>
-    <message>
-        <location line="-62"/>
-        <location filename="../src/qt3support/network/q3http.cpp" line="-45"/>
-        <source>Wrong content length</source>
-        <translation>אורך תוכן שגוי</translation>
-    </message>
-    <message>
-        <location line="-2204"/>
-        <source>HTTPS connection requested but SSL support not compiled in</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2286"/>
-        <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+10"/>
-        <location line="+19"/>
-        <location filename="../src/qt3support/network/q3http.cpp" line="+48"/>
-        <source>HTTP request failed</source>
-        <translation>בקשת ה-HTTP נכשלה</translation>
-    </message>
-    <message>
-        <location filename="../src/qt3support/network/q3http.cpp" line="+450"/>
-        <source>Host %1 found</source>
-        <translation type="unfinished">המארח %1 נמצא</translation>
-    </message>
-    <message>
-        <location line="+14"/>
-        <source>Host found</source>
-        <translation type="unfinished">המארח נמצא</translation>
-    </message>
-    <message>
-        <location line="-11"/>
-        <source>Connected to host %1</source>
-        <translation type="unfinished">מחובר למארח %1</translation>
-    </message>
-    <message>
-        <location line="+14"/>
-        <source>Connected to host</source>
-        <translation type="unfinished">מחובר למארח</translation>
-    </message>
-    <message>
-        <location line="-11"/>
-        <source>Connection to %1 closed</source>
-        <translation type="unfinished">החיבור אל %1 נסגר</translation>
-    </message>
-    <message>
-        <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-22"/>
-        <location filename="../src/qt3support/network/q3http.cpp" line="+14"/>
-        <source>Connection closed</source>
-        <translation type="unfinished">החיבור נסגר</translation>
-    </message>
-    <message>
-        <location filename="../src/network/access/qhttp.cpp" line="-1077"/>
-        <location line="+820"/>
-        <location filename="../src/qt3support/network/q3http.cpp" line="-1152"/>
-        <location line="+567"/>
-        <source>Unknown error</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-568"/>
-        <location filename="../src/qt3support/network/q3http.cpp" line="-370"/>
-        <source>Request aborted</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+579"/>
-        <location filename="../src/qt3support/network/q3http.cpp" line="+381"/>
-        <source>No server set to connect to</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+168"/>
-        <location filename="../src/qt3support/network/q3http.cpp" line="+60"/>
-        <source>Server closed connection unexpectedly</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+151"/>
-        <location filename="../src/qt3support/network/q3http.cpp" line="+113"/>
-        <source>Invalid HTTP response header</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+28"/>
-        <source>Unknown authentication method</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+97"/>
-        <location line="+48"/>
-        <location filename="../src/qt3support/network/q3http.cpp" line="+40"/>
-        <location line="+47"/>
-        <source>Invalid HTTP chunked body</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+38"/>
-        <source>Error writing response to device</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-173"/>
-        <source>Proxy authentication required</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>Authentication required</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-138"/>
-        <source>Connection refused (or timed out)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+6"/>
-        <source>Proxy requires authentication</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Host requires authentication</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Data corrupted</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Unknown protocol specified</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>SSL handshake failed</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QHttpSocketEngine</name>
-    <message>
-        <location filename="../src/network/socket/qhttpsocketengine.cpp" line="-89"/>
-        <source>Did not receive HTTP response from proxy</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+25"/>
-        <source>Error parsing authentication request from proxy</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+31"/>
-        <source>Authentication required</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+27"/>
-        <source>Proxy denied connection</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+10"/>
-        <source>Error communicating with HTTP proxy</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+23"/>
-        <source>Proxy server not found</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Proxy connection refused</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Proxy server connection timed out</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Proxy connection closed prematurely</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QIBaseDriver</name>
-    <message>
-        <location filename="../src/sql/drivers/ibase/qsql_ibase.cpp" line="+1428"/>
-        <source>Error opening database</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+54"/>
-        <source>Could not start transaction</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+13"/>
-        <source>Unable to commit transaction</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+13"/>
-        <source>Unable to rollback transaction</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QIBaseResult</name>
-    <message>
-        <location line="-1097"/>
-        <source>Unable to create BLOB</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+6"/>
-        <source>Unable to write BLOB</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+14"/>
-        <source>Unable to open BLOB</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+16"/>
-        <source>Unable to read BLOB</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+125"/>
-        <location line="+189"/>
-        <source>Could not find array</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-157"/>
-        <source>Could not get array data</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+212"/>
-        <source>Could not get query info</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+20"/>
-        <source>Could not start transaction</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+19"/>
-        <source>Unable to commit transaction</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+33"/>
-        <source>Could not allocate statement</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Could not prepare statement</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <location line="+7"/>
-        <source>Could not describe input statement</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+10"/>
-        <source>Could not describe statement</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+115"/>
-        <source>Unable to close statement</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+8"/>
-        <source>Unable to execute query</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+46"/>
-        <source>Could not fetch next item</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+160"/>
-        <source>Could not get statement info</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QIODevice</name>
-    <message>
-        <location filename="../src/corelib/global/qglobal.cpp" line="+1869"/>
-        <source>Permission denied</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Too many open files</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>No such file or directory</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>No space left on device</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/corelib/io/qiodevice.cpp" line="+1536"/>
-        <source>Unknown error</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QInputContext</name>
-    <message>
-        <location filename="../src/gui/inputmethod/qinputcontextfactory.cpp" line="+242"/>
-        <source>XIM</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+23"/>
-        <source>XIM input method</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>Windows input method</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>Mac OS X input method</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QInputDialog</name>
-    <message>
-        <location filename="../src/gui/dialogs/qinputdialog.cpp" line="+223"/>
-        <source>Enter a value:</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QLibrary</name>
-    <message>
-        <location filename="../src/corelib/plugin/qlibrary.cpp" line="+378"/>
-        <source>Could not mmap &apos;%1&apos;: %2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+22"/>
-        <source>Plugin verification data mismatch in &apos;%1&apos;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+6"/>
-        <source>Could not unmap &apos;%1&apos;: %2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+302"/>
-        <source>The plugin &apos;%1&apos; uses incompatible Qt library. (%2.%3.%4) [%5]</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+20"/>
-        <source>The plugin &apos;%1&apos; uses incompatible Qt library. Expected build key &quot;%2&quot;, got &quot;%3&quot;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+340"/>
-        <source>Unknown error</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-377"/>
-        <location filename="../src/corelib/plugin/qpluginloader.cpp" line="+280"/>
-        <source>The shared library was not found.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>The file &apos;%1&apos; is not a valid Qt plugin.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+43"/>
-        <source>The plugin &apos;%1&apos; uses incompatible Qt library. (Cannot mix debug and release libraries.)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/corelib/plugin/qlibrary_unix.cpp" line="+209"/>
-        <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+99"/>
-        <source>Cannot load library %1: %2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+16"/>
-        <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+26"/>
-        <source>Cannot unload library %1: %2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+31"/>
-        <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+15"/>
-        <source>Cannot resolve symbol &quot;%1&quot; in %2: %3</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QLineEdit</name>
-    <message>
-        <location filename="../src/gui/widgets/qlineedit.cpp" line="+2680"/>
-        <source>&amp;Undo</source>
-        <translation type="unfinished">&amp;בטל</translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>&amp;Redo</source>
-        <translation type="unfinished">בצע &amp;שוב</translation>
-    </message>
-    <message>
-        <location line="+7"/>
-        <source>Cu&amp;t</source>
-        <translation type="unfinished">&amp;גזור</translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>&amp;Copy</source>
-        <translation type="unfinished">הע&amp;תק</translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>&amp;Paste</source>
-        <translation type="unfinished">ה&amp;דבק</translation>
-    </message>
-    <message>
-        <location line="+11"/>
-        <source>Select All</source>
-        <translation type="unfinished">בחר הכל</translation>
-    </message>
-    <message>
-        <location line="-6"/>
-        <source>Delete</source>
-        <translation type="unfinished">מחק</translation>
-    </message>
-</context>
-<context>
-    <name>QLocalServer</name>
-    <message>
-        <location filename="../src/network/socket/qlocalserver.cpp" line="+226"/>
-        <location filename="../src/network/socket/qlocalserver_unix.cpp" line="+231"/>
-        <source>%1: Name error</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/network/socket/qlocalserver_unix.cpp" line="-8"/>
-        <source>%1: Permission denied</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+12"/>
-        <source>%1: Address in use</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <location filename="../src/network/socket/qlocalserver_win.cpp" line="+158"/>
-        <source>%1: Unknown error %2</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QLocalSocket</name>
-    <message>
-        <location filename="../src/network/socket/qlocalsocket_tcp.cpp" line="+132"/>
-        <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+134"/>
-        <source>%1: Connection refused</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
-        <source>%1: Remote closed</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
-        <location filename="../src/network/socket/qlocalsocket_win.cpp" line="+80"/>
-        <location line="+43"/>
-        <source>%1: Invalid name</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
-        <source>%1: Socket access error</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
-        <source>%1: Socket resource error</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
-        <source>%1: Socket operation timed out</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
-        <source>%1: Datagram too large</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
-        <location filename="../src/network/socket/qlocalsocket_win.cpp" line="-48"/>
-        <source>%1: Connection error</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/>
-        <source>%1: The socket operation is not supported</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>%1: Unknown error</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+4"/>
-        <location filename="../src/network/socket/qlocalsocket_win.cpp" line="+10"/>
-        <source>%1: Unknown error %2</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QMYSQLDriver</name>
-    <message>
-        <location filename="../src/sql/drivers/mysql/qsql_mysql.cpp" line="+1231"/>
-        <source>Unable to open database &apos;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+7"/>
-        <source>Unable to connect</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+127"/>
-        <source>Unable to begin transaction</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+17"/>
-        <source>Unable to commit transaction</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+17"/>
-        <source>Unable to rollback transaction</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QMYSQLResult</name>
-    <message>
-        <location line="-922"/>
-        <source>Unable to fetch data</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+176"/>
-        <source>Unable to execute query</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+6"/>
-        <source>Unable to store result</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+190"/>
-        <location line="+8"/>
-        <source>Unable to prepare statement</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+34"/>
-        <source>Unable to reset statement</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+87"/>
-        <source>Unable to bind value</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+11"/>
-        <source>Unable to execute statement</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+14"/>
-        <location line="+21"/>
-        <source>Unable to bind outvalues</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-12"/>
-        <source>Unable to store statement results</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-253"/>
-        <source>Unable to execute next query</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+10"/>
-        <source>Unable to store next result</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QMdiArea</name>
-    <message>
-        <location filename="../src/gui/widgets/qmdiarea.cpp" line="+290"/>
-        <source>(Untitled)</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QMdiSubWindow</name>
-    <message>
-        <location filename="../src/gui/widgets/qmdisubwindow.cpp" line="+280"/>
-        <source>%1 - [%2]</source>
-        <translation type="unfinished">%1 - [%2]</translation>
-    </message>
-    <message>
-        <location line="+72"/>
-        <source>Close</source>
-        <translation type="unfinished">סגור</translation>
-    </message>
-    <message>
-        <location line="-18"/>
-        <source>Minimize</source>
-        <translation type="unfinished">מזער</translation>
-    </message>
-    <message>
-        <location line="+13"/>
-        <source>Restore Down</source>
-        <translation type="unfinished">שחזר למטה</translation>
-    </message>
-    <message>
-        <location line="+707"/>
-        <source>&amp;Restore</source>
-        <translation type="unfinished">ש&amp;חזר</translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>&amp;Move</source>
-        <translation type="unfinished">ה&amp;זז</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>&amp;Size</source>
-        <translation type="unfinished">גו&amp;דל</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Mi&amp;nimize</source>
-        <translation type="unfinished">&amp;מזער</translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Ma&amp;ximize</source>
-        <translation type="unfinished">&amp;הגדל</translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Stay on &amp;Top</source>
-        <translation type="unfinished">&amp;תמיד עליון</translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>&amp;Close</source>
-        <translation type="unfinished">&amp;סגור</translation>
-    </message>
-    <message>
-        <location line="-787"/>
-        <source>- [%1]</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+58"/>
-        <source>Maximize</source>
-        <translation type="unfinished">הגדל</translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Unshade</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Shade</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+6"/>
-        <source>Restore</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+6"/>
-        <source>Help</source>
-        <translation type="unfinished">עזרה</translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Menu</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QMenu</name>
-    <message>
-        <location filename="../src/plugins/accessible/widgets/qaccessiblemenu.cpp" line="+157"/>
-        <location line="+225"/>
-        <source>Close</source>
-        <translation type="unfinished">סגור</translation>
-    </message>
-    <message>
-        <location line="-224"/>
-        <location line="+225"/>
-        <source>Open</source>
-        <translation type="unfinished">פתח</translation>
-    </message>
-    <message>
-        <location line="-223"/>
-        <location line="+225"/>
-        <location line="+51"/>
-        <source>Execute</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QMenuBar</name>
-    <message>
-        <source>Options</source>
-        <translation type="obsolete">אפשרויות</translation>
-    </message>
-</context>
-<context>
-    <name>QMessageBox</name>
-    <message>
-        <location filename="../src/gui/dialogs/qmessagebox.cpp" line="-1964"/>
-        <location line="+852"/>
-        <location filename="../src/gui/dialogs/qmessagebox.h" line="-52"/>
-        <location line="+8"/>
-        <source>OK</source>
-        <translation>אישור</translation>
-    </message>
-    <message>
-        <location line="+509"/>
-        <source>About Qt</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-508"/>
-        <source>Help</source>
-        <translation type="unfinished">עזרה</translation>
-    </message>
-    <message>
-        <location line="-1097"/>
-        <source>Show Details...</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Hide Details...</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1570"/>
-        <source>&lt;h3&gt;About Qt&lt;/h3&gt;&lt;p&gt;This program uses Qt version %1.&lt;/p&gt;&lt;p&gt;Qt is a C++ toolkit for cross-platform application development.&lt;/p&gt;&lt;p&gt;Qt provides single-source portability across MS&amp;nbsp;Windows, Mac&amp;nbsp;OS&amp;nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.&lt;/p&gt;&lt;p&gt;Qt is available under three different licensing options designed to accommodate the needs of our various users.&lt;/p&gt;Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.&lt;/p&gt;&lt;p&gt;Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.&lt;/p&gt;&lt;p&gt;Please see &lt;a href=&quot;http://qt.nokia.com/products/licensing&quot;&gt;qt.nokia.com/products/licensing&lt;/a&gt; for an overview of Qt licensing.&lt;/p&gt;&lt;p&gt;Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).&lt;/p&gt;&lt;p&gt;Qt is a Nokia product. See &lt;a href=&quot;http://qt.nokia.com/&quot;&gt;qt.nokia.com&lt;/a&gt; for more information.&lt;/p&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QMultiInputContext</name>
-    <message>
-        <location filename="../src/plugins/inputmethods/imsw-multi/qmultiinputcontext.cpp" line="+88"/>
-        <source>Select IM</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QMultiInputContextPlugin</name>
-    <message>
-        <location filename="../src/plugins/inputmethods/imsw-multi/qmultiinputcontextplugin.cpp" line="+95"/>
-        <source>Multiple input method switcher</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+7"/>
-        <source>Multiple input method switcher that uses the context menu of the text widgets</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QNativeSocketEngine</name>
-    <message>
-        <location filename="../src/network/socket/qnativesocketengine.cpp" line="+206"/>
-        <source>The remote host closed the connection</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Network operation timed out</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Out of resources</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Unsupported socket operation</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Protocol type not supported</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Invalid socket descriptor</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+6"/>
-        <source>Network unreachable</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Permission denied</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Connection timed out</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Connection refused</source>
-        <translation type="unfinished">החיבור נדחה</translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>The bound address is already in use</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>The address is not available</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>The address is protected</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+6"/>
-        <source>Unable to send a message</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Unable to receive a message</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Unable to write</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Network error</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Another socket is already listening on the same port</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-66"/>
-        <source>Unable to initialize non-blocking socket</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Unable to initialize broadcast socket</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Attempt to use IPv6 socket on a platform with no IPv6 support</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+21"/>
-        <source>Host unreachable</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+24"/>
-        <source>Datagram was too large to send</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+18"/>
-        <source>Operation on non-socket</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+6"/>
-        <source>Unknown error</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-3"/>
-        <source>The proxy type is invalid for this operation</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QNetworkAccessCacheBackend</name>
-    <message>
-        <location filename="../src/network/access/qnetworkaccesscachebackend.cpp" line="+65"/>
-        <source>Error opening %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QNetworkAccessFileBackend</name>
-    <message>
-        <location filename="../src/network/access/qnetworkaccessfilebackend.cpp" line="+99"/>
-        <source>Request for opening non-local file %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+42"/>
-        <source>Error opening %1: %2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+56"/>
-        <source>Write error writing to %1: %2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+33"/>
-        <source>Cannot open %1: Path is a directory</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+21"/>
-        <source>Read error reading from %1: %2</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QNetworkAccessFtpBackend</name>
-    <message>
-        <location filename="../src/network/access/qnetworkaccessftpbackend.cpp" line="+165"/>
-        <source>No suitable proxy found</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+14"/>
-        <source>Cannot open %1: is a directory</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+130"/>
-        <source>Logging in to %1 failed: authentication required</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+39"/>
-        <source>Error while downloading %1: %2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Error while uploading %1: %2</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QNetworkAccessHttpBackend</name>
-    <message>
-        <location filename="../src/network/access/qnetworkaccesshttpbackend.cpp" line="+597"/>
-        <source>No suitable proxy found</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QNetworkReply</name>
-    <message>
-        <location line="+128"/>
-        <source>Error downloading %1 - server replied: %2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/network/access/qnetworkreplyimpl.cpp" line="+68"/>
-        <source>Protocol &quot;%1&quot; is unknown</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QNetworkReplyImpl</name>
-    <message>
-        <location line="+432"/>
-        <location line="+22"/>
-        <source>Operation canceled</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QOCIDriver</name>
-    <message>
-        <location filename="../src/sql/drivers/oci/qsql_oci.cpp" line="+2069"/>
-        <source>Unable to logon</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-144"/>
-        <source>Unable to initialize</source>
-        <comment>QOCIDriver</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+215"/>
-        <source>Unable to begin transaction</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+19"/>
-        <source>Unable to commit transaction</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+19"/>
-        <source>Unable to rollback transaction</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QOCIResult</name>
-    <message>
-        <location line="-963"/>
-        <location line="+161"/>
-        <location line="+15"/>
-        <source>Unable to bind column for batch execute</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+15"/>
-        <source>Unable to execute batch statement</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+302"/>
-        <source>Unable to goto next</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+59"/>
-        <source>Unable to alloc statement</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+15"/>
-        <source>Unable to prepare statement</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+36"/>
-        <source>Unable to bind value</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+19"/>
-        <source>Unable to execute statement</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QODBCDriver</name>
-    <message>
-        <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="+1785"/>
-        <source>Unable to connect</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+6"/>
-        <source>Unable to connect - Driver doesn&apos;t support all needed functionality</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+242"/>
-        <source>Unable to disable autocommit</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+17"/>
-        <source>Unable to commit transaction</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+17"/>
-        <source>Unable to rollback transaction</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+15"/>
-        <source>Unable to enable autocommit</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QODBCResult</name>
-    <message>
-        <location line="-1218"/>
-        <location line="+349"/>
-        <source>QODBCResult::reset: Unable to set &apos;SQL_CURSOR_STATIC&apos; as statement attribute. Please check your ODBC driver configuration</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-332"/>
-        <location line="+626"/>
-        <source>Unable to execute statement</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-555"/>
-        <source>Unable to fetch next</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+279"/>
-        <source>Unable to prepare statement</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+268"/>
-        <source>Unable to bind variable</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+194"/>
-        <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="-475"/>
-        <location line="+578"/>
-        <source>Unable to fetch last</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="-672"/>
-        <source>Unable to fetch</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+44"/>
-        <source>Unable to fetch first</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+19"/>
-        <source>Unable to fetch previous</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QObject</name>
-    <message>
-        <location filename="../src/gui/util/qdesktopservices_mac.cpp" line="+165"/>
-        <source>Home</source>
-        <translation type="unfinished">Home</translation>
-    </message>
-    <message>
-        <location filename="../src/network/access/qnetworkaccessdatabackend.cpp" line="+74"/>
-        <source>Operation not supported on %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+53"/>
-        <source>Invalid URI: %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/network/access/qnetworkaccessdebugpipebackend.cpp" line="+175"/>
-        <source>Write error writing to %1: %2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+57"/>
-        <source>Read error reading from %1: %2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+31"/>
-        <source>Socket error on %1: %2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+15"/>
-        <source>Remote host closed the connection prematurely on %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+53"/>
-        <source>Protocol error: packet of size 0 received</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/network/kernel/qhostinfo.cpp" line="+177"/>
-        <location line="+57"/>
-        <source>No host name given</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QPPDOptionsModel</name>
-    <message>
-        <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="+1195"/>
-        <source>Name</source>
-        <translation type="unfinished">שם</translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Value</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QPSQLDriver</name>
-    <message>
-        <location filename="../src/sql/drivers/psql/qsql_psql.cpp" line="+763"/>
-        <source>Unable to connect</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+49"/>
-        <source>Could not begin transaction</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+17"/>
-        <source>Could not commit transaction</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+16"/>
-        <source>Could not rollback transaction</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+358"/>
-        <source>Unable to subscribe</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+32"/>
-        <source>Unable to unsubscribe</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QPSQLResult</name>
-    <message>
-        <location line="-1058"/>
-        <source>Unable to create query</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+374"/>
-        <source>Unable to prepare statement</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QPageSetupWidget</name>
-    <message>
-        <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="+304"/>
-        <source>Centimeters (cm)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+0"/>
-        <source>Millimeters (mm)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+0"/>
-        <source>Inches (in)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+0"/>
-        <source>Points (pt)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/gui/dialogs/qpagesetupwidget.ui"/>
-        <source>Form</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>Paper</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>Page size:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>Width:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>Height:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>Paper source:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>Orientation</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>Portrait</source>
-        <translation type="unfinished">לאורך</translation>
-    </message>
-    <message>
-        <location/>
-        <source>Landscape</source>
-        <translation type="unfinished">לרוחב</translation>
-    </message>
-    <message>
-        <location/>
-        <source>Reverse landscape</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>Reverse portrait</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>Margins</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>top margin</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>left margin</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>right margin</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>bottom margin</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QPluginLoader</name>
-    <message>
-        <location filename="../src/corelib/plugin/qpluginloader.cpp" line="+24"/>
-        <source>Unknown error</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-68"/>
-        <source>The plugin was not loaded.</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QPrintDialog</name>
-    <message>
-        <location filename="../src/gui/painting/qprinterinfo_unix.cpp" line="+98"/>
-        <source>locally connected</source>
-        <translation>מחוברת מקומית</translation>
-    </message>
-    <message>
-        <location line="+23"/>
-        <location line="+225"/>
-        <source>Aliases: %1</source>
-        <translation>שמות נוספים: %1</translation>
-    </message>
-    <message>
-        <location line="+223"/>
-        <location line="+199"/>
-        <source>unknown</source>
-        <translation>לא ידוע</translation>
-    </message>
-    <message>
-        <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="+268"/>
-        <source>OK</source>
-        <translation type="unfinished">אישור</translation>
-    </message>
-    <message>
-        <source>Cancel</source>
-        <translation type="obsolete">ביטול</translation>
-    </message>
-    <message>
-        <source>Print in color if available</source>
-        <translation type="obsolete">הדפס בצבע אם הדבר זמין</translation>
-    </message>
-    <message>
-        <source>Printer</source>
-        <translation type="obsolete">מדפסת</translation>
-    </message>
-    <message>
-        <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="+375"/>
-        <source>Print all</source>
-        <translation type="unfinished">הדפס הכל</translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Print range</source>
-        <translation type="unfinished">טווח הדפסה</translation>
-    </message>
-    <message>
-        <source>Print last page first</source>
-        <translation type="obsolete">הדפס את העמוד הראשון אחרון</translation>
-    </message>
-    <message>
-        <source>Number of copies:</source>
-        <translation type="obsolete">מספר עותקים:</translation>
-    </message>
-    <message>
-        <source>Paper format</source>
-        <translation type="obsolete">תבנית נייר</translation>
-    </message>
-    <message>
-        <source>Portrait</source>
-        <translation type="obsolete">לאורך</translation>
-    </message>
-    <message>
-        <source>Landscape</source>
-        <translation type="obsolete">לרוחב</translation>
-    </message>
-    <message>
-        <location line="-48"/>
-        <source>A0 (841 x 1189 mm)</source>
-        <translation>A0 (841 x 1189 mm)</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>A1 (594 x 841 mm)</source>
-        <translation>A1 (594 x 841 mm)</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>A2 (420 x 594 mm)</source>
-        <translation>A2 (420 x 594 mm)</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>A3 (297 x 420 mm)</source>
-        <translation>A3 (297 x 420 mm)</translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>A5 (148 x 210 mm)</source>
-        <translation>A5 (148 x 210 mm)</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>A6 (105 x 148 mm)</source>
-        <translation>A6 (105 x 148 mm)</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>A7 (74 x 105 mm)</source>
-        <translation>A7 (74 x 105 mm)</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>A8 (52 x 74 mm)</source>
-        <translation>A8 (52 x 74 mm)</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>A9 (37 x 52 mm)</source>
-        <translation>A9 (37 x 52 mm)</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>B0 (1000 x 1414 mm)</source>
-        <translation>B0 (1000 x 1414 mm)</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>B1 (707 x 1000 mm)</source>
-        <translation>B1 (707 x 1000 mm)</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>B2 (500 x 707 mm)</source>
-        <translation>B2 (500 x 707 mm)</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>B3 (353 x 500 mm)</source>
-        <translation>B3 (353 x 500 mm)</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>B4 (250 x 353 mm)</source>
-        <translation>B4 (250 x 353 mm)</translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>B6 (125 x 176 mm)</source>
-        <translation>B6 (125 x 176 mm)</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>B7 (88 x 125 mm)</source>
-        <translation>B7 (88 x 125 mm)</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>B8 (62 x 88 mm)</source>
-        <translation>B8 (62 x 88 mm)</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>B9 (44 x 62 mm)</source>
-        <translation>B9 (44 x 62 mm)</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>B10 (31 x 44 mm)</source>
-        <translation>B10 (31 x 44 mm)</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>C5E (163 x 229 mm)</source>
-        <translation>C5E (163 x 229 mm)</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>DLE (110 x 220 mm)</source>
-        <translation>DLE (110 x 220 mm)</translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Folio (210 x 330 mm)</source>
-        <translation>Folio (210 x 330 mm)</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Ledger (432 x 279 mm)</source>
-        <translation>Ledger (432 x 279 mm)</translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Tabloid (279 x 432 mm)</source>
-        <translation>Tabloid (279 x 432 mm)</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>US Common #10 Envelope (105 x 241 mm)</source>
-        <translation>US Common #10 Envelope (105 x 241 mm)</translation>
-    </message>
-    <message>
-        <location line="-25"/>
-        <source>A4 (210 x 297 mm, 8.26 x 11.7 inches)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+11"/>
-        <source>B5 (176 x 250 mm, 6.93 x 9.84 inches)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+8"/>
-        <source>Executive (7.5 x 10 inches, 191 x 254 mm)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Legal (8.5 x 14 inches, 216 x 356 mm)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Letter (8.5 x 11 inches, 216 x 279 mm)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/gui/dialogs/qabstractprintdialog.cpp" line="+110"/>
-        <location line="+13"/>
-        <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="-2"/>
-        <source>Print</source>
-        <translation type="unfinished">הדפס</translation>
-    </message>
-    <message>
-        <source>File</source>
-        <translation type="obsolete">קובץ</translation>
-    </message>
-    <message>
-        <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-357"/>
-        <source>Print To File ...</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Other</source>
-        <translation type="obsolete">אחר</translation>
-    </message>
-    <message>
-        <location line="+80"/>
-        <source>File %1 is not writable.
-Please choose a different file name.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>%1 already exists.
-Do you want to overwrite it?</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="-208"/>
-        <source>File exists</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>&lt;qt&gt;Do you want to overwrite it?&lt;/qt&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+227"/>
-        <source>Print selection</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-8"/>
-        <source>%1 is a directory.
-Please choose a different file name.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="-232"/>
-        <source>A0</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>A1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>A2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>A3</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>A4</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>A5</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>A6</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>A7</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>A8</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>A9</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>B0</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>B1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>B2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>B3</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>B4</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>B5</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>B6</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>B7</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>B8</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>B9</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>B10</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>C5E</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>DLE</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Executive</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Folio</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Ledger</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Legal</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Letter</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Tabloid</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>US Common #10 Envelope</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Custom</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-522"/>
-        <location line="+68"/>
-        <source>&amp;Options &gt;&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-63"/>
-        <source>&amp;Print</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+67"/>
-        <source>&amp;Options &lt;&lt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+253"/>
-        <source>Print to File (PDF)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Print to File (Postscript)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+45"/>
-        <source>Local file</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Write %1 file</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="+1"/>
-        <source>The &apos;From&apos; value cannot be greater than the &apos;To&apos; value.</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QPrintPreviewDialog</name>
-    <message>
-        <location filename="../src/gui/dialogs/qabstractpagesetupdialog.cpp" line="+68"/>
-        <location line="+12"/>
-        <source>Page Setup</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/gui/dialogs/qprintpreviewdialog.cpp" line="+252"/>
-        <source>%1%</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+79"/>
-        <source>Print Preview</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+29"/>
-        <source>Next page</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Previous page</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>First page</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Last page</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+9"/>
-        <source>Fit width</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Fit page</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+11"/>
-        <source>Zoom in</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Zoom out</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+6"/>
-        <source>Portrait</source>
-        <translation type="unfinished">לאורך</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Landscape</source>
-        <translation type="unfinished">לרוחב</translation>
-    </message>
-    <message>
-        <location line="+10"/>
-        <source>Show single page</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Show facing pages</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Show overview of all pages</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+15"/>
-        <source>Print</source>
-        <translation type="unfinished">הדפס</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Page setup</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Close</source>
-        <translation type="unfinished">סגור</translation>
-    </message>
-    <message>
-        <location line="+151"/>
-        <source>Export to PDF</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Export to PostScript</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QPrintPropertiesDialog</name>
-    <message>
-        <source>Save</source>
-        <translation type="obsolete">שמור</translation>
-    </message>
-    <message>
-        <source>OK</source>
-        <translation type="obsolete">אישור</translation>
-    </message>
-</context>
-<context>
-    <name>QPrintPropertiesWidget</name>
-    <message>
-        <location filename="../src/gui/dialogs/qprintpropertieswidget.ui"/>
-        <source>Form</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>Page</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>Advanced</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QPrintSettingsOutput</name>
-    <message>
-        <location filename="../src/gui/dialogs/qprintsettingsoutput.ui"/>
-        <source>Form</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>Copies</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>Print range</source>
-        <translation type="unfinished">טווח הדפסה</translation>
-    </message>
-    <message>
-        <location/>
-        <source>Print all</source>
-        <translation type="unfinished">הדפס הכל</translation>
-    </message>
-    <message>
-        <location/>
-        <source>Pages from</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>to</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>Selection</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>Output Settings</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>Copies:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>Collate</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>Reverse</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>Options</source>
-        <translation type="unfinished">אפשרויות</translation>
-    </message>
-    <message>
-        <location/>
-        <source>Color Mode</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>Color</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>Grayscale</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>Duplex Printing</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>None</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>Long side</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>Short side</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QPrintWidget</name>
-    <message>
-        <location filename="../src/gui/dialogs/qprintwidget.ui"/>
-        <source>Form</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>Printer</source>
-        <translation type="unfinished">מדפסת</translation>
-    </message>
-    <message>
-        <location/>
-        <source>&amp;Name:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>P&amp;roperties</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>Location:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>Preview</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>Type:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>Output &amp;file:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location/>
-        <source>...</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QProcess</name>
-    <message>
-        <location filename="../src/corelib/io/qprocess_unix.cpp" line="+475"/>
-        <location filename="../src/corelib/io/qprocess_win.cpp" line="+147"/>
-        <source>Could not open input redirection for reading</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+12"/>
-        <location filename="../src/corelib/io/qprocess_win.cpp" line="+36"/>
-        <source>Could not open output redirection for writing</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+235"/>
-        <source>Resource error (fork failure): %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+259"/>
-        <location line="+53"/>
-        <location line="+74"/>
-        <location line="+67"/>
-        <location filename="../src/corelib/io/qprocess_win.cpp" line="+422"/>
-        <location line="+50"/>
-        <location line="+75"/>
-        <location line="+42"/>
-        <location line="+54"/>
-        <source>Process operation timed out</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/corelib/io/qprocess.cpp" line="+533"/>
-        <location line="+52"/>
-        <location filename="../src/corelib/io/qprocess_win.cpp" line="-211"/>
-        <location line="+50"/>
-        <source>Error reading from process</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+47"/>
-        <location line="+779"/>
-        <location filename="../src/corelib/io/qprocess_win.cpp" line="+140"/>
-        <source>Error writing to process</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-709"/>
-        <source>Process crashed</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+912"/>
-        <source>No program defined</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/corelib/io/qprocess_win.cpp" line="-341"/>
-        <source>Process failed to start</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QProgressDialog</name>
-    <message>
-        <location filename="../src/gui/dialogs/qprogressdialog.cpp" line="+182"/>
-        <source>Cancel</source>
-        <translation>ביטול</translation>
-    </message>
-</context>
-<context>
-    <name>QPushButton</name>
-    <message>
-        <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="-8"/>
-        <source>Open</source>
-        <translation type="unfinished">פתח</translation>
-    </message>
-</context>
-<context>
-    <name>QRadioButton</name>
-    <message>
-        <location line="+12"/>
-        <source>Check</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QRegExp</name>
-    <message>
-        <location filename="../src/corelib/tools/qregexp.cpp" line="+64"/>
-        <source>no error occurred</source>
-        <translation type="unfinished">לא אירעה כל שגיאה</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>disabled feature used</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>bad char class syntax</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>bad lookahead syntax</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>bad repetition syntax</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>invalid octal value</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>missing left delim</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>unexpected end</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>met internal limit</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QSQLite2Driver</name>
-    <message>
-        <location filename="../src/sql/drivers/sqlite2/qsql_sqlite2.cpp" line="+396"/>
-        <source>Error to open database</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+41"/>
-        <source>Unable to begin transaction</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+17"/>
-        <source>Unable to commit transaction</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+17"/>
-        <source>Unable to rollback Transaction</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QSQLite2Result</name>
-    <message>
-        <location line="-323"/>
-        <source>Unable to fetch results</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+147"/>
-        <source>Unable to execute statement</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QSQLiteDriver</name>
-    <message>
-        <location filename="../src/sql/drivers/sqlite/qsql_sqlite.cpp" line="+528"/>
-        <source>Error opening database</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+11"/>
-        <source>Error closing database</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+20"/>
-        <source>Unable to begin transaction</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+15"/>
-        <source>Unable to commit transaction</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+15"/>
-        <source>Unable to rollback transaction</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QSQLiteResult</name>
-    <message>
-        <location line="-400"/>
-        <location line="+66"/>
-        <location line="+8"/>
-        <source>Unable to fetch row</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+63"/>
-        <source>Unable to execute statement</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+20"/>
-        <source>Unable to reset statement</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+45"/>
-        <source>Unable to bind parameters</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+7"/>
-        <source>Parameter count mismatch</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-208"/>
-        <source>No query</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QScrollBar</name>
-    <message>
-        <location filename="../src/gui/widgets/qscrollbar.cpp" line="+448"/>
-        <source>Scroll here</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Left edge</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+0"/>
-        <source>Top</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Right edge</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+0"/>
-        <source>Bottom</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Page left</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+0"/>
-        <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+143"/>
-        <source>Page up</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Page right</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+0"/>
-        <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+4"/>
-        <source>Page down</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Scroll left</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+0"/>
-        <source>Scroll up</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Scroll right</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+0"/>
-        <source>Scroll down</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-6"/>
-        <source>Line up</source>
-        <translation type="unfinished">סדר בשורה</translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>Position</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>Line down</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QSharedMemory</name>
-    <message>
-        <location filename="../src/corelib/kernel/qsharedmemory.cpp" line="+207"/>
-        <source>%1: unable to set key on lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+81"/>
-        <source>%1: create size is less then 0</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+168"/>
-        <location filename="../src/corelib/kernel/qsharedmemory_p.h" line="+148"/>
-        <source>%1: unable to lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+22"/>
-        <source>%1: unable to unlock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+78"/>
-        <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+87"/>
-        <source>%1: permission denied</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-22"/>
-        <source>%1: already exists</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+9"/>
-        <source>%1: doesn&apos;t exists</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+6"/>
-        <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+9"/>
-        <source>%1: out of resources</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+7"/>
-        <source>%1: unknown error %2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+21"/>
-        <source>%1: key is empty</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+8"/>
-        <source>%1: unix key file doesn&apos;t exists</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+7"/>
-        <source>%1: ftok failed</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+51"/>
-        <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+15"/>
-        <source>%1: unable to make key</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+20"/>
-        <source>%1: system-imposed size restrictions</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+53"/>
-        <source>%1: not attached</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-27"/>
-        <source>%1: invalid size</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+68"/>
-        <source>%1: key error</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+38"/>
-        <source>%1: size query failed</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QShortcut</name>
-    <message>
-        <location filename="../src/gui/kernel/qkeysequence.cpp" line="+373"/>
-        <source>Space</source>
-        <translation type="unfinished">רווח</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Esc</source>
-        <translation type="unfinished">Esc</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Tab</source>
-        <translation type="unfinished">Tab</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Backtab</source>
-        <translation type="unfinished">Backtab</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Backspace</source>
-        <translation type="unfinished">Backspace</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Return</source>
-        <translation type="unfinished">Return</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Enter</source>
-        <translation type="unfinished">Enter</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Ins</source>
-        <translation type="unfinished">Ins</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Del</source>
-        <translation type="unfinished">Del</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Pause</source>
-        <translation type="unfinished">Pause</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Print</source>
-        <translation type="unfinished">הדפס</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>SysReq</source>
-        <translation type="unfinished">SysReq</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Home</source>
-        <translation type="unfinished">Home</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>End</source>
-        <translation type="unfinished">End</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Left</source>
-        <translation type="unfinished">שמאלה</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Up</source>
-        <translation type="unfinished">למעלה</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Right</source>
-        <translation type="unfinished">ימינה</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Down</source>
-        <translation type="unfinished">למטה</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>PgUp</source>
-        <translation type="unfinished">PgUp</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>PgDown</source>
-        <translation type="unfinished">PgDown</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>CapsLock</source>
-        <translation type="unfinished">CapsLock</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>NumLock</source>
-        <translation type="unfinished">NumLock</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>ScrollLock</source>
-        <translation type="unfinished">ScrollLock</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Menu</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Help</source>
-        <translation type="unfinished">עזרה</translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Back</source>
-        <translation type="unfinished">אחורה</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Forward</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Stop</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Refresh</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Volume Down</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Volume Mute</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Volume Up</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Bass Boost</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Bass Up</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Bass Down</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Treble Up</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Treble Down</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Media Play</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Media Stop</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Media Previous</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Media Next</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Media Record</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Favorites</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Search</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Standby</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Open URL</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Launch Mail</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Launch Media</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Launch (0)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Launch (1)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Launch (2)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Launch (3)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Launch (4)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Launch (5)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Launch (6)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Launch (7)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Launch (8)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Launch (9)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Launch (A)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Launch (B)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Launch (C)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Launch (D)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Launch (E)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Launch (F)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>Print Screen</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Page Up</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Page Down</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Caps Lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Num Lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Number Lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Scroll Lock</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Insert</source>
-        <translation type="unfinished">הוסף</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Delete</source>
-        <translation type="unfinished">מחק</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Escape</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>System Request</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>Select</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Yes</source>
-        <translation type="unfinished">כן</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>No</source>
-        <translation type="unfinished">לא</translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>Context1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Context2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Context3</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Context4</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Call</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Hangup</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Flip</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+527"/>
-        <location line="+122"/>
-        <source>Ctrl</source>
-        <translation type="unfinished">Ctrl</translation>
-    </message>
-    <message>
-        <location line="-121"/>
-        <location line="+125"/>
-        <source>Shift</source>
-        <translation type="unfinished">Shift</translation>
-    </message>
-    <message>
-        <location line="-124"/>
-        <location line="+122"/>
-        <source>Alt</source>
-        <translation type="unfinished">Alt</translation>
-    </message>
-    <message>
-        <location line="-121"/>
-        <location line="+117"/>
-        <source>Meta</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-25"/>
-        <source>+</source>
-        <translation type="unfinished">+</translation>
-    </message>
-    <message>
-        <location line="+46"/>
-        <source>F%1</source>
-        <translation type="unfinished">F%1</translation>
-    </message>
-    <message>
-        <location line="-720"/>
-        <source>Home Page</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QSlider</name>
-    <message>
-        <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+151"/>
-        <source>Page left</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+0"/>
-        <source>Page up</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Position</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Page right</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+0"/>
-        <source>Page down</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QSocks5SocketEngine</name>
-    <message>
-        <location filename="../src/network/socket/qsocks5socketengine.cpp" line="-67"/>
-        <source>Connection to proxy refused</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>Connection to proxy closed prematurely</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>Proxy host not found</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Connection to proxy timed out</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+17"/>
-        <source>Proxy authentication failed</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Proxy authentication failed: %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+9"/>
-        <source>SOCKS version 5 protocol error</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+19"/>
-        <source>General SOCKSv5 server failure</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>Connection not allowed by SOCKSv5 server</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+16"/>
-        <source>TTL expired</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>SOCKSv5 command not supported</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>Address type not supported</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Unknown SOCKSv5 proxy error code 0x%1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+685"/>
-        <source>Network operation timed out</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QSpinBox</name>
-    <message>
-        <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-574"/>
-        <source>More</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Less</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QSql</name>
-    <message>
-        <location filename="../src/qt3support/sql/q3sqlmanager_p.cpp" line="+890"/>
-        <source>Delete</source>
-        <translation type="unfinished">מחק</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Delete this record?</source>
-        <translation type="unfinished">האם למחוק רשומה זו?</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <location line="+16"/>
-        <location line="+36"/>
-        <source>Yes</source>
-        <translation type="unfinished">כן</translation>
-    </message>
-    <message>
-        <location line="-51"/>
-        <location line="+16"/>
-        <location line="+36"/>
-        <source>No</source>
-        <translation type="unfinished">לא</translation>
-    </message>
-    <message>
-        <location line="-44"/>
-        <source>Insert</source>
-        <translation type="unfinished">הוסף</translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Update</source>
-        <translation type="unfinished">עדכן</translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>Save edits?</source>
-        <translation type="unfinished">האם לשמור את העריכה?</translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Cancel</source>
-        <translation type="unfinished">ביטול</translation>
-    </message>
-    <message>
-        <location line="+32"/>
-        <source>Confirm</source>
-        <translation type="unfinished">אישור</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Cancel your edits?</source>
-        <translation type="unfinished">האם לבטל את העריכה שלך?</translation>
-    </message>
-</context>
-<context>
-    <name>QSslSocket</name>
-    <message>
-        <location filename="../src/network/ssl/qsslsocket_openssl.cpp" line="+569"/>
-        <source>Unable to write data: %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+119"/>
-        <source>Error while reading: %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+96"/>
-        <source>Error during SSL handshake: %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-524"/>
-        <source>Error creating SSL context (%1)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+25"/>
-        <source>Invalid or empty cipher list (%1)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+62"/>
-        <source>Error creating SSL session, %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+15"/>
-        <source>Error creating SSL session: %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-61"/>
-        <source>Cannot provide a certificate with no key, %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+7"/>
-        <source>Error loading local certificate, %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+12"/>
-        <source>Error loading private key, %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+7"/>
-        <source>Private key does not certificate public key, %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QSystemSemaphore</name>
-    <message>
-        <location filename="../src/corelib/kernel/qsystemsemaphore_unix.cpp" line="-41"/>
-        <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="+66"/>
-        <source>%1: out of resources</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-13"/>
-        <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="+4"/>
-        <source>%1: permission denied</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>%1: already exists</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>%1: does not exist</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+9"/>
-        <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="+3"/>
-        <source>%1: unknown error %2</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QTDSDriver</name>
-    <message>
-        <location filename="../src/sql/drivers/tds/qsql_tds.cpp" line="+584"/>
-        <source>Unable to open connection</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Unable to use database</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QTabBar</name>
-    <message>
-        <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="-326"/>
-        <source>Scroll Left</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+0"/>
-        <source>Scroll Right</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QTcpServer</name>
-    <message>
-        <location filename="../src/network/socket/qtcpserver.cpp" line="+282"/>
-        <source>Operation on socket is not supported</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QTextControl</name>
-    <message>
-        <location filename="../src/gui/text/qtextcontrol.cpp" line="+1973"/>
-        <source>&amp;Undo</source>
-        <translation type="unfinished">&amp;בטל</translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>&amp;Redo</source>
-        <translation type="unfinished">בצע &amp;שוב</translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>Cu&amp;t</source>
-        <translation type="unfinished">&amp;גזור</translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>&amp;Copy</source>
-        <translation type="unfinished">הע&amp;תק</translation>
-    </message>
-    <message>
-        <location line="+7"/>
-        <source>Copy &amp;Link Location</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+6"/>
-        <source>&amp;Paste</source>
-        <translation type="unfinished">ה&amp;דבק</translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Delete</source>
-        <translation type="unfinished">מחק</translation>
-    </message>
-    <message>
-        <location line="+7"/>
-        <source>Select All</source>
-        <translation type="unfinished">בחר הכל</translation>
-    </message>
-</context>
-<context>
-    <name>QToolButton</name>
-    <message>
-        <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="+254"/>
-        <location line="+6"/>
-        <source>Press</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-4"/>
-        <location line="+8"/>
-        <source>Open</source>
-        <translation type="unfinished">פתח</translation>
-    </message>
-</context>
-<context>
-    <name>QUdpSocket</name>
-    <message>
-        <location filename="../src/network/socket/qudpsocket.cpp" line="+169"/>
-        <source>This platform does not support IPv6</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QUndoGroup</name>
-    <message>
-        <location filename="../src/gui/util/qundogroup.cpp" line="+386"/>
-        <source>Undo</source>
-        <translation type="unfinished">בטל</translation>
-    </message>
-    <message>
-        <location line="+28"/>
-        <source>Redo</source>
-        <translation type="unfinished">שחזר</translation>
-    </message>
-</context>
-<context>
-    <name>QUndoModel</name>
-    <message>
-        <location filename="../src/gui/util/qundoview.cpp" line="+101"/>
-        <source>&lt;empty&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QUndoStack</name>
-    <message>
-        <location filename="../src/gui/util/qundostack.cpp" line="+834"/>
-        <source>Undo</source>
-        <translation type="unfinished">בטל</translation>
-    </message>
-    <message>
-        <location line="+27"/>
-        <source>Redo</source>
-        <translation type="unfinished">שחזר</translation>
-    </message>
-</context>
-<context>
-    <name>QUnicodeControlCharacterMenu</name>
-    <message>
-        <location filename="../src/gui/text/qtextcontrol.cpp" line="+884"/>
-        <source>LRM Left-to-right mark</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>RLM Right-to-left mark</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>ZWJ Zero width joiner</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>ZWNJ Zero width non-joiner</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>ZWSP Zero width space</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>LRE Start of left-to-right embedding</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>RLE Start of right-to-left embedding</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>LRO Start of left-to-right override</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>RLO Start of right-to-left override</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>PDF Pop directional formatting</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+6"/>
-        <source>Insert Unicode control character</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QWebFrame</name>
-    <message>
-        <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp" line="+692"/>
-        <source>Request cancelled</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+17"/>
-        <source>Request blocked</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+7"/>
-        <source>Cannot show URL</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+6"/>
-        <source>Frame load interruped by policy change</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+6"/>
-        <source>Cannot show mimetype</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+6"/>
-        <source>File does not exist</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QWebPage</name>
-    <message>
-        <location filename="../src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp" line="+382"/>
-        <source>Bad HTTP request</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/3rdparty/webkit/WebCore/platform/qt/Localizations.cpp" line="+42"/>
-        <source>Submit</source>
-        <comment>default label for Submit buttons in forms on web pages</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Submit</source>
-        <comment>Submit (input element) alt text for &lt;input&gt; elements with no alt, title, or value</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Reset</source>
-        <comment>default label for Reset buttons in forms on web pages</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+10"/>
-        <source>This is a searchable index. Enter search keywords: </source>
-        <comment>text that appears at the start of nearly-obsolete web pages in the form of a &apos;searchable index&apos;</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Choose File</source>
-        <comment>title for file button used in HTML forms</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>No file selected</source>
-        <comment>text to display in file button used in HTML forms when no file is selected</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Open in New Window</source>
-        <comment>Open in New Window context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Save Link...</source>
-        <comment>Download Linked File context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Copy Link</source>
-        <comment>Copy Link context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Open Image</source>
-        <comment>Open Image in New Window context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Save Image</source>
-        <comment>Download Image context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Copy Image</source>
-        <comment>Copy Link context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Open Frame</source>
-        <comment>Open Frame in New Window context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Copy</source>
-        <comment>Copy context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Go Back</source>
-        <comment>Back context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Go Forward</source>
-        <comment>Forward context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Stop</source>
-        <comment>Stop context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Reload</source>
-        <comment>Reload context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Cut</source>
-        <comment>Cut context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Paste</source>
-        <comment>Paste context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>No Guesses Found</source>
-        <comment>No Guesses Found context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Ignore</source>
-        <comment>Ignore Spelling context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Add To Dictionary</source>
-        <comment>Learn Spelling context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Search The Web</source>
-        <comment>Search The Web context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Look Up In Dictionary</source>
-        <comment>Look Up in Dictionary context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Open Link</source>
-        <comment>Open Link context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Ignore</source>
-        <comment>Ignore Grammar context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Spelling</source>
-        <comment>Spelling and Grammar context sub-menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Show Spelling and Grammar</source>
-        <comment>menu item title</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Hide Spelling and Grammar</source>
-        <comment>menu item title</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Check Spelling</source>
-        <comment>Check spelling context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Check Spelling While Typing</source>
-        <comment>Check spelling while typing context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Check Grammar With Spelling</source>
-        <comment>Check grammar with spelling context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Fonts</source>
-        <comment>Font context sub-menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Bold</source>
-        <comment>Bold context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Italic</source>
-        <comment>Italic context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Underline</source>
-        <comment>Underline context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Outline</source>
-        <comment>Outline context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Direction</source>
-        <comment>Writing direction context sub-menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Text Direction</source>
-        <comment>Text direction context sub-menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Default</source>
-        <comment>Default writing direction context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>LTR</source>
-        <comment>Left to Right context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>RTL</source>
-        <comment>Right to Left context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Inspect</source>
-        <comment>Inspect Element context menu item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>No recent searches</source>
-        <comment>Label for only item in menu that appears when clicking on the search field image, when no searches have been performed</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Recent searches</source>
-        <comment>label for first item in the menu that appears when clicking on the search field image, used as embedded menu title</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Clear recent searches</source>
-        <comment>menu item in Recent Searches menu that empties menu&apos;s contents</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+75"/>
-        <source>Unknown</source>
-        <comment>Unknown filesize FTP directory listing item</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>%1 (%2x%3 pixels)</source>
-        <comment>Title string for images</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/InspectorClientQt.cpp" line="+185"/>
-        <source>Web Inspector - %2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/3rdparty/webkit/WebCore/platform/qt/ScrollbarQt.cpp" line="+58"/>
-        <source>Scroll here</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Left edge</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+0"/>
-        <source>Top</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Right edge</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+0"/>
-        <source>Bottom</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Page left</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+0"/>
-        <source>Page up</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Page right</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+0"/>
-        <source>Page down</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Scroll left</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+0"/>
-        <source>Scroll up</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Scroll right</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+0"/>
-        <source>Scroll down</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message numerus="yes">
-        <location filename="../src/3rdparty/webkit/WebCore/platform/qt/FileChooserQt.cpp" line="+45"/>
-        <source>%n file(s)</source>
-        <comment>number of chosen file</comment>
-        <translation type="unfinished">
-            <numerusform></numerusform>
-        </translation>
-    </message>
-    <message>
-        <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="+1322"/>
-        <source>JavaScript Alert - %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+15"/>
-        <source>JavaScript Confirm - %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+17"/>
-        <source>JavaScript Prompt - %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+333"/>
-        <source>Move the cursor to the next character</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Move the cursor to the previous character</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Move the cursor to the next word</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Move the cursor to the previous word</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Move the cursor to the next line</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Move the cursor to the previous line</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Move the cursor to the start of the line</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Move the cursor to the end of the line</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Move the cursor to the start of the block</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Move the cursor to the end of the block</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Move the cursor to the start of the document</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Move the cursor to the end of the document</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Select all</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Select to the next character</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Select to the previous character</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Select to the next word</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Select to the previous word</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Select to the next line</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Select to the previous line</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Select to the start of the line</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Select to the end of the line</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Select to the start of the block</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Select to the end of the block</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Select to the start of the document</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Select to the end of the document</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Delete to the start of the word</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Delete to the end of the word</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+33"/>
-        <source>Insert a new paragraph</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Insert a new line</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QWhatsThisAction</name>
-    <message>
-        <location filename="../src/gui/kernel/qwhatsthis.cpp" line="+522"/>
-        <source>What&apos;s This?</source>
-        <translation type="unfinished">מה זה?</translation>
-    </message>
-</context>
-<context>
-    <name>QWidget</name>
-    <message>
-        <location filename="../src/gui/kernel/qwidget.cpp" line="+5326"/>
-        <source>*</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QWizard</name>
-    <message>
-        <location filename="../src/gui/dialogs/qwizard.cpp" line="+649"/>
-        <source>Cancel</source>
-        <translation type="unfinished">ביטול</translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Help</source>
-        <translation type="unfinished">עזרה</translation>
-    </message>
-    <message>
-        <location line="-14"/>
-        <source>Go Back</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <source>Continue</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <source>Commit</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Done</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-10"/>
-        <source>&lt; &amp;Back</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+10"/>
-        <source>&amp;Finish</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>&amp;Help</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-8"/>
-        <source>&amp;Next</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+0"/>
-        <source>&amp;Next &gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QWorkspace</name>
-    <message>
-        <location filename="../src/gui/widgets/qworkspace.cpp" line="+1094"/>
-        <source>&amp;Restore</source>
-        <translation type="unfinished">ש&amp;חזר</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>&amp;Move</source>
-        <translation type="unfinished">ה&amp;זז</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>&amp;Size</source>
-        <translation type="unfinished">&amp;שנה גודל</translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Mi&amp;nimize</source>
-        <translation type="unfinished">&amp;מזער</translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Ma&amp;ximize</source>
-        <translation type="unfinished">&amp;הגדל</translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>&amp;Close</source>
-        <translation type="unfinished">&amp;סגור</translation>
-    </message>
-    <message>
-        <location line="+6"/>
-        <source>Stay on &amp;Top</source>
-        <translation type="unfinished">&amp;תמיד עליון</translation>
-    </message>
-    <message>
-        <location line="+3"/>
-        <location line="+1059"/>
-        <source>Sh&amp;ade</source>
-        <translation type="unfinished">&amp;גלול</translation>
-    </message>
-    <message>
-        <location line="-278"/>
-        <location line="+60"/>
-        <source>%1 - [%2]</source>
-        <translation>%1 - [%2]</translation>
-    </message>
-    <message>
-        <location line="-1837"/>
-        <source>Minimize</source>
-        <translation type="unfinished">מזער</translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Restore Down</source>
-        <translation type="unfinished">שחזר למטה</translation>
-    </message>
-    <message>
-        <location line="-4"/>
-        <source>Close</source>
-        <translation type="unfinished">סגור</translation>
-    </message>
-    <message>
-        <location line="+2053"/>
-        <source>&amp;Unshade</source>
-        <translation type="unfinished">&amp;בטל גלילה</translation>
-    </message>
-</context>
-<context>
-    <name>QXml</name>
-    <message>
-        <location filename="../src/xml/sax/qxml.cpp" line="+58"/>
-        <source>no error occurred</source>
-        <translation>לא אירעה כל שגיאה</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>error triggered by consumer</source>
-        <translation>נגרמה שגיאה על ידי הצרכן</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>unexpected end of file</source>
-        <translation>סוף קובץ לא צפוי</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>more than one document type definition</source>
-        <translation>יותר מהגדרה אחת של סוג מסמך</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>error occurred while parsing element</source>
-        <translation>אירעה שגיאה בעת עיבוד המרכיב</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>tag mismatch</source>
-        <translation>אי-התאמה בתגית</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>error occurred while parsing content</source>
-        <translation>אירעה שגיאה בעת עיבוד התוכן</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>unexpected character</source>
-        <translation>תו לא צפוי</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>invalid name for processing instruction</source>
-        <translation>שם לא תקף עבור הוראת העיבוד</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>version expected while reading the XML declaration</source>
-        <translation>הייתה צפויה גירסה בעת קריאה ההכרזה על XML</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>wrong value for standalone declaration</source>
-        <translation>ערך שגוי עבור ההגדרה העצמאית</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>encoding declaration or standalone declaration expected while reading the XML declaration</source>
-        <translation>הייתה צפויה הכרזה על קידוד או הכרזה עצמאית בעת קריאת ההכרזה על XML</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>standalone declaration expected while reading the XML declaration</source>
-        <translation>הייתה צפויה הכרזה עצמאית בעת קריאת ההכרזה על XML</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>error occurred while parsing document type definition</source>
-        <translation>אירעה שגיאה בעת עיבוד הגדרת סוג המסמך</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>letter is expected</source>
-        <translation>הייתה צפויה אות</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>error occurred while parsing comment</source>
-        <translation>אירעה שגיאה בעת עיבוד ההערה</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>error occurred while parsing reference</source>
-        <translation>אירעה שגיאה בעת עיבוד ההתייחסות</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>internal general entity reference not allowed in DTD</source>
-        <translation>התייחסות ליישות כללית פנימית אינה מותרת ב-DTD</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>external parsed general entity reference not allowed in attribute value</source>
-        <translation>התייחסות ליישות כללית מעובדת חיצונית אינה מותרת בערך המאפיין</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>external parsed general entity reference not allowed in DTD</source>
-        <translation>התייחסות ליישות כללית מעובדת חיצונית אינה מותרת ב-DTD</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>unparsed entity reference in wrong context</source>
-        <translation>התייחסות ליישות לא מעובדת בהקשר שגוי</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>recursive entities</source>
-        <translation>יישות רקורסיבית</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>error in the text declaration of an external entity</source>
-        <translation>שגיאה בהכרזת טקסט של יישות חיצונית</translation>
-    </message>
-</context>
-<context>
-    <name>QXmlStream</name>
-    <message>
-        <location filename="../src/corelib/xml/qxmlstream.cpp" line="+592"/>
-        <location filename="../src/corelib/xml/qxmlstream_p.h" line="+1769"/>
-        <source>Extra content at end of document.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+222"/>
-        <source>Invalid entity value.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+107"/>
-        <source>Invalid XML character.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+259"/>
-        <source>Sequence &apos;]]&gt;&apos; not allowed in content.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+309"/>
-        <source>Namespace prefix &apos;%1&apos; not declared</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+78"/>
-        <source>Attribute redefined.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+115"/>
-        <source>Unexpected character &apos;%1&apos; in public id literal.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+28"/>
-        <source>Invalid XML version string.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Unsupported XML version.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+23"/>
-        <source>%1 is an invalid encoding name.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+7"/>
-        <source>Encoding %1 is unsupported</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+16"/>
-        <source>Standalone accepts only yes or no.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Invalid attribute in XML declaration.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+16"/>
-        <source>Premature end of document.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>Invalid document.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+40"/>
-        <source>Expected </source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+11"/>
-        <source>, but got &apos;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>Unexpected &apos;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+210"/>
-        <source>Expected character data.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/corelib/xml/qxmlstream_p.h" line="-995"/>
-        <source>Recursive entity detected.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+516"/>
-        <source>Start tag expected.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+222"/>
-        <source>XML declaration not at start of document.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-31"/>
-        <source>NDATA in parameter entity declaration.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+34"/>
-        <source>%1 is an invalid processing instruction name.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+11"/>
-        <source>Invalid processing instruction name.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/corelib/xml/qxmlstream.cpp" line="-521"/>
-        <location line="+12"/>
-        <location filename="../src/corelib/xml/qxmlstream_p.h" line="+164"/>
-        <location line="+53"/>
-        <source>Illegal namespace declaration.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/corelib/xml/qxmlstream_p.h" line="+15"/>
-        <source>Invalid XML name.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+23"/>
-        <source>Opening and ending tag mismatch.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+18"/>
-        <source>Reference to unparsed entity &apos;%1&apos;.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-13"/>
-        <location line="+61"/>
-        <location line="+40"/>
-        <source>Entity &apos;%1&apos; not declared.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-26"/>
-        <source>Reference to external entity &apos;%1&apos; in attribute value.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+40"/>
-        <source>Invalid character reference.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/corelib/xml/qxmlstream.cpp" line="-75"/>
-        <location filename="../src/corelib/xml/qxmlstream_p.h" line="-823"/>
-        <source>Encountered incorrectly encoded content.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+274"/>
-        <source>The standalone pseudo attribute must appear after the encoding.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/corelib/xml/qxmlstream_p.h" line="+562"/>
-        <source>%1 is an invalid PUBLIC identifier.</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>QtXmlPatterns</name>
-    <message>
-        <location filename="../src/xmlpatterns/acceltree/qacceltreebuilder.cpp" line="+205"/>
-        <source>An %1-attribute with value %2 has already been declared.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+13"/>
-        <source>An %1-attribute must have a valid %2 as value, which %3 isn&apos;t.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/api/qiodevicedelegate.cpp" line="+84"/>
-        <source>Network timeout.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/api/qxmlserializer.cpp" line="+320"/>
-        <source>Element %1 can&apos;t be serialized because it appears outside the document element.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+60"/>
-        <source>Attribute %1 can&apos;t be serialized because it appears at the top level.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/data/qabstractdatetime.cpp" line="+80"/>
-        <source>Year %1 is invalid because it begins with %2.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+19"/>
-        <source>Day %1 is outside the range %2..%3.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+7"/>
-        <source>Month %1 is outside the range %2..%3.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+10"/>
-        <source>Overflow: Can&apos;t represent date %1.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+9"/>
-        <source>Day %1 is invalid for month %2.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+49"/>
-        <source>Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; </source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+13"/>
-        <source>Time %1:%2:%3.%4 is invalid.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+115"/>
-        <source>Overflow: Date can&apos;t be represented.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/data/qabstractduration.cpp" line="+99"/>
-        <location line="+15"/>
-        <source>At least one component must be present.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-7"/>
-        <source>At least one time component must appear after the %1-delimiter.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/data/qabstractfloatmathematician.cpp" line="+64"/>
-        <source>No operand in an integer division, %1, can be %2.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+7"/>
-        <source>The first operand in an integer division, %1, cannot be infinity (%2).</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+6"/>
-        <source>The second operand in a division, %1, cannot be zero (%2).</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/data/qanyuri_p.h" line="+132"/>
-        <source>%1 is not a valid value of type %2.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/data/qatomiccasters_p.h" line="+223"/>
-        <source>When casting to %1 from %2, the source value cannot be %3.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/data/qatomicmathematicians.cpp" line="+65"/>
-        <source>Integer division (%1) by zero (%2) is undefined.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+7"/>
-        <source>Division (%1) by zero (%2) is undefined.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+7"/>
-        <source>Modulus division (%1) by zero (%2) is undefined.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+122"/>
-        <location line="+32"/>
-        <source>Dividing a value of type %1 by %2 (not-a-number) is not allowed.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-20"/>
-        <source>Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+32"/>
-        <source>Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/data/qatomicvalue.cpp" line="+79"/>
-        <source>A value of type %1 cannot have an Effective Boolean Value.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/data/qboolean.cpp" line="+78"/>
-        <source>Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/data/qderivedinteger_p.h" line="+402"/>
-        <source>Value %1 of type %2 exceeds maximum (%3).</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+9"/>
-        <source>Value %1 of type %2 is below minimum (%3).</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/data/qhexbinary.cpp" line="+91"/>
-        <source>A value of type %1 must contain an even number of digits. The value %2 does not.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+19"/>
-        <source>%1 is not valid as a value of type %2.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/expr/qarithmeticexpression.cpp" line="+207"/>
-        <source>Operator %1 cannot be used on type %2.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+17"/>
-        <source>Operator %1 cannot be used on atomic values of type %2 and %3.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/expr/qattributenamevalidator.cpp" line="+66"/>
-        <source>The namespace URI in the name for a computed attribute cannot be %1.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+9"/>
-        <source>The name for a computed attribute cannot have the namespace URI %1 with the local name %2.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/expr/qcastas.cpp" line="+88"/>
-        <source>Type error in cast, expected %1, received %2.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+29"/>
-        <source>When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/expr/qcastingplatform.cpp" line="+134"/>
-        <source>No casting is possible with %1 as the target type.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+15"/>
-        <source>It is not possible to cast from %1 to %2.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+27"/>
-        <source>Casting to %1 is not possible because it is an abstract type, and can therefore never be instantiated.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+23"/>
-        <source>It&apos;s not possible to cast the value %1 of type %2 to %3</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+8"/>
-        <source>Failure when casting from %1 to %2: %3</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/expr/qcommentconstructor.cpp" line="+67"/>
-        <source>A comment cannot contain %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+6"/>
-        <source>A comment cannot end with a %1.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/expr/qcomparisonplatform.cpp" line="+167"/>
-        <source>No comparisons can be done involving the type %1.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+14"/>
-        <source>Operator %1 is not available between atomic values of type %2 and %3.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/expr/qdocumentcontentvalidator.cpp" line="+86"/>
-        <source>An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/expr/qexpressionfactory.cpp" line="+169"/>
-        <source>A library module cannot be evaluated directly. It must be imported from a main module.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+40"/>
-        <source>No template by name %1 exists.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/expr/qgenericpredicate.cpp" line="+106"/>
-        <source>A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+32"/>
-        <source>A positional predicate must evaluate to a single numeric value.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/expr/qncnameconstructor_p.h" line="+113"/>
-        <source>The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, is %2 invalid.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+24"/>
-        <source>%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/expr/qpath.cpp" line="+109"/>
-        <source>The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/expr/qprocessinginstructionconstructor.cpp" line="+84"/>
-        <source>The data of a processing instruction cannot contain the string %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/expr/qqnameconstructor.cpp" line="+82"/>
-        <source>No namespace binding exists for the prefix %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/expr/qqnameconstructor_p.h" line="+156"/>
-        <source>No namespace binding exists for the prefix %1 in %2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+12"/>
-        <location filename="../src/xmlpatterns/functions/qqnamefns.cpp" line="+69"/>
-        <source>%1 is an invalid %2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message numerus="yes">
-        <location filename="../src/xmlpatterns/functions/qabstractfunctionfactory.cpp" line="+77"/>
-        <source>%1 takes at most %n argument(s). %2 is therefore invalid.</source>
-        <translation type="unfinished">
-            <numerusform></numerusform>
-        </translation>
-    </message>
-    <message numerus="yes">
-        <location line="+11"/>
-        <source>%1 requires at least %n argument(s). %2 is therefore invalid.</source>
-        <translation type="unfinished">
-            <numerusform></numerusform>
-        </translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/functions/qaggregatefns.cpp" line="+120"/>
-        <source>The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+74"/>
-        <source>The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+91"/>
-        <source>The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/functions/qassemblestringfns.cpp" line="+88"/>
-        <source>%1 is not a valid XML 1.0 character.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/functions/qcomparingaggregator.cpp" line="+197"/>
-        <source>The first argument to %1 cannot be of type %2.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/functions/qdatetimefn.cpp" line="+86"/>
-        <source>If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/functions/qerrorfn.cpp" line="+61"/>
-        <source>%1 was called.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/functions/qpatternmatchingfns.cpp" line="+94"/>
-        <source>%1 must be followed by %2 or %3, not at the end of the replacement string.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+39"/>
-        <source>In the replacement string, %1 must be followed by at least one digit when not escaped.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+26"/>
-        <source>In the replacement string, %1 can only be used to escape itself or %2, not %3</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/functions/qpatternplatform.cpp" line="+92"/>
-        <source>%1 matches newline characters</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>%1 and %2 match the start and end of a line.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+6"/>
-        <source>Matches are case insensitive</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+4"/>
-        <source>Whitespace characters are removed, except when they appear in character classes</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+99"/>
-        <source>%1 is an invalid regular expression pattern: %2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+30"/>
-        <source>%1 is an invalid flag for regular expressions. Valid flags are:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/functions/qqnamefns.cpp" line="+17"/>
-        <source>If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/functions/qsequencefns.cpp" line="+347"/>
-        <source>It will not be possible to retrieve %1.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/functions/qcontextnodechecker.cpp" line="+54"/>
-        <source>The root node of the second argument to function %1 must be a document node. %2 is not a document node.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/functions/qsequencegeneratingfns.cpp" line="+279"/>
-        <source>The default collection is undefined</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+13"/>
-        <source>%1 cannot be retrieved</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/functions/qstringvaluefns.cpp" line="+252"/>
-        <source>The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization).</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/functions/qtimezonefns.cpp" line="+87"/>
-        <source>A zone offset must be in the range %1..%2 inclusive. %3 is out of range.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+12"/>
-        <source>%1 is not a whole number of minutes.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/janitors/qcardinalityverifier.cpp" line="+58"/>
-        <source>Required cardinality is %1; got cardinality %2.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/janitors/qitemverifier.cpp" line="+67"/>
-        <source>The item %1 did not match the required type %2.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+379"/>
-        <location line="+7253"/>
-        <source>%1 is an unknown schema type.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-6971"/>
-        <source>Only one %1 declaration can occur in the query prolog.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+188"/>
-        <source>The initialization of variable %1 depends on itself</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+63"/>
-        <source>No variable by name %1 exists</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/parser/qparsercontext.cpp" line="+93"/>
-        <source>The variable %1 is unused</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+2841"/>
-        <source>Version %1 is not supported. The supported XQuery version is 1.0.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+16"/>
-        <source>The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+55"/>
-        <source>No function with signature %1 is available</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+72"/>
-        <location line="+10"/>
-        <source>A default namespace declaration must occur before function, variable, and option declarations.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+10"/>
-        <source>Namespace declarations must occur before function, variable, and option declarations.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+11"/>
-        <source>Module imports must occur before function, variable, and option declarations.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+200"/>
-        <source>It is not possible to redeclare prefix %1.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+18"/>
-        <source>Prefix %1 is already declared in the prolog.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+95"/>
-        <source>The name of an option must have a prefix. There is no default namespace for options.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+171"/>
-        <source>The Schema Import feature is not supported, and therefore %1 declarations cannot occur.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+13"/>
-        <source>The target namespace of a %1 cannot be empty.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+8"/>
-        <source>The module import feature is not supported</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+52"/>
-        <source>No value is available for the external variable by name %1.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-4154"/>
-        <source>A construct was encountered which only is allowed in XQuery.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+118"/>
-        <source>A template by name %1 has already been declared.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+3581"/>
-        <source>The keyword %1 cannot occur with any other mode name.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+29"/>
-        <source>The value of attribute %1 must of type %2, which %3 isn&apos;t.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+75"/>
-        <source>The prefix %1 can not be bound. By default, it is already bound to the namespace %2.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+312"/>
-        <source>A variable by name %1 has already been declared.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+135"/>
-        <source>A stylesheet function must have a prefixed name.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+9"/>
-        <source>The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+9"/>
-        <source>The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+12"/>
-        <source>The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+34"/>
-        <source>A function already exists with the signature %1.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+23"/>
-        <source>No external functions are supported. All supported functions can be used directly, without first declaring them as external</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+37"/>
-        <source>An argument by name %1 has already been declared. Every argument name must be unique.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+179"/>
-        <source>When function %1 is used for matching inside a pattern, the argument must be a variable reference or a string literal.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+11"/>
-        <source>In an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+14"/>
-        <source>In an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+9"/>
-        <source>In an XSL-T pattern, function %1 cannot have a third argument.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+10"/>
-        <source>In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+63"/>
-        <source>In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+126"/>
-        <source>%1 is an invalid template mode name.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+44"/>
-        <source>The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+758"/>
-        <source>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+39"/>
-        <source>None of the pragma expressions are supported. Therefore, a fallback expression must be present</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+267"/>
-        <source>Each name of a template parameter must be unique; %1 is duplicated.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+129"/>
-        <source>The %1-axis is unsupported in XQuery</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+1150"/>
-        <source>%1 is not a valid name for a processing-instruction.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-7029"/>
-        <source>%1 is not a valid numeric literal.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+6165"/>
-        <source>No function by name %1 is available.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+102"/>
-        <source>The namespace URI cannot be the empty string when binding to a prefix, %1.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+7"/>
-        <source>%1 is an invalid namespace URI.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+6"/>
-        <source>It is not possible to bind to the prefix %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+7"/>
-        <source>Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+8"/>
-        <source>Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+15"/>
-        <source>Two namespace declaration attributes have the same name: %1.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+89"/>
-        <source>The namespace URI must be a constant and cannot use enclosed expressions.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+16"/>
-        <source>An attribute by name %1 has already appeared on this element.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+61"/>
-        <source>A direct element constructor is not well-formed. %1 is ended with %2.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+458"/>
-        <source>The name %1 does not refer to any schema type.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+10"/>
-        <source>%1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+9"/>
-        <source>%1 is not an atomic type. Casting is only possible to atomic types.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+145"/>
-        <location line="+71"/>
-        <source>%1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+48"/>
-        <source>The name of an extension expression must be in a namespace.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/type/qcardinality.cpp" line="+55"/>
-        <source>empty</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>zero or one</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>exactly one</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>one or more</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+2"/>
-        <source>zero or more</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/type/qtypechecker.cpp" line="+63"/>
-        <source>Required type is %1, but %2 was found.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+44"/>
-        <source>Promoting %1 to %2 may cause loss of precision.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+49"/>
-        <source>The focus is undefined.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/utils/qoutputvalidator.cpp" line="+86"/>
-        <source>It&apos;s not possible to add attributes after any other kind of node.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+7"/>
-        <source>An attribute by name %1 has already been created.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/utils/qxpathhelper_p.h" line="+120"/>
-        <source>Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/acceltree/qacceltreeresourceloader.cpp" line="+314"/>
-        <source>%1 is an unsupported encoding.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+16"/>
-        <source>%1 contains octets which are disallowed in the requested encoding %2.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+18"/>
-        <source>The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/expr/qapplytemplate.cpp" line="+119"/>
-        <source>Ambiguous rule match.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/expr/qcomputednamespaceconstructor.cpp" line="+69"/>
-        <source>In a namespace constructor, the value for a namespace cannot be an empty string.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+11"/>
-        <source>The prefix must be a valid %1, which %2 is not.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+14"/>
-        <source>The prefix %1 cannot be bound.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+10"/>
-        <source>Only the prefix %1 can be bound to %2 and vice versa.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/expr/qevaluationcache.cpp" line="+117"/>
-        <source>Circularity detected</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/expr/qtemplate.cpp" line="+145"/>
-        <source>The parameter %1 is required, but no corresponding %2 is supplied.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="-71"/>
-        <source>The parameter %1 is passed, but no corresponding %2 exists.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/functions/qunparsedtextfn.cpp" line="+65"/>
-        <source>The URI cannot have a fragment</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+519"/>
-        <source>Element %1 is not allowed at this location.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+9"/>
-        <source>Text nodes are not allowed at this location.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+20"/>
-        <source>Parse error: %1</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+62"/>
-        <source>The value of the XSL-T version attribute must be a value of type %1, which %2 isn&apos;t.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+20"/>
-        <source>Running an XSL-T 1.0 stylesheet with a 2.0 processor.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+108"/>
-        <source>Unknown XSL-T attribute %1.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+23"/>
-        <source>Attribute %1 and %2 are mutually exclusive.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+166"/>
-        <source>In a simplified stylesheet module, attribute %1 must be present.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+72"/>
-        <source>If element %1 has no attribute %2, it cannot have attribute %3 or %4.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+9"/>
-        <source>Element %1 must have at least one of the attributes %2 or %3.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+28"/>
-        <source>At least one mode must be specified in the %1-attribute on element %2.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/parser/qmaintainingreader.cpp" line="+183"/>
-        <source>Attribute %1 cannot appear on the element %2. Only the standard attributes can appear.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+6"/>
-        <source>Attribute %1 cannot appear on the element %2. Only %3 is allowed, and the standard attributes.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+8"/>
-        <source>Attribute %1 cannot appear on the element %2. Allowed is %3, %4, and the standard attributes.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+9"/>
-        <source>Attribute %1 cannot appear on the element %2. Allowed is %3, and the standard attributes.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+13"/>
-        <source>XSL-T attributes on XSL-T elements must be in the null namespace, not in the XSL-T namespace which %1 is.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+12"/>
-        <source>The attribute %1 must appear on element %2.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+8"/>
-        <source>The element with local name %1 does not exist in XSL-T.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+123"/>
-        <source>Element %1 must come last.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+24"/>
-        <source>At least one %1-element must occur before %2.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+7"/>
-        <source>Only one %1-element can appear.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+31"/>
-        <source>At least one %1-element must occur inside %2.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+58"/>
-        <source>When attribute %1 is present on %2, a sequence constructor cannot be used.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+13"/>
-        <source>Element %1 must have either a %2-attribute or a sequence constructor.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+125"/>
-        <source>When a parameter is required, a default value cannot be supplied through a %1-attribute or a sequence constructor.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+270"/>
-        <source>Element %1 cannot have children.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+434"/>
-        <source>Element %1 cannot have a sequence constructor.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+86"/>
-        <location line="+9"/>
-        <source>The attribute %1 cannot appear on %2, when it is a child of %3.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+15"/>
-        <source>A parameter in a function cannot be declared to be a tunnel.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+149"/>
-        <source>This processor is not Schema-aware and therefore %1 cannot be used.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+57"/>
-        <source>Top level stylesheet elements must be in a non-null namespace, which %1 isn&apos;t.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+48"/>
-        <source>The value for attribute %1 on element %2 must either be %3 or %4, not %5.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+20"/>
-        <source>Attribute %1 cannot have the value %2.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+58"/>
-        <source>The attribute %1 can only appear on the first %2 element.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+99"/>
-        <source>At least one %1 element must appear as child of %2.</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-<context>
-    <name>VolumeSlider</name>
-    <message>
-        <location filename="../src/3rdparty/phonon/phonon/volumeslider.cpp" line="+67"/>
-        <source>Muted</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+5"/>
-        <location line="+15"/>
-        <source>Volume: %1%</source>
-        <translation type="unfinished"></translation>
-    </message>
-</context>
-</TS>
--- a/translations/translations.pri	Thu May 27 13:40:48 2010 +0300
+++ b/translations/translations.pri	Fri Jun 11 14:24:45 2010 +0300
@@ -17,7 +17,7 @@
 
 ###### Qt Libraries
 
-QT_TS        = ar cs da de es fr iw ja_JP pl pt ru sk sl sv uk zh_CN zh_TW
+QT_TS        = ar cs da de es fr he ja_JP pl pt ru sk sl sv uk zh_CN zh_TW
 
 ts-qt.commands = (cd $$QT_SOURCE_TREE/src && $$LUPDATE \
                                 -I../include -I../include/Qt \
--- a/util/s60pixelmetrics/pixel_metrics.cpp	Thu May 27 13:40:48 2010 +0300
+++ b/util/s60pixelmetrics/pixel_metrics.cpp	Fri Jun 11 14:24:45 2010 +0300
@@ -50,7 +50,7 @@
 // so that we can keep dynamic and static values inline.
 // Please adjust version data if correcting dynamic PM calculations.
 const TInt KPMMajorVersion = 1;
-const TInt KPMMinorVersion = 18;
+const TInt KPMMinorVersion = 19;
 
 TPixelMetricsVersion PixelMetrics::Version()
     {
@@ -468,7 +468,7 @@
             TAknLayoutRect sliderSettingRect;
             sliderSettingRect.LayoutRect( sliderRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_cp() );
             TAknLayoutRect sliderGraph2Rect;
-            sliderGraph2Rect.LayoutRect( sliderSettingRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_g2() );
+            sliderGraph2Rect.LayoutRect( sliderSettingRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_g6() );
             value = sliderGraph2Rect.Rect().Width();
             }
             break;
@@ -483,7 +483,8 @@
             TAknLayoutRect sliderSettingRect;
             sliderSettingRect.LayoutRect( sliderRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_cp() );
             TAknLayoutRect sliderGraph2Rect;
-            sliderGraph2Rect.LayoutRect( sliderSettingRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_g2() );
+            sliderGraph2Rect.LayoutRect( sliderSettingRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_g6() );
+            //todo: make a proper calculation for tick marks
             value = (TInt)(sliderGraph2Rect.Rect().Height()*1.5); // add assumed tickmark height
             }
             break;
@@ -498,7 +499,8 @@
             TAknLayoutRect sliderSettingRect;
             sliderSettingRect.LayoutRect( sliderRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_cp() );
             TAknLayoutRect sliderGraph2Rect;
-            sliderGraph2Rect.LayoutRect( sliderSettingRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_g2() );
+            sliderGraph2Rect.LayoutRect( sliderSettingRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_g6() );
+            //todo: make a proper calculation for tick marks
             value = (TInt)(sliderGraph2Rect.Rect().Height()*0.5); // no tickmarks in S60, lets assume they are half the size of slider indicator
             }
             break;
@@ -513,7 +515,7 @@
             TAknLayoutRect sliderSettingRect;
             sliderSettingRect.LayoutRect( sliderRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_cp() );
             TAknLayoutRect sliderGraph2Rect;
-            sliderGraph2Rect.LayoutRect( sliderSettingRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_g2() );
+            sliderGraph2Rect.LayoutRect( sliderSettingRect.Rect(), AknLayoutScalable_Avkon::slider_set_pane_g6() );
             value = sliderGraph2Rect.Rect().Height();
             }
             break;