From 50b48aec6ddd451a6d1709c0942477b503457663 Mon Sep 17 00:00:00 2001 From: tpearson Date: Wed, 3 Feb 2010 02:15:56 +0000 Subject: [PATCH] Added abandoned KDE3 version of K3B git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/k3b@1084400 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- AUTHORS | 2 + COPYING | 280 + COPYING-DOCS | 397 + ChangeLog | 743 + FAQ | 82 + INSTALL | 51 + KNOWNBUGS | 0 Makefile.am | 11 + PERMISSIONS | 32 + README | 92 + RELEASE_HOWTO | 27 + TODO | 22 + acinclude.m4 | 11945 +++++++++++ aclocal.m4 | 903 + config.h.in | 362 + configure.files | 26 + configure.in | 1244 ++ configure.in.bot | 62 + configure.in.in | 184 + doc/Makefile.am | 4 + doc/audiocd-howto.docbook | 96 + doc/burndialog_audio.png | Bin 0 -> 19980 bytes doc/burndialog_progress.png | Bin 0 -> 22348 bytes doc/cdcloning_dialog.png | Bin 0 -> 22862 bytes doc/cdcloning_reading.png | Bin 0 -> 15181 bytes doc/cdcopy-howto.docbook | 86 + doc/cdcopy_done.png | Bin 0 -> 22164 bytes doc/cdcopy_reading.png | Bin 0 -> 19386 bytes doc/cdcopy_settings.png | Bin 0 -> 21191 bytes doc/cdcopy_writing.png | Bin 0 -> 22480 bytes doc/commands.docbook | 700 + doc/dcop.docbook | 104 + doc/index.docbook | 340 + doc/select_audiofiles.png | Bin 0 -> 46007 bytes doc/select_project.png | Bin 0 -> 25449 bytes k3b.lsm | 14 + k3bsetup/Makefile.am | 18 + k3bsetup/base_k3bsetup2.ui | 380 + k3bsetup/k3bsetup | 20 + k3bsetup/k3bsetup2.cpp | 560 + k3bsetup/k3bsetup2.desktop | 148 + k3bsetup/k3bsetup2.h | 65 + kfile-plugins/Makefile.am | 1 + kfile-plugins/k3bproject/Makefile.am | 27 + kfile-plugins/k3bproject/kfile_k3b.desktop | 53 + .../k3bproject/kfile_k3bprojectfileplugin.cpp | 135 + .../k3bproject/kfile_k3bprojectfileplugin.h | 37 + kioslaves/Makefile.am | 1 + kioslaves/videodvd/Makefile.am | 19 + kioslaves/videodvd/videodvd.cpp | 407 + kioslaves/videodvd/videodvd.desktop | 48 + kioslaves/videodvd/videodvd.h | 55 + kioslaves/videodvd/videodvd.protocol | 52 + libk3b/Makefile.am | 28 + libk3b/README | 29 + libk3b/cddb/Makefile.am | 9 + libk3b/cddb/k3bcddb.cpp | 280 + libk3b/cddb/k3bcddb.h | 103 + libk3b/cddb/k3bcddbhttpquery.cpp | 233 + libk3b/cddb/k3bcddbhttpquery.h | 64 + libk3b/cddb/k3bcddblocalquery.cpp | 129 + libk3b/cddb/k3bcddblocalquery.h | 48 + libk3b/cddb/k3bcddblocalsubmit.cpp | 102 + libk3b/cddb/k3bcddblocalsubmit.h | 43 + libk3b/cddb/k3bcddbmultientriesdialog.cpp | 74 + libk3b/cddb/k3bcddbmultientriesdialog.h | 48 + libk3b/cddb/k3bcddbpquery.cpp | 278 + libk3b/cddb/k3bcddbpquery.h | 62 + libk3b/cddb/k3bcddbquery.cpp | 275 + libk3b/cddb/k3bcddbquery.h | 115 + libk3b/cddb/k3bcddbresult.cpp | 49 + libk3b/cddb/k3bcddbresult.h | 79 + libk3b/cddb/k3bcddbsubmit.cpp | 84 + libk3b/cddb/k3bcddbsubmit.h | 60 + libk3b/configure.in.in | 3 + libk3b/core/Makefile.am | 19 + libk3b/core/k3b_export.h | 33 + libk3b/core/k3bcore.cpp | 375 + libk3b/core/k3bcore.h | 181 + libk3b/core/k3bdataevent.h | 48 + libk3b/core/k3bdefaultexternalprograms.cpp | 1030 + libk3b/core/k3bdefaultexternalprograms.h | 143 + libk3b/core/k3bexternalbinmanager.cpp | 389 + libk3b/core/k3bexternalbinmanager.h | 162 + libk3b/core/k3bglobals.cpp | 634 + libk3b/core/k3bglobals.h | 257 + libk3b/core/k3bglobalsettings.cpp | 61 + libk3b/core/k3bglobalsettings.h | 70 + libk3b/core/k3bjob.cpp | 253 + libk3b/core/k3bjob.h | 311 + libk3b/core/k3bjobhandler.h | 64 + libk3b/core/k3bprocess.cpp | 452 + libk3b/core/k3bprocess.h | 204 + libk3b/core/k3bprogressinfoevent.h | 85 + libk3b/core/k3bsimplejobhandler.cpp | 62 + libk3b/core/k3bsimplejobhandler.h | 61 + libk3b/core/k3bthread.cpp | 221 + libk3b/core/k3bthread.h | 95 + libk3b/core/k3bthreadjob.cpp | 161 + libk3b/core/k3bthreadjob.h | 89 + libk3b/core/k3bversion.cpp | 318 + libk3b/core/k3bversion.h | 141 + libk3b/dummy.cpp | 1 + libk3b/jobs/Makefile.am | 43 + libk3b/jobs/k3baudiocuefilewritingjob.cpp | 272 + libk3b/jobs/k3baudiocuefilewritingjob.h | 79 + libk3b/jobs/k3baudiosessionreadingjob.cpp | 278 + libk3b/jobs/k3baudiosessionreadingjob.h | 75 + libk3b/jobs/k3bbinimagewritingjob.cpp | 234 + libk3b/jobs/k3bbinimagewritingjob.h | 79 + libk3b/jobs/k3bblankingjob.cpp | 176 + libk3b/jobs/k3bblankingjob.h | 71 + libk3b/jobs/k3bcdcopyjob.cpp | 1213 ++ libk3b/jobs/k3bcdcopyjob.h | 117 + libk3b/jobs/k3bcdda2wavreader.cpp | 254 + libk3b/jobs/k3bcdda2wavreader.h | 70 + libk3b/jobs/k3bclonejob.cpp | 375 + libk3b/jobs/k3bclonejob.h | 99 + libk3b/jobs/k3bclonetocreader.cpp | 235 + libk3b/jobs/k3bclonetocreader.h | 45 + libk3b/jobs/k3bdatatrackreader.cpp | 515 + libk3b/jobs/k3bdatatrackreader.h | 87 + libk3b/jobs/k3bdvdcopyjob.cpp | 894 + libk3b/jobs/k3bdvdcopyjob.h | 99 + libk3b/jobs/k3bdvdformattingjob.cpp | 536 + libk3b/jobs/k3bdvdformattingjob.h | 91 + libk3b/jobs/k3biso9660imagewritingjob.cpp | 458 + libk3b/jobs/k3biso9660imagewritingjob.h | 98 + libk3b/jobs/k3breadcdreader.cpp | 335 + libk3b/jobs/k3breadcdreader.h | 91 + libk3b/jobs/k3bverificationjob.cpp | 384 + libk3b/jobs/k3bverificationjob.h | 92 + .../k3bvideodvdtitledetectclippingjob.cpp | 291 + .../jobs/k3bvideodvdtitledetectclippingjob.h | 106 + .../jobs/k3bvideodvdtitletranscodingjob.cpp | 583 + libk3b/jobs/k3bvideodvdtitletranscodingjob.h | 275 + libk3b/k3bimage.xsd | 175 + libk3b/plugin/Makefile.am | 28 + libk3b/plugin/k3baudioclient.cpp | 46 + libk3b/plugin/k3baudioclient.h | 51 + libk3b/plugin/k3baudiodecoder.cpp | 599 + libk3b/plugin/k3baudiodecoder.h | 254 + libk3b/plugin/k3baudioencoder.cpp | 175 + libk3b/plugin/k3baudioencoder.h | 203 + libk3b/plugin/k3baudiooutputplugin.h | 69 + libk3b/plugin/k3baudioserver.cpp | 214 + libk3b/plugin/k3baudioserver.h | 85 + libk3b/plugin/k3bplugin.cpp | 36 + libk3b/plugin/k3bplugin.h | 113 + libk3b/plugin/k3bpluginconfigwidget.cpp | 48 + libk3b/plugin/k3bpluginconfigwidget.h | 40 + libk3b/plugin/k3bpluginfactory.cpp | 33 + libk3b/plugin/k3bpluginfactory.h | 98 + libk3b/plugin/k3bpluginmanager.cpp | 189 + libk3b/plugin/k3bpluginmanager.h | 70 + libk3b/plugin/k3bprojectplugin.h | 161 + libk3b/plugin/libsamplerate/Makefile.am | 20 + libk3b/plugin/libsamplerate/common.h | 105 + libk3b/plugin/libsamplerate/configure.in.in | 13 + libk3b/plugin/libsamplerate/fastest_coeffs.h | 2493 +++ libk3b/plugin/libsamplerate/float_cast.h | 203 + .../plugin/libsamplerate/high_qual_coeffs.h | 17116 ++++++++++++++++ libk3b/plugin/libsamplerate/mid_qual_coeffs.h | 5315 +++++ libk3b/plugin/libsamplerate/samplerate.c | 301 + libk3b/plugin/libsamplerate/samplerate.h | 138 + libk3b/plugin/libsamplerate/src_linear.c | 194 + libk3b/plugin/libsamplerate/src_sinc.c | 471 + libk3b/plugin/libsamplerate/src_zoh.c | 186 + libk3b/projects/Makefile.am | 32 + libk3b/projects/audiocd/Makefile.am | 35 + .../projects/audiocd/k3baudiocdtrackdrag.cpp | 109 + libk3b/projects/audiocd/k3baudiocdtrackdrag.h | 50 + .../audiocd/k3baudiocdtracksource.cpp | 262 + .../projects/audiocd/k3baudiocdtracksource.h | 99 + .../projects/audiocd/k3baudiodatasource.cpp | 210 + libk3b/projects/audiocd/k3baudiodatasource.h | 168 + .../audiocd/k3baudiodatasourceiterator.cpp | 71 + .../audiocd/k3baudiodatasourceiterator.h | 61 + libk3b/projects/audiocd/k3baudiodoc.cpp | 1127 + libk3b/projects/audiocd/k3baudiodoc.h | 263 + libk3b/projects/audiocd/k3baudiofile.cpp | 112 + libk3b/projects/audiocd/k3baudiofile.h | 85 + libk3b/projects/audiocd/k3baudioimager.cpp | 203 + libk3b/projects/audiocd/k3baudioimager.h | 59 + libk3b/projects/audiocd/k3baudiojob.cpp | 864 + libk3b/projects/audiocd/k3baudiojob.h | 107 + .../projects/audiocd/k3baudiojobtempdata.cpp | 132 + libk3b/projects/audiocd/k3baudiojobtempdata.h | 64 + .../projects/audiocd/k3baudiomaxspeedjob.cpp | 224 + libk3b/projects/audiocd/k3baudiomaxspeedjob.h | 43 + .../projects/audiocd/k3baudionormalizejob.cpp | 205 + .../projects/audiocd/k3baudionormalizejob.h | 63 + libk3b/projects/audiocd/k3baudiotrack.cpp | 628 + libk3b/projects/audiocd/k3baudiotrack.h | 214 + libk3b/projects/audiocd/k3baudiozerodata.cpp | 115 + libk3b/projects/audiocd/k3baudiozerodata.h | 55 + libk3b/projects/datacd/Makefile.am | 35 + libk3b/projects/datacd/k3bbootitem.cpp | 58 + libk3b/projects/datacd/k3bbootitem.h | 66 + libk3b/projects/datacd/k3bdatadoc.cpp | 1376 ++ libk3b/projects/datacd/k3bdatadoc.h | 297 + libk3b/projects/datacd/k3bdataitem.cpp | 264 + libk3b/projects/datacd/k3bdataitem.h | 225 + libk3b/projects/datacd/k3bdatajob.cpp | 972 + libk3b/projects/datacd/k3bdatajob.h | 111 + .../projects/datacd/k3bdatapreparationjob.cpp | 283 + .../projects/datacd/k3bdatapreparationjob.h | 51 + libk3b/projects/datacd/k3bdiritem.cpp | 406 + libk3b/projects/datacd/k3bdiritem.h | 155 + .../datacd/k3bfilecompilationsizehandler.cpp | 228 + .../datacd/k3bfilecompilationsizehandler.h | 73 + libk3b/projects/datacd/k3bfileitem.cpp | 300 + libk3b/projects/datacd/k3bfileitem.h | 124 + libk3b/projects/datacd/k3bisoimager.cpp | 1187 ++ libk3b/projects/datacd/k3bisoimager.h | 188 + libk3b/projects/datacd/k3bisooptions.cpp | 216 + libk3b/projects/datacd/k3bisooptions.h | 183 + libk3b/projects/datacd/k3bmkisofshandler.cpp | 150 + libk3b/projects/datacd/k3bmkisofshandler.h | 74 + libk3b/projects/datacd/k3bmsinfofetcher.cpp | 243 + libk3b/projects/datacd/k3bmsinfofetcher.h | 64 + .../projects/datacd/k3bsessionimportitem.cpp | 59 + libk3b/projects/datacd/k3bsessionimportitem.h | 63 + libk3b/projects/datacd/k3bspecialdataitem.h | 76 + libk3b/projects/datadvd/Makefile.am | 21 + libk3b/projects/datadvd/k3bdvdbooktypejob.cpp | 350 + libk3b/projects/datadvd/k3bdvdbooktypejob.h | 99 + libk3b/projects/datadvd/k3bdvddoc.cpp | 39 + libk3b/projects/datadvd/k3bdvddoc.h | 37 + libk3b/projects/datadvd/k3bdvdjob.cpp | 344 + libk3b/projects/datadvd/k3bdvdjob.h | 57 + libk3b/projects/datadvd/k3bdvdview.cpp | 48 + libk3b/projects/datadvd/k3bdvdview.h | 40 + libk3b/projects/k3babstractwriter.cpp | 96 + libk3b/projects/k3babstractwriter.h | 92 + libk3b/projects/k3bcdrdaowriter.cpp | 1101 + libk3b/projects/k3bcdrdaowriter.h | 157 + libk3b/projects/k3bcdrecordwriter.cpp | 810 + libk3b/projects/k3bcdrecordwriter.h | 123 + libk3b/projects/k3bcuefileparser.cpp | 461 + libk3b/projects/k3bcuefileparser.h | 57 + libk3b/projects/k3bdoc.cpp | 221 + libk3b/projects/k3bdoc.h | 229 + libk3b/projects/k3bdvdrecordwriter.cpp | 119 + libk3b/projects/k3bdvdrecordwriter.h | 40 + libk3b/projects/k3bgrowisofshandler.cpp | 318 + libk3b/projects/k3bgrowisofshandler.h | 87 + libk3b/projects/k3bgrowisofswriter.cpp | 630 + libk3b/projects/k3bgrowisofswriter.h | 106 + libk3b/projects/k3bimagefilereader.cpp | 88 + libk3b/projects/k3bimagefilereader.h | 55 + libk3b/projects/k3binffilewriter.cpp | 186 + libk3b/projects/k3binffilewriter.h | 119 + libk3b/projects/k3bpipebuffer.cpp | 281 + libk3b/projects/k3bpipebuffer.h | 59 + libk3b/projects/k3btocfilewriter.cpp | 356 + libk3b/projects/k3btocfilewriter.h | 62 + libk3b/projects/mixedcd/Makefile.am | 23 + libk3b/projects/mixedcd/k3bmixeddoc.cpp | 249 + libk3b/projects/mixedcd/k3bmixeddoc.h | 95 + libk3b/projects/mixedcd/k3bmixedjob.cpp | 1339 ++ libk3b/projects/mixedcd/k3bmixedjob.h | 144 + libk3b/projects/movixcd/Makefile.am | 23 + libk3b/projects/movixcd/k3bmovixdoc.cpp | 445 + libk3b/projects/movixcd/k3bmovixdoc.h | 125 + .../projects/movixcd/k3bmovixdocpreparer.cpp | 490 + libk3b/projects/movixcd/k3bmovixdocpreparer.h | 67 + libk3b/projects/movixcd/k3bmovixfileitem.cpp | 68 + libk3b/projects/movixcd/k3bmovixfileitem.h | 52 + libk3b/projects/movixcd/k3bmovixjob.cpp | 132 + libk3b/projects/movixcd/k3bmovixjob.h | 60 + libk3b/projects/movixcd/k3bmovixprogram.cpp | 339 + libk3b/projects/movixcd/k3bmovixprogram.h | 103 + libk3b/projects/movixdvd/Makefile.am | 21 + libk3b/projects/movixdvd/k3bmovixdvddoc.cpp | 36 + libk3b/projects/movixdvd/k3bmovixdvddoc.h | 40 + libk3b/projects/movixdvd/k3bmovixdvdjob.cpp | 131 + libk3b/projects/movixdvd/k3bmovixdvdjob.h | 60 + libk3b/projects/videocd/Makefile.am | 20 + libk3b/projects/videocd/cdi/Makefile.am | 5 + libk3b/projects/videocd/cdi/cdi_imag.rtf | Bin 0 -> 1314877 bytes libk3b/projects/videocd/cdi/cdi_text.fnt | Bin 0 -> 13616 bytes libk3b/projects/videocd/cdi/cdi_vcd.app | Bin 0 -> 102400 bytes libk3b/projects/videocd/cdi/cdi_vcd.cfg | 12 + libk3b/projects/videocd/cdi/icdia.htm | 12 + libk3b/projects/videocd/cdi/vcd_on_cdi_41.pdf | Bin 0 -> 126675 bytes libk3b/projects/videocd/extra/Makefile.am | 5 + .../projects/videocd/extra/k3bphotosvcd.mpg | Bin 0 -> 824970 bytes libk3b/projects/videocd/extra/k3bphotovcd.mpg | Bin 0 -> 1731138 bytes libk3b/projects/videocd/k3bvcddoc.cpp | 894 + libk3b/projects/videocd/k3bvcddoc.h | 192 + libk3b/projects/videocd/k3bvcdjob.cpp | 567 + libk3b/projects/videocd/k3bvcdjob.h | 115 + libk3b/projects/videocd/k3bvcdoptions.cpp | 146 + libk3b/projects/videocd/k3bvcdoptions.h | 377 + libk3b/projects/videocd/k3bvcdtrack.cpp | 456 + libk3b/projects/videocd/k3bvcdtrack.h | 198 + libk3b/projects/videocd/k3bvcdxmlview.cpp | 440 + libk3b/projects/videocd/k3bvcdxmlview.h | 59 + libk3b/projects/videocd/mpeginfo/Makefile.am | 5 + .../projects/videocd/mpeginfo/k3bmpeginfo.cpp | 844 + .../projects/videocd/mpeginfo/k3bmpeginfo.h | 178 + libk3b/projects/videodvd/Makefile.am | 20 + libk3b/projects/videodvd/k3bvideodvddoc.cpp | 71 + libk3b/projects/videodvd/k3bvideodvddoc.h | 46 + .../projects/videodvd/k3bvideodvdimager.cpp | 221 + libk3b/projects/videodvd/k3bvideodvdimager.h | 61 + libk3b/projects/videodvd/k3bvideodvdjob.cpp | 101 + libk3b/projects/videodvd/k3bvideodvdjob.h | 46 + libk3b/scripts/Makefile.am | 11 + libk3b/scripts/k3b_automount | 66 + libk3b/tools/Makefile.am | 44 + libk3b/tools/k3bactivepipe.cpp | 255 + libk3b/tools/k3bactivepipe.h | 134 + libk3b/tools/k3bbusywidget.cpp | 103 + libk3b/tools/k3bbusywidget.h | 54 + libk3b/tools/k3bcdparanoialib.cpp | 783 + libk3b/tools/k3bcdparanoialib.h | 161 + libk3b/tools/k3bcdtextvalidator.cpp | 42 + libk3b/tools/k3bcdtextvalidator.h | 33 + libk3b/tools/k3bchecksumpipe.cpp | 99 + libk3b/tools/k3bchecksumpipe.h | 66 + libk3b/tools/k3bcutcombobox.cpp | 230 + libk3b/tools/k3bcutcombobox.h | 92 + libk3b/tools/k3bdevicecombobox.cpp | 174 + libk3b/tools/k3bdevicecombobox.h | 67 + libk3b/tools/k3bdevicehandler.cpp | 332 + libk3b/tools/k3bdevicehandler.h | 237 + libk3b/tools/k3bdeviceselectiondialog.cpp | 130 + libk3b/tools/k3bdeviceselectiondialog.h | 62 + libk3b/tools/k3bdirsizejob.cpp | 184 + libk3b/tools/k3bdirsizejob.h | 67 + libk3b/tools/k3bexceptions.cpp | 43 + libk3b/tools/k3bexceptions.h | 35 + libk3b/tools/k3bfilesplitter.cpp | 307 + libk3b/tools/k3bfilesplitter.h | 108 + libk3b/tools/k3bfilesysteminfo.cpp | 141 + libk3b/tools/k3bfilesysteminfo.h | 56 + libk3b/tools/k3bintmapcombobox.cpp | 127 + libk3b/tools/k3bintmapcombobox.h | 83 + libk3b/tools/k3bintvalidator.cpp | 137 + libk3b/tools/k3bintvalidator.h | 84 + libk3b/tools/k3biso9660.cpp | 899 + libk3b/tools/k3biso9660.h | 453 + libk3b/tools/k3biso9660backend.cpp | 239 + libk3b/tools/k3biso9660backend.h | 95 + libk3b/tools/k3blibdvdcss.cpp | 307 + libk3b/tools/k3blibdvdcss.h | 84 + libk3b/tools/k3blistview.cpp | 1290 ++ libk3b/tools/k3blistview.h | 296 + libk3b/tools/k3blistviewitemanimator.cpp | 137 + libk3b/tools/k3blistviewitemanimator.h | 78 + libk3b/tools/k3bmd5job.cpp | 322 + libk3b/tools/k3bmd5job.h | 92 + libk3b/tools/k3bmsfedit.cpp | 153 + libk3b/tools/k3bmsfedit.h | 70 + libk3b/tools/k3bmultichoicedialog.cpp | 191 + libk3b/tools/k3bmultichoicedialog.h | 73 + libk3b/tools/k3bpipe.cpp | 79 + libk3b/tools/k3bpipe.h | 60 + libk3b/tools/k3bprogressdialog.cpp | 107 + libk3b/tools/k3bprogressdialog.h | 63 + libk3b/tools/k3bpushbutton.cpp | 136 + libk3b/tools/k3bpushbutton.h | 75 + libk3b/tools/k3bradioaction.cpp | 94 + libk3b/tools/k3bradioaction.h | 122 + libk3b/tools/k3brichtextlabel.cpp | 109 + libk3b/tools/k3brichtextlabel.h | 62 + libk3b/tools/k3bsignalwaiter.cpp | 62 + libk3b/tools/k3bsignalwaiter.h | 51 + libk3b/tools/k3bstdguiitems.cpp | 215 + libk3b/tools/k3bstdguiitems.h | 45 + libk3b/tools/k3bstringutils.cpp | 111 + libk3b/tools/k3bstringutils.h | 39 + libk3b/tools/k3btempfile.cpp | 51 + libk3b/tools/k3btempfile.h | 43 + libk3b/tools/k3bthreadwidget.cpp | 142 + libk3b/tools/k3bthreadwidget.h | 78 + libk3b/tools/k3bthroughputestimator.cpp | 98 + libk3b/tools/k3bthroughputestimator.h | 57 + libk3b/tools/k3btitlelabel.cpp | 266 + libk3b/tools/k3btitlelabel.h | 68 + libk3b/tools/k3btoolbox.cpp | 293 + libk3b/tools/k3btoolbox.h | 93 + libk3b/tools/k3btoolbutton.cpp | 109 + libk3b/tools/k3btoolbutton.h | 50 + libk3b/tools/k3bvalidators.cpp | 154 + libk3b/tools/k3bvalidators.h | 131 + libk3b/tools/k3bwavefilewriter.cpp | 186 + libk3b/tools/k3bwavefilewriter.h | 78 + libk3b/tools/kcutlabel.cpp | 115 + libk3b/tools/kcutlabel.h | 68 + libk3b/tools/libisofs/COPYING | 280 + libk3b/tools/libisofs/ChangeLog | 9 + libk3b/tools/libisofs/Makefile.am | 5 + libk3b/tools/libisofs/README | 24 + libk3b/tools/libisofs/bswap.h | 94 + libk3b/tools/libisofs/el_torito.h | 63 + libk3b/tools/libisofs/iso_fs.h | 219 + libk3b/tools/libisofs/isofs.cpp | 878 + libk3b/tools/libisofs/isofs.h | 151 + libk3b/tools/libisofs/rock.h | 127 + libk3b/videodvd/Makefile.am | 19 + libk3b/videodvd/configure.in.bot | 11 + libk3b/videodvd/configure.in.in | 28 + libk3b/videodvd/k3bvideodvd.cpp | 327 + libk3b/videodvd/k3bvideodvd.h | 91 + libk3b/videodvd/k3bvideodvdaudiostream.h | 112 + libk3b/videodvd/k3bvideodvdptt.h | 50 + libk3b/videodvd/k3bvideodvdsubpicturestream.h | 68 + libk3b/videodvd/k3bvideodvdtime.cpp | 106 + libk3b/videodvd/k3bvideodvdtime.h | 59 + libk3b/videodvd/k3bvideodvdtitle.h | 112 + libk3b/videodvd/k3bvideodvdvideostream.cpp | 60 + libk3b/videodvd/k3bvideodvdvideostream.h | 107 + libk3bdevice/Makefile.am | 34 + libk3bdevice/configure.in.bot | 20 + libk3bdevice/configure.in.in | 212 + libk3bdevice/k3bcdtext.cpp | 685 + libk3bdevice/k3bcdtext.h | 201 + libk3bdevice/k3bcrc.cpp | 80 + libk3bdevice/k3bcrc.h | 35 + libk3bdevice/k3bdebug.cpp | 137 + libk3bdevice/k3bdebug.h | 63 + libk3bdevice/k3bdevice.cpp | 3650 ++++ libk3bdevice/k3bdevice.h | 836 + libk3bdevice/k3bdevice_export.h | 33 + libk3bdevice/k3bdevice_mmc.cpp | 947 + libk3bdevice/k3bdeviceglobals.cpp | 247 + libk3bdevice/k3bdeviceglobals.h | 54 + libk3bdevice/k3bdevicemanager.cpp | 903 + libk3bdevice/k3bdevicemanager.h | 247 + libk3bdevice/k3bdevicetypes.h | 266 + libk3bdevice/k3bdiskinfo.cpp | 266 + libk3bdevice/k3bdiskinfo.h | 182 + libk3bdevice/k3bhalconnection.cpp | 610 + libk3bdevice/k3bhalconnection.h | 223 + libk3bdevice/k3bmmc.h | 697 + libk3bdevice/k3bmsf.cpp | 335 + libk3bdevice/k3bmsf.h | 118 + libk3bdevice/k3bscsicommand.cpp | 218 + libk3bdevice/k3bscsicommand.h | 142 + libk3bdevice/k3bscsicommand_bsd.cpp | 208 + libk3bdevice/k3bscsicommand_linux.cpp | 177 + libk3bdevice/k3bscsicommand_netbsd.cpp | 111 + libk3bdevice/k3btoc.cpp | 163 + libk3bdevice/k3btoc.h | 101 + libk3bdevice/k3btrack.cpp | 123 + libk3bdevice/k3btrack.h | 151 + libk3bdevice/libk3bdevice.doxy | 214 + plugins/Makefile.am | 1 + plugins/audiooutput/Makefile.am | 9 + plugins/audiooutput/alsa/Makefile.am | 14 + plugins/audiooutput/alsa/configure.in.bot | 7 + plugins/audiooutput/alsa/configure.in.in | 26 + .../audiooutput/alsa/k3balsaoutputplugin.cpp | 293 + .../audiooutput/alsa/k3balsaoutputplugin.h | 69 + .../alsa/k3balsaoutputplugin.plugin | 9 + plugins/audiooutput/arts/Makefile.am | 13 + .../audiooutput/arts/k3bartsoutputplugin.cpp | 90 + .../audiooutput/arts/k3bartsoutputplugin.h | 47 + .../arts/k3bartsoutputplugin.plugin | 9 + plugins/decoder/Makefile.am | 26 + plugins/decoder/ffmpeg/Makefile.am | 15 + plugins/decoder/ffmpeg/configure.in.bot | 25 + plugins/decoder/ffmpeg/configure.in.in | 68 + plugins/decoder/ffmpeg/k3bffmpegdecoder.cpp | 155 + plugins/decoder/ffmpeg/k3bffmpegdecoder.h | 67 + .../decoder/ffmpeg/k3bffmpegdecoder.plugin | 9 + plugins/decoder/ffmpeg/k3bffmpegwrapper.cpp | 375 + plugins/decoder/ffmpeg/k3bffmpegwrapper.h | 85 + plugins/decoder/flac/Makefile.am | 13 + plugins/decoder/flac/configure.in.bot | 13 + plugins/decoder/flac/configure.in.in | 41 + plugins/decoder/flac/k3bflacdecoder.cpp | 494 + plugins/decoder/flac/k3bflacdecoder.h | 68 + plugins/decoder/flac/k3bflacdecoder.plugin | 9 + plugins/decoder/libsndfile/Makefile.am | 14 + plugins/decoder/libsndfile/configure.in.bot | 11 + plugins/decoder/libsndfile/configure.in.in | 52 + .../libsndfile/k3blibsndfiledecoder.cpp | 254 + .../decoder/libsndfile/k3blibsndfiledecoder.h | 69 + .../libsndfile/k3blibsndfiledecoder.plugin | 9 + plugins/decoder/mp3/Makefile.am | 13 + plugins/decoder/mp3/configure.in.bot | 11 + plugins/decoder/mp3/configure.in.in | 24 + plugins/decoder/mp3/k3bmad.cpp | 359 + plugins/decoder/mp3/k3bmad.h | 92 + plugins/decoder/mp3/k3bmaddecoder.cpp | 542 + plugins/decoder/mp3/k3bmaddecoder.h | 79 + plugins/decoder/mp3/k3bmaddecoder.plugin | 9 + plugins/decoder/musepack/Makefile.am | 16 + plugins/decoder/musepack/configure.in.bot | 12 + plugins/decoder/musepack/configure.in.in | 52 + plugins/decoder/musepack/k3bmpcdecoder.cpp | 111 + plugins/decoder/musepack/k3bmpcdecoder.h | 62 + plugins/decoder/musepack/k3bmpcdecoder.plugin | 9 + plugins/decoder/musepack/k3bmpcwrapper.cpp | 193 + plugins/decoder/musepack/k3bmpcwrapper.h | 58 + plugins/decoder/ogg/Makefile.am | 13 + plugins/decoder/ogg/configure.in.bot | 11 + plugins/decoder/ogg/configure.in.in | 32 + plugins/decoder/ogg/k3boggvorbisdecoder.cpp | 252 + plugins/decoder/ogg/k3boggvorbisdecoder.h | 72 + .../decoder/ogg/k3boggvorbisdecoder.plugin | 9 + plugins/decoder/skeleton.cpp | 101 + plugins/decoder/skeleton.h | 57 + plugins/decoder/skeleton.plugin | 9 + plugins/decoder/wave/Makefile.am | 13 + plugins/decoder/wave/k3bwavedecoder.cpp | 392 + plugins/decoder/wave/k3bwavedecoder.h | 74 + plugins/decoder/wave/k3bwavedecoder.plugin | 9 + plugins/encoder/Makefile.am | 9 + plugins/encoder/external/Makefile.am | 15 + .../base_k3bexternalencoderconfigwidget.ui | 148 + .../base_k3bexternalencodereditwidget.ui | 164 + .../encoder/external/k3bexternalencoder.cpp | 380 + plugins/encoder/external/k3bexternalencoder.h | 68 + .../external/k3bexternalencoder.plugin | 9 + .../external/k3bexternalencodercommand.cpp | 110 + .../external/k3bexternalencodercommand.h | 40 + .../k3bexternalencoderconfigwidget.cpp | 228 + .../external/k3bexternalencoderconfigwidget.h | 72 + plugins/encoder/lame/Makefile.am | 15 + .../lame/base_k3blameencodersettingswidget.ui | 480 + .../base_k3bmanualbitratesettingswidget.ui | 273 + plugins/encoder/lame/configure.in.bot | 11 + plugins/encoder/lame/configure.in.in | 20 + plugins/encoder/lame/k3blameencoder.cpp | 627 + plugins/encoder/lame/k3blameencoder.h | 88 + plugins/encoder/lame/k3blameencoder.plugin | 9 + plugins/encoder/ogg/Makefile.am | 13 + .../base_k3boggvorbisencodersettingswidget.ui | 392 + plugins/encoder/ogg/k3boggvorbisencoder.cpp | 555 + plugins/encoder/ogg/k3boggvorbisencoder.h | 81 + .../encoder/ogg/k3boggvorbisencoder.plugin | 9 + plugins/encoder/skeleton.cpp | 123 + plugins/encoder/skeleton.h | 64 + plugins/encoder/skeleton.plugin | 9 + plugins/encoder/sox/Makefile.am | 13 + .../sox/base_k3bsoxencoderconfigwidget.ui | 258 + plugins/encoder/sox/k3bsoxencoder.cpp | 482 + plugins/encoder/sox/k3bsoxencoder.h | 82 + plugins/encoder/sox/k3bsoxencoder.plugin | 9 + plugins/project/Makefile.am | 1 + .../project/audiometainforenamer/Makefile.am | 19 + .../k3baudiometainforenamerplugin.cpp | 392 + .../k3baudiometainforenamerplugin.h | 76 + .../k3baudiometainforenamerplugin.plugin | 9 + plugins/project/audioprojectcddb/Makefile.am | 22 + .../k3baudioprojectcddbplugin.cpp | 151 + .../k3baudioprojectcddbplugin.h | 53 + .../k3baudioprojectcddbplugin.plugin | 9 + src/IDEAS | 45 + src/Makefile.am | 86 + src/eventsrc | 333 + src/fastscale/Makefile.am | 14 + src/fastscale/README | 2 + src/fastscale/asm_scale.S | 810 + src/fastscale/configure.in.in | 63 + src/fastscale/scale.cpp | 1975 ++ src/fastscale/scale.h | 34 + src/icons/Makefile.am | 2 + src/icons/actions/Makefile.am | 2 + src/icons/actions/cr16-action-greenled.png | Bin 0 -> 536 bytes src/icons/actions/cr16-action-redled.png | Bin 0 -> 493 bytes src/icons/actions/cr16-action-yellowinfo.png | Bin 0 -> 589 bytes src/icons/actions/cr16-action-yellowled.png | Bin 0 -> 498 bytes src/icons/actions/hi16-action-audiocd.png | Bin 0 -> 957 bytes .../actions/hi16-action-burn_cdimage.png | Bin 0 -> 908 bytes .../actions/hi16-action-burn_dvdimage.png | Bin 0 -> 1011 bytes src/icons/actions/hi16-action-cdburn.png | Bin 0 -> 916 bytes src/icons/actions/hi16-action-cdcopy.png | Bin 0 -> 951 bytes src/icons/actions/hi16-action-cddarip.png | Bin 0 -> 872 bytes src/icons/actions/hi16-action-datacd.png | Bin 0 -> 941 bytes src/icons/actions/hi16-action-datadvd.png | Bin 0 -> 925 bytes src/icons/actions/hi16-action-dvdcopy.png | Bin 0 -> 1050 bytes src/icons/actions/hi16-action-emovix.png | Bin 0 -> 978 bytes src/icons/actions/hi16-action-erasecd.png | Bin 0 -> 928 bytes src/icons/actions/hi16-action-formatdvd.png | Bin 0 -> 1009 bytes src/icons/actions/hi16-action-mixedcd.png | Bin 0 -> 969 bytes src/icons/actions/hi16-action-mp3cd.png | Bin 0 -> 836 bytes src/icons/actions/hi16-action-musicbrainz.png | Bin 0 -> 1850 bytes src/icons/actions/hi16-action-videocd.png | Bin 0 -> 1026 bytes src/icons/actions/hi16-action-videodvd.png | Bin 0 -> 1044 bytes src/icons/actions/hi22-action-audiocd.png | Bin 0 -> 1410 bytes .../actions/hi22-action-burn_cdimage.png | Bin 0 -> 1291 bytes .../actions/hi22-action-burn_dvdimage.png | Bin 0 -> 1410 bytes src/icons/actions/hi22-action-cdburn.png | Bin 0 -> 1450 bytes src/icons/actions/hi22-action-cdcopy.png | Bin 0 -> 1389 bytes src/icons/actions/hi22-action-cddarip.png | Bin 0 -> 1397 bytes src/icons/actions/hi22-action-datacd.png | Bin 0 -> 1410 bytes src/icons/actions/hi22-action-datadvd.png | Bin 0 -> 1410 bytes src/icons/actions/hi22-action-dvdcopy.png | Bin 0 -> 1465 bytes src/icons/actions/hi22-action-emovix.png | Bin 0 -> 1511 bytes src/icons/actions/hi22-action-erasecd.png | Bin 0 -> 1503 bytes src/icons/actions/hi22-action-formatdvd.png | Bin 0 -> 1612 bytes src/icons/actions/hi22-action-mixedcd.png | Bin 0 -> 1553 bytes src/icons/actions/hi22-action-mp3cd.png | Bin 0 -> 1155 bytes src/icons/actions/hi22-action-videocd.png | Bin 0 -> 1627 bytes src/icons/actions/hi22-action-videodvd.png | Bin 0 -> 1641 bytes src/icons/actions/hi32-action-audiocd.png | Bin 0 -> 2358 bytes .../actions/hi32-action-burn_cdimage.png | Bin 0 -> 2355 bytes .../actions/hi32-action-burn_dvdimage.png | Bin 0 -> 2543 bytes src/icons/actions/hi32-action-cdburn.png | Bin 0 -> 2422 bytes src/icons/actions/hi32-action-cdcopy.png | Bin 0 -> 2288 bytes src/icons/actions/hi32-action-cddarip.png | Bin 0 -> 2420 bytes src/icons/actions/hi32-action-datacd.png | Bin 0 -> 2218 bytes src/icons/actions/hi32-action-datadvd.png | Bin 0 -> 2281 bytes src/icons/actions/hi32-action-dvdcopy.png | Bin 0 -> 2658 bytes src/icons/actions/hi32-action-emovix.png | Bin 0 -> 2522 bytes src/icons/actions/hi32-action-erasecd.png | Bin 0 -> 2599 bytes src/icons/actions/hi32-action-formatdvd.png | Bin 0 -> 2905 bytes src/icons/actions/hi32-action-mixedcd.png | Bin 0 -> 2490 bytes src/icons/actions/hi32-action-mp3cd.png | Bin 0 -> 2512 bytes src/icons/actions/hi32-action-videocd.png | Bin 0 -> 2895 bytes src/icons/actions/hi32-action-videodvd.png | Bin 0 -> 2945 bytes src/icons/actions/hi48-action-audiocd.png | Bin 0 -> 4033 bytes .../actions/hi48-action-burn_cdimage.png | Bin 0 -> 4060 bytes .../actions/hi48-action-burn_dvdimage.png | Bin 0 -> 4462 bytes src/icons/actions/hi48-action-cdburn.png | Bin 0 -> 4366 bytes src/icons/actions/hi48-action-cdcopy.png | Bin 0 -> 3945 bytes src/icons/actions/hi48-action-cddarip.png | Bin 0 -> 4131 bytes src/icons/actions/hi48-action-datacd.png | Bin 0 -> 3581 bytes src/icons/actions/hi48-action-datadvd.png | Bin 0 -> 3853 bytes src/icons/actions/hi48-action-dvdcopy.png | Bin 0 -> 4782 bytes src/icons/actions/hi48-action-emovix.png | Bin 0 -> 4602 bytes src/icons/actions/hi48-action-erasecd.png | Bin 0 -> 4676 bytes src/icons/actions/hi48-action-formatdvd.png | Bin 0 -> 5330 bytes src/icons/actions/hi48-action-mixedcd.png | Bin 0 -> 4289 bytes src/icons/actions/hi48-action-mp3cd.png | Bin 0 -> 4351 bytes src/icons/actions/hi48-action-videocd.png | Bin 0 -> 5594 bytes src/icons/actions/hi48-action-videodvd.png | Bin 0 -> 5649 bytes src/icons/actions/hi64-action-musicbrainz.png | Bin 0 -> 4807 bytes src/icons/actions/hisc-action-audiocd.svgz | Bin 0 -> 3370 bytes .../actions/hisc-action-burn_cdimage.svgz | Bin 0 -> 7665 bytes .../actions/hisc-action-burn_dvdimage.svgz | Bin 0 -> 8596 bytes src/icons/actions/hisc-action-cdburn.svgz | Bin 0 -> 2771 bytes src/icons/actions/hisc-action-cdcopy.svgz | Bin 0 -> 3097 bytes src/icons/actions/hisc-action-cddarip.svgz | Bin 0 -> 9363 bytes src/icons/actions/hisc-action-datacd.svgz | Bin 0 -> 4433 bytes src/icons/actions/hisc-action-datadvd.svgz | Bin 0 -> 3160 bytes src/icons/actions/hisc-action-dvdcopy.svgz | Bin 0 -> 4200 bytes src/icons/actions/hisc-action-emovix.svgz | Bin 0 -> 55745 bytes src/icons/actions/hisc-action-erasecd.svgz | Bin 0 -> 8251 bytes src/icons/actions/hisc-action-formatdvd.svgz | Bin 0 -> 9158 bytes src/icons/actions/hisc-action-mixedcd.svgz | Bin 0 -> 6298 bytes src/icons/actions/hisc-action-mp3cd.svgz | Bin 0 -> 4455 bytes src/icons/actions/hisc-action-videocd.svgz | Bin 0 -> 8587 bytes src/icons/actions/hisc-action-videodvd.svgz | Bin 0 -> 9447 bytes src/icons/hi128-app-k3b.png | Bin 0 -> 5295 bytes src/icons/hi16-app-k3b.png | Bin 0 -> 731 bytes src/icons/hi22-app-k3b.png | Bin 0 -> 1142 bytes src/icons/hi32-app-k3b.png | Bin 0 -> 1376 bytes src/icons/hi48-app-k3b.png | Bin 0 -> 2067 bytes src/icons/hi64-app-k3b.png | Bin 0 -> 2891 bytes src/k3b-cue.desktop | 14 + src/k3b-iso.desktop | 13 + src/k3b.cpp | 1630 ++ src/k3b.desktop | 123 + src/k3b.h | 330 + src/k3bappdevicemanager.cpp | 304 + src/k3bappdevicemanager.h | 119 + src/k3bapplication.cpp | 451 + src/k3bapplication.h | 156 + src/k3baudioplayer.cpp | 663 + src/k3baudioplayer.h | 208 + src/k3baudioprojectinterface.cpp | 92 + src/k3baudioprojectinterface.h | 63 + src/k3bburnprogressdialog.cpp | 134 + src/k3bburnprogressdialog.h | 55 + src/k3bcontentsview.cpp | 86 + src/k3bcontentsview.h | 49 + src/k3bdatamodewidget.cpp | 106 + src/k3bdatamodewidget.h | 46 + src/k3bdataprojectinterface.cpp | 128 + src/k3bdataprojectinterface.h | 105 + src/k3bdebuggingoutputdialog.cpp | 162 + src/k3bdebuggingoutputdialog.h | 46 + src/k3bdebuggingoutputfile.cpp | 75 + src/k3bdebuggingoutputfile.h | 39 + src/k3bdiroperator.cpp | 159 + src/k3bdiroperator.h | 82 + src/k3bdirview.cpp | 367 + src/k3bdirview.h | 100 + src/k3bdiskinfoview.cpp | 500 + src/k3bdiskinfoview.h | 56 + src/k3bemptydiscwaiter.cpp | 761 + src/k3bemptydiscwaiter.h | 139 + src/k3bfiletreecombobox.cpp | 393 + src/k3bfiletreecombobox.h | 72 + src/k3bfiletreeview.cpp | 728 + src/k3bfiletreeview.h | 199 + src/k3bfileview.cpp | 183 + src/k3bfileview.h | 74 + src/k3bfirstrun.cpp | 84 + src/k3bfirstrun.h | 34 + src/k3bflatbutton.cpp | 203 + src/k3bflatbutton.h | 77 + src/k3binteractiondialog.cpp | 662 + src/k3binteractiondialog.h | 279 + src/k3binterface.cpp | 192 + src/k3binterface.h | 102 + src/k3bjobinterface.cpp | 190 + src/k3bjobinterface.h | 82 + src/k3bjobprogressdialog.cpp | 696 + src/k3bjobprogressdialog.h | 173 + src/k3bjobprogressosd.cpp | 303 + src/k3bjobprogressosd.h | 88 + src/k3blsofwrapper.cpp | 108 + src/k3blsofwrapper.h | 60 + src/k3blsofwrapperdialog.cpp | 127 + src/k3blsofwrapperdialog.h | 53 + src/k3bmediacache.cpp | 373 + src/k3bmediacache.h | 148 + src/k3bmediacontentsview.cpp | 166 + src/k3bmediacontentsview.h | 116 + src/k3bmediaselectioncombobox.cpp | 505 + src/k3bmediaselectioncombobox.h | 136 + src/k3bmediaselectiondialog.cpp | 127 + src/k3bmediaselectiondialog.h | 87 + src/k3bmedium.cpp | 463 + src/k3bmedium.h | 134 + src/k3bminibutton.cpp | 77 + src/k3bminibutton.h | 51 + src/k3bmixedprojectinterface.cpp | 46 + src/k3bmixedprojectinterface.h | 47 + src/k3bmusicbrainz.cpp | 103 + src/k3bmusicbrainz.h | 54 + src/k3bpassivepopup.cpp | 280 + src/k3bpassivepopup.h | 76 + src/k3bprojectinterface.cpp | 138 + src/k3bprojectinterface.h | 91 + src/k3bprojectmanager.cpp | 653 + src/k3bprojectmanager.h | 89 + src/k3bprojecttabwidget.cpp | 216 + src/k3bprojecttabwidget.h | 78 + src/k3bservicemenuinstaller.cpp | 119 + src/k3bservicemenuinstaller.h | 55 + src/k3bsidepanel.cpp | 108 + src/k3bsidepanel.h | 49 + src/k3bsplash.cpp | 129 + src/k3bsplash.h | 48 + src/k3bstatusbarmanager.cpp | 250 + src/k3bstatusbarmanager.h | 61 + src/k3bsystemproblemdialog.cpp | 690 + src/k3bsystemproblemdialog.h | 101 + src/k3btempdirselectionwidget.cpp | 277 + src/k3btempdirselectionwidget.h | 100 + src/k3bthemedheader.cpp | 129 + src/k3bthemedheader.h | 55 + src/k3bthemedlabel.cpp | 76 + src/k3bthemedlabel.h | 42 + src/k3bthememanager.cpp | 324 + src/k3bthememanager.h | 146 + src/k3btimeoutwidget.cpp | 149 + src/k3btimeoutwidget.h | 59 + src/k3btooltip.cpp | 195 + src/k3btooltip.h | 81 + src/k3btrm.cpp | 93 + src/k3btrm.h | 60 + src/k3bui.rc | 78 + src/k3bwelcomewidget.cpp | 489 + src/k3bwelcomewidget.h | 124 + src/k3bwidgetshoweffect.cpp | 203 + src/k3bwidgetshoweffect.h | 115 + src/k3bwriterselectionwidget.cpp | 607 + src/k3bwriterselectionwidget.h | 146 + src/k3bwritingmodewidget.cpp | 247 + src/k3bwritingmodewidget.h | 91 + src/konqi/Makefile.am | 16 + src/konqi/k3b_audiocd_rip.desktop | 49 + src/konqi/k3b_cd_copy.desktop | 52 + src/konqi/k3b_create_audio_cd.desktop | 62 + src/konqi/k3b_create_data_cd.desktop | 63 + src/konqi/k3b_create_data_dvd.desktop | 57 + src/konqi/k3b_create_video_cd.desktop | 61 + src/konqi/k3b_dvd_copy.desktop | 52 + src/konqi/k3b_handle_empty_cd.desktop | 120 + src/konqi/k3b_handle_empty_dvd.desktop | 110 + src/konqi/k3b_videodvd_rip.desktop | 48 + src/konqi/k3b_write_bin_image.desktop | 62 + src/konqi/k3b_write_iso_image.desktop | 55 + src/main.cpp | 152 + src/mimetypes/Makefile.am | 3 + src/mimetypes/x-k3b.desktop | 65 + src/misc/Makefile.am | 14 + src/misc/k3bblankingdialog.cpp | 343 + src/misc/k3bblankingdialog.h | 86 + src/misc/k3bcdcopydialog.cpp | 556 + src/misc/k3bcdcopydialog.h | 96 + src/misc/k3bcdimagewritingdialog.cpp | 1049 + src/misc/k3bcdimagewritingdialog.h | 116 + src/misc/k3bdvdcopydialog.cpp | 455 + src/misc/k3bdvdcopydialog.h | 79 + src/misc/k3bdvdformattingdialog.cpp | 185 + src/misc/k3bdvdformattingdialog.h | 55 + src/misc/k3bisoimagewritingdialog.cpp | 580 + src/misc/k3bisoimagewritingdialog.h | 90 + src/option/Makefile.am | 20 + src/option/base_k3bcddboptiontab.ui | 560 + src/option/base_k3bmiscoptiontab.ui | 284 + src/option/base_k3bpluginoptiontab.ui | 90 + src/option/base_k3bthemeoptiontab.ui | 208 + src/option/k3bburningoptiontab.cpp | 198 + src/option/k3bburningoptiontab.h | 61 + src/option/k3bcddboptiontab.cpp | 338 + src/option/k3bcddboptiontab.h | 50 + src/option/k3bdeviceoptiontab.cpp | 94 + src/option/k3bdeviceoptiontab.h | 47 + src/option/k3bdevicewidget.cpp | 404 + src/option/k3bdevicewidget.h | 78 + src/option/k3bexternalbinoptiontab.cpp | 78 + src/option/k3bexternalbinoptiontab.h | 50 + src/option/k3bexternalbinwidget.cpp | 318 + src/option/k3bexternalbinwidget.h | 103 + src/option/k3bmiscoptiontab.cpp | 187 + src/option/k3bmiscoptiontab.h | 43 + src/option/k3bnotifyoptiontab.cpp | 61 + src/option/k3bnotifyoptiontab.h | 43 + src/option/k3boptiondialog.cpp | 258 + src/option/k3boptiondialog.h | 91 + src/option/k3bpluginoptiontab.cpp | 137 + src/option/k3bpluginoptiontab.h | 43 + src/option/k3bthemeoptiontab.cpp | 234 + src/option/k3bthemeoptiontab.h | 47 + src/pics/73lab/Makefile.am | 23 + src/pics/73lab/dialog_left.png | Bin 0 -> 556 bytes src/pics/73lab/dialog_right.png | Bin 0 -> 5881 bytes src/pics/73lab/k3b.theme | 5 + src/pics/73lab/media_audio.png | Bin 0 -> 7487 bytes src/pics/73lab/media_data.png | Bin 0 -> 8374 bytes src/pics/73lab/media_empty.png | Bin 0 -> 8001 bytes src/pics/73lab/media_left.png | Bin 0 -> 556 bytes src/pics/73lab/media_mixed.png | Bin 0 -> 8116 bytes src/pics/73lab/media_none.png | Bin 0 -> 5881 bytes src/pics/73lab/media_video.png | Bin 0 -> 7157 bytes src/pics/73lab/probing.png | Bin 0 -> 32980 bytes src/pics/73lab/progress_fail.png | Bin 0 -> 17515 bytes src/pics/73lab/progress_right.png | Bin 0 -> 1723 bytes src/pics/73lab/progress_success.png | Bin 0 -> 16094 bytes src/pics/73lab/progress_working.png | Bin 0 -> 13102 bytes src/pics/73lab/project_left.png | Bin 0 -> 9445 bytes src/pics/73lab/project_right.png | Bin 0 -> 1723 bytes src/pics/73lab/splash.png | Bin 0 -> 159246 bytes src/pics/73lab/welcome_bg.png | Bin 0 -> 37538 bytes src/pics/Makefile.am | 1 + src/pics/RobsTheme/Makefile.am | 23 + src/pics/RobsTheme/dialog_left.png | Bin 0 -> 250 bytes src/pics/RobsTheme/dialog_right.png | Bin 0 -> 2845 bytes src/pics/RobsTheme/k3b.theme | 5 + src/pics/RobsTheme/media_audio.png | Bin 0 -> 7422 bytes src/pics/RobsTheme/media_data.png | Bin 0 -> 9382 bytes src/pics/RobsTheme/media_empty.png | Bin 0 -> 4240 bytes src/pics/RobsTheme/media_left.png | Bin 0 -> 250 bytes src/pics/RobsTheme/media_mixed.png | Bin 0 -> 8748 bytes src/pics/RobsTheme/media_none.png | Bin 0 -> 2861 bytes src/pics/RobsTheme/media_video.png | Bin 0 -> 4334 bytes src/pics/RobsTheme/progress_fail.png | Bin 0 -> 7390 bytes src/pics/RobsTheme/progress_right.png | Bin 0 -> 2438 bytes src/pics/RobsTheme/progress_success.png | Bin 0 -> 10252 bytes src/pics/RobsTheme/progress_working.png | Bin 0 -> 6998 bytes src/pics/RobsTheme/project_left.png | Bin 0 -> 8067 bytes src/pics/RobsTheme/project_right.png | Bin 0 -> 2376 bytes src/pics/RobsTheme/splash.png | Bin 0 -> 144339 bytes src/pics/RobsTheme/welcome_bg.png | Bin 0 -> 75487 bytes src/pics/crystal/Makefile.am | 24 + src/pics/crystal/dialog_left.png | Bin 0 -> 1609 bytes src/pics/crystal/dialog_right.png | Bin 0 -> 7376 bytes src/pics/crystal/k3b.theme | 5 + src/pics/crystal/media_audio.png | Bin 0 -> 5068 bytes src/pics/crystal/media_data.png | Bin 0 -> 6870 bytes src/pics/crystal/media_empty.png | Bin 0 -> 7545 bytes src/pics/crystal/media_left.png | Bin 0 -> 1609 bytes src/pics/crystal/media_mixed.png | Bin 0 -> 5474 bytes src/pics/crystal/media_none.png | Bin 0 -> 7376 bytes src/pics/crystal/media_video.png | Bin 0 -> 6794 bytes src/pics/crystal/probing.png | Bin 0 -> 31970 bytes src/pics/crystal/progress_fail.png | Bin 0 -> 5714 bytes src/pics/crystal/progress_right.png | Bin 0 -> 1928 bytes src/pics/crystal/progress_success.png | Bin 0 -> 6590 bytes src/pics/crystal/progress_working.png | Bin 0 -> 7091 bytes src/pics/crystal/project_left.png | Bin 0 -> 4303 bytes src/pics/crystal/project_right.png | Bin 0 -> 1928 bytes src/pics/crystal/splash.png | Bin 0 -> 150400 bytes src/pics/crystal/welcome_bg.png | Bin 0 -> 33102 bytes src/pics/quant/Makefile.am | 23 + src/pics/quant/dialog_left.png | Bin 0 -> 3429 bytes src/pics/quant/dialog_right.png | Bin 0 -> 4364 bytes src/pics/quant/k3b.theme | 6 + src/pics/quant/media_audio.png | Bin 0 -> 5120 bytes src/pics/quant/media_data.png | Bin 0 -> 4352 bytes src/pics/quant/media_empty.png | Bin 0 -> 1579 bytes src/pics/quant/media_left.png | Bin 0 -> 3475 bytes src/pics/quant/media_mixed.png | Bin 0 -> 3429 bytes src/pics/quant/media_none.png | Bin 0 -> 1835 bytes src/pics/quant/media_video.png | Bin 0 -> 10157 bytes src/pics/quant/progress_fail.png | Bin 0 -> 14819 bytes src/pics/quant/progress_right.png | Bin 0 -> 5548 bytes src/pics/quant/progress_success.png | Bin 0 -> 12044 bytes src/pics/quant/progress_working.png | Bin 0 -> 11647 bytes src/pics/quant/project_left.png | Bin 0 -> 9454 bytes src/pics/quant/project_right.png | Bin 0 -> 5628 bytes src/pics/quant/splash.png | Bin 0 -> 216696 bytes src/pics/quant/welcome_bg.png | Bin 0 -> 591641 bytes src/projects/Makefile.am | 86 + .../base_k3badvanceddataimagesettings.ui | 193 + .../base_k3baudiocdtextallfieldswidget.ui | 275 + src/projects/base_k3baudiocdtextwidget.ui | 222 + src/projects/base_k3baudiotrackwidget.ui | 336 + src/projects/base_k3bbootimageview.ui | 394 + src/projects/base_k3bdataimagesettings.ui | 274 + src/projects/base_k3bdatavolumedescwidget.ui | 370 + src/projects/base_k3bmovixoptionswidget.ui | 337 + src/projects/k3baudioburndialog.cpp | 341 + src/projects/k3baudioburndialog.h | 81 + src/projects/k3baudiocdtextwidget.cpp | 236 + src/projects/k3baudiocdtextwidget.h | 55 + src/projects/k3baudiodatasourceeditwidget.cpp | 166 + src/projects/k3baudiodatasourceeditwidget.h | 70 + src/projects/k3baudiodatasourceviewitem.cpp | 111 + src/projects/k3baudiodatasourceviewitem.h | 54 + src/projects/k3baudioeditorwidget.cpp | 877 + src/projects/k3baudioeditorwidget.h | 220 + src/projects/k3baudiotrackaddingdialog.cpp | 302 + src/projects/k3baudiotrackaddingdialog.h | 106 + src/projects/k3baudiotrackdialog.cpp | 113 + src/projects/k3baudiotrackdialog.h | 57 + src/projects/k3baudiotrackplayer.cpp | 365 + src/projects/k3baudiotrackplayer.h | 87 + src/projects/k3baudiotracksplitdialog.cpp | 232 + src/projects/k3baudiotracksplitdialog.h | 71 + src/projects/k3baudiotracktrmlookupdialog.cpp | 131 + src/projects/k3baudiotracktrmlookupdialog.h | 54 + src/projects/k3baudiotrackview.cpp | 1005 + src/projects/k3baudiotrackview.h | 142 + src/projects/k3baudiotrackviewitem.cpp | 229 + src/projects/k3baudiotrackviewitem.h | 66 + src/projects/k3baudiotrackwidget.cpp | 162 + src/projects/k3baudiotrackwidget.h | 48 + src/projects/k3baudioview.cpp | 136 + src/projects/k3baudioview.h | 61 + src/projects/k3bbootimagedialog.cpp | 45 + src/projects/k3bbootimagedialog.h | 44 + src/projects/k3bbootimageview.cpp | 273 + src/projects/k3bbootimageview.h | 57 + .../k3bdataadvancedimagesettingswidget.cpp | 352 + .../k3bdataadvancedimagesettingswidget.h | 69 + src/projects/k3bdataburndialog.cpp | 289 + src/projects/k3bdataburndialog.h | 75 + src/projects/k3bdatadirtreeview.cpp | 506 + src/projects/k3bdatadirtreeview.h | 115 + src/projects/k3bdatafileview.cpp | 483 + src/projects/k3bdatafileview.h | 115 + src/projects/k3bdataimagesettingswidget.cpp | 400 + src/projects/k3bdataimagesettingswidget.h | 54 + src/projects/k3bdatamultisessioncombobox.cpp | 177 + src/projects/k3bdatamultisessioncombobox.h | 52 + src/projects/k3bdatapropertiesdialog.cpp | 248 + src/projects/k3bdatapropertiesdialog.h | 61 + src/projects/k3bdatasessionimportdialog.cpp | 137 + src/projects/k3bdatasessionimportdialog.h | 64 + src/projects/k3bdataurladdingdialog.cpp | 826 + src/projects/k3bdataurladdingdialog.h | 110 + src/projects/k3bdataview.cpp | 196 + src/projects/k3bdataview.h | 78 + src/projects/k3bdataviewitem.cpp | 340 + src/projects/k3bdataviewitem.h | 135 + src/projects/k3bdatavolumedescwidget.cpp | 93 + src/projects/k3bdatavolumedescwidget.h | 40 + src/projects/k3bdvdburndialog.cpp | 300 + src/projects/k3bdvdburndialog.h | 69 + src/projects/k3bdvdview.cpp | 48 + src/projects/k3bdvdview.h | 40 + src/projects/k3bencodingconverter.cpp | 130 + src/projects/k3bencodingconverter.h | 59 + src/projects/k3bfillstatusdisplay.cpp | 759 + src/projects/k3bfillstatusdisplay.h | 117 + src/projects/k3bmixedburndialog.cpp | 353 + src/projects/k3bmixedburndialog.h | 78 + src/projects/k3bmixeddirtreeview.cpp | 103 + src/projects/k3bmixeddirtreeview.h | 56 + src/projects/k3bmixedview.cpp | 155 + src/projects/k3bmixedview.h | 66 + src/projects/k3bmovixburndialog.cpp | 265 + src/projects/k3bmovixburndialog.h | 64 + src/projects/k3bmovixdvdburndialog.cpp | 219 + src/projects/k3bmovixdvdburndialog.h | 57 + src/projects/k3bmovixdvdview.cpp | 48 + src/projects/k3bmovixdvdview.h | 40 + src/projects/k3bmovixlistview.cpp | 327 + src/projects/k3bmovixlistview.h | 100 + src/projects/k3bmovixoptionswidget.cpp | 243 + src/projects/k3bmovixoptionswidget.h | 50 + src/projects/k3bmovixview.cpp | 192 + src/projects/k3bmovixview.h | 65 + src/projects/k3bmusicbrainzjob.cpp | 287 + src/projects/k3bmusicbrainzjob.h | 89 + src/projects/k3bprojectburndialog.cpp | 413 + src/projects/k3bprojectburndialog.h | 191 + src/projects/k3bprojectplugindialog.cpp | 68 + src/projects/k3bprojectplugindialog.h | 46 + src/projects/k3bvcdburndialog.cpp | 1088 + src/projects/k3bvcdburndialog.h | 142 + src/projects/k3bvcdlistview.cpp | 271 + src/projects/k3bvcdlistview.h | 90 + src/projects/k3bvcdlistviewitem.cpp | 129 + src/projects/k3bvcdlistviewitem.h | 50 + src/projects/k3bvcdtrackdialog.cpp | 802 + src/projects/k3bvcdtrackdialog.h | 123 + src/projects/k3bvcdview.cpp | 74 + src/projects/k3bvcdview.h | 55 + src/projects/k3bvideodvdburndialog.cpp | 198 + src/projects/k3bvideodvdburndialog.h | 55 + src/projects/k3bvideodvdview.cpp | 84 + src/projects/k3bvideodvdview.h | 48 + src/projects/k3bview.cpp | 176 + src/projects/k3bview.h | 112 + src/projects/kostore/Makefile.am | 11 + src/projects/kostore/README.k3b | 2 + src/projects/kostore/SPEC | 122 + src/projects/kostore/koStore.cc | 629 + src/projects/kostore/koStore.h | 384 + src/projects/kostore/koStoreBase.cc | 29 + src/projects/kostore/koStoreBase.h | 51 + src/projects/kostore/koStoreDevice.h | 88 + src/projects/kostore/koZipStore.cc | 237 + src/projects/kostore/koZipStore.h | 61 + src/rip/Makefile.am | 32 + src/rip/base_k3baudiorippingoptionwidget.ui | 282 + src/rip/base_k3bcddbpatternwidget.ui | 180 + src/rip/k3baudiocdlistview.cpp | 66 + src/rip/k3baudiocdlistview.h | 45 + src/rip/k3baudiocdview.cpp | 631 + src/rip/k3baudiocdview.h | 107 + src/rip/k3baudioconvertingoptionwidget.cpp | 266 + src/rip/k3baudioconvertingoptionwidget.h | 74 + src/rip/k3baudioprojectconvertingdialog.cpp | 371 + src/rip/k3baudioprojectconvertingdialog.h | 78 + src/rip/k3baudioprojectconvertingthread.cpp | 459 + src/rip/k3baudioprojectconvertingthread.h | 101 + src/rip/k3baudioripjob.cpp | 77 + src/rip/k3baudioripjob.h | 71 + src/rip/k3baudiorippingdialog.cpp | 470 + src/rip/k3baudiorippingdialog.h | 92 + src/rip/k3baudioripthread.cpp | 602 + src/rip/k3baudioripthread.h | 117 + src/rip/k3bcddbpatternwidget.cpp | 175 + src/rip/k3bcddbpatternwidget.h | 51 + src/rip/k3bcuefilewriter.cpp | 91 + src/rip/k3bcuefilewriter.h | 54 + src/rip/k3bpatternparser.cpp | 305 + src/rip/k3bpatternparser.h | 52 + src/rip/k3bvideocdinfo.cpp | 247 + src/rip/k3bvideocdinfo.h | 107 + src/rip/k3bvideocdrip.cpp | 355 + src/rip/k3bvideocdrip.h | 74 + src/rip/k3bvideocdrippingdialog.cpp | 260 + src/rip/k3bvideocdrippingdialog.h | 73 + src/rip/k3bvideocdrippingoptions.h | 74 + src/rip/k3bvideocdview.cpp | 509 + src/rip/k3bvideocdview.h | 105 + src/rip/videodvd/Makefile.am | 16 + .../videodvd/base_k3bvideodvdrippingwidget.ui | 721 + src/rip/videodvd/k3bvideodvdrippingdialog.cpp | 634 + src/rip/videodvd/k3bvideodvdrippingdialog.h | 82 + src/rip/videodvd/k3bvideodvdrippingjob.cpp | 385 + src/rip/videodvd/k3bvideodvdrippingjob.h | 106 + .../videodvd/k3bvideodvdrippingpreview.cpp | 135 + src/rip/videodvd/k3bvideodvdrippingpreview.h | 66 + .../k3bvideodvdrippingtitlelistview.cpp | 410 + .../k3bvideodvdrippingtitlelistview.h | 58 + src/rip/videodvd/k3bvideodvdrippingview.cpp | 256 + src/rip/videodvd/k3bvideodvdrippingview.h | 66 + src/rip/videodvd/k3bvideodvdrippingwidget.cpp | 375 + src/rip/videodvd/k3bvideodvdrippingwidget.h | 67 + src/sounds/Makefile.am | 5 + src/sounds/k3b_error1.wav | Bin 0 -> 15669 bytes src/sounds/k3b_success1.wav | Bin 0 -> 46657 bytes src/sounds/k3b_wait_media1.wav | Bin 0 -> 1940 bytes src/sourceheader | 15 + src/tips | 47 + stamp-h.in | 0 subdirs | 8 + 1084 files changed, 202730 insertions(+) create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 COPYING-DOCS create mode 100644 ChangeLog create mode 100644 FAQ create mode 100644 INSTALL create mode 100644 KNOWNBUGS create mode 100644 Makefile.am create mode 100644 PERMISSIONS create mode 100644 README create mode 100644 RELEASE_HOWTO create mode 100644 TODO create mode 100644 acinclude.m4 create mode 100644 aclocal.m4 create mode 100644 config.h.in create mode 100644 configure.files create mode 100644 configure.in create mode 100644 configure.in.bot create mode 100644 configure.in.in create mode 100644 doc/Makefile.am create mode 100644 doc/audiocd-howto.docbook create mode 100644 doc/burndialog_audio.png create mode 100644 doc/burndialog_progress.png create mode 100644 doc/cdcloning_dialog.png create mode 100644 doc/cdcloning_reading.png create mode 100644 doc/cdcopy-howto.docbook create mode 100644 doc/cdcopy_done.png create mode 100644 doc/cdcopy_reading.png create mode 100644 doc/cdcopy_settings.png create mode 100644 doc/cdcopy_writing.png create mode 100644 doc/commands.docbook create mode 100644 doc/dcop.docbook create mode 100644 doc/index.docbook create mode 100644 doc/select_audiofiles.png create mode 100644 doc/select_project.png create mode 100644 k3b.lsm create mode 100644 k3bsetup/Makefile.am create mode 100644 k3bsetup/base_k3bsetup2.ui create mode 100644 k3bsetup/k3bsetup create mode 100644 k3bsetup/k3bsetup2.cpp create mode 100644 k3bsetup/k3bsetup2.desktop create mode 100644 k3bsetup/k3bsetup2.h create mode 100644 kfile-plugins/Makefile.am create mode 100644 kfile-plugins/k3bproject/Makefile.am create mode 100644 kfile-plugins/k3bproject/kfile_k3b.desktop create mode 100644 kfile-plugins/k3bproject/kfile_k3bprojectfileplugin.cpp create mode 100644 kfile-plugins/k3bproject/kfile_k3bprojectfileplugin.h create mode 100644 kioslaves/Makefile.am create mode 100644 kioslaves/videodvd/Makefile.am create mode 100644 kioslaves/videodvd/videodvd.cpp create mode 100644 kioslaves/videodvd/videodvd.desktop create mode 100644 kioslaves/videodvd/videodvd.h create mode 100644 kioslaves/videodvd/videodvd.protocol create mode 100644 libk3b/Makefile.am create mode 100644 libk3b/README create mode 100644 libk3b/cddb/Makefile.am create mode 100644 libk3b/cddb/k3bcddb.cpp create mode 100644 libk3b/cddb/k3bcddb.h create mode 100644 libk3b/cddb/k3bcddbhttpquery.cpp create mode 100644 libk3b/cddb/k3bcddbhttpquery.h create mode 100644 libk3b/cddb/k3bcddblocalquery.cpp create mode 100644 libk3b/cddb/k3bcddblocalquery.h create mode 100644 libk3b/cddb/k3bcddblocalsubmit.cpp create mode 100644 libk3b/cddb/k3bcddblocalsubmit.h create mode 100644 libk3b/cddb/k3bcddbmultientriesdialog.cpp create mode 100644 libk3b/cddb/k3bcddbmultientriesdialog.h create mode 100644 libk3b/cddb/k3bcddbpquery.cpp create mode 100644 libk3b/cddb/k3bcddbpquery.h create mode 100644 libk3b/cddb/k3bcddbquery.cpp create mode 100644 libk3b/cddb/k3bcddbquery.h create mode 100644 libk3b/cddb/k3bcddbresult.cpp create mode 100644 libk3b/cddb/k3bcddbresult.h create mode 100644 libk3b/cddb/k3bcddbsubmit.cpp create mode 100644 libk3b/cddb/k3bcddbsubmit.h create mode 100644 libk3b/configure.in.in create mode 100644 libk3b/core/Makefile.am create mode 100644 libk3b/core/k3b_export.h create mode 100644 libk3b/core/k3bcore.cpp create mode 100644 libk3b/core/k3bcore.h create mode 100644 libk3b/core/k3bdataevent.h create mode 100644 libk3b/core/k3bdefaultexternalprograms.cpp create mode 100644 libk3b/core/k3bdefaultexternalprograms.h create mode 100644 libk3b/core/k3bexternalbinmanager.cpp create mode 100644 libk3b/core/k3bexternalbinmanager.h create mode 100644 libk3b/core/k3bglobals.cpp create mode 100644 libk3b/core/k3bglobals.h create mode 100644 libk3b/core/k3bglobalsettings.cpp create mode 100644 libk3b/core/k3bglobalsettings.h create mode 100644 libk3b/core/k3bjob.cpp create mode 100644 libk3b/core/k3bjob.h create mode 100644 libk3b/core/k3bjobhandler.h create mode 100644 libk3b/core/k3bprocess.cpp create mode 100644 libk3b/core/k3bprocess.h create mode 100644 libk3b/core/k3bprogressinfoevent.h create mode 100644 libk3b/core/k3bsimplejobhandler.cpp create mode 100644 libk3b/core/k3bsimplejobhandler.h create mode 100644 libk3b/core/k3bthread.cpp create mode 100644 libk3b/core/k3bthread.h create mode 100644 libk3b/core/k3bthreadjob.cpp create mode 100644 libk3b/core/k3bthreadjob.h create mode 100644 libk3b/core/k3bversion.cpp create mode 100644 libk3b/core/k3bversion.h create mode 100644 libk3b/dummy.cpp create mode 100644 libk3b/jobs/Makefile.am create mode 100644 libk3b/jobs/k3baudiocuefilewritingjob.cpp create mode 100644 libk3b/jobs/k3baudiocuefilewritingjob.h create mode 100644 libk3b/jobs/k3baudiosessionreadingjob.cpp create mode 100644 libk3b/jobs/k3baudiosessionreadingjob.h create mode 100644 libk3b/jobs/k3bbinimagewritingjob.cpp create mode 100644 libk3b/jobs/k3bbinimagewritingjob.h create mode 100644 libk3b/jobs/k3bblankingjob.cpp create mode 100644 libk3b/jobs/k3bblankingjob.h create mode 100644 libk3b/jobs/k3bcdcopyjob.cpp create mode 100644 libk3b/jobs/k3bcdcopyjob.h create mode 100644 libk3b/jobs/k3bcdda2wavreader.cpp create mode 100644 libk3b/jobs/k3bcdda2wavreader.h create mode 100644 libk3b/jobs/k3bclonejob.cpp create mode 100644 libk3b/jobs/k3bclonejob.h create mode 100644 libk3b/jobs/k3bclonetocreader.cpp create mode 100644 libk3b/jobs/k3bclonetocreader.h create mode 100644 libk3b/jobs/k3bdatatrackreader.cpp create mode 100644 libk3b/jobs/k3bdatatrackreader.h create mode 100644 libk3b/jobs/k3bdvdcopyjob.cpp create mode 100644 libk3b/jobs/k3bdvdcopyjob.h create mode 100644 libk3b/jobs/k3bdvdformattingjob.cpp create mode 100644 libk3b/jobs/k3bdvdformattingjob.h create mode 100644 libk3b/jobs/k3biso9660imagewritingjob.cpp create mode 100644 libk3b/jobs/k3biso9660imagewritingjob.h create mode 100644 libk3b/jobs/k3breadcdreader.cpp create mode 100644 libk3b/jobs/k3breadcdreader.h create mode 100644 libk3b/jobs/k3bverificationjob.cpp create mode 100644 libk3b/jobs/k3bverificationjob.h create mode 100644 libk3b/jobs/k3bvideodvdtitledetectclippingjob.cpp create mode 100644 libk3b/jobs/k3bvideodvdtitledetectclippingjob.h create mode 100644 libk3b/jobs/k3bvideodvdtitletranscodingjob.cpp create mode 100644 libk3b/jobs/k3bvideodvdtitletranscodingjob.h create mode 100644 libk3b/k3bimage.xsd create mode 100644 libk3b/plugin/Makefile.am create mode 100644 libk3b/plugin/k3baudioclient.cpp create mode 100644 libk3b/plugin/k3baudioclient.h create mode 100644 libk3b/plugin/k3baudiodecoder.cpp create mode 100644 libk3b/plugin/k3baudiodecoder.h create mode 100644 libk3b/plugin/k3baudioencoder.cpp create mode 100644 libk3b/plugin/k3baudioencoder.h create mode 100644 libk3b/plugin/k3baudiooutputplugin.h create mode 100644 libk3b/plugin/k3baudioserver.cpp create mode 100644 libk3b/plugin/k3baudioserver.h create mode 100644 libk3b/plugin/k3bplugin.cpp create mode 100644 libk3b/plugin/k3bplugin.h create mode 100644 libk3b/plugin/k3bpluginconfigwidget.cpp create mode 100644 libk3b/plugin/k3bpluginconfigwidget.h create mode 100644 libk3b/plugin/k3bpluginfactory.cpp create mode 100644 libk3b/plugin/k3bpluginfactory.h create mode 100644 libk3b/plugin/k3bpluginmanager.cpp create mode 100644 libk3b/plugin/k3bpluginmanager.h create mode 100644 libk3b/plugin/k3bprojectplugin.h create mode 100644 libk3b/plugin/libsamplerate/Makefile.am create mode 100644 libk3b/plugin/libsamplerate/common.h create mode 100644 libk3b/plugin/libsamplerate/configure.in.in create mode 100644 libk3b/plugin/libsamplerate/fastest_coeffs.h create mode 100644 libk3b/plugin/libsamplerate/float_cast.h create mode 100644 libk3b/plugin/libsamplerate/high_qual_coeffs.h create mode 100644 libk3b/plugin/libsamplerate/mid_qual_coeffs.h create mode 100644 libk3b/plugin/libsamplerate/samplerate.c create mode 100644 libk3b/plugin/libsamplerate/samplerate.h create mode 100644 libk3b/plugin/libsamplerate/src_linear.c create mode 100644 libk3b/plugin/libsamplerate/src_sinc.c create mode 100644 libk3b/plugin/libsamplerate/src_zoh.c create mode 100644 libk3b/projects/Makefile.am create mode 100644 libk3b/projects/audiocd/Makefile.am create mode 100644 libk3b/projects/audiocd/k3baudiocdtrackdrag.cpp create mode 100644 libk3b/projects/audiocd/k3baudiocdtrackdrag.h create mode 100644 libk3b/projects/audiocd/k3baudiocdtracksource.cpp create mode 100644 libk3b/projects/audiocd/k3baudiocdtracksource.h create mode 100644 libk3b/projects/audiocd/k3baudiodatasource.cpp create mode 100644 libk3b/projects/audiocd/k3baudiodatasource.h create mode 100644 libk3b/projects/audiocd/k3baudiodatasourceiterator.cpp create mode 100644 libk3b/projects/audiocd/k3baudiodatasourceiterator.h create mode 100644 libk3b/projects/audiocd/k3baudiodoc.cpp create mode 100644 libk3b/projects/audiocd/k3baudiodoc.h create mode 100644 libk3b/projects/audiocd/k3baudiofile.cpp create mode 100644 libk3b/projects/audiocd/k3baudiofile.h create mode 100644 libk3b/projects/audiocd/k3baudioimager.cpp create mode 100644 libk3b/projects/audiocd/k3baudioimager.h create mode 100644 libk3b/projects/audiocd/k3baudiojob.cpp create mode 100644 libk3b/projects/audiocd/k3baudiojob.h create mode 100644 libk3b/projects/audiocd/k3baudiojobtempdata.cpp create mode 100644 libk3b/projects/audiocd/k3baudiojobtempdata.h create mode 100644 libk3b/projects/audiocd/k3baudiomaxspeedjob.cpp create mode 100644 libk3b/projects/audiocd/k3baudiomaxspeedjob.h create mode 100644 libk3b/projects/audiocd/k3baudionormalizejob.cpp create mode 100644 libk3b/projects/audiocd/k3baudionormalizejob.h create mode 100644 libk3b/projects/audiocd/k3baudiotrack.cpp create mode 100644 libk3b/projects/audiocd/k3baudiotrack.h create mode 100644 libk3b/projects/audiocd/k3baudiozerodata.cpp create mode 100644 libk3b/projects/audiocd/k3baudiozerodata.h create mode 100644 libk3b/projects/datacd/Makefile.am create mode 100644 libk3b/projects/datacd/k3bbootitem.cpp create mode 100644 libk3b/projects/datacd/k3bbootitem.h create mode 100644 libk3b/projects/datacd/k3bdatadoc.cpp create mode 100644 libk3b/projects/datacd/k3bdatadoc.h create mode 100644 libk3b/projects/datacd/k3bdataitem.cpp create mode 100644 libk3b/projects/datacd/k3bdataitem.h create mode 100644 libk3b/projects/datacd/k3bdatajob.cpp create mode 100644 libk3b/projects/datacd/k3bdatajob.h create mode 100644 libk3b/projects/datacd/k3bdatapreparationjob.cpp create mode 100644 libk3b/projects/datacd/k3bdatapreparationjob.h create mode 100644 libk3b/projects/datacd/k3bdiritem.cpp create mode 100644 libk3b/projects/datacd/k3bdiritem.h create mode 100644 libk3b/projects/datacd/k3bfilecompilationsizehandler.cpp create mode 100644 libk3b/projects/datacd/k3bfilecompilationsizehandler.h create mode 100644 libk3b/projects/datacd/k3bfileitem.cpp create mode 100644 libk3b/projects/datacd/k3bfileitem.h create mode 100644 libk3b/projects/datacd/k3bisoimager.cpp create mode 100644 libk3b/projects/datacd/k3bisoimager.h create mode 100644 libk3b/projects/datacd/k3bisooptions.cpp create mode 100644 libk3b/projects/datacd/k3bisooptions.h create mode 100644 libk3b/projects/datacd/k3bmkisofshandler.cpp create mode 100644 libk3b/projects/datacd/k3bmkisofshandler.h create mode 100644 libk3b/projects/datacd/k3bmsinfofetcher.cpp create mode 100644 libk3b/projects/datacd/k3bmsinfofetcher.h create mode 100644 libk3b/projects/datacd/k3bsessionimportitem.cpp create mode 100644 libk3b/projects/datacd/k3bsessionimportitem.h create mode 100644 libk3b/projects/datacd/k3bspecialdataitem.h create mode 100644 libk3b/projects/datadvd/Makefile.am create mode 100644 libk3b/projects/datadvd/k3bdvdbooktypejob.cpp create mode 100644 libk3b/projects/datadvd/k3bdvdbooktypejob.h create mode 100644 libk3b/projects/datadvd/k3bdvddoc.cpp create mode 100644 libk3b/projects/datadvd/k3bdvddoc.h create mode 100644 libk3b/projects/datadvd/k3bdvdjob.cpp create mode 100644 libk3b/projects/datadvd/k3bdvdjob.h create mode 100644 libk3b/projects/datadvd/k3bdvdview.cpp create mode 100644 libk3b/projects/datadvd/k3bdvdview.h create mode 100644 libk3b/projects/k3babstractwriter.cpp create mode 100644 libk3b/projects/k3babstractwriter.h create mode 100644 libk3b/projects/k3bcdrdaowriter.cpp create mode 100644 libk3b/projects/k3bcdrdaowriter.h create mode 100644 libk3b/projects/k3bcdrecordwriter.cpp create mode 100644 libk3b/projects/k3bcdrecordwriter.h create mode 100644 libk3b/projects/k3bcuefileparser.cpp create mode 100644 libk3b/projects/k3bcuefileparser.h create mode 100644 libk3b/projects/k3bdoc.cpp create mode 100644 libk3b/projects/k3bdoc.h create mode 100644 libk3b/projects/k3bdvdrecordwriter.cpp create mode 100644 libk3b/projects/k3bdvdrecordwriter.h create mode 100644 libk3b/projects/k3bgrowisofshandler.cpp create mode 100644 libk3b/projects/k3bgrowisofshandler.h create mode 100644 libk3b/projects/k3bgrowisofswriter.cpp create mode 100644 libk3b/projects/k3bgrowisofswriter.h create mode 100644 libk3b/projects/k3bimagefilereader.cpp create mode 100644 libk3b/projects/k3bimagefilereader.h create mode 100644 libk3b/projects/k3binffilewriter.cpp create mode 100644 libk3b/projects/k3binffilewriter.h create mode 100644 libk3b/projects/k3bpipebuffer.cpp create mode 100644 libk3b/projects/k3bpipebuffer.h create mode 100644 libk3b/projects/k3btocfilewriter.cpp create mode 100644 libk3b/projects/k3btocfilewriter.h create mode 100644 libk3b/projects/mixedcd/Makefile.am create mode 100644 libk3b/projects/mixedcd/k3bmixeddoc.cpp create mode 100644 libk3b/projects/mixedcd/k3bmixeddoc.h create mode 100644 libk3b/projects/mixedcd/k3bmixedjob.cpp create mode 100644 libk3b/projects/mixedcd/k3bmixedjob.h create mode 100644 libk3b/projects/movixcd/Makefile.am create mode 100644 libk3b/projects/movixcd/k3bmovixdoc.cpp create mode 100644 libk3b/projects/movixcd/k3bmovixdoc.h create mode 100644 libk3b/projects/movixcd/k3bmovixdocpreparer.cpp create mode 100644 libk3b/projects/movixcd/k3bmovixdocpreparer.h create mode 100644 libk3b/projects/movixcd/k3bmovixfileitem.cpp create mode 100644 libk3b/projects/movixcd/k3bmovixfileitem.h create mode 100644 libk3b/projects/movixcd/k3bmovixjob.cpp create mode 100644 libk3b/projects/movixcd/k3bmovixjob.h create mode 100644 libk3b/projects/movixcd/k3bmovixprogram.cpp create mode 100644 libk3b/projects/movixcd/k3bmovixprogram.h create mode 100644 libk3b/projects/movixdvd/Makefile.am create mode 100644 libk3b/projects/movixdvd/k3bmovixdvddoc.cpp create mode 100644 libk3b/projects/movixdvd/k3bmovixdvddoc.h create mode 100644 libk3b/projects/movixdvd/k3bmovixdvdjob.cpp create mode 100644 libk3b/projects/movixdvd/k3bmovixdvdjob.h create mode 100644 libk3b/projects/videocd/Makefile.am create mode 100644 libk3b/projects/videocd/cdi/Makefile.am create mode 100644 libk3b/projects/videocd/cdi/cdi_imag.rtf create mode 100644 libk3b/projects/videocd/cdi/cdi_text.fnt create mode 100644 libk3b/projects/videocd/cdi/cdi_vcd.app create mode 100644 libk3b/projects/videocd/cdi/cdi_vcd.cfg create mode 100644 libk3b/projects/videocd/cdi/icdia.htm create mode 100644 libk3b/projects/videocd/cdi/vcd_on_cdi_41.pdf create mode 100644 libk3b/projects/videocd/extra/Makefile.am create mode 100644 libk3b/projects/videocd/extra/k3bphotosvcd.mpg create mode 100644 libk3b/projects/videocd/extra/k3bphotovcd.mpg create mode 100644 libk3b/projects/videocd/k3bvcddoc.cpp create mode 100644 libk3b/projects/videocd/k3bvcddoc.h create mode 100644 libk3b/projects/videocd/k3bvcdjob.cpp create mode 100644 libk3b/projects/videocd/k3bvcdjob.h create mode 100644 libk3b/projects/videocd/k3bvcdoptions.cpp create mode 100644 libk3b/projects/videocd/k3bvcdoptions.h create mode 100644 libk3b/projects/videocd/k3bvcdtrack.cpp create mode 100644 libk3b/projects/videocd/k3bvcdtrack.h create mode 100644 libk3b/projects/videocd/k3bvcdxmlview.cpp create mode 100644 libk3b/projects/videocd/k3bvcdxmlview.h create mode 100644 libk3b/projects/videocd/mpeginfo/Makefile.am create mode 100644 libk3b/projects/videocd/mpeginfo/k3bmpeginfo.cpp create mode 100644 libk3b/projects/videocd/mpeginfo/k3bmpeginfo.h create mode 100644 libk3b/projects/videodvd/Makefile.am create mode 100644 libk3b/projects/videodvd/k3bvideodvddoc.cpp create mode 100644 libk3b/projects/videodvd/k3bvideodvddoc.h create mode 100644 libk3b/projects/videodvd/k3bvideodvdimager.cpp create mode 100644 libk3b/projects/videodvd/k3bvideodvdimager.h create mode 100644 libk3b/projects/videodvd/k3bvideodvdjob.cpp create mode 100644 libk3b/projects/videodvd/k3bvideodvdjob.h create mode 100644 libk3b/scripts/Makefile.am create mode 100755 libk3b/scripts/k3b_automount create mode 100644 libk3b/tools/Makefile.am create mode 100644 libk3b/tools/k3bactivepipe.cpp create mode 100644 libk3b/tools/k3bactivepipe.h create mode 100644 libk3b/tools/k3bbusywidget.cpp create mode 100644 libk3b/tools/k3bbusywidget.h create mode 100644 libk3b/tools/k3bcdparanoialib.cpp create mode 100644 libk3b/tools/k3bcdparanoialib.h create mode 100644 libk3b/tools/k3bcdtextvalidator.cpp create mode 100644 libk3b/tools/k3bcdtextvalidator.h create mode 100644 libk3b/tools/k3bchecksumpipe.cpp create mode 100644 libk3b/tools/k3bchecksumpipe.h create mode 100644 libk3b/tools/k3bcutcombobox.cpp create mode 100644 libk3b/tools/k3bcutcombobox.h create mode 100644 libk3b/tools/k3bdevicecombobox.cpp create mode 100644 libk3b/tools/k3bdevicecombobox.h create mode 100644 libk3b/tools/k3bdevicehandler.cpp create mode 100644 libk3b/tools/k3bdevicehandler.h create mode 100644 libk3b/tools/k3bdeviceselectiondialog.cpp create mode 100644 libk3b/tools/k3bdeviceselectiondialog.h create mode 100644 libk3b/tools/k3bdirsizejob.cpp create mode 100644 libk3b/tools/k3bdirsizejob.h create mode 100644 libk3b/tools/k3bexceptions.cpp create mode 100644 libk3b/tools/k3bexceptions.h create mode 100644 libk3b/tools/k3bfilesplitter.cpp create mode 100644 libk3b/tools/k3bfilesplitter.h create mode 100644 libk3b/tools/k3bfilesysteminfo.cpp create mode 100644 libk3b/tools/k3bfilesysteminfo.h create mode 100644 libk3b/tools/k3bintmapcombobox.cpp create mode 100644 libk3b/tools/k3bintmapcombobox.h create mode 100644 libk3b/tools/k3bintvalidator.cpp create mode 100644 libk3b/tools/k3bintvalidator.h create mode 100644 libk3b/tools/k3biso9660.cpp create mode 100644 libk3b/tools/k3biso9660.h create mode 100644 libk3b/tools/k3biso9660backend.cpp create mode 100644 libk3b/tools/k3biso9660backend.h create mode 100644 libk3b/tools/k3blibdvdcss.cpp create mode 100644 libk3b/tools/k3blibdvdcss.h create mode 100644 libk3b/tools/k3blistview.cpp create mode 100644 libk3b/tools/k3blistview.h create mode 100644 libk3b/tools/k3blistviewitemanimator.cpp create mode 100644 libk3b/tools/k3blistviewitemanimator.h create mode 100644 libk3b/tools/k3bmd5job.cpp create mode 100644 libk3b/tools/k3bmd5job.h create mode 100644 libk3b/tools/k3bmsfedit.cpp create mode 100644 libk3b/tools/k3bmsfedit.h create mode 100644 libk3b/tools/k3bmultichoicedialog.cpp create mode 100644 libk3b/tools/k3bmultichoicedialog.h create mode 100644 libk3b/tools/k3bpipe.cpp create mode 100644 libk3b/tools/k3bpipe.h create mode 100644 libk3b/tools/k3bprogressdialog.cpp create mode 100644 libk3b/tools/k3bprogressdialog.h create mode 100644 libk3b/tools/k3bpushbutton.cpp create mode 100644 libk3b/tools/k3bpushbutton.h create mode 100644 libk3b/tools/k3bradioaction.cpp create mode 100644 libk3b/tools/k3bradioaction.h create mode 100644 libk3b/tools/k3brichtextlabel.cpp create mode 100644 libk3b/tools/k3brichtextlabel.h create mode 100644 libk3b/tools/k3bsignalwaiter.cpp create mode 100644 libk3b/tools/k3bsignalwaiter.h create mode 100644 libk3b/tools/k3bstdguiitems.cpp create mode 100644 libk3b/tools/k3bstdguiitems.h create mode 100644 libk3b/tools/k3bstringutils.cpp create mode 100644 libk3b/tools/k3bstringutils.h create mode 100644 libk3b/tools/k3btempfile.cpp create mode 100644 libk3b/tools/k3btempfile.h create mode 100644 libk3b/tools/k3bthreadwidget.cpp create mode 100644 libk3b/tools/k3bthreadwidget.h create mode 100644 libk3b/tools/k3bthroughputestimator.cpp create mode 100644 libk3b/tools/k3bthroughputestimator.h create mode 100644 libk3b/tools/k3btitlelabel.cpp create mode 100644 libk3b/tools/k3btitlelabel.h create mode 100644 libk3b/tools/k3btoolbox.cpp create mode 100644 libk3b/tools/k3btoolbox.h create mode 100644 libk3b/tools/k3btoolbutton.cpp create mode 100644 libk3b/tools/k3btoolbutton.h create mode 100644 libk3b/tools/k3bvalidators.cpp create mode 100644 libk3b/tools/k3bvalidators.h create mode 100644 libk3b/tools/k3bwavefilewriter.cpp create mode 100644 libk3b/tools/k3bwavefilewriter.h create mode 100644 libk3b/tools/kcutlabel.cpp create mode 100644 libk3b/tools/kcutlabel.h create mode 100644 libk3b/tools/libisofs/COPYING create mode 100644 libk3b/tools/libisofs/ChangeLog create mode 100644 libk3b/tools/libisofs/Makefile.am create mode 100644 libk3b/tools/libisofs/README create mode 100644 libk3b/tools/libisofs/bswap.h create mode 100644 libk3b/tools/libisofs/el_torito.h create mode 100644 libk3b/tools/libisofs/iso_fs.h create mode 100644 libk3b/tools/libisofs/isofs.cpp create mode 100644 libk3b/tools/libisofs/isofs.h create mode 100644 libk3b/tools/libisofs/rock.h create mode 100644 libk3b/videodvd/Makefile.am create mode 100644 libk3b/videodvd/configure.in.bot create mode 100644 libk3b/videodvd/configure.in.in create mode 100644 libk3b/videodvd/k3bvideodvd.cpp create mode 100644 libk3b/videodvd/k3bvideodvd.h create mode 100644 libk3b/videodvd/k3bvideodvdaudiostream.h create mode 100644 libk3b/videodvd/k3bvideodvdptt.h create mode 100644 libk3b/videodvd/k3bvideodvdsubpicturestream.h create mode 100644 libk3b/videodvd/k3bvideodvdtime.cpp create mode 100644 libk3b/videodvd/k3bvideodvdtime.h create mode 100644 libk3b/videodvd/k3bvideodvdtitle.h create mode 100644 libk3b/videodvd/k3bvideodvdvideostream.cpp create mode 100644 libk3b/videodvd/k3bvideodvdvideostream.h create mode 100644 libk3bdevice/Makefile.am create mode 100644 libk3bdevice/configure.in.bot create mode 100644 libk3bdevice/configure.in.in create mode 100644 libk3bdevice/k3bcdtext.cpp create mode 100644 libk3bdevice/k3bcdtext.h create mode 100644 libk3bdevice/k3bcrc.cpp create mode 100644 libk3bdevice/k3bcrc.h create mode 100644 libk3bdevice/k3bdebug.cpp create mode 100644 libk3bdevice/k3bdebug.h create mode 100644 libk3bdevice/k3bdevice.cpp create mode 100644 libk3bdevice/k3bdevice.h create mode 100644 libk3bdevice/k3bdevice_export.h create mode 100644 libk3bdevice/k3bdevice_mmc.cpp create mode 100644 libk3bdevice/k3bdeviceglobals.cpp create mode 100644 libk3bdevice/k3bdeviceglobals.h create mode 100644 libk3bdevice/k3bdevicemanager.cpp create mode 100644 libk3bdevice/k3bdevicemanager.h create mode 100644 libk3bdevice/k3bdevicetypes.h create mode 100644 libk3bdevice/k3bdiskinfo.cpp create mode 100644 libk3bdevice/k3bdiskinfo.h create mode 100644 libk3bdevice/k3bhalconnection.cpp create mode 100644 libk3bdevice/k3bhalconnection.h create mode 100644 libk3bdevice/k3bmmc.h create mode 100644 libk3bdevice/k3bmsf.cpp create mode 100644 libk3bdevice/k3bmsf.h create mode 100644 libk3bdevice/k3bscsicommand.cpp create mode 100644 libk3bdevice/k3bscsicommand.h create mode 100644 libk3bdevice/k3bscsicommand_bsd.cpp create mode 100644 libk3bdevice/k3bscsicommand_linux.cpp create mode 100644 libk3bdevice/k3bscsicommand_netbsd.cpp create mode 100644 libk3bdevice/k3btoc.cpp create mode 100644 libk3bdevice/k3btoc.h create mode 100644 libk3bdevice/k3btrack.cpp create mode 100644 libk3bdevice/k3btrack.h create mode 100644 libk3bdevice/libk3bdevice.doxy create mode 100644 plugins/Makefile.am create mode 100644 plugins/audiooutput/Makefile.am create mode 100644 plugins/audiooutput/alsa/Makefile.am create mode 100644 plugins/audiooutput/alsa/configure.in.bot create mode 100644 plugins/audiooutput/alsa/configure.in.in create mode 100644 plugins/audiooutput/alsa/k3balsaoutputplugin.cpp create mode 100644 plugins/audiooutput/alsa/k3balsaoutputplugin.h create mode 100644 plugins/audiooutput/alsa/k3balsaoutputplugin.plugin create mode 100644 plugins/audiooutput/arts/Makefile.am create mode 100644 plugins/audiooutput/arts/k3bartsoutputplugin.cpp create mode 100644 plugins/audiooutput/arts/k3bartsoutputplugin.h create mode 100644 plugins/audiooutput/arts/k3bartsoutputplugin.plugin create mode 100644 plugins/decoder/Makefile.am create mode 100644 plugins/decoder/ffmpeg/Makefile.am create mode 100644 plugins/decoder/ffmpeg/configure.in.bot create mode 100644 plugins/decoder/ffmpeg/configure.in.in create mode 100644 plugins/decoder/ffmpeg/k3bffmpegdecoder.cpp create mode 100644 plugins/decoder/ffmpeg/k3bffmpegdecoder.h create mode 100644 plugins/decoder/ffmpeg/k3bffmpegdecoder.plugin create mode 100644 plugins/decoder/ffmpeg/k3bffmpegwrapper.cpp create mode 100644 plugins/decoder/ffmpeg/k3bffmpegwrapper.h create mode 100644 plugins/decoder/flac/Makefile.am create mode 100644 plugins/decoder/flac/configure.in.bot create mode 100644 plugins/decoder/flac/configure.in.in create mode 100644 plugins/decoder/flac/k3bflacdecoder.cpp create mode 100644 plugins/decoder/flac/k3bflacdecoder.h create mode 100644 plugins/decoder/flac/k3bflacdecoder.plugin create mode 100644 plugins/decoder/libsndfile/Makefile.am create mode 100644 plugins/decoder/libsndfile/configure.in.bot create mode 100644 plugins/decoder/libsndfile/configure.in.in create mode 100644 plugins/decoder/libsndfile/k3blibsndfiledecoder.cpp create mode 100644 plugins/decoder/libsndfile/k3blibsndfiledecoder.h create mode 100644 plugins/decoder/libsndfile/k3blibsndfiledecoder.plugin create mode 100644 plugins/decoder/mp3/Makefile.am create mode 100644 plugins/decoder/mp3/configure.in.bot create mode 100644 plugins/decoder/mp3/configure.in.in create mode 100644 plugins/decoder/mp3/k3bmad.cpp create mode 100644 plugins/decoder/mp3/k3bmad.h create mode 100644 plugins/decoder/mp3/k3bmaddecoder.cpp create mode 100644 plugins/decoder/mp3/k3bmaddecoder.h create mode 100644 plugins/decoder/mp3/k3bmaddecoder.plugin create mode 100644 plugins/decoder/musepack/Makefile.am create mode 100644 plugins/decoder/musepack/configure.in.bot create mode 100644 plugins/decoder/musepack/configure.in.in create mode 100644 plugins/decoder/musepack/k3bmpcdecoder.cpp create mode 100644 plugins/decoder/musepack/k3bmpcdecoder.h create mode 100644 plugins/decoder/musepack/k3bmpcdecoder.plugin create mode 100644 plugins/decoder/musepack/k3bmpcwrapper.cpp create mode 100644 plugins/decoder/musepack/k3bmpcwrapper.h create mode 100644 plugins/decoder/ogg/Makefile.am create mode 100644 plugins/decoder/ogg/configure.in.bot create mode 100644 plugins/decoder/ogg/configure.in.in create mode 100644 plugins/decoder/ogg/k3boggvorbisdecoder.cpp create mode 100644 plugins/decoder/ogg/k3boggvorbisdecoder.h create mode 100644 plugins/decoder/ogg/k3boggvorbisdecoder.plugin create mode 100644 plugins/decoder/skeleton.cpp create mode 100644 plugins/decoder/skeleton.h create mode 100644 plugins/decoder/skeleton.plugin create mode 100644 plugins/decoder/wave/Makefile.am create mode 100644 plugins/decoder/wave/k3bwavedecoder.cpp create mode 100644 plugins/decoder/wave/k3bwavedecoder.h create mode 100644 plugins/decoder/wave/k3bwavedecoder.plugin create mode 100644 plugins/encoder/Makefile.am create mode 100644 plugins/encoder/external/Makefile.am create mode 100644 plugins/encoder/external/base_k3bexternalencoderconfigwidget.ui create mode 100644 plugins/encoder/external/base_k3bexternalencodereditwidget.ui create mode 100644 plugins/encoder/external/k3bexternalencoder.cpp create mode 100644 plugins/encoder/external/k3bexternalencoder.h create mode 100644 plugins/encoder/external/k3bexternalencoder.plugin create mode 100644 plugins/encoder/external/k3bexternalencodercommand.cpp create mode 100644 plugins/encoder/external/k3bexternalencodercommand.h create mode 100644 plugins/encoder/external/k3bexternalencoderconfigwidget.cpp create mode 100644 plugins/encoder/external/k3bexternalencoderconfigwidget.h create mode 100644 plugins/encoder/lame/Makefile.am create mode 100644 plugins/encoder/lame/base_k3blameencodersettingswidget.ui create mode 100644 plugins/encoder/lame/base_k3bmanualbitratesettingswidget.ui create mode 100644 plugins/encoder/lame/configure.in.bot create mode 100644 plugins/encoder/lame/configure.in.in create mode 100644 plugins/encoder/lame/k3blameencoder.cpp create mode 100644 plugins/encoder/lame/k3blameencoder.h create mode 100644 plugins/encoder/lame/k3blameencoder.plugin create mode 100644 plugins/encoder/ogg/Makefile.am create mode 100644 plugins/encoder/ogg/base_k3boggvorbisencodersettingswidget.ui create mode 100644 plugins/encoder/ogg/k3boggvorbisencoder.cpp create mode 100644 plugins/encoder/ogg/k3boggvorbisencoder.h create mode 100644 plugins/encoder/ogg/k3boggvorbisencoder.plugin create mode 100644 plugins/encoder/skeleton.cpp create mode 100644 plugins/encoder/skeleton.h create mode 100644 plugins/encoder/skeleton.plugin create mode 100644 plugins/encoder/sox/Makefile.am create mode 100644 plugins/encoder/sox/base_k3bsoxencoderconfigwidget.ui create mode 100644 plugins/encoder/sox/k3bsoxencoder.cpp create mode 100644 plugins/encoder/sox/k3bsoxencoder.h create mode 100644 plugins/encoder/sox/k3bsoxencoder.plugin create mode 100644 plugins/project/Makefile.am create mode 100644 plugins/project/audiometainforenamer/Makefile.am create mode 100644 plugins/project/audiometainforenamer/k3baudiometainforenamerplugin.cpp create mode 100644 plugins/project/audiometainforenamer/k3baudiometainforenamerplugin.h create mode 100644 plugins/project/audiometainforenamer/k3baudiometainforenamerplugin.plugin create mode 100644 plugins/project/audioprojectcddb/Makefile.am create mode 100644 plugins/project/audioprojectcddb/k3baudioprojectcddbplugin.cpp create mode 100644 plugins/project/audioprojectcddb/k3baudioprojectcddbplugin.h create mode 100644 plugins/project/audioprojectcddb/k3baudioprojectcddbplugin.plugin create mode 100644 src/IDEAS create mode 100644 src/Makefile.am create mode 100644 src/eventsrc create mode 100644 src/fastscale/Makefile.am create mode 100644 src/fastscale/README create mode 100644 src/fastscale/asm_scale.S create mode 100644 src/fastscale/configure.in.in create mode 100644 src/fastscale/scale.cpp create mode 100644 src/fastscale/scale.h create mode 100644 src/icons/Makefile.am create mode 100644 src/icons/actions/Makefile.am create mode 100644 src/icons/actions/cr16-action-greenled.png create mode 100644 src/icons/actions/cr16-action-redled.png create mode 100644 src/icons/actions/cr16-action-yellowinfo.png create mode 100644 src/icons/actions/cr16-action-yellowled.png create mode 100644 src/icons/actions/hi16-action-audiocd.png create mode 100644 src/icons/actions/hi16-action-burn_cdimage.png create mode 100644 src/icons/actions/hi16-action-burn_dvdimage.png create mode 100644 src/icons/actions/hi16-action-cdburn.png create mode 100644 src/icons/actions/hi16-action-cdcopy.png create mode 100644 src/icons/actions/hi16-action-cddarip.png create mode 100644 src/icons/actions/hi16-action-datacd.png create mode 100644 src/icons/actions/hi16-action-datadvd.png create mode 100644 src/icons/actions/hi16-action-dvdcopy.png create mode 100644 src/icons/actions/hi16-action-emovix.png create mode 100644 src/icons/actions/hi16-action-erasecd.png create mode 100644 src/icons/actions/hi16-action-formatdvd.png create mode 100644 src/icons/actions/hi16-action-mixedcd.png create mode 100644 src/icons/actions/hi16-action-mp3cd.png create mode 100644 src/icons/actions/hi16-action-musicbrainz.png create mode 100644 src/icons/actions/hi16-action-videocd.png create mode 100644 src/icons/actions/hi16-action-videodvd.png create mode 100644 src/icons/actions/hi22-action-audiocd.png create mode 100644 src/icons/actions/hi22-action-burn_cdimage.png create mode 100644 src/icons/actions/hi22-action-burn_dvdimage.png create mode 100644 src/icons/actions/hi22-action-cdburn.png create mode 100644 src/icons/actions/hi22-action-cdcopy.png create mode 100644 src/icons/actions/hi22-action-cddarip.png create mode 100644 src/icons/actions/hi22-action-datacd.png create mode 100644 src/icons/actions/hi22-action-datadvd.png create mode 100644 src/icons/actions/hi22-action-dvdcopy.png create mode 100644 src/icons/actions/hi22-action-emovix.png create mode 100644 src/icons/actions/hi22-action-erasecd.png create mode 100644 src/icons/actions/hi22-action-formatdvd.png create mode 100644 src/icons/actions/hi22-action-mixedcd.png create mode 100644 src/icons/actions/hi22-action-mp3cd.png create mode 100644 src/icons/actions/hi22-action-videocd.png create mode 100644 src/icons/actions/hi22-action-videodvd.png create mode 100644 src/icons/actions/hi32-action-audiocd.png create mode 100644 src/icons/actions/hi32-action-burn_cdimage.png create mode 100644 src/icons/actions/hi32-action-burn_dvdimage.png create mode 100644 src/icons/actions/hi32-action-cdburn.png create mode 100644 src/icons/actions/hi32-action-cdcopy.png create mode 100644 src/icons/actions/hi32-action-cddarip.png create mode 100644 src/icons/actions/hi32-action-datacd.png create mode 100644 src/icons/actions/hi32-action-datadvd.png create mode 100644 src/icons/actions/hi32-action-dvdcopy.png create mode 100644 src/icons/actions/hi32-action-emovix.png create mode 100644 src/icons/actions/hi32-action-erasecd.png create mode 100644 src/icons/actions/hi32-action-formatdvd.png create mode 100644 src/icons/actions/hi32-action-mixedcd.png create mode 100644 src/icons/actions/hi32-action-mp3cd.png create mode 100644 src/icons/actions/hi32-action-videocd.png create mode 100644 src/icons/actions/hi32-action-videodvd.png create mode 100644 src/icons/actions/hi48-action-audiocd.png create mode 100644 src/icons/actions/hi48-action-burn_cdimage.png create mode 100644 src/icons/actions/hi48-action-burn_dvdimage.png create mode 100644 src/icons/actions/hi48-action-cdburn.png create mode 100644 src/icons/actions/hi48-action-cdcopy.png create mode 100644 src/icons/actions/hi48-action-cddarip.png create mode 100644 src/icons/actions/hi48-action-datacd.png create mode 100644 src/icons/actions/hi48-action-datadvd.png create mode 100644 src/icons/actions/hi48-action-dvdcopy.png create mode 100644 src/icons/actions/hi48-action-emovix.png create mode 100644 src/icons/actions/hi48-action-erasecd.png create mode 100644 src/icons/actions/hi48-action-formatdvd.png create mode 100644 src/icons/actions/hi48-action-mixedcd.png create mode 100644 src/icons/actions/hi48-action-mp3cd.png create mode 100644 src/icons/actions/hi48-action-videocd.png create mode 100644 src/icons/actions/hi48-action-videodvd.png create mode 100644 src/icons/actions/hi64-action-musicbrainz.png create mode 100644 src/icons/actions/hisc-action-audiocd.svgz create mode 100644 src/icons/actions/hisc-action-burn_cdimage.svgz create mode 100644 src/icons/actions/hisc-action-burn_dvdimage.svgz create mode 100644 src/icons/actions/hisc-action-cdburn.svgz create mode 100644 src/icons/actions/hisc-action-cdcopy.svgz create mode 100644 src/icons/actions/hisc-action-cddarip.svgz create mode 100644 src/icons/actions/hisc-action-datacd.svgz create mode 100644 src/icons/actions/hisc-action-datadvd.svgz create mode 100644 src/icons/actions/hisc-action-dvdcopy.svgz create mode 100644 src/icons/actions/hisc-action-emovix.svgz create mode 100644 src/icons/actions/hisc-action-erasecd.svgz create mode 100644 src/icons/actions/hisc-action-formatdvd.svgz create mode 100644 src/icons/actions/hisc-action-mixedcd.svgz create mode 100644 src/icons/actions/hisc-action-mp3cd.svgz create mode 100644 src/icons/actions/hisc-action-videocd.svgz create mode 100644 src/icons/actions/hisc-action-videodvd.svgz create mode 100644 src/icons/hi128-app-k3b.png create mode 100644 src/icons/hi16-app-k3b.png create mode 100644 src/icons/hi22-app-k3b.png create mode 100644 src/icons/hi32-app-k3b.png create mode 100644 src/icons/hi48-app-k3b.png create mode 100644 src/icons/hi64-app-k3b.png create mode 100644 src/k3b-cue.desktop create mode 100644 src/k3b-iso.desktop create mode 100644 src/k3b.cpp create mode 100644 src/k3b.desktop create mode 100644 src/k3b.h create mode 100644 src/k3bappdevicemanager.cpp create mode 100644 src/k3bappdevicemanager.h create mode 100644 src/k3bapplication.cpp create mode 100644 src/k3bapplication.h create mode 100644 src/k3baudioplayer.cpp create mode 100644 src/k3baudioplayer.h create mode 100644 src/k3baudioprojectinterface.cpp create mode 100644 src/k3baudioprojectinterface.h create mode 100644 src/k3bburnprogressdialog.cpp create mode 100644 src/k3bburnprogressdialog.h create mode 100644 src/k3bcontentsview.cpp create mode 100644 src/k3bcontentsview.h create mode 100644 src/k3bdatamodewidget.cpp create mode 100644 src/k3bdatamodewidget.h create mode 100644 src/k3bdataprojectinterface.cpp create mode 100644 src/k3bdataprojectinterface.h create mode 100644 src/k3bdebuggingoutputdialog.cpp create mode 100644 src/k3bdebuggingoutputdialog.h create mode 100644 src/k3bdebuggingoutputfile.cpp create mode 100644 src/k3bdebuggingoutputfile.h create mode 100644 src/k3bdiroperator.cpp create mode 100644 src/k3bdiroperator.h create mode 100644 src/k3bdirview.cpp create mode 100644 src/k3bdirview.h create mode 100644 src/k3bdiskinfoview.cpp create mode 100644 src/k3bdiskinfoview.h create mode 100644 src/k3bemptydiscwaiter.cpp create mode 100644 src/k3bemptydiscwaiter.h create mode 100644 src/k3bfiletreecombobox.cpp create mode 100644 src/k3bfiletreecombobox.h create mode 100644 src/k3bfiletreeview.cpp create mode 100644 src/k3bfiletreeview.h create mode 100644 src/k3bfileview.cpp create mode 100644 src/k3bfileview.h create mode 100644 src/k3bfirstrun.cpp create mode 100644 src/k3bfirstrun.h create mode 100644 src/k3bflatbutton.cpp create mode 100644 src/k3bflatbutton.h create mode 100644 src/k3binteractiondialog.cpp create mode 100644 src/k3binteractiondialog.h create mode 100644 src/k3binterface.cpp create mode 100644 src/k3binterface.h create mode 100644 src/k3bjobinterface.cpp create mode 100644 src/k3bjobinterface.h create mode 100644 src/k3bjobprogressdialog.cpp create mode 100644 src/k3bjobprogressdialog.h create mode 100644 src/k3bjobprogressosd.cpp create mode 100644 src/k3bjobprogressosd.h create mode 100644 src/k3blsofwrapper.cpp create mode 100644 src/k3blsofwrapper.h create mode 100644 src/k3blsofwrapperdialog.cpp create mode 100644 src/k3blsofwrapperdialog.h create mode 100644 src/k3bmediacache.cpp create mode 100644 src/k3bmediacache.h create mode 100644 src/k3bmediacontentsview.cpp create mode 100644 src/k3bmediacontentsview.h create mode 100644 src/k3bmediaselectioncombobox.cpp create mode 100644 src/k3bmediaselectioncombobox.h create mode 100644 src/k3bmediaselectiondialog.cpp create mode 100644 src/k3bmediaselectiondialog.h create mode 100644 src/k3bmedium.cpp create mode 100644 src/k3bmedium.h create mode 100644 src/k3bminibutton.cpp create mode 100644 src/k3bminibutton.h create mode 100644 src/k3bmixedprojectinterface.cpp create mode 100644 src/k3bmixedprojectinterface.h create mode 100644 src/k3bmusicbrainz.cpp create mode 100644 src/k3bmusicbrainz.h create mode 100644 src/k3bpassivepopup.cpp create mode 100644 src/k3bpassivepopup.h create mode 100644 src/k3bprojectinterface.cpp create mode 100644 src/k3bprojectinterface.h create mode 100644 src/k3bprojectmanager.cpp create mode 100644 src/k3bprojectmanager.h create mode 100644 src/k3bprojecttabwidget.cpp create mode 100644 src/k3bprojecttabwidget.h create mode 100644 src/k3bservicemenuinstaller.cpp create mode 100644 src/k3bservicemenuinstaller.h create mode 100644 src/k3bsidepanel.cpp create mode 100644 src/k3bsidepanel.h create mode 100644 src/k3bsplash.cpp create mode 100644 src/k3bsplash.h create mode 100644 src/k3bstatusbarmanager.cpp create mode 100644 src/k3bstatusbarmanager.h create mode 100644 src/k3bsystemproblemdialog.cpp create mode 100644 src/k3bsystemproblemdialog.h create mode 100644 src/k3btempdirselectionwidget.cpp create mode 100644 src/k3btempdirselectionwidget.h create mode 100644 src/k3bthemedheader.cpp create mode 100644 src/k3bthemedheader.h create mode 100644 src/k3bthemedlabel.cpp create mode 100644 src/k3bthemedlabel.h create mode 100644 src/k3bthememanager.cpp create mode 100644 src/k3bthememanager.h create mode 100644 src/k3btimeoutwidget.cpp create mode 100644 src/k3btimeoutwidget.h create mode 100644 src/k3btooltip.cpp create mode 100644 src/k3btooltip.h create mode 100644 src/k3btrm.cpp create mode 100644 src/k3btrm.h create mode 100644 src/k3bui.rc create mode 100644 src/k3bwelcomewidget.cpp create mode 100644 src/k3bwelcomewidget.h create mode 100644 src/k3bwidgetshoweffect.cpp create mode 100644 src/k3bwidgetshoweffect.h create mode 100644 src/k3bwriterselectionwidget.cpp create mode 100644 src/k3bwriterselectionwidget.h create mode 100644 src/k3bwritingmodewidget.cpp create mode 100644 src/k3bwritingmodewidget.h create mode 100644 src/konqi/Makefile.am create mode 100644 src/konqi/k3b_audiocd_rip.desktop create mode 100644 src/konqi/k3b_cd_copy.desktop create mode 100644 src/konqi/k3b_create_audio_cd.desktop create mode 100644 src/konqi/k3b_create_data_cd.desktop create mode 100644 src/konqi/k3b_create_data_dvd.desktop create mode 100644 src/konqi/k3b_create_video_cd.desktop create mode 100644 src/konqi/k3b_dvd_copy.desktop create mode 100644 src/konqi/k3b_handle_empty_cd.desktop create mode 100644 src/konqi/k3b_handle_empty_dvd.desktop create mode 100644 src/konqi/k3b_videodvd_rip.desktop create mode 100644 src/konqi/k3b_write_bin_image.desktop create mode 100644 src/konqi/k3b_write_iso_image.desktop create mode 100644 src/main.cpp create mode 100644 src/mimetypes/Makefile.am create mode 100644 src/mimetypes/x-k3b.desktop create mode 100644 src/misc/Makefile.am create mode 100644 src/misc/k3bblankingdialog.cpp create mode 100644 src/misc/k3bblankingdialog.h create mode 100644 src/misc/k3bcdcopydialog.cpp create mode 100644 src/misc/k3bcdcopydialog.h create mode 100644 src/misc/k3bcdimagewritingdialog.cpp create mode 100644 src/misc/k3bcdimagewritingdialog.h create mode 100644 src/misc/k3bdvdcopydialog.cpp create mode 100644 src/misc/k3bdvdcopydialog.h create mode 100644 src/misc/k3bdvdformattingdialog.cpp create mode 100644 src/misc/k3bdvdformattingdialog.h create mode 100644 src/misc/k3bisoimagewritingdialog.cpp create mode 100644 src/misc/k3bisoimagewritingdialog.h create mode 100644 src/option/Makefile.am create mode 100644 src/option/base_k3bcddboptiontab.ui create mode 100644 src/option/base_k3bmiscoptiontab.ui create mode 100644 src/option/base_k3bpluginoptiontab.ui create mode 100644 src/option/base_k3bthemeoptiontab.ui create mode 100644 src/option/k3bburningoptiontab.cpp create mode 100644 src/option/k3bburningoptiontab.h create mode 100644 src/option/k3bcddboptiontab.cpp create mode 100644 src/option/k3bcddboptiontab.h create mode 100644 src/option/k3bdeviceoptiontab.cpp create mode 100644 src/option/k3bdeviceoptiontab.h create mode 100644 src/option/k3bdevicewidget.cpp create mode 100644 src/option/k3bdevicewidget.h create mode 100644 src/option/k3bexternalbinoptiontab.cpp create mode 100644 src/option/k3bexternalbinoptiontab.h create mode 100644 src/option/k3bexternalbinwidget.cpp create mode 100644 src/option/k3bexternalbinwidget.h create mode 100644 src/option/k3bmiscoptiontab.cpp create mode 100644 src/option/k3bmiscoptiontab.h create mode 100644 src/option/k3bnotifyoptiontab.cpp create mode 100644 src/option/k3bnotifyoptiontab.h create mode 100644 src/option/k3boptiondialog.cpp create mode 100644 src/option/k3boptiondialog.h create mode 100644 src/option/k3bpluginoptiontab.cpp create mode 100644 src/option/k3bpluginoptiontab.h create mode 100644 src/option/k3bthemeoptiontab.cpp create mode 100644 src/option/k3bthemeoptiontab.h create mode 100644 src/pics/73lab/Makefile.am create mode 100644 src/pics/73lab/dialog_left.png create mode 100644 src/pics/73lab/dialog_right.png create mode 100644 src/pics/73lab/k3b.theme create mode 100644 src/pics/73lab/media_audio.png create mode 100644 src/pics/73lab/media_data.png create mode 100644 src/pics/73lab/media_empty.png create mode 100644 src/pics/73lab/media_left.png create mode 100644 src/pics/73lab/media_mixed.png create mode 100644 src/pics/73lab/media_none.png create mode 100644 src/pics/73lab/media_video.png create mode 100644 src/pics/73lab/probing.png create mode 100644 src/pics/73lab/progress_fail.png create mode 100644 src/pics/73lab/progress_right.png create mode 100644 src/pics/73lab/progress_success.png create mode 100644 src/pics/73lab/progress_working.png create mode 100644 src/pics/73lab/project_left.png create mode 100644 src/pics/73lab/project_right.png create mode 100644 src/pics/73lab/splash.png create mode 100644 src/pics/73lab/welcome_bg.png create mode 100644 src/pics/Makefile.am create mode 100644 src/pics/RobsTheme/Makefile.am create mode 100644 src/pics/RobsTheme/dialog_left.png create mode 100644 src/pics/RobsTheme/dialog_right.png create mode 100644 src/pics/RobsTheme/k3b.theme create mode 100644 src/pics/RobsTheme/media_audio.png create mode 100644 src/pics/RobsTheme/media_data.png create mode 100644 src/pics/RobsTheme/media_empty.png create mode 100644 src/pics/RobsTheme/media_left.png create mode 100644 src/pics/RobsTheme/media_mixed.png create mode 100644 src/pics/RobsTheme/media_none.png create mode 100644 src/pics/RobsTheme/media_video.png create mode 100644 src/pics/RobsTheme/progress_fail.png create mode 100644 src/pics/RobsTheme/progress_right.png create mode 100644 src/pics/RobsTheme/progress_success.png create mode 100644 src/pics/RobsTheme/progress_working.png create mode 100644 src/pics/RobsTheme/project_left.png create mode 100644 src/pics/RobsTheme/project_right.png create mode 100644 src/pics/RobsTheme/splash.png create mode 100644 src/pics/RobsTheme/welcome_bg.png create mode 100644 src/pics/crystal/Makefile.am create mode 100644 src/pics/crystal/dialog_left.png create mode 100644 src/pics/crystal/dialog_right.png create mode 100644 src/pics/crystal/k3b.theme create mode 100644 src/pics/crystal/media_audio.png create mode 100644 src/pics/crystal/media_data.png create mode 100644 src/pics/crystal/media_empty.png create mode 100644 src/pics/crystal/media_left.png create mode 100644 src/pics/crystal/media_mixed.png create mode 100644 src/pics/crystal/media_none.png create mode 100644 src/pics/crystal/media_video.png create mode 100644 src/pics/crystal/probing.png create mode 100644 src/pics/crystal/progress_fail.png create mode 100644 src/pics/crystal/progress_right.png create mode 100644 src/pics/crystal/progress_success.png create mode 100644 src/pics/crystal/progress_working.png create mode 100644 src/pics/crystal/project_left.png create mode 100644 src/pics/crystal/project_right.png create mode 100644 src/pics/crystal/splash.png create mode 100644 src/pics/crystal/welcome_bg.png create mode 100644 src/pics/quant/Makefile.am create mode 100644 src/pics/quant/dialog_left.png create mode 100644 src/pics/quant/dialog_right.png create mode 100644 src/pics/quant/k3b.theme create mode 100644 src/pics/quant/media_audio.png create mode 100644 src/pics/quant/media_data.png create mode 100644 src/pics/quant/media_empty.png create mode 100644 src/pics/quant/media_left.png create mode 100644 src/pics/quant/media_mixed.png create mode 100644 src/pics/quant/media_none.png create mode 100644 src/pics/quant/media_video.png create mode 100644 src/pics/quant/progress_fail.png create mode 100644 src/pics/quant/progress_right.png create mode 100644 src/pics/quant/progress_success.png create mode 100644 src/pics/quant/progress_working.png create mode 100644 src/pics/quant/project_left.png create mode 100644 src/pics/quant/project_right.png create mode 100644 src/pics/quant/splash.png create mode 100644 src/pics/quant/welcome_bg.png create mode 100644 src/projects/Makefile.am create mode 100644 src/projects/base_k3badvanceddataimagesettings.ui create mode 100644 src/projects/base_k3baudiocdtextallfieldswidget.ui create mode 100644 src/projects/base_k3baudiocdtextwidget.ui create mode 100644 src/projects/base_k3baudiotrackwidget.ui create mode 100644 src/projects/base_k3bbootimageview.ui create mode 100644 src/projects/base_k3bdataimagesettings.ui create mode 100644 src/projects/base_k3bdatavolumedescwidget.ui create mode 100644 src/projects/base_k3bmovixoptionswidget.ui create mode 100644 src/projects/k3baudioburndialog.cpp create mode 100644 src/projects/k3baudioburndialog.h create mode 100644 src/projects/k3baudiocdtextwidget.cpp create mode 100644 src/projects/k3baudiocdtextwidget.h create mode 100644 src/projects/k3baudiodatasourceeditwidget.cpp create mode 100644 src/projects/k3baudiodatasourceeditwidget.h create mode 100644 src/projects/k3baudiodatasourceviewitem.cpp create mode 100644 src/projects/k3baudiodatasourceviewitem.h create mode 100644 src/projects/k3baudioeditorwidget.cpp create mode 100644 src/projects/k3baudioeditorwidget.h create mode 100644 src/projects/k3baudiotrackaddingdialog.cpp create mode 100644 src/projects/k3baudiotrackaddingdialog.h create mode 100644 src/projects/k3baudiotrackdialog.cpp create mode 100644 src/projects/k3baudiotrackdialog.h create mode 100644 src/projects/k3baudiotrackplayer.cpp create mode 100644 src/projects/k3baudiotrackplayer.h create mode 100644 src/projects/k3baudiotracksplitdialog.cpp create mode 100644 src/projects/k3baudiotracksplitdialog.h create mode 100644 src/projects/k3baudiotracktrmlookupdialog.cpp create mode 100644 src/projects/k3baudiotracktrmlookupdialog.h create mode 100644 src/projects/k3baudiotrackview.cpp create mode 100644 src/projects/k3baudiotrackview.h create mode 100644 src/projects/k3baudiotrackviewitem.cpp create mode 100644 src/projects/k3baudiotrackviewitem.h create mode 100644 src/projects/k3baudiotrackwidget.cpp create mode 100644 src/projects/k3baudiotrackwidget.h create mode 100644 src/projects/k3baudioview.cpp create mode 100644 src/projects/k3baudioview.h create mode 100644 src/projects/k3bbootimagedialog.cpp create mode 100644 src/projects/k3bbootimagedialog.h create mode 100644 src/projects/k3bbootimageview.cpp create mode 100644 src/projects/k3bbootimageview.h create mode 100644 src/projects/k3bdataadvancedimagesettingswidget.cpp create mode 100644 src/projects/k3bdataadvancedimagesettingswidget.h create mode 100644 src/projects/k3bdataburndialog.cpp create mode 100644 src/projects/k3bdataburndialog.h create mode 100644 src/projects/k3bdatadirtreeview.cpp create mode 100644 src/projects/k3bdatadirtreeview.h create mode 100644 src/projects/k3bdatafileview.cpp create mode 100644 src/projects/k3bdatafileview.h create mode 100644 src/projects/k3bdataimagesettingswidget.cpp create mode 100644 src/projects/k3bdataimagesettingswidget.h create mode 100644 src/projects/k3bdatamultisessioncombobox.cpp create mode 100644 src/projects/k3bdatamultisessioncombobox.h create mode 100644 src/projects/k3bdatapropertiesdialog.cpp create mode 100644 src/projects/k3bdatapropertiesdialog.h create mode 100644 src/projects/k3bdatasessionimportdialog.cpp create mode 100644 src/projects/k3bdatasessionimportdialog.h create mode 100644 src/projects/k3bdataurladdingdialog.cpp create mode 100644 src/projects/k3bdataurladdingdialog.h create mode 100644 src/projects/k3bdataview.cpp create mode 100644 src/projects/k3bdataview.h create mode 100644 src/projects/k3bdataviewitem.cpp create mode 100644 src/projects/k3bdataviewitem.h create mode 100644 src/projects/k3bdatavolumedescwidget.cpp create mode 100644 src/projects/k3bdatavolumedescwidget.h create mode 100644 src/projects/k3bdvdburndialog.cpp create mode 100644 src/projects/k3bdvdburndialog.h create mode 100644 src/projects/k3bdvdview.cpp create mode 100644 src/projects/k3bdvdview.h create mode 100644 src/projects/k3bencodingconverter.cpp create mode 100644 src/projects/k3bencodingconverter.h create mode 100644 src/projects/k3bfillstatusdisplay.cpp create mode 100644 src/projects/k3bfillstatusdisplay.h create mode 100644 src/projects/k3bmixedburndialog.cpp create mode 100644 src/projects/k3bmixedburndialog.h create mode 100644 src/projects/k3bmixeddirtreeview.cpp create mode 100644 src/projects/k3bmixeddirtreeview.h create mode 100644 src/projects/k3bmixedview.cpp create mode 100644 src/projects/k3bmixedview.h create mode 100644 src/projects/k3bmovixburndialog.cpp create mode 100644 src/projects/k3bmovixburndialog.h create mode 100644 src/projects/k3bmovixdvdburndialog.cpp create mode 100644 src/projects/k3bmovixdvdburndialog.h create mode 100644 src/projects/k3bmovixdvdview.cpp create mode 100644 src/projects/k3bmovixdvdview.h create mode 100644 src/projects/k3bmovixlistview.cpp create mode 100644 src/projects/k3bmovixlistview.h create mode 100644 src/projects/k3bmovixoptionswidget.cpp create mode 100644 src/projects/k3bmovixoptionswidget.h create mode 100644 src/projects/k3bmovixview.cpp create mode 100644 src/projects/k3bmovixview.h create mode 100644 src/projects/k3bmusicbrainzjob.cpp create mode 100644 src/projects/k3bmusicbrainzjob.h create mode 100644 src/projects/k3bprojectburndialog.cpp create mode 100644 src/projects/k3bprojectburndialog.h create mode 100644 src/projects/k3bprojectplugindialog.cpp create mode 100644 src/projects/k3bprojectplugindialog.h create mode 100644 src/projects/k3bvcdburndialog.cpp create mode 100644 src/projects/k3bvcdburndialog.h create mode 100644 src/projects/k3bvcdlistview.cpp create mode 100644 src/projects/k3bvcdlistview.h create mode 100644 src/projects/k3bvcdlistviewitem.cpp create mode 100644 src/projects/k3bvcdlistviewitem.h create mode 100644 src/projects/k3bvcdtrackdialog.cpp create mode 100644 src/projects/k3bvcdtrackdialog.h create mode 100644 src/projects/k3bvcdview.cpp create mode 100644 src/projects/k3bvcdview.h create mode 100644 src/projects/k3bvideodvdburndialog.cpp create mode 100644 src/projects/k3bvideodvdburndialog.h create mode 100644 src/projects/k3bvideodvdview.cpp create mode 100644 src/projects/k3bvideodvdview.h create mode 100644 src/projects/k3bview.cpp create mode 100644 src/projects/k3bview.h create mode 100644 src/projects/kostore/Makefile.am create mode 100644 src/projects/kostore/README.k3b create mode 100644 src/projects/kostore/SPEC create mode 100644 src/projects/kostore/koStore.cc create mode 100644 src/projects/kostore/koStore.h create mode 100644 src/projects/kostore/koStoreBase.cc create mode 100644 src/projects/kostore/koStoreBase.h create mode 100644 src/projects/kostore/koStoreDevice.h create mode 100644 src/projects/kostore/koZipStore.cc create mode 100644 src/projects/kostore/koZipStore.h create mode 100644 src/rip/Makefile.am create mode 100644 src/rip/base_k3baudiorippingoptionwidget.ui create mode 100644 src/rip/base_k3bcddbpatternwidget.ui create mode 100644 src/rip/k3baudiocdlistview.cpp create mode 100644 src/rip/k3baudiocdlistview.h create mode 100644 src/rip/k3baudiocdview.cpp create mode 100644 src/rip/k3baudiocdview.h create mode 100644 src/rip/k3baudioconvertingoptionwidget.cpp create mode 100644 src/rip/k3baudioconvertingoptionwidget.h create mode 100644 src/rip/k3baudioprojectconvertingdialog.cpp create mode 100644 src/rip/k3baudioprojectconvertingdialog.h create mode 100644 src/rip/k3baudioprojectconvertingthread.cpp create mode 100644 src/rip/k3baudioprojectconvertingthread.h create mode 100644 src/rip/k3baudioripjob.cpp create mode 100644 src/rip/k3baudioripjob.h create mode 100644 src/rip/k3baudiorippingdialog.cpp create mode 100644 src/rip/k3baudiorippingdialog.h create mode 100644 src/rip/k3baudioripthread.cpp create mode 100644 src/rip/k3baudioripthread.h create mode 100644 src/rip/k3bcddbpatternwidget.cpp create mode 100644 src/rip/k3bcddbpatternwidget.h create mode 100644 src/rip/k3bcuefilewriter.cpp create mode 100644 src/rip/k3bcuefilewriter.h create mode 100644 src/rip/k3bpatternparser.cpp create mode 100644 src/rip/k3bpatternparser.h create mode 100644 src/rip/k3bvideocdinfo.cpp create mode 100644 src/rip/k3bvideocdinfo.h create mode 100644 src/rip/k3bvideocdrip.cpp create mode 100644 src/rip/k3bvideocdrip.h create mode 100644 src/rip/k3bvideocdrippingdialog.cpp create mode 100644 src/rip/k3bvideocdrippingdialog.h create mode 100644 src/rip/k3bvideocdrippingoptions.h create mode 100644 src/rip/k3bvideocdview.cpp create mode 100644 src/rip/k3bvideocdview.h create mode 100644 src/rip/videodvd/Makefile.am create mode 100644 src/rip/videodvd/base_k3bvideodvdrippingwidget.ui create mode 100644 src/rip/videodvd/k3bvideodvdrippingdialog.cpp create mode 100644 src/rip/videodvd/k3bvideodvdrippingdialog.h create mode 100644 src/rip/videodvd/k3bvideodvdrippingjob.cpp create mode 100644 src/rip/videodvd/k3bvideodvdrippingjob.h create mode 100644 src/rip/videodvd/k3bvideodvdrippingpreview.cpp create mode 100644 src/rip/videodvd/k3bvideodvdrippingpreview.h create mode 100644 src/rip/videodvd/k3bvideodvdrippingtitlelistview.cpp create mode 100644 src/rip/videodvd/k3bvideodvdrippingtitlelistview.h create mode 100644 src/rip/videodvd/k3bvideodvdrippingview.cpp create mode 100644 src/rip/videodvd/k3bvideodvdrippingview.h create mode 100644 src/rip/videodvd/k3bvideodvdrippingwidget.cpp create mode 100644 src/rip/videodvd/k3bvideodvdrippingwidget.h create mode 100644 src/sounds/Makefile.am create mode 100644 src/sounds/k3b_error1.wav create mode 100644 src/sounds/k3b_success1.wav create mode 100644 src/sounds/k3b_wait_media1.wav create mode 100644 src/sourceheader create mode 100644 src/tips create mode 100644 stamp-h.in create mode 100644 subdirs diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..8363f0c --- /dev/null +++ b/AUTHORS @@ -0,0 +1,2 @@ +Sebastian Trueg +Christian Kvasny diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..034359f --- /dev/null +++ b/COPYING @@ -0,0 +1,280 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Steet, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, 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 or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +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 give any other recipients of the Program a copy of this License +along with the Program. + +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 Program or any portion +of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +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 Program, 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 Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) 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; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, 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 executable. However, as a +special exception, the source code 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. + +If distribution of executable or 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 counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program 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. + + 5. 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 Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program 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 to +this License. + + 7. 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 Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program 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 Program. + +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. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program 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. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 Program +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 Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, 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 + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/COPYING-DOCS b/COPYING-DOCS new file mode 100644 index 0000000..4a0fe1c --- /dev/null +++ b/COPYING-DOCS @@ -0,0 +1,397 @@ + GNU Free Documentation License + Version 1.2, November 2002 + + + Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + +0. PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +functional and useful document "free" in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. + +This License is a kind of "copyleft", which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + + +1. APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The "Document", below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as "you". You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. + +A "Modified Version" of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A "Secondary Section" is a named appendix or a front-matter section of +the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall subject +(or to related matters) and contains nothing that could fall directly +within that overall subject. (Thus, if the Document is in part a +textbook of mathematics, a Secondary Section may not explain any +mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The "Invariant Sections" are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. + +The "Cover Texts" are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. + +A "Transparent" copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not "Transparent" is called "Opaque". + +Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, LaTeX input format, SGML +or XML using a publicly available DTD, and standard-conforming simple +HTML, PostScript or PDF designed for human modification. Examples of +transparent image formats include PNG, XCF and JPG. Opaque formats +include proprietary formats that can be read and edited only by +proprietary word processors, SGML or XML for which the DTD and/or +processing tools are not generally available, and the +machine-generated HTML, PostScript or PDF produced by some word +processors for output purposes only. + +The "Title Page" means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, "Title Page" means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + +A section "Entitled XYZ" means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as "Acknowledgements", +"Dedications", "Endorsements", or "History".) To "Preserve the Title" +of such a section when you modify the Document means that it remains a +section "Entitled XYZ" according to this definition. + +The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. + + +2. VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + + +3. COPYING IN QUANTITY + +If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document's license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. + + +4. MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +A. Use in the Title Page (and on the covers, if any) a title distinct + from that of the Document, and from those of previous versions + (which should, if there were any, be listed in the History section + of the Document). You may use the same title as a previous version + if the original publisher of that version gives permission. +B. List on the Title Page, as authors, one or more persons or entities + responsible for authorship of the modifications in the Modified + Version, together with at least five of the principal authors of the + Document (all of its principal authors, if it has fewer than five), + unless they release you from this requirement. +C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. +D. Preserve all the copyright notices of the Document. +E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. +F. Include, immediately after the copyright notices, a license notice + giving the public permission to use the Modified Version under the + terms of this License, in the form shown in the Addendum below. +G. Preserve in that license notice the full lists of Invariant Sections + and required Cover Texts given in the Document's license notice. +H. Include an unaltered copy of this License. +I. Preserve the section Entitled "History", Preserve its Title, and add + to it an item stating at least the title, year, new authors, and + publisher of the Modified Version as given on the Title Page. If + there is no section Entitled "History" in the Document, create one + stating the title, year, authors, and publisher of the Document as + given on its Title Page, then add an item describing the Modified + Version as stated in the previous sentence. +J. Preserve the network location, if any, given in the Document for + public access to a Transparent copy of the Document, and likewise + the network locations given in the Document for previous versions + it was based on. These may be placed in the "History" section. + You may omit a network location for a work that was published at + least four years before the Document itself, or if the original + publisher of the version it refers to gives permission. +K. For any section Entitled "Acknowledgements" or "Dedications", + Preserve the Title of the section, and preserve in the section all + the substance and tone of each of the contributor acknowledgements + and/or dedications given therein. +L. Preserve all the Invariant Sections of the Document, + unaltered in their text and in their titles. Section numbers + or the equivalent are not considered part of the section titles. +M. Delete any section Entitled "Endorsements". Such a section + may not be included in the Modified Version. +N. Do not retitle any existing section to be Entitled "Endorsements" + or to conflict in title with any Invariant Section. +O. Preserve any Warranty Disclaimers. + +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section Entitled "Endorsements", provided it contains +nothing but endorsements of your Modified Version by various +parties--for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + + +5. COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections Entitled "History" +in the various original documents, forming one section Entitled +"History"; likewise combine any sections Entitled "Acknowledgements", +and any sections Entitled "Dedications". You must delete all sections +Entitled "Endorsements". + + +6. COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. + +You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. + + +7. AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an "aggregate" if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation's users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document's Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. + + +8. TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. + +If a section in the Document is Entitled "Acknowledgements", +"Dedications", or "History", the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. + + +9. TERMINATION + +You may not copy, modify, sublicense, or distribute the Document except +as expressly provided for under this License. Any other attempt to +copy, modify, sublicense or distribute the Document 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. + + +10. FUTURE REVISIONS OF THIS LICENSE + +The Free Software Foundation may publish new, revised versions +of the GNU Free Documentation 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. See +http://www.gnu.org/copyleft/. + +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License "or any later version" applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. + + +ADDENDUM: How to use this License for your documents + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + + Copyright (c) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.2 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. + A copy of the license is included in the section entitled "GNU + Free Documentation License". + +If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the "with...Texts." line with this: + + with the Invariant Sections being LIST THEIR TITLES, with the + Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. + +If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..c4477a1 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,743 @@ +1.0.5 +===== + * Fix CD Copy device selection (Bug 151924) + * Fixed HAL mounting (thanks to Ken Milmore) + * Always wait for the drive to become ready before starting verification. + +1.0.4 +===== + * Never use growisofs parameter -dvd-compat with DVD-RW media in restricted overwrite mode + * Unmount medium before DVD formatting + * Silently (without introducing new strings for translation) allow the burning of files + bigger than 4 GB with appropriate versions of genisoimage or mkisofs. + * Do only reload the medium before verification if necessary, i.e. if the newly written + track cannot be read otherwise (many old drives depend on this). Hopefully this will + at least work around the aweful "DMA disabled" bug for many users. + +1.0.3 +===== + * Reverted to old behaviour of reloading medium before verification. Not enough + testing had been done before introducing this and some systems fail to read the + medium before reload (Bugs 147297, 147328, 147420, 147698). + * Do not crash when the currently playing audio project item is removed (Bug 147548). + * Added desktop actions to handle empty media with K3b. + * Fixed read retry when reading data tracks (Bug 147778) + * K3b's dialogs now honor the global button layout setting (Bug 147799) + * Do not crash on mp3 files without tags if compiled with taglib support (Bug 142651) + * Do not allow to copy a rewritable media to itself. + * Fixed crash on startup with devices that return bogus GET PERFORMANCE data (Bug 147676) + +1.0.2 +===== + * Properly determine the capacity of complete CD-R(W) media. + * Mark a data project as modified if files are renamed. + * Allow adding of all actions to the welcome window (Bug 145866) + * Added "NoDisplay=true" property to k3b-cue.desktop and k3b-iso.desktop + * Fixed supported write speed detection on some devices + * No reload before verification and between writing sessions (CD copy + Mixed Mode CD) anymore + +1.0.1 +===== + * Fixed crash when using the Device menu without a selected device. + * Fixed DVD copy when reading from a DVD+RW. + * Fixed --without-alsa configure check + * Fixed a crash in Video DVD ripping when the title does not contain an audio stream + * Only use the mkisofs parameters -biblio, -copyright, and -abstract if they have been set. Using them + with invalid values (empty) seems to result in broken iso images sometimes. + * Better compatibility with recent transcode development branch + * Fixed Multisession import size handling. + * Fixed Lame quality preset handling. + * Made libk3bdevice really thread-safe. This fixes the disabled DMA bug! + * New configure check --without-cdrecord-suid-root to disable K3b's check for cdrecord permissions. + Although not recommended it is requested by many distributors. + * Changed the order of the buttons in the tool dialogs to match the KDE order. + * Added handling of the newly introduced genisoimage parameter -allow-limited-size + * Make the K3b Sox audio encoder plugin work with newer sox versions (Thanks, Stephan.) + +1.0 +=== + * K3b now includes a VideoDVD kio slave. It can be used in Konqueror through the protocol videodvd:/ + to copy the files from a VideoDVD with on-the-fly decryption if libdvdcss is installed. + (Be aware that in some countries it is not permitted to use libdvdcss.) + * New Device menu containing all the actions possible for a device (like eject, unmount, ...). + This includes the possibility of assigning shortcuts to these kind of actions. + * K3b now warns if user parameters for external programs have been specified. This has been introduced + because there were some bug report that were caused by faulty user parameters. + * Cleaned up all the job classes: No job creates a widget anymore. This allows for non-GUI usage of libk3b. + For example in a kioslave. + * New option in the data project to not cache the inodes. That means it is possible to have multiple + actual copies of the same file on one CD/DVD. + * K3b now tries to disable stuff that might influence the burning process. This includes the KDED module + mediamanager, SuSEPlugger, and automounting (currently supported: subfs, supermount). + * New Audio Track source editor dialog to cut audio track sources at the beginning and the end. + * Splitted "read retries" and "ignore read errors" for data and audio sectors in cd copy and set new + defaults for audio sectors which make more sense: 5 retires and skip unreadable sectors. + * New Mediamanager which makes K3b always know which device contains which medium. This makes medium handling + more smooth and the user now selects a medium instead of a device. + Other advantages: + - No waiting time anymore when asking for information on media (including for example Audio CD ripping). + - Nice default image filenames. + - CD Copy: Enable/disable options based on the source medium + - Automatically select newly inserted media as burning medium + * DCOP call directBurn() now returns a boolean value stating if the process could be started. + * New DCOP calls cddaRip(), videocdrip(), and videodvdrip() with media:/ url support. + * K3b can now handle media:/ urls from the command line to specify devices + * Better Lame settings dialog. Easier to use for the novice user and better defaults. + * Nicer Ogg Vorbis encoder settings dialog. + * K3b now shows the DVD Medium ID in the disk information view. + * K3b now displays a rough estimate on the remaining time for the current job. + * New automatic media size mode for the projects. This means K3b uses the size from an inserted medium + for the project maximum size. + * Make a suggestion for the filename when saving a project based on the Volume ID (data projects) or the + CD-Text title (Audio CD) + * The Audio encoder plugins are now able to provide (very simplistic) user feedback in case of an error. + * New settings "Swap byte order" and "Write Wave header" in the audio encoding plugin using external apps. + This makes way for the usage of such programs as mppenc to encode Musepack files. In fact, mppenc is set up + as a default along with flac if installed. + * New DCOP interface: K3bJobInterface which provides DCOP signals for the currently running job. It may, + for example, be used to provide information to a Karamba module. + * New KFile plugin for K3b projects. For now it only shows the type of the project (Data DVD or Audio CD or ...) + but may be extended to show arbitrary information. + * K3b now chooses default image names based on the project name or the volumeid/cdtext title in case of + CD/DVD copy. + * The K3b Project DCOP Interface now uses the QString type for url parameters instead of KURL. + * Save/load audio cd track sources in audio projects + * Display a beautified volume id. For example: THE_TRANSPORTER -> The Transporter + * Check if the image directory exists before starting to create a project image + * Possibility to hide the OSD temporarily for one process. + * Completely rewritten Video DVD ripping and transcoding support: + - Simple on-the-fly transcoding of Video DVD titles + - Interface similar to Audio CD ripping + - Preview images in the ripping window + - Automatic clipping + - Simple resizing with automatic aspect ratio handling + * File System presets for all data projects including all the advanced options. + * Completely rewritten data project verification + - K3b now compares the written image instead of the single files + - Verification of Video DVD projects + * Little GUI changes: + - Changed the dialog layout in the action dialogs. + - Simplified the layout of the burn dialogs for data projects (more advanced settings hidden) + - Improved theme support (transparent themes) + * Device buffer status display for DVD burning with growisofs >= 7.0 + * Support for Audio CD ripping with libcdio instead of libcdparanoia + * Support for Cdrkit, the Debian fork of cdrtools + +0.12.17 +======= + * Fixed saving/loading of the file view configuration. + * Improved ffmpeg autoconf check. + * More FreeBSD Compile fixes (thanks to Heiner Eichmann). + * Fixed symbolic link handling in data projects (a bug introduced in 0.12.16) + * Use UTF-8 encoding to store and load local CDDB entries. + * Never use growisofs parameter -dvd-compat with DVD+RW media. + * Fixed flac audio encoding for the audio project conversion feature. + +0.12.16 +======= + * FreeBSD Compile fixes (thanks to Heiner Eichmann). + * Always force 44.1khz in the Lame MP3 encoder plugin. + * Fixed VideoDVD creation on rewritable media. + * NetBSD support (thanks to Mark Davies). + * Fixed Copy of Enhanced Audio CDs with CD-Text + * Changed default boot cataloge name from "boot.cataloge" to "boot.catalog" + * Fixed a crash when reusing the same DVD Iso Image writing dialog. + * Ignore case when comparing MD5 sums entered by the user. + * Make sure that filenames in a data project's folder are unique. + * Allow index statements bigger than 99 minutes in cue files. + * Properly set the length of SCSI commands (this fixes some device detection problems). + +0.12.15 +======= + * Write more metadata tags in the default setup of the external encoder plugin. + * Fixed on-the-fly Video DVD creation + * Fixed data project verification in case filenames had to be shortened due to Joliet limitations. + * Use -dvd-compat parameter to close DVDs in on-the-fly mode. + * Fixed libdvdcss handling (again), no crashes anymore. + * Fixed the "invalid url" bug. + * Use SG IO for scsi commands with newer linux kernels. This should fix problems with scsi device + detection. + * Warn about shortened filenames due to Joliet restrictions before starting the burning process. + +0.12.14 +======= + * Make sure new projects are not already marked as modified. + * Fixed (hopefully) the last bug related to Data project verification. + +0.12.13 +======= + * Honor umask when creating directories for Audio CD ripping. + * Only update the buffer state for DVD burning if it really changes. + * Fixed a crash in verification if the CD/DVD does not contain RR extensions. + * Lowered default DVD writing buffer size to 32 MB to avoid "memorylock limit" problems + as described on http://fy.chalmers.se/~appro/linux/DVD+RW/tools/ + * Fixed loading of libdvdcss. + +0.12.12 +======= + * Fixed another bug in the iso options code which sometimes resulted in a failed verification. + * Properly close the reading device when copying VideoDVDs. This bug resulted in a blocked device. + * Fixed handling of filenames in libdvdcss backend (this fixes VideoDVD copy). + +0.12.11 +======= + * Fixed selection in the audio CD ripping window. + * Fixed info block handling in WAVE audio file decoder: no more clicks at the end. + * Introduced a hack which fixes the "Wav detected as Mpeg file" bug. + * Fixed Auto multisession mode for DVD+RW and DVD-RW in restricted overwrite mode in case + a previous session was imported. + * Fixed a crash with HAL >= 0.5 when exiting K3b. + * Allow copying of double layer DVDs with a size below 4.3 GB to single layer media. + * Support for the ring buffer in growisofs 6.0. + * Use .iso extension for images instead of .img + * Properly remove the image file in case verification failed. + * Ignore mounting state of a medium when showing its contents. + * Fixed a bug in the iso options code which sometimes resulted in a failed verification. + * Properly handle cue files withan image file name like image.bin.cue + image.bin + * Write a proper Xing header when encoding VBR mp3 files. + +0.12.10 +======= + * Fixed Auto multisession mode in DVD projects + * Fixed crash in dcop call directBurn in case no valid burner device was set. + * Fixed verification of datacd projects when using the MaxIso9660 option without the OmitVersionNumber option + +0.12.9 +====== + * New project dcop calls: + directBurn() - directly starts the burn process without user interaction + setBurnDevice(QString) - set the burn device to be used + * Disable the cd-text fields if cd-text writing is disabled. + * New Alsa audio output plugin. + * If a DVD project does not fill up the DVD completely do not close the DVD in automatic + multisession mode. + * Fixed problems with filenames ending in backslashes. + * Fixed verification problems with localized characters. + * Added error handling for incorrectly encoded filenames. + * Automatically use a newly installed version of an external application at the next K3b start. + * Complete new set of K3b action icons for project types and tools. Many thanks to Marcel Dierkes. + * Show text on the burn button to make it catch the eye. + * Support for media:// urls in the Image writing dialogs. + * Fixed problems with files bigger than 2 GB on some systems. + +0.12.8 +====== + * Load index0 value in audio project. + * Ignore case in cue files. + * The "eject media" setting was not used properly in some situations (thanks to simon@munton.demon.co.uk for the patch) + * Fixed a bug in the mp3 decoder which caused it to miss some perfectly valid mp3 files. + +0.12.7 +====== + * Fixed crash when refreshing the device list. + * Fixed cancellation of adding files to a data project. + * Fixed on-the-fly data project burning. + * Backported a warning about following links to folders (K3b cannot do that after the link has + been added to the project). + +0.12.6 +====== + * Copy XA Form1 tracks always in TAO writing mode. + * Support for media:/ urls. + * No extra whitespace when renaming audio files in a data project anymore. + * Fixed verification of multisession CDs (thanks to simon@munton.demon.co.uk) + * Preserve directory access time in data projects when using the "backup" option. + * Disable the "audio normalization" option in case the normalize program is not installed. + +0.12.5 +====== + * Fixed the progressbar in the file view + * It is possible to add the "New Data DVD Project" button to the welcome window again. + * Fixed problems with unreadable items when using a non-standard color scheme + * Properly set the permissions on cdrecord versions >= 2.01.01a02 + * Fixed the "Disabled start button in Copy dialog" bug. + * Little window layout fix in K3bSetup2. + * Always use sector size 2048 when only creating an image in CD Copy. This means extracted + iso images from CDs with non-Mode1 tracks are useable again. + * Preserve directory permissions and user/group id in data projects when using the "backup" option. + +0.12.4 +====== + * Fixed --cdimage and --dvdimage parameters. + * Fixed the file browser menu. Now it contains the bookmarks and "add to project" actions again. + * Fixed Index 0 (Pregap) handling in audio cue files. + * Improved handling of broken cue files: K3b now searches the directory for image files that could fit + the cue file in case the FILE entry is bogus. + * Always try to create a new session in case the old one has been imported regardless of the inserted + medium's free space. + * Fixed DVD-RW Restricted Overwrite media handling + * Use RAW writing mode for audio CDs in case the writer does not support DAO but RAW. + * Fixed compile problems with latest ffmpeg builds. + +0.12.3 +====== + * Ignore dock config from K3b versions older than 0.12 + * Do not delete DVD project iso image if "remove image" is unchecked. + * Properly load multisession default settings. + * Update device selection boxes when devices are added or removed via HAL. + * Properly cancel DVD project writing. + * Fixed DVD+RW session import + +0.12.2 +====== + * After for example copying a CD when the dialog comes up again keep the last settings. + * Default to incremental sequential writing mode when copying a DVD to a DVD-R. + * Fixed a crash when the DVD copy dialog is reused. + * Fixed inline editing in the audio CD view (without bigger changes this only works with a + rather strange selection mode.) + * Show the configured splash screen image instead of the default. + * Fixed eMovix 0.9 default settings handling. + * Import session: disable RockRidge if the previous session does not contain RR extensions. + This fixes the problem with strange filenames if the new session is mounted via RR. + * Fixed the --cdimage parameter. + * Changed max copies from 99 to 999. + * Improved session import dialog. + * Properly default to DVD size in Video DVD project. + * Fixed automatic multisession handling for DVD+RW media. + * Fixed handbook installation. + * Fixed HAL backend: devices are properly removed now. + * Ignore K3b Themes that do not follow the new filename scheme. + +0.12.1 +Fixed compilation problems with older musepack library version. +Fixed compile problem with older gcc versions. +Enable verification checkbox for ISO9660 images in the CD writing dialog. +Do not report success even if audio project conversion failed. + +0.12 +Added "Mpeg Still" support to Video-CD Project +FreeBSD support (thanks to Adriaan De Groot) +Support for all global CD-Text fields with cdrecord. +Some GUI changes: cleaned up the action dialogs, moved the burnfree option to the global settings dialog + since turning it off should be a very seldomly used task. +Added support for multiple copies to the projects. +Added missed VCD 3.0 track interpretation option for SVCD's +New Lame encoding plugin providing a proper configuration dialog. +Added Bookmarks to the file browser. +Fixed window layering problem with windowmanagers != kwm +Added KPart plugin which converts a list of audio files into one of the supported encoder formats. +Allow disabling of CD-Text reading in cd-copy to overcome problems with CD-Text on some drives. +Check CD-Text crc when copying +Fixed incorrect PBC order, PBC now should work on all "standalone" DVD Players +Fixed waittime bug for PBC infinite timeout. +Import Audio Cue files into an audio project. +It is now possible to open an iso image or an audio cue file just like a project file. +Create cue files for an audio CD ripped into one single file +Show writer buffer state in addition to fifo buffer when writing CDs. +Show device buffer state for DVD writing (does not work always yet) +Fixed read and save setting in VideoCD project. +Big parts of the audio project have been rewritten to have a way better design: + - K3b now does not create additional silence between the tracks by default + the pregap is treated as part of the previous track like in all other + writing applications. + - Instead it's possible to add additional silence manually to a track. + - Allow multible sources for one track. + - Split tracks, merge tracks. + - Improved track dialog. +K3b now always writes a logfile in $(KDEHOME)/share/apps/k3b/lastlog.log +New device configuration format which solves all issues with removable devices like USB. +Copy CSS encrypted DVDs if libdvdcss is installed. +Libsndfile decoder plugin. This includes support for AIFF audio files. +ffmpeg decoder plugin. This includes support for wma audio files. +Musepack audio decoder plugin. +Use DAO writing mode for data CDs when overwrite is enabled. +Added option to load the last used settings in addition to the default user settings in every + action dialog. +Show system device name in case the string representing two devices are equal. +Fixed the docking issues. No floating dock windows anymore. :) I have no idea why I wasn't able to do this + before... it was so easy after all. +Plugin based Audio Output system for Audio project "preview". +Dropped id3lib in favor of TagLib (great work Scott :) +When the speed for an on-the-fly audio project is set to "Auto" K3b now determines the max writing speed. +Do not close dialogs after the action is done (for example cd copy) +Directly copy Audio tracks from an Audio CD to an Audio project. +Session management +Made K3b a unique application only allowing one instance. +Improved dcop interface for data projects which allows to add and remove items + to and from specific folders in the project. +Conditional audio ripping pattern. Now what does that mean? It means that you can do stuff like: + "if the track has a genre encoded use it, otherwise use 'misc'" and stuff like that. +New project plugin interface. Example: the audio project cddb plugin is now a project plugin +MusicBrainz support (Query audio file tags over the internet) +K3b now has a "smart" automatic multisession handling in Data projects. +Replaced the system tray by an OSD inspired by the one in amaroK +Better symlink handling with proper size information if "follow symlinks" is activated. +HAL support (turn on your USB writer while K3b is running and see it getting detected automatically) +eMovix 0.9.0 support + +0.11.10 +Support Mp3 files starting with multiple ID3 tags. +Improved ~ handling in the QuickDirSelector. +Save/Load composer fields in audio projects +Save/Load default DVD Copy reading device + +0.11.9 +Fixed data project size calculation (for good this time). + +0.11.8 +K3b now searches for the Debian cdrecord wrapper script and properly selects the cdrecord version to use + (cdrecord.mmap or cdrecord.shm) based on the kernel version. This should fix all problems with + K3bSetup on Debian. +Fixed writing speed parsing with patched cdrecord +Add leading zero to tracknumber meta data field when encoding audio tracks. +Fixed data project size calculation if files from different devices have the same inode number. +It is now possible to enter hexadecimal values in the boot image load segment fields. +Fixed external program encoder plugin (this includes lame and flac encoding) + +0.11.7 +Check size of returned CD-TEXT data to be a multiple of the pack length. This should fix problems + with CD copy. +Audio Project: Do not overwrite CD-Text values loaded from the project file with the ones detected. +Added --copydvd command line parameter +Do only read MCN and ISRCs when copying an audio cd since scanning them takes a very long time. +Fixed cdrdao 1.1.8 version handling (no ATAPI warning) +Fixed crash when using the Audiometadatarenamer on Movix Projects +Automatically enable UDF extensions in case the project contains files bigger then 2 gb. + +0.11.6 +Fixed length calculation for long FLAC files. +Allow Audio CDs that violate the Red Book standard (Tracks shorter than 4 seconds) +Some improvements in disk-info retrieval + +0.11.5 +Do not ask for overwriting directories in cloning dialog +Again fixed some disk detection problems which were introduced with the previous fixes :-( +Fixed a crash which occured if the last boot image was displayed in the fileview while removing it. +Support for ID3 Tags in FLAC files. +Support for cdrdao 1.1.8. + +0.11.4 +Fixed adding of hidden files (wrong naming of config entries) +Use a default imagefile name for cloning if none was specified. +Use the Joliet names if no Rockridge is available in session import + +0.11.3 +fixed features detection with some devices. +fixed multisession writing on some systems (K3b used to open the device instead of leaving it to mkisofs to + prevent permission problems. Sadly this does not work with all systems since it seems that K3b does + not close the device early enough so cdrecord cannot open it.) + +0.11.2 +K3bProcess now has a clean API and a non-stupid implementation which fixes the kde 3.2 issue +way better than the hotfix from 0.11.1. +Fixed a crash at K3b start which happened with ROM drives that return zero length modepage 0x05 data. +fixed onthefly DVD copy issues +K3b now uses the internal reader for DVD copy instead of readcd +added read retries and "ignore read error" options to the dvd copy dialog +fixed handling of empty raw toc data +fixed the bug that made K3b try to use cdrdao for DVD iso image writing. +add files to a project by dropping them on the corresponding tab +removed the "query cddb" option from the copy dialog since this is configured globally anyway. +fixed loading of VideoDVD projects +Fixed VideoDVD project with a HACK. mkisofs is not able to create a VideoDVD using graft-points which + is the default in K3b. So now K3b links all VIDEO_TS files in a temp directory. + +0.11.1 +fixed an issue introduced with KDE 3.2rc1 which caused on-the-fly data writing to fail all the time. + (If you need to know: For some reason KProcess makes the Stdin fd O_NONBLOCK. This way mkisofs is + not able to write properly to cdrecord's stdin anymore.) + +0.11 +fixed libcdparanoia-loading on Debian (and maybe some other systems) +fixed crash at end of image creation in DVD project +fixed filesize display for very large files and projects (integer overflow) +fixed CD-TEXT reading. On some systems some senseless characters where appended. +fixed Id3lib detection in configure.in.in +added primitive supermount support +kernel 2.5 compile fixes (thanks to ismail (cartman) d�mez ) +K3b now defaults to the generic-mmc cdrdao driver if the used burner is not listed in + cdrdao's driver table. As all modern drives use the generic-mmc driver anyway this + is valid and prevents from a lot of newbie problems. +Added a thememanager and the new crystal look by Everaldo +K3b does not mount the disk for session import or data verification anymore. This way supermount + users will have no problems. +merged cue/bin and isoimage burning in one dialog which provides image-type-detection + supported so far: iso, cue, cdrdao toc, cdrecord clone images +better systemconfigcheck messages when cdrecord is not running with root privs +proper automatic writing mode and writing app selection for non-DAO-capable writers +overwriting of files in a new session +default CD size is now 80 min +generic resampling for all audio plugins +support for mono files +support for 8Bit wave files +FLAC decoding plugin (thanks to John Steele Scott) +check if a DVD-R(W) writer supports incremental streaming before trying multisession +check if a DVD-R(W) writer supports testwriting before trying a simulation +fixed DVD-Copy. We needed to determine the size of the data to copy for ourselves instead of relying + on the kernel +Automatic CD-writing speed selection (chooses always the max for now) +Technical info about audiofiles in the audio project are displayed in the track properties dialog +One may now add complete dirs to an audio project +Detection of Justlink support +Finally the device handling is completely independant. No calls to cdrecord anymore. That's why we +now have a libk3bdevice. +Improved writing speed estimation for audio tracks. +Added a button which determines the supported writing speeds with the mounted media. this way it is possible + to also select dvd writing speeds other than 1x +fixed directory sorting in iso filesystems +fixed boot image file sorting +Joliet long support (103 chars joliet filenames) +improved meta tag handling for audio encoding, support for album title and stuff +fixed crash when only creating images without an installed cd writer +writing speed is loaded correctly again +Completely rewritten CD copy: + - Copy Audio, multisession and Mixed mode CDs. + - Copy CD-TEXT + - Create CD-TEXT from Cddb entries + - Audio reading with cdparanoia for high quality ripping + - no cdrdao anymore +Support for new growisofs option to specify the size of a written image in DAO mode +Added check for free space in temp dir to dvd copy +Added a script to simplify the start of K3bSetup2. + +0.10 +DVD writing support with the DVD+RW-tools by Andy Polyakov +DVD formatting +DVD Copy (pure data dvd copy without any video transcoding) +CD Cloning with cdrtools >= 2.01a17 +device capabilities detection without cdrecord. This solves the long startup problem with ATAPI devices. +moved audio ripping pattern configuration from options dialog to audio ripping dialog +option to automatically erase CD-RWs and DVD-RWs without asking before writing +dragging files from a data project to the audio player (basically it's just a KURLDrag so it may be dragged + everywhere) +K3b is now divided in three libs and the main application: libk3bcore, libk3btools, and libk3bproject + this makes creating KParts-plugins easy. Two examples can be found in the tests/kpartplugins dir + one of them is a former K3b option which allowed to use audio meta data to rename files while + adding them to a data project. Now this is done by a plugin and a much higher degree of user + interaction. +Iso9660 file sorting (mkisofs -sort) +libid3 support for better mp3 tag access (we had that in some very old version but back then + K3b depended on it. Now it defaults to using KFileMetaInfo if it's not available) +Pluggable audio decoding +Pluggable audio encoding and completely rewritten audio ripping + much faster now due to a much better threading +Check for read permission when adding files to a project +file filter in binimagewritingdialog and isoimagewritingdialog (thanx to David Maciejak) +Verification of written data (compares md5 sums of all written files). +K3bSetup is not longer compiled unless explicit activated (K3bSetup is outdated and K3bSetup2 is still not ready) +K3b now also compiles without aRts. In this case the audioplayer will be useless (but still there) +no need for special mkisofs permissons anymore. K3b now openes the device itself when importing + an old session. +added a little color animation when dropping files onto a directory in data projects + it is always hard to tell if one dropped on the correct dir. If some one has a better animation + I would be interested in replacing this simple one. +Added CD-TEXT reading (used for Audio CD ripping) +sox encoder plugin to encode to all audio formats supported by sox (will anyone ever use this??) +encoder plugin that let's you specify a commandline to encode the data. Typical example would be calling lame to + encode to mp3. +much better TOC reading. K3b now displays multisession info. +m3u Playlist creation for ripped audio files +replaced the old K3bSetup with a quite simple KControl Module which is only able to change the + needed permission for devices and external programs. Everything else is nowadays done + by the distros. + + +0.9 +support for eMovix 0.8.0rc2 +better data project size calculation + +0.9pre2 +support for writing CD-Text with cdrecord +support for writing audio and mixed-mode CDs on-the-fly with cdrecord >= 2.01a13 +no gui blocking when reloading the media while writing a two-session mixed-mode cd +nodma option in eMovix project +fixed problems with audio decoding (the process sometimes stalled) + +0.9pre1 +added system notification +added eMovix project +added bootable cd support (multible images) +K3b now allows automatic writing mode selection to be sure to always use the best writing mode (DAO, TAO) +the environment PATH is searched for external bins +more error handling +dropped KDE/QT 3.0.x compatibility, now K3b requires at least 3.1 +internals: + devices rewrite, use generic packet ioctl's + cdinfo rewrite, use generic packet ioctl's + merged cdrdaoparser and cdrdaowriter +added multisession cd copy +fixed onlyCreateImage (this time for real!) +added option to hide main window while writing +fixed temp-dir problems with nfs-mounted home directories + K3b now uses the default kde tempdir +Resmgr support +added user datamode selection (mode1, mode2(form1)) +support for relative paths in playlists (thanx to Nick Bloke) +new progressdialog +faster cddb access (older versions just queried all entries, now only the selected one gets queried) +K3b is now threaded. +Gui beautifying. +videocd: + add playback control (PBC) + add customizing of Gaps and Margins + add HQ-VIDEOCD support + add relaxed APS support (this controls whether APS constraints are strict or relaxed) + add category restriction support + add an option to create always an empty `/SEGMENT' directory (some Players need this) + fixed load and saveUserDefaults + fixed autodetection VCD Typ (now the user can turn off this feature) +added audio volume normalization +added udf support to data project +user commands for external programs are separated by space now since the comma just + made problems for options like "--driver generic-mmc" which had to be specified + as "--driver, generic-mmc" +support for newer versions of cdrecord which have a slighly changed user interface +support for cuefile writing with cdrecord > 2.01a14 + +0.8.1 +fixed compiling problems with kernel < 2.4.3 +fixed onlyCreateImage in data project +fixed handling of cdrecord burnfree/burnproof driveroption in versions < 1.10 +fixed error with localized docking config that caused empty windows when changing the language +introduced workaround for serious cdrdao bug that caused tocfiles to be deleted +disabled the delete shortcut in the fileview (way too many users deleted files by accident when they + wanted to remove project items) + +0.8 +advanced options: manually selection of writing app (cdrecord or cdrdao) + +changed the option dialog layout -> smaller window + +fixed problems with first pregap in audio project: + no need to set the first pregap to 0 on some writers anymore + no 4 second pregap before first tracks anymore + +fixed problems with detecting some audio tracks that had flags like preemp set + +removed cdparanoia dependancy (dynamic linking) +big internal changes +split bin/cue writing from iso-image-writing +better cdcopy (mainly more options) +customizeable audio ripping + +mixed mode cd creation +video cd creation +video cd on cd-i support +better error handling + +indivdual selection of final size for encoded movie +clean vob dir before start and restore it (i.e playing wiht PowerDVD stores +config files in the directory) + +AC3-passthrough mode for DIVX Encoding +DND for AudioCD-Ripping to harddisc. + + +0.7.5 +Added session import +little reordering of menus +fixed the "cdrecord error 255" bug +fixed some i18n issues +improved mp3 file detection +added K3b project mimetype +added konqueror servicemenu entries +now KoStore is used for saving documents +K3bSetup is started with the correct language now +MD5 sum is only calculated on demand (but still asynchronous) +fixed K3bSetup linking problems + +0.7.4 +fixed bug that caused stupid mountpoints to be assigned to the devices +Mounting dvd with UDF filesystem (uppercase words) should now work (copy ifo-files). +beautified cddb setup +internal cddb change (rewrite) +fixed problems when writing mp3 and ogg vorbis files together +burnproof support for cdrecord <= 1.11a02 works again (and also for the new cdrecord ;) +Fix audiolanguange parsing for transcode 0.6.2 (wrong entries in k3bDVDRip.xml) +Bugfix Selecting ripping dir with file dialog and new directory now shows the available space properly. +Bugfix Cancel one pass in encoding now works +If select "Add to project" in the context menu of the file/dir tree a dialog (audio/data) asks +for creating a new data or audio project. + +0.7.3 +fixed compile problems with gcc 3.x + +0.7.2 +added md5sum to iso-image dialog +fixed compile problem when ogg-vorbis is not installed +fixed iso-image volume descriptor problem that caused all descriptors to be enclosed in quotation marks +added raw-copy option +better external program handling + +0.7.1 +audio: + fixed mp3 resampling problems + better handling of newly added tracks +data: + proper symlink handling + better support of the mkisofs options + option for adding hidden files + backup permissions +device: + support for symlinks in fstab +misc: + progress display in the K3b titlebar + better progress display in systray + +0.7 +DivX/XviD encoding +enhanced cddb support +new artwork from Ayo +fixed some device detection problems +fixed problems with long filenames and Joliet +some gui enhancements +added libmad to the sources +removed id3lib + +0.6pre2 +added ogg-vorbis support +added iso ids to diskInfo +fixed iso project input fields + +0.6pre1 +well... I don't know.. everything? + +0.5.1 +fixed bug that caused a compile error on some systems +fixed problems with audio cd writing +disabled projects while writing (needed for writing in the background) + +0.5.0 +-fixed mkisofs 1.14 problems +-audio on-the-fly burning (even corrupted mp3-files) +-saving/loading of projects +-atip and toc info +-cd-ripping (wav) with extended pattern support +-cddb support +-play audio cds +-extended option-dialog +-hide first track on audio-cds +-detection of ide-devices as cd-rom +-blanking of cdrws +-writing of existing iso-images +-optional setting of cdrdao driver for every scsi-device +-burn in the background (it's even possible to write on two writers simultaneous or write a cd and create an image (if your system is fast enough ;-)) +-K3b checks for an empty disk before writing! +-and like every time some other stuff i cannot remember ;-) + +0.4.3 +Fixed bug that caused K3b to crash while detecting devices +highly improved adding of files and directories to a data project +adding empty directories to data project via context menu +disabled audio on-the-fly burning due to a problem that caused faulty cds + +0.4.2 +added new DirTree (code from Konqueror) +added new device-management (the scsi-bus is checked directly) +detection of Burn-Proof-capable drives +some bugfixes + +0.4.1 +added whitespace-treatment +dock-positions are saved + +0.4.0 +Added ISO-cd support +file-tree creation via drag'n'drop +renaming of files +support of most of the mkisofs-features +improved audiotrack dialog +use of ID3Lib + +... and other things i really cannot remember... ;-) + diff --git a/FAQ b/FAQ new file mode 100644 index 0000000..3802d3b --- /dev/null +++ b/FAQ @@ -0,0 +1,82 @@ +Q: Compiling K3b fails with errors like this: + base_k3badvanceddataimagesettings.cpp:185: invalid use of undefined type + `struct KComboBox' + base_k3badvanceddataimagesettings.h:17: forward declaration of `struct + KComboBox' +A: The QTDesigner tool 'uic' is not able to find the kde widget plugins. + To solve this run 'qtconfig' and add '$KDEDIR/lib/kde3/plugins' to the plugin search path + (replace $KDEDIR with your kde base dir). + + +Q: K3b thinks my SCSI device is IDE. +A: If you are using the rpm from SuSE your version of K3bSetup is not able to set the + permissions that K3b needs the devices to have. The SuSE guys seem to think messing with + permissions is too dangerous. It is recommended to always compile from source to have all + K3b features. + + +Q: Where has all the fancy graphic gone? +A: Most likely you installed K3b in the wrong directory. All KDE programs are installed in the + KDE dirtree (SuSE: /opt/kde3, RedHat: /usr). If you compile K3b from source it defaults + to either $KDEDIR or /usr/local. To install in the correct directory you need to specify the prefix + to configure like this: + ./configure --prefix=`kde-config --prefix` + That will install K3b relative to the correct path. + + +Q: The linking always breaks with the missing -laudio. +A: You need to install NAS. + + +Q: Where can I find K3bSetup2? +A: K3bSetup2 is a KControlCenter Module. You can find it in the System Administration section or start + it manually with "kdesu kcmshell k3bsetup2". + There also is a script since K3b 0.11 called k3bsetup. + + +Q: My writer supports writing at speed X but K3b shows Y as a max. +A: K3b determined the maximum writing speed the first time you start it. Since the speed reported by the + writer always depends on the mounted medium this may not be the real max. + To manually change it open the K3b settings in the device section and click on the value. You will + be presented with a spinbox which allows to change the speed. + + +Q: Writing fails with the following cdrecord message: + "Cannot allocate memory. Cannot get SCSI I/O buffer." +A: Since kernel 2.6.9 suid root programs are not allowed to use the SCSI subsystem. + To solve this issue either configure cdrecord to run without root privileges: chmod 755 /usr/bin/cdrecord + or run K3b as root (which is not recommended but works also). + + +Q: Writing fails with the following cdrecord message over and over again: + "Error trying to open /dev/hdc exclusively (Device or resource busy)..." +A: You are using a patched cdrecord version which tries to open the device exclusively which fails because + your are probably also using automounting. The solutions are to disable automounting altogether (and this is + the recommended solution as automounting can cause other more serious problems with CD/DVD writing) or to + install a non-patched cdrecord version. + +Q: My DVD drive supports 16X but K3B keeps burning at 1X! What's happening? + +A: Your kernel most likely didn't apply optimal settings for your drive when it detected it. You can find out + what are the current settings of your drive with the command "hdparm -v /dev/dvd": + + /dev/dvd: + IO_support = 0 (default 16-bit) + unmaskirq = 0 (off) + using_dma = 0 (off) + keepsettings = 0 (off) + readonly = 0 (off) + readahead = 256 (on) + + The following options are known to maximize burning and playback performance: + + hdparm -d1 -c1 -a8 -u1 /dev/dvd + + To make these options permanent, a quick and dirty solution is to include the command in /etc/rc.local. + Consult your distribution documentation for a tailored solution. + + Some drives have buggy DMA support. If you experience instability, leave these options disabled. + + Some useful references: + http://www.togaware.com/linux/survivor/CD_DVD_Drives.shtml + http://www.linuxjournal.com/article/6921 diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..4ce45cb --- /dev/null +++ b/INSTALL @@ -0,0 +1,51 @@ +Installing K3b 1.0 +------------------ + + +What you need to run K3b: + mandatory: + - since K3b is a CD writing program a cd writer would be a good thing to have ;-) + - the QT3 library (at least version 3.2) + - the KDE3 libraries (at least version 3.2) + - the cdparanoia library for cd ripping from Monty + - the cdrtools (cdrecord, mkisofs) from Joerg Schilling + - the dvd+rw-tools by Andy Polyakov for DVD writing + + optional: + - cdrdao, the other linux cd writing program from Andreas Mueller + - the transcode tools for DVD ripping and DivX/XviD encoding from Thomas Oestreich + - vcdimager >= 0.7 for creating video cds + - libmad for mp3 decoding + - ogg-vorbis libraries for encoding and decoding + - the FLAC++ libraries for flac-decoding + - the eMovix package + - TagLib by Scott Wheeler for reading Meta data tags + - the musepack (or now mpcdec) library for decoding Musepack audio files + - the ffmpeg library to decode other audio file formats such as wma + - the sndfile library to decode audio file formats such as AIFF or VOC + - the lame library to encode audio files in the mp3 format + - sox to encode audio files in formats such as AIFF or VOC + - a dynamically compiled libffmpeg for wma decoding + - the musicbrainz library for metadata queries for single audio titles + +After that it's all the same: + + ./configure + +or try ./configure --help to learn about the options. + +If configure was successful you are presented with a list of configure results that shows +which optional features are enabled. Now just compile K3b: + + make + +Now you are ready to install: + + make install (as root) + + +See PERMISSIONS on hints how to properly setup the permissions to use K3b without problems. + + +Have fun +Sebastian Trueg (trueg@k3b.org) diff --git a/KNOWNBUGS b/KNOWNBUGS new file mode 100644 index 0000000..e69de29 diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..6d2b67a --- /dev/null +++ b/Makefile.am @@ -0,0 +1,11 @@ +if with_k3bsetup1 + K3BSETUPDIR=k3bsetup +endif + +EXTRA_DIST = AUTHORS COPYING ChangeLog INSTALL README TODO k3b.lsm admin configure.in.in + +AUTOMAKE_OPTIONS = foreign 1.5 + +#include admin/deps.am + +SUBDIRS = doc libk3bdevice libk3b src kioslaves plugins kfile-plugins $(K3BSETUPDIR) diff --git a/PERMISSIONS b/PERMISSIONS new file mode 100644 index 0000000..1fe56bf --- /dev/null +++ b/PERMISSIONS @@ -0,0 +1,32 @@ +K3b needs some special permissions to work properly. Most distrobutions come with permissions that I don't like +very much and make problems when adding new CD/DVD devices to your system. +If you set up your system as follows you can be sure to never have K3b permission problems again. + +1. Disable pam authentication for cdrom and burner devices in /etc/security/console.perm. Otherwise your permissions + will be overwritten when loggin in and it's not possible for two users to use K3b at the same time. + In my opinion one should disable this completely and create a proper configuration instead. The most annoying + issue with this pam stuff is that you cannot have two sessions with two different users running because the first + one owns all the sound and cd devices. + +2. Create a cdrom or cdrw or whatever group (if it not already exists) and add all users that should be able to + use K3b to that group. You may also skip this step and let everybody use K3b. In that case simply use root as + the group and permissions 4711 and 666 instead of 4710 and 660 in the following steps. + +3. Change the permissions of cdrecord and cdrdao to 4710 root.cdrom (substitute cdrom with the group from 2). + This way both will run suid root which allows them to increase their scheduling priority resulting in a more + stable burning process. + +4. Change the permissions of all your cdrom device to 660 root.cdrom (substitute cdrom with the group from 2). + With devfs you may do this with lines like this (the first changes all ide cd devices while the second takes + care of the scsi cd devices): + REGISTER ^ide/host.*/bus.*/target.*/lun.*/cd PERMISSIONS root.cdrom 660 + REGISTER ^scsi/host.*/bus.*/target.*/lun.*/cd PERMISSIONS root.cdrom 660 + In case you are not using devfs you may determine the devices by running K3b once as root and looking in the + device settings. The corresponding devices are listed there. + +5. Change the permissions of the generic SCSI devices to 660 root.cdrom (substitute cdrom with the group from 2). + Both cdrecord and cdrdao use the generic devices to access the scsi drives. So you don't need to perform this step + if you only have IDE devices. + Use a line like the following for devfs: + REGISTER ^scsi/host.*/bus.*/target.*/lun.*/generic PERMISSIONS root.cdrom 660 + In case you are not using devfs the devices are /dev/sg*. diff --git a/README b/README new file mode 100644 index 0000000..6bb3640 --- /dev/null +++ b/README @@ -0,0 +1,92 @@ +K3b Version 1.0 + +Thanx for downloading K3b - The CD Kreator + +These are the features so far: + - the most userfriendly interface ever ;-) + - themable + + - Media-centric user interface: + - Select the medium to use for burning instead of the device + - K3b always knows about all optical devices and inserted media and adjusts the UI accordingly + + - writing audio-cds + - On-the-fly decoding of many audio formats through plugin struxture + (decoding plugins for mp3, ogg vorbis, flac, wave, musepack, wma, aiff, and others) + - CD-Text support + - Metadata support, fill CD-Text from metadata or via Internet queries (CDDB + Musicbrainz) + - little gimmick: hide the first track (so that you have to search back from the + beginning of the cd to find it) + - volume level normalization (only when writing with an image) + - multiple sources for one track possible (merging of tracks, splitting of tracks, + adding silence of arbitrary length) + - integrated "preview" player + - Directly add audio tracks from other CDs and let K3b take care of the rest. + + - writing ISO9660-CDs and DVDs + - Joliet/Rockridge support + - Udf filestructures (no pure Udf so far) + - create image/write image + - writing on-the-fly + - creating of file-tree via drag'n'drop (as easy as it could be) + - removing files and directories from data tree + - moving files within the project + - adding new empty directories to data tree + - renaming of files (manually or automatically for mp3-files) (for joliet and rockrigde) + - support for most of the mkisofs-options (I don't think anyone will ever use them! ;-)) + - multisession support (including importing old sessions and overwriting files from old sessions) + Automagically multisession handling: start, continue, or finish multisession CDs and DVDs based on + the size of the project and the remaining capacity on the media. + - El Torito bootable CD/DVD support + + - writing Video CDs + - VCD 1.1, 2.0, SVCD + - CD-i support (Version 4) + + - writing mixed-mode CDs + - CD-Extra (CD-Plus, Enhanced Audio CD) support + + - writing eMovix CDs and DVDs + + - writing data DVDs + - Support for DVD-R(W) and DVD+R(W) + - Support for DVD+R Double Layer media + + - formatting DVD-RWs and DVD+RWs + + - writing existing iso-images and cue/bin images to CD + - Writing of Audio cue file images on-the-fly (All audio formats supported) + + - CD copy (data, audio, mixed mode) + + - DVD copy + + - CD cloning with cdrecord >=2.01a17 + + - blanking of CD-RWs + - Also automagically before writing a CD. + + - CD ripping to wav, mp3, ogg-vorbis, flac, or whatever format needed + - encoding plugin system + - Cddb support + - sophisticated pattern system to automatically organize the ripped tracks + - m3u playlist creation + - CD-TEXT support + + - DVD ripping with the transcode tools + - Support for automatic clipping + - DivX/XviD encoding + + - Retrieving CD/DVD info and toc + + - Powerful default and automatic settings + + +See INSTALL for further information + + +Please report bugs (with k3b output!) and tell me what you like/dislike +about the user-interface! + +Have fun +Sebastian Trueg (trueg@k3b.org) diff --git a/RELEASE_HOWTO b/RELEASE_HOWTO new file mode 100644 index 0000000..7346b6a --- /dev/null +++ b/RELEASE_HOWTO @@ -0,0 +1,27 @@ +Howto create a K3b release (stable branch) + +1. create a package from the stable branch using the createPackage.sh script: + createPackage.sh -a k3b -av 0.12 -ab branches/stable/extragear/multimedia --notoplevel -ib branches/stable/l10n + -is extragear-multimedia --pofiles "k3b libk3b libk3bdevice k3bsetup" --postprocess postprocessk3b.sh --split + --admin /branches/KDE/3.4/kde-common/admin + +2. Make sure the version in src/main.cpp, k3b.lsm, README, INSTALL is valid. + Check the version in libk3b. + +3. Create the tarball. + +4. Test the tarball. That includes removing any trace of K3b from the test system before and in the ideal + case compile on a minimal system meaning minimal KDE/QT versions. + +5. Upload the tarball to upload.sf.net/incoming and create a release on www.sourceforge.net (or use releaseforge, + a nice little application which automates the whole sourceforge release thing). + +6. Create a news entry on www.k3b.org and update the download page. + +7. Promote the release on www.kde-apps.org and freshmeat.net (the latter may also be done with releaseforge) + +8. Send an announcement email to: + k3b-user@lists.sourceforge.net + k3b-announce@lists.sourceforge.net + kde-extra-gear@kde.org + kde-announce@kde.org diff --git a/TODO b/TODO new file mode 100644 index 0000000..02bd01e --- /dev/null +++ b/TODO @@ -0,0 +1,22 @@ ++ integrated Audio CD player (as part of the audio project preview) + +- video cd photoalbum, portfolio +- video cd Interactive Menues (automenues) +- video cd split long mpegs (volume set) +- video dvd creation with menu support +- Support for other playlist formats + ++ video cd ripping ++ video cd mpeg-still support ++ video cd Navigation + ++ Alsa output plugin ++ Rewrite of the DVD ripping/encoding stuff + + Encoding on-the-fly (no extra encoding dialog) + + Do not rip in a special format but save the Video DVD as + a normal VideoDVD structure (or encoded) + +legend: +- planned +* work in progress ++ done diff --git a/acinclude.m4 b/acinclude.m4 new file mode 100644 index 0000000..6b26319 --- /dev/null +++ b/acinclude.m4 @@ -0,0 +1,11945 @@ +## -*- autoconf -*- + +dnl This file is part of the KDE libraries/packages +dnl Copyright (C) 1997 Janos Farkas (chexum@shadow.banki.hu) +dnl (C) 1997,98,99 Stephan Kulow (coolo@kde.org) + +dnl This file is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Library General Public +dnl License as published by the Free Software Foundation; either +dnl version 2 of the License, or (at your option) any later version. + +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Library General Public License for more details. + +dnl You should have received a copy of the GNU Library General Public License +dnl along with this library; see the file COPYING.LIB. If not, write to +dnl the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +dnl Boston, MA 02110-1301, USA. + +dnl IMPORTANT NOTE: +dnl Please do not modify this file unless you expect your modifications to be +dnl carried into every other module in the repository. +dnl +dnl Single-module modifications are best placed in configure.in for kdelibs +dnl and kdebase or configure.in.in if present. + +# KDE_PATH_X_DIRECT +dnl Internal subroutine of AC_PATH_X. +dnl Set ac_x_includes and/or ac_x_libraries. +AC_DEFUN([KDE_PATH_X_DIRECT], +[ +AC_REQUIRE([KDE_CHECK_LIB64]) + +if test "$ac_x_includes" = NO; then + # Guess where to find include files, by looking for this one X11 .h file. + test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h + + # First, try using that file with no special directory specified. +AC_TRY_CPP([#include <$x_direct_test_include>], +[# We can compile using X headers with no special include directory. +ac_x_includes=], +[# Look for the header file in a standard set of common directories. +# Check X11 before X11Rn because it is often a symlink to the current release. + for ac_dir in \ + /usr/X11/include \ + /usr/X11R6/include \ + /usr/X11R5/include \ + /usr/X11R4/include \ + \ + /usr/include/X11 \ + /usr/include/X11R6 \ + /usr/include/X11R5 \ + /usr/include/X11R4 \ + \ + /usr/local/X11/include \ + /usr/local/X11R6/include \ + /usr/local/X11R5/include \ + /usr/local/X11R4/include \ + \ + /usr/local/include/X11 \ + /usr/local/include/X11R6 \ + /usr/local/include/X11R5 \ + /usr/local/include/X11R4 \ + \ + /usr/X386/include \ + /usr/x386/include \ + /usr/XFree86/include/X11 \ + \ + /usr/include \ + /usr/local/include \ + /usr/unsupported/include \ + /usr/athena/include \ + /usr/local/x11r5/include \ + /usr/lpp/Xamples/include \ + \ + /usr/openwin/include \ + /usr/openwin/share/include \ + ; \ + do + if test -r "$ac_dir/$x_direct_test_include"; then + ac_x_includes=$ac_dir + break + fi + done]) +fi # $ac_x_includes = NO + +if test "$ac_x_libraries" = NO; then + # Check for the libraries. + + test -z "$x_direct_test_library" && x_direct_test_library=Xt + test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc + + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS="$LIBS" + LIBS="-l$x_direct_test_library $LIBS" +AC_TRY_LINK([#include ], [${x_direct_test_function}(1)], +[LIBS="$ac_save_LIBS" +# We can link X programs with no special library path. +ac_x_libraries=], +[LIBS="$ac_save_LIBS" +# First see if replacing the include by lib works. +# Check X11 before X11Rn because it is often a symlink to the current release. +for ac_dir in `echo "$ac_x_includes" | sed s/include/lib${kdelibsuff}/` \ + /usr/X11/lib${kdelibsuff} \ + /usr/X11R6/lib${kdelibsuff} \ + /usr/X11R5/lib${kdelibsuff} \ + /usr/X11R4/lib${kdelibsuff} \ + \ + /usr/lib${kdelibsuff}/X11 \ + /usr/lib${kdelibsuff}/X11R6 \ + /usr/lib${kdelibsuff}/X11R5 \ + /usr/lib${kdelibsuff}/X11R4 \ + \ + /usr/local/X11/lib${kdelibsuff} \ + /usr/local/X11R6/lib${kdelibsuff} \ + /usr/local/X11R5/lib${kdelibsuff} \ + /usr/local/X11R4/lib${kdelibsuff} \ + \ + /usr/local/lib${kdelibsuff}/X11 \ + /usr/local/lib${kdelibsuff}/X11R6 \ + /usr/local/lib${kdelibsuff}/X11R5 \ + /usr/local/lib${kdelibsuff}/X11R4 \ + \ + /usr/X386/lib${kdelibsuff} \ + /usr/x386/lib${kdelibsuff} \ + /usr/XFree86/lib${kdelibsuff}/X11 \ + \ + /usr/lib${kdelibsuff} \ + /usr/local/lib${kdelibsuff} \ + /usr/unsupported/lib${kdelibsuff} \ + /usr/athena/lib${kdelibsuff} \ + /usr/local/x11r5/lib${kdelibsuff} \ + /usr/lpp/Xamples/lib${kdelibsuff} \ + /lib/usr/lib${kdelibsuff}/X11 \ + \ + /usr/openwin/lib${kdelibsuff} \ + /usr/openwin/share/lib${kdelibsuff} \ + ; \ +do +dnl Don't even attempt the hair of trying to link an X program! + for ac_extension in a so sl; do + if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done]) +fi # $ac_x_libraries = NO +]) + + +dnl ------------------------------------------------------------------------ +dnl Find a file (or one of more files in a list of dirs) +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_FIND_FILE], +[ +$3=NO +for i in $2; +do + for j in $1; + do + echo "configure: __oline__: $i/$j" >&AC_FD_CC + if test -r "$i/$j"; then + echo "taking that" >&AC_FD_CC + $3=$i + break 2 + fi + done +done +]) + +dnl KDE_FIND_PATH(program-name, variable-name, list-of-dirs, +dnl if-not-found, test-parameter, prepend-path) +dnl +dnl Look for program-name in list-of-dirs+$PATH. +dnl If prepend-path is set, look in $PATH+list-of-dirs instead. +dnl If found, $variable-name is set. If not, if-not-found is evaluated. +dnl test-parameter: if set, the program is executed with this arg, +dnl and only a successful exit code is required. +AC_DEFUN([KDE_FIND_PATH], +[ + AC_MSG_CHECKING([for $1]) + if test -n "$$2"; then + kde_cv_path="$$2"; + else + kde_cache=`echo $1 | sed 'y%./+-%__p_%'` + + AC_CACHE_VAL(kde_cv_path_$kde_cache, + [ + kde_cv_path="NONE" + kde_save_IFS=$IFS + IFS=':' + dirs="" + for dir in $PATH; do + dirs="$dirs $dir" + done + if test -z "$6"; then dnl Append dirs in PATH (default) + dirs="$3 $dirs" + else dnl Prepend dirs in PATH (if 6th arg is set) + dirs="$dirs $3" + fi + IFS=$kde_save_IFS + + for dir in $dirs; do + if test -x "$dir/$1"; then + if test -n "$5" + then + evalstr="$dir/$1 $5 2>&1 " + if eval $evalstr; then + kde_cv_path="$dir/$1" + break + fi + else + kde_cv_path="$dir/$1" + break + fi + fi + done + + eval "kde_cv_path_$kde_cache=$kde_cv_path" + + ]) + + eval "kde_cv_path=\"`echo '$kde_cv_path_'$kde_cache`\"" + + fi + + if test -z "$kde_cv_path" || test "$kde_cv_path" = NONE; then + AC_MSG_RESULT(not found) + $4 + else + AC_MSG_RESULT($kde_cv_path) + $2=$kde_cv_path + + fi +]) + +AC_DEFUN([KDE_MOC_ERROR_MESSAGE], +[ + AC_MSG_ERROR([No Qt meta object compiler (moc) found! +Please check whether you installed Qt correctly. +You need to have a running moc binary. +configure tried to run $ac_cv_path_moc and the test didn't +succeed. If configure shouldn't have tried this one, set +the environment variable MOC to the right one before running +configure. +]) +]) + +AC_DEFUN([KDE_UIC_ERROR_MESSAGE], +[ + AC_MSG_WARN([No Qt ui compiler (uic) found! +Please check whether you installed Qt correctly. +You need to have a running uic binary. +configure tried to run $ac_cv_path_uic and the test didn't +succeed. If configure shouldn't have tried this one, set +the environment variable UIC to the right one before running +configure. +]) +]) + + +AC_DEFUN([KDE_CHECK_UIC_FLAG], +[ + AC_MSG_CHECKING([whether uic supports -$1 ]) + kde_cache=`echo $1 | sed 'y% .=/+-%____p_%'` + AC_CACHE_VAL(kde_cv_prog_uic_$kde_cache, + [ + cat >conftest.ui < +EOT + ac_uic_testrun="$UIC_PATH -$1 $2 conftest.ui >/dev/null" + if AC_TRY_EVAL(ac_uic_testrun); then + eval "kde_cv_prog_uic_$kde_cache=yes" + else + eval "kde_cv_prog_uic_$kde_cache=no" + fi + rm -f conftest* + ]) + + if eval "test \"`echo '$kde_cv_prog_uic_'$kde_cache`\" = yes"; then + AC_MSG_RESULT([yes]) + : + $3 + else + AC_MSG_RESULT([no]) + : + $4 + fi +]) + + +dnl ------------------------------------------------------------------------ +dnl Find the meta object compiler and the ui compiler in the PATH, +dnl in $QTDIR/bin, and some more usual places +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_PATH_QT_MOC_UIC], +[ + AC_REQUIRE([KDE_CHECK_PERL]) + qt_bindirs="" + for dir in $kde_qt_dirs; do + qt_bindirs="$qt_bindirs $dir/bin $dir/src/moc" + done + qt_bindirs="$qt_bindirs /usr/bin /usr/X11R6/bin /usr/local/qt/bin" + if test ! "$ac_qt_bindir" = "NO"; then + qt_bindirs="$ac_qt_bindir $qt_bindirs" + fi + + KDE_FIND_PATH(moc, MOC, [$qt_bindirs], [KDE_MOC_ERROR_MESSAGE]) + if test -z "$UIC_NOT_NEEDED"; then + KDE_FIND_PATH(uic, UIC_PATH, [$qt_bindirs], [UIC_PATH=""]) + if test -z "$UIC_PATH" ; then + KDE_UIC_ERROR_MESSAGE + exit 1 + else + UIC=$UIC_PATH + + if test $kde_qtver = 3; then + KDE_CHECK_UIC_FLAG(L,[/nonexistent],ac_uic_supports_libpath=yes,ac_uic_supports_libpath=no) + KDE_CHECK_UIC_FLAG(nounload,,ac_uic_supports_nounload=yes,ac_uic_supports_nounload=no) + + if test x$ac_uic_supports_libpath = xyes; then + UIC="$UIC -L \$(kde_widgetdir)" + fi + if test x$ac_uic_supports_nounload = xyes; then + UIC="$UIC -nounload" + fi + fi + fi + else + UIC="echo uic not available: " + fi + + AC_SUBST(MOC) + AC_SUBST(UIC) + + UIC_TR="i18n" + if test $kde_qtver = 3; then + UIC_TR="tr2i18n" + fi + + AC_SUBST(UIC_TR) +]) + +AC_DEFUN([KDE_1_CHECK_PATHS], +[ + KDE_1_CHECK_PATH_HEADERS + + KDE_TEST_RPATH= + + if test -n "$USE_RPATH"; then + + if test -n "$kde_libraries"; then + KDE_TEST_RPATH="-R $kde_libraries" + fi + + if test -n "$qt_libraries"; then + KDE_TEST_RPATH="$KDE_TEST_RPATH -R $qt_libraries" + fi + + if test -n "$x_libraries"; then + KDE_TEST_RPATH="$KDE_TEST_RPATH -R $x_libraries" + fi + + KDE_TEST_RPATH="$KDE_TEST_RPATH $KDE_EXTRA_RPATH" + fi + +AC_MSG_CHECKING([for KDE libraries installed]) +ac_link='$LIBTOOL_SHELL --silent --mode=link ${CXX-g++} -o conftest $CXXFLAGS $all_includes $CPPFLAGS $LDFLAGS $all_libraries conftest.$ac_ext $LIBS -lkdecore $LIBQT $KDE_TEST_RPATH 1>&5' + +if AC_TRY_EVAL(ac_link) && test -s conftest; then + AC_MSG_RESULT(yes) +else + AC_MSG_ERROR([your system fails at linking a small KDE application! +Check, if your compiler is installed correctly and if you have used the +same compiler to compile Qt and kdelibs as you did use now. +For more details about this problem, look at the end of config.log.]) +fi + +if eval `KDEDIR= ./conftest 2>&5`; then + kde_result=done +else + kde_result=problems +fi + +KDEDIR= ./conftest 2> /dev/null >&5 # make an echo for config.log +kde_have_all_paths=yes + +KDE_SET_PATHS($kde_result) + +]) + +AC_DEFUN([KDE_SET_PATHS], +[ + kde_cv_all_paths="kde_have_all_paths=\"yes\" \ + kde_htmldir=\"$kde_htmldir\" \ + kde_appsdir=\"$kde_appsdir\" \ + kde_icondir=\"$kde_icondir\" \ + kde_sounddir=\"$kde_sounddir\" \ + kde_datadir=\"$kde_datadir\" \ + kde_locale=\"$kde_locale\" \ + kde_cgidir=\"$kde_cgidir\" \ + kde_confdir=\"$kde_confdir\" \ + kde_kcfgdir=\"$kde_kcfgdir\" \ + kde_mimedir=\"$kde_mimedir\" \ + kde_toolbardir=\"$kde_toolbardir\" \ + kde_wallpaperdir=\"$kde_wallpaperdir\" \ + kde_templatesdir=\"$kde_templatesdir\" \ + kde_bindir=\"$kde_bindir\" \ + kde_servicesdir=\"$kde_servicesdir\" \ + kde_servicetypesdir=\"$kde_servicetypesdir\" \ + kde_moduledir=\"$kde_moduledir\" \ + kde_styledir=\"$kde_styledir\" \ + kde_widgetdir=\"$kde_widgetdir\" \ + xdg_appsdir=\"$xdg_appsdir\" \ + xdg_menudir=\"$xdg_menudir\" \ + xdg_directorydir=\"$xdg_directorydir\" \ + kde_result=$1" +]) + +AC_DEFUN([KDE_SET_DEFAULT_PATHS], +[ +if test "$1" = "default"; then + + if test -z "$kde_htmldir"; then + kde_htmldir='\${datadir}/doc/HTML' + fi + if test -z "$kde_appsdir"; then + kde_appsdir='\${datadir}/applnk' + fi + if test -z "$kde_icondir"; then + kde_icondir='\${datadir}/icons' + fi + if test -z "$kde_sounddir"; then + kde_sounddir='\${datadir}/sounds' + fi + if test -z "$kde_datadir"; then + kde_datadir='\${datadir}/apps' + fi + if test -z "$kde_locale"; then + kde_locale='\${datadir}/locale' + fi + if test -z "$kde_cgidir"; then + kde_cgidir='\${exec_prefix}/cgi-bin' + fi + if test -z "$kde_confdir"; then + kde_confdir='\${datadir}/config' + fi + if test -z "$kde_kcfgdir"; then + kde_kcfgdir='\${datadir}/config.kcfg' + fi + if test -z "$kde_mimedir"; then + kde_mimedir='\${datadir}/mimelnk' + fi + if test -z "$kde_toolbardir"; then + kde_toolbardir='\${datadir}/toolbar' + fi + if test -z "$kde_wallpaperdir"; then + kde_wallpaperdir='\${datadir}/wallpapers' + fi + if test -z "$kde_templatesdir"; then + kde_templatesdir='\${datadir}/templates' + fi + if test -z "$kde_bindir"; then + kde_bindir='\${exec_prefix}/bin' + fi + if test -z "$kde_servicesdir"; then + kde_servicesdir='\${datadir}/services' + fi + if test -z "$kde_servicetypesdir"; then + kde_servicetypesdir='\${datadir}/servicetypes' + fi + if test -z "$kde_moduledir"; then + if test "$kde_qtver" = "2"; then + kde_moduledir='\${libdir}/kde2' + else + kde_moduledir='\${libdir}/kde3' + fi + fi + if test -z "$kde_styledir"; then + kde_styledir='\${libdir}/kde3/plugins/styles' + fi + if test -z "$kde_widgetdir"; then + kde_widgetdir='\${libdir}/kde3/plugins/designer' + fi + if test -z "$xdg_appsdir"; then + xdg_appsdir='\${datadir}/applications/kde' + fi + if test -z "$xdg_menudir"; then + xdg_menudir='\${sysconfdir}/xdg/menus' + fi + if test -z "$xdg_directorydir"; then + xdg_directorydir='\${datadir}/desktop-directories' + fi + + KDE_SET_PATHS(defaults) + +else + + if test $kde_qtver = 1; then + AC_MSG_RESULT([compiling]) + KDE_1_CHECK_PATHS + else + AC_MSG_ERROR([path checking not yet supported for KDE 2]) + fi + +fi +]) + +AC_DEFUN([KDE_CHECK_PATHS_FOR_COMPLETENESS], +[ if test -z "$kde_htmldir" || test -z "$kde_appsdir" || + test -z "$kde_icondir" || test -z "$kde_sounddir" || + test -z "$kde_datadir" || test -z "$kde_locale" || + test -z "$kde_cgidir" || test -z "$kde_confdir" || + test -z "$kde_kcfgdir" || + test -z "$kde_mimedir" || test -z "$kde_toolbardir" || + test -z "$kde_wallpaperdir" || test -z "$kde_templatesdir" || + test -z "$kde_bindir" || test -z "$kde_servicesdir" || + test -z "$kde_servicetypesdir" || test -z "$kde_moduledir" || + test -z "$kde_styledir" || test -z "kde_widgetdir" || + test -z "$xdg_appsdir" || test -z "$xdg_menudir" || test -z "$xdg_directorydir" || + test "x$kde_have_all_paths" != "xyes"; then + kde_have_all_paths=no + fi +]) + +AC_DEFUN([KDE_MISSING_PROG_ERROR], +[ + AC_MSG_ERROR([The important program $1 was not found! +Please check whether you installed KDE correctly. +]) +]) + +AC_DEFUN([KDE_MISSING_ARTS_ERROR], +[ + AC_MSG_ERROR([The important program $1 was not found! +Please check whether you installed aRts correctly or use +--without-arts to compile without aRts support (this will remove functionality). +]) +]) + +AC_DEFUN([KDE_SET_DEFAULT_BINDIRS], +[ + kde_default_bindirs="/usr/bin /usr/local/bin /opt/local/bin /usr/X11R6/bin /opt/kde/bin /opt/kde3/bin /usr/kde/bin /usr/local/kde/bin" + test -n "$KDEDIR" && kde_default_bindirs="$KDEDIR/bin $kde_default_bindirs" + if test -n "$KDEDIRS"; then + kde_save_IFS=$IFS + IFS=: + for dir in $KDEDIRS; do + kde_default_bindirs="$dir/bin $kde_default_bindirs " + done + IFS=$kde_save_IFS + fi +]) + +AC_DEFUN([KDE_SUBST_PROGRAMS], +[ + AC_ARG_WITH(arts, + AC_HELP_STRING([--without-arts],[build without aRts [default=no]]), + [build_arts=$withval], + [build_arts=yes] + ) + AM_CONDITIONAL(include_ARTS, test "$build_arts" '!=' "no") + if test "$build_arts" = "no"; then + AC_DEFINE(WITHOUT_ARTS, 1, [Defined if compiling without arts]) + fi + + KDE_SET_DEFAULT_BINDIRS + kde_default_bindirs="$exec_prefix/bin $prefix/bin $kde_libs_prefix/bin $kde_default_bindirs" + KDE_FIND_PATH(dcopidl, DCOPIDL, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidl)]) + KDE_FIND_PATH(dcopidl2cpp, DCOPIDL2CPP, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidl2cpp)]) + if test "$build_arts" '!=' "no"; then + KDE_FIND_PATH(mcopidl, MCOPIDL, [$kde_default_bindirs], [KDE_MISSING_ARTS_ERROR(mcopidl)]) + KDE_FIND_PATH(artsc-config, ARTSCCONFIG, [$kde_default_bindirs], [KDE_MISSING_ARTS_ERROR(artsc-config)]) + fi + KDE_FIND_PATH(meinproc, MEINPROC, [$kde_default_bindirs]) + + kde32ornewer=1 + kde33ornewer=1 + if test -n "$kde_qtver" && test "$kde_qtver" -lt 3; then + kde32ornewer= + kde33ornewer= + else + if test "$kde_qtver" = "3"; then + if test "$kde_qtsubver" -le 1; then + kde32ornewer= + fi + if test "$kde_qtsubver" -le 2; then + kde33ornewer= + fi + if test "$KDECONFIG" != "compiled"; then + if test `$KDECONFIG --version | grep KDE | sed 's/KDE: \(...\).*/\1/'` = 3.2; then + kde33ornewer= + fi + fi + fi + fi + + if test -n "$kde32ornewer"; then + KDE_FIND_PATH(kconfig_compiler, KCONFIG_COMPILER, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(kconfig_compiler)]) + KDE_FIND_PATH(dcopidlng, DCOPIDLNG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidlng)]) + fi + if test -n "$kde33ornewer"; then + KDE_FIND_PATH(makekdewidgets, MAKEKDEWIDGETS, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(makekdewidgets)]) + AC_SUBST(MAKEKDEWIDGETS) + fi + KDE_FIND_PATH(xmllint, XMLLINT, [${prefix}/bin ${exec_prefix}/bin], [XMLLINT=""]) + + if test -n "$MEINPROC" -a "$MEINPROC" != "compiled"; then + kde_sharedirs="/usr/share/kde /usr/local/share /usr/share /opt/kde3/share /opt/kde/share $prefix/share" + test -n "$KDEDIR" && kde_sharedirs="$KDEDIR/share $kde_sharedirs" + AC_FIND_FILE(apps/ksgmltools2/customization/kde-chunk.xsl, $kde_sharedirs, KDE_XSL_STYLESHEET) + if test "$KDE_XSL_STYLESHEET" = "NO"; then + KDE_XSL_STYLESHEET="" + else + KDE_XSL_STYLESHEET="$KDE_XSL_STYLESHEET/apps/ksgmltools2/customization/kde-chunk.xsl" + fi + fi + + DCOP_DEPENDENCIES='$(DCOPIDL)' + if test -n "$kde32ornewer"; then + KCFG_DEPENDENCIES='$(KCONFIG_COMPILER)' + DCOP_DEPENDENCIES='$(DCOPIDL) $(DCOPIDLNG)' + AC_SUBST(KCONFIG_COMPILER) + AC_SUBST(KCFG_DEPENDENCIES) + AC_SUBST(DCOPIDLNG) + fi + AC_SUBST(DCOPIDL) + AC_SUBST(DCOPIDL2CPP) + AC_SUBST(DCOP_DEPENDENCIES) + AC_SUBST(MCOPIDL) + AC_SUBST(ARTSCCONFIG) + AC_SUBST(MEINPROC) + AC_SUBST(KDE_XSL_STYLESHEET) + AC_SUBST(XMLLINT) +])dnl + +AC_DEFUN([AC_CREATE_KFSSTND], +[ +AC_REQUIRE([AC_CHECK_RPATH]) + +AC_MSG_CHECKING([for KDE paths]) +kde_result="" +kde_cached_paths=yes +AC_CACHE_VAL(kde_cv_all_paths, +[ + KDE_SET_DEFAULT_PATHS($1) + kde_cached_paths=no +]) +eval "$kde_cv_all_paths" +KDE_CHECK_PATHS_FOR_COMPLETENESS +if test "$kde_have_all_paths" = "no" && test "$kde_cached_paths" = "yes"; then + # wrong values were cached, may be, we can set better ones + kde_result= + kde_htmldir= kde_appsdir= kde_icondir= kde_sounddir= + kde_datadir= kde_locale= kde_cgidir= kde_confdir= kde_kcfgdir= + kde_mimedir= kde_toolbardir= kde_wallpaperdir= kde_templatesdir= + kde_bindir= kde_servicesdir= kde_servicetypesdir= kde_moduledir= + kde_have_all_paths= + kde_styledir= + kde_widgetdir= + xdg_appsdir = xdg_menudir= xdg_directorydir= + KDE_SET_DEFAULT_PATHS($1) + eval "$kde_cv_all_paths" + KDE_CHECK_PATHS_FOR_COMPLETENESS + kde_result="$kde_result (cache overridden)" +fi +if test "$kde_have_all_paths" = "no"; then + AC_MSG_ERROR([configure could not run a little KDE program to test the environment. +Since it had compiled and linked before, it must be a strange problem on your system. +Look at config.log for details. If you are not able to fix this, look at +http://www.kde.org/faq/installation.html or any www.kde.org mirror. +(If you're using an egcs version on Linux, you may update binutils!) +]) +else + rm -f conftest* + AC_MSG_RESULT($kde_result) +fi + +bindir=$kde_bindir + +KDE_SUBST_PROGRAMS + +]) + +AC_DEFUN([AC_SUBST_KFSSTND], +[ +AC_SUBST(kde_htmldir) +AC_SUBST(kde_appsdir) +AC_SUBST(kde_icondir) +AC_SUBST(kde_sounddir) +AC_SUBST(kde_datadir) +AC_SUBST(kde_locale) +AC_SUBST(kde_confdir) +AC_SUBST(kde_kcfgdir) +AC_SUBST(kde_mimedir) +AC_SUBST(kde_wallpaperdir) +AC_SUBST(kde_bindir) +dnl X Desktop Group standards +AC_SUBST(xdg_appsdir) +AC_SUBST(xdg_menudir) +AC_SUBST(xdg_directorydir) +dnl for KDE 2 +AC_SUBST(kde_templatesdir) +AC_SUBST(kde_servicesdir) +AC_SUBST(kde_servicetypesdir) +AC_SUBST(kde_moduledir) +AC_SUBST(kdeinitdir, '$(kde_moduledir)') +AC_SUBST(kde_styledir) +AC_SUBST(kde_widgetdir) +if test "$kde_qtver" = 1; then + kde_minidir="$kde_icondir/mini" +else +# for KDE 1 - this breaks KDE2 apps using minidir, but +# that's the plan ;-/ + kde_minidir="/dev/null" +fi +dnl AC_SUBST(kde_minidir) +dnl AC_SUBST(kde_cgidir) +dnl AC_SUBST(kde_toolbardir) +]) + +AC_DEFUN([KDE_MISC_TESTS], +[ + dnl Checks for libraries. + AC_CHECK_LIB(util, main, [LIBUTIL="-lutil"]) dnl for *BSD + AC_SUBST(LIBUTIL) + AC_CHECK_LIB(compat, main, [LIBCOMPAT="-lcompat"]) dnl for *BSD + AC_SUBST(LIBCOMPAT) + kde_have_crypt= + AC_CHECK_LIB(crypt, crypt, [LIBCRYPT="-lcrypt"; kde_have_crypt=yes], + AC_CHECK_LIB(c, crypt, [kde_have_crypt=yes], [ + AC_MSG_WARN([you have no crypt in either libcrypt or libc. +You should install libcrypt from another source or configure with PAM +support]) + kde_have_crypt=no + ])) + AC_SUBST(LIBCRYPT) + if test $kde_have_crypt = yes; then + AC_DEFINE_UNQUOTED(HAVE_CRYPT, 1, [Defines if your system has the crypt function]) + fi + AC_CHECK_SOCKLEN_T + AC_CHECK_LIB(dnet, dnet_ntoa, [X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"]) + if test $ac_cv_lib_dnet_dnet_ntoa = no; then + AC_CHECK_LIB(dnet_stub, dnet_ntoa, + [X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"]) + fi + AC_CHECK_FUNC(inet_ntoa) + if test $ac_cv_func_inet_ntoa = no; then + AC_CHECK_LIB(nsl, inet_ntoa, X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl") + fi + AC_CHECK_FUNC(connect) + if test $ac_cv_func_connect = no; then + AC_CHECK_LIB(socket, connect, X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS", , + $X_EXTRA_LIBS) + fi + + AC_CHECK_FUNC(remove) + if test $ac_cv_func_remove = no; then + AC_CHECK_LIB(posix, remove, X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix") + fi + + # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. + AC_CHECK_FUNC(shmat, , + AC_CHECK_LIB(ipc, shmat, X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc")) + + # more headers that need to be explicitly included on darwin + AC_CHECK_HEADERS(sys/types.h stdint.h) + + # sys/bitypes.h is needed for uint32_t and friends on Tru64 + AC_CHECK_HEADERS(sys/bitypes.h) + + # darwin requires a poll emulation library + AC_CHECK_LIB(poll, poll, LIB_POLL="-lpoll") + + # for some image handling on Mac OS X + AC_CHECK_HEADERS(Carbon/Carbon.h) + + # CoreAudio framework + AC_CHECK_HEADER(CoreAudio/CoreAudio.h, [ + AC_DEFINE(HAVE_COREAUDIO, 1, [Define if you have the CoreAudio API]) + FRAMEWORK_COREAUDIO="-Wl,-framework,CoreAudio" + ]) + + AC_CHECK_RES_INIT + AC_SUBST(LIB_POLL) + AC_SUBST(FRAMEWORK_COREAUDIO) + LIBSOCKET="$X_EXTRA_LIBS" + AC_SUBST(LIBSOCKET) + AC_SUBST(X_EXTRA_LIBS) + AC_CHECK_LIB(ucb, killpg, [LIBUCB="-lucb"]) dnl for Solaris2.4 + AC_SUBST(LIBUCB) + + case $host in dnl this *is* LynxOS specific + *-*-lynxos* ) + AC_MSG_CHECKING([LynxOS header file wrappers]) + [CFLAGS="$CFLAGS -D__NO_INCLUDE_WARN__"] + AC_MSG_RESULT(disabled) + AC_CHECK_LIB(bsd, gethostbyname, [LIBSOCKET="-lbsd"]) dnl for LynxOS + ;; + esac + + KDE_CHECK_TYPES + KDE_CHECK_LIBDL + KDE_CHECK_STRLCPY + KDE_CHECK_PIE_SUPPORT + +# darwin needs this to initialize the environment +AC_CHECK_HEADERS(crt_externs.h) +AC_CHECK_FUNC(_NSGetEnviron, [AC_DEFINE(HAVE_NSGETENVIRON, 1, [Define if your system needs _NSGetEnviron to set up the environment])]) + +AH_VERBATIM(_DARWIN_ENVIRON, +[ +#if defined(HAVE_NSGETENVIRON) && defined(HAVE_CRT_EXTERNS_H) +# include +# include +# define environ (*_NSGetEnviron()) +#endif +]) + +AH_VERBATIM(_AIX_STRINGS_H_BZERO, +[ +/* + * AIX defines FD_SET in terms of bzero, but fails to include + * that defines bzero. + */ + +#if defined(_AIX) +#include +#endif +]) + +AC_CHECK_FUNCS([vsnprintf snprintf]) + +AH_VERBATIM(_TRU64,[ +/* + * On HP-UX, the declaration of vsnprintf() is needed every time ! + */ + +#if !defined(HAVE_VSNPRINTF) || defined(hpux) +#if __STDC__ +#include +#include +#else +#include +#endif +#ifdef __cplusplus +extern "C" +#endif +int vsnprintf(char *str, size_t n, char const *fmt, va_list ap); +#ifdef __cplusplus +extern "C" +#endif +int snprintf(char *str, size_t n, char const *fmt, ...); +#endif +]) + +]) + +dnl ------------------------------------------------------------------------ +dnl Find the header files and libraries for X-Windows. Extended the +dnl macro AC_PATH_X +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([K_PATH_X], +[ +AC_REQUIRE([KDE_MISC_TESTS])dnl +AC_REQUIRE([KDE_CHECK_LIB64]) + +AC_ARG_ENABLE( + embedded, + AC_HELP_STRING([--enable-embedded],[link to Qt-embedded, don't use X]), + kde_use_qt_emb=$enableval, + kde_use_qt_emb=no +) + +AC_ARG_ENABLE( + qtopia, + AC_HELP_STRING([--enable-qtopia],[link to Qt-embedded, link to the Qtopia Environment]), + kde_use_qt_emb_palm=$enableval, + kde_use_qt_emb_palm=no +) + +AC_ARG_ENABLE( + mac, + AC_HELP_STRING([--enable-mac],[link to Qt/Mac (don't use X)]), + kde_use_qt_mac=$enableval, + kde_use_qt_mac=no +) + +# used to disable x11-specific stuff on special platforms +AM_CONDITIONAL(include_x11, test "$kde_use_qt_emb" = "no" && test "$kde_use_qt_mac" = "no") + +if test "$kde_use_qt_emb" = "no" && test "$kde_use_qt_mac" = "no"; then + +AC_MSG_CHECKING(for X) + +AC_CACHE_VAL(kde_cv_have_x, +[# One or both of the vars are not set, and there is no cached value. +if test "{$x_includes+set}" = set || test "$x_includes" = NONE; then + kde_x_includes=NO +else + kde_x_includes=$x_includes +fi +if test "{$x_libraries+set}" = set || test "$x_libraries" = NONE; then + kde_x_libraries=NO +else + kde_x_libraries=$x_libraries +fi + +# below we use the standard autoconf calls +ac_x_libraries=$kde_x_libraries +ac_x_includes=$kde_x_includes + +KDE_PATH_X_DIRECT +dnl AC_PATH_X_XMKMF picks /usr/lib as the path for the X libraries. +dnl Unfortunately, if compiling with the N32 ABI, this is not the correct +dnl location. The correct location is /usr/lib32 or an undefined value +dnl (the linker is smart enough to pick the correct default library). +dnl Things work just fine if you use just AC_PATH_X_DIRECT. +dnl Solaris has a similar problem. AC_PATH_X_XMKMF forces x_includes to +dnl /usr/openwin/include, which doesn't work. /usr/include does work, so +dnl x_includes should be left alone. +case "$host" in +mips-sgi-irix6*) + ;; +*-*-solaris*) + ;; +*) + _AC_PATH_X_XMKMF + if test -z "$ac_x_includes"; then + ac_x_includes="." + fi + if test -z "$ac_x_libraries"; then + ac_x_libraries="/usr/lib${kdelibsuff}" + fi +esac +#from now on we use our own again + +# when the user already gave --x-includes, we ignore +# what the standard autoconf macros told us. +if test "$kde_x_includes" = NO; then + kde_x_includes=$ac_x_includes +fi + +# for --x-libraries too +if test "$kde_x_libraries" = NO; then + kde_x_libraries=$ac_x_libraries +fi + +if test "$kde_x_includes" = NO; then + AC_MSG_ERROR([Can't find X includes. Please check your installation and add the correct paths!]) +fi + +if test "$kde_x_libraries" = NO; then + AC_MSG_ERROR([Can't find X libraries. Please check your installation and add the correct paths!]) +fi + +# Record where we found X for the cache. +kde_cv_have_x="have_x=yes \ + kde_x_includes=$kde_x_includes kde_x_libraries=$kde_x_libraries" +])dnl + +eval "$kde_cv_have_x" + +if test "$have_x" != yes; then + AC_MSG_RESULT($have_x) + no_x=yes +else + AC_MSG_RESULT([libraries $kde_x_libraries, headers $kde_x_includes]) +fi + +if test -z "$kde_x_includes" || test "x$kde_x_includes" = xNONE; then + X_INCLUDES="" + x_includes="."; dnl better than nothing :- + else + x_includes=$kde_x_includes + X_INCLUDES="-I$x_includes" +fi + +if test -z "$kde_x_libraries" || test "x$kde_x_libraries" = xNONE || test "$kde_x_libraries" = "/usr/lib"; then + X_LDFLAGS="" + x_libraries="/usr/lib"; dnl better than nothing :- + else + x_libraries=$kde_x_libraries + X_LDFLAGS="-L$x_libraries" +fi +all_includes="$X_INCLUDES" +all_libraries="$X_LDFLAGS $LDFLAGS_AS_NEEDED $LDFLAGS_NEW_DTAGS" + +# Check for libraries that X11R6 Xt/Xaw programs need. +ac_save_LDFLAGS="$LDFLAGS" +LDFLAGS="$LDFLAGS $X_LDFLAGS" +# SM needs ICE to (dynamically) link under SunOS 4.x (so we have to +# check for ICE first), but we must link in the order -lSM -lICE or +# we get undefined symbols. So assume we have SM if we have ICE. +# These have to be linked with before -lX11, unlike the other +# libraries we check for below, so use a different variable. +# --interran@uluru.Stanford.EDU, kb@cs.umb.edu. +AC_CHECK_LIB(ICE, IceConnectionNumber, + [LIBSM="-lSM -lICE"], , $X_EXTRA_LIBS) +LDFLAGS="$ac_save_LDFLAGS" + +LIB_X11='-lX11 $(LIBSOCKET)' + +AC_MSG_CHECKING(for libXext) +AC_CACHE_VAL(kde_cv_have_libXext, +[ +kde_ldflags_safe="$LDFLAGS" +kde_libs_safe="$LIBS" + +LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS" +LIBS="-lXext -lX11 $LIBSOCKET" + +AC_TRY_LINK([ +#include +#ifdef STDC_HEADERS +# include +#endif +], +[ +printf("hello Xext\n"); +], +kde_cv_have_libXext=yes, +kde_cv_have_libXext=no +) + +LDFLAGS=$kde_ldflags_safe +LIBS=$kde_libs_safe +]) + +AC_MSG_RESULT($kde_cv_have_libXext) + +if test "$kde_cv_have_libXext" = "no"; then + AC_MSG_ERROR([We need a working libXext to proceed. Since configure +can't find it itself, we stop here assuming that make wouldn't find +them either.]) +fi + +LIB_XEXT="-lXext" +QTE_NORTTI="" + +elif test "$kde_use_qt_emb" = "yes"; then + dnl We're using QT Embedded + CPPFLAGS=-DQWS + CXXFLAGS="$CXXFLAGS -fno-rtti" + QTE_NORTTI="-fno-rtti -DQWS" + X_PRE_LIBS="" + LIB_X11="" + LIB_XEXT="" + LIB_XRENDER="" + LIBSM="" + X_INCLUDES="" + X_LDFLAGS="" + x_includes="" + x_libraries="" +elif test "$kde_use_qt_mac" = "yes"; then + dnl We're using QT/Mac (I use QT_MAC so that qglobal.h doesn't *have* to + dnl be included to get the information) --Sam + CXXFLAGS="$CXXFLAGS -DQT_MAC -no-cpp-precomp" + CFLAGS="$CFLAGS -DQT_MAC -no-cpp-precomp" + X_PRE_LIBS="" + LIB_X11="" + LIB_XEXT="" + LIB_XRENDER="" + LIBSM="" + X_INCLUDES="" + X_LDFLAGS="" + x_includes="" + x_libraries="" +fi +AC_SUBST(X_PRE_LIBS) +AC_SUBST(LIB_X11) +AC_SUBST(LIB_XRENDER) +AC_SUBST(LIBSM) +AC_SUBST(X_INCLUDES) +AC_SUBST(X_LDFLAGS) +AC_SUBST(x_includes) +AC_SUBST(x_libraries) +AC_SUBST(QTE_NORTTI) +AC_SUBST(LIB_XEXT) + +]) + +AC_DEFUN([KDE_PRINT_QT_PROGRAM], +[ +AC_REQUIRE([KDE_USE_QT]) +cat > conftest.$ac_ext < +#include +EOF +if test "$kde_qtver" = "2"; then +cat >> conftest.$ac_ext < +#include +#include +EOF + +if test $kde_qtsubver -gt 0; then +cat >> conftest.$ac_ext <> conftest.$ac_ext < +#include +#include +EOF +fi + +echo "#if ! ($kde_qt_verstring)" >> conftest.$ac_ext +cat >> conftest.$ac_ext <> conftest.$ac_ext <> conftest.$ac_ext <> conftest.$ac_ext <> conftest.$ac_ext <&AC_FD_CC + cat conftest.$ac_ext >&AC_FD_CC +fi + +rm -f conftest* +CXXFLAGS="$ac_cxxflags_safe" +LDFLAGS="$ac_ldflags_safe" +LIBS="$ac_libs_safe" + +LD_LIBRARY_PATH="$ac_LD_LIBRARY_PATH_safe" +export LD_LIBRARY_PATH +LIBRARY_PATH="$ac_LIBRARY_PATH" +export LIBRARY_PATH +AC_LANG_RESTORE +]) + +if test "$kde_cv_qt_direct" = "yes"; then + AC_MSG_RESULT(yes) + $1 +else + AC_MSG_RESULT(no) + $2 +fi +]) + +dnl ------------------------------------------------------------------------ +dnl Try to find the Qt headers and libraries. +dnl $(QT_LDFLAGS) will be -Lqtliblocation (if needed) +dnl and $(QT_INCLUDES) will be -Iqthdrlocation (if needed) +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_PATH_QT_1_3], +[ +AC_REQUIRE([K_PATH_X]) +AC_REQUIRE([KDE_USE_QT]) +AC_REQUIRE([KDE_CHECK_LIB64]) + +dnl ------------------------------------------------------------------------ +dnl Add configure flag to enable linking to MT version of Qt library. +dnl ------------------------------------------------------------------------ + +AC_ARG_ENABLE( + mt, + AC_HELP_STRING([--disable-mt],[link to non-threaded Qt (deprecated)]), + kde_use_qt_mt=$enableval, + [ + if test $kde_qtver = 3; then + kde_use_qt_mt=yes + else + kde_use_qt_mt=no + fi + ] +) + +USING_QT_MT="" + +dnl ------------------------------------------------------------------------ +dnl If we not get --disable-qt-mt then adjust some vars for the host. +dnl ------------------------------------------------------------------------ + +KDE_MT_LDFLAGS= +KDE_MT_LIBS= +if test "x$kde_use_qt_mt" = "xyes"; then + KDE_CHECK_THREADING + if test "x$kde_use_threading" = "xyes"; then + CPPFLAGS="$USE_THREADS -DQT_THREAD_SUPPORT $CPPFLAGS" + KDE_MT_LDFLAGS="$USE_THREADS" + KDE_MT_LIBS="$LIBPTHREAD" + else + kde_use_qt_mt=no + fi +fi +AC_SUBST(KDE_MT_LDFLAGS) +AC_SUBST(KDE_MT_LIBS) + +kde_qt_was_given=yes + +dnl ------------------------------------------------------------------------ +dnl If we haven't been told how to link to Qt, we work it out for ourselves. +dnl ------------------------------------------------------------------------ +if test -z "$LIBQT_GLOB"; then + if test "x$kde_use_qt_emb" = "xyes"; then + LIBQT_GLOB="libqte.*" + else + LIBQT_GLOB="libqt.*" + fi +fi + +dnl ------------------------------------------------------------ +dnl If we got --enable-embedded then adjust the Qt library name. +dnl ------------------------------------------------------------ +if test "x$kde_use_qt_emb" = "xyes"; then + qtlib="qte" +else + qtlib="qt" +fi + +kde_int_qt="-l$qtlib" + +if test -z "$LIBQPE"; then +dnl ------------------------------------------------------------ +dnl If we got --enable-palmtop then add -lqpe to the link line +dnl ------------------------------------------------------------ + if test "x$kde_use_qt_emb" = "xyes"; then + if test "x$kde_use_qt_emb_palm" = "xyes"; then + LIB_QPE="-lqpe" + else + LIB_QPE="" + fi + else + LIB_QPE="" + fi +fi + +dnl ------------------------------------------------------------------------ +dnl If we got --enable-qt-mt then adjust the Qt library name for the host. +dnl ------------------------------------------------------------------------ + +if test "x$kde_use_qt_mt" = "xyes"; then + LIBQT="-l$qtlib-mt" + kde_int_qt="-l$qtlib-mt" + LIBQT_GLOB="lib$qtlib-mt.*" + USING_QT_MT="using -mt" +else + LIBQT="-l$qtlib" +fi + +if test $kde_qtver != 1; then + + AC_REQUIRE([AC_FIND_PNG]) + AC_REQUIRE([AC_FIND_JPEG]) + LIBQT="$LIBQT $LIBPNG $LIBJPEG" +fi + +if test $kde_qtver = 3; then + AC_REQUIRE([KDE_CHECK_LIBDL]) + LIBQT="$LIBQT $LIBDL" +fi + +AC_MSG_CHECKING([for Qt]) + +if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then +LIBQT="$LIBQT $X_PRE_LIBS -lXext -lX11 $LIBSM $LIBSOCKET" +fi +ac_qt_includes=NO ac_qt_libraries=NO ac_qt_bindir=NO +qt_libraries="" +qt_includes="" +AC_ARG_WITH(qt-dir, + AC_HELP_STRING([--with-qt-dir=DIR],[where the root of Qt is installed ]), + [ ac_qt_includes="$withval"/include + ac_qt_libraries="$withval"/lib${kdelibsuff} + ac_qt_bindir="$withval"/bin + ]) + +AC_ARG_WITH(qt-includes, + AC_HELP_STRING([--with-qt-includes=DIR],[where the Qt includes are. ]), + [ + ac_qt_includes="$withval" + ]) + +kde_qt_libs_given=no + +AC_ARG_WITH(qt-libraries, + AC_HELP_STRING([--with-qt-libraries=DIR],[where the Qt library is installed.]), + [ ac_qt_libraries="$withval" + kde_qt_libs_given=yes + ]) + +AC_CACHE_VAL(ac_cv_have_qt, +[#try to guess Qt locations + +qt_incdirs="" +for dir in $kde_qt_dirs; do + qt_incdirs="$qt_incdirs $dir/include $dir" +done +if test -z "$PKG_CONFIG"; then + AC_PATH_PROG(PKG_CONFIG, pkg-config, no) +fi +if test "$PKG_CONFIG" != "no" ; then + if $PKG_CONFIG --exists qt-mt ; then + qt_incdirs="$qt_incdirs `$PKG_CONFIG --variable=includedir qt-mt`" + fi +fi +qt_incdirs="$QTINC $qt_incdirs /usr/local/qt/include /usr/include/qt /usr/include /usr/X11R6/include/X11/qt /usr/X11R6/include/qt /usr/X11R6/include/qt2 /usr/include/qt3 $x_includes" +if test ! "$ac_qt_includes" = "NO"; then + qt_incdirs="$ac_qt_includes $qt_incdirs" +fi + +if test "$kde_qtver" != "1"; then + kde_qt_header=qstyle.h +else + kde_qt_header=qglobal.h +fi + +AC_FIND_FILE($kde_qt_header, $qt_incdirs, qt_incdir) +ac_qt_includes="$qt_incdir" + +qt_libdirs="" +for dir in $kde_qt_dirs; do + qt_libdirs="$qt_libdirs $dir/lib${kdelibsuff} $dir/lib $dir" +done +if test -z "$PKG_CONFIG"; then + AC_PATH_PROG(PKG_CONFIG, pkg-config, no) +fi +if test "$PKG_CONFIG" != "no" ; then + if $PKG_CONFIG --exists qt-mt ; then + qt_libdirs="$qt_incdirs `$PKG_CONFIG --variable=libdir qt-mt`" + fi +fi +qt_libdirs="$QTLIB $qt_libdirs /usr/X11R6/lib /usr/lib /usr/local/qt/lib $x_libraries" +if test ! "$ac_qt_libraries" = "NO"; then + qt_libdir=$ac_qt_libraries +else + qt_libdirs="$ac_qt_libraries $qt_libdirs" + # if the Qt was given, the chance is too big that libqt.* doesn't exist + qt_libdir=NONE + for dir in $qt_libdirs; do + try="ls -1 $dir/${LIBQT_GLOB}" + if test -n "`$try 2> /dev/null`"; then qt_libdir=$dir; break; else echo "tried $dir" >&AC_FD_CC ; fi + done +fi +for a in $qt_libdir/lib`echo ${kde_int_qt} | sed 's,^-l,,'`_incremental.*; do + if test -e "$a"; then + LIBQT="$LIBQT ${kde_int_qt}_incremental" + break + fi +done + +ac_qt_libraries="$qt_libdir" + +AC_LANG_SAVE +AC_LANG_CPLUSPLUS + +ac_cxxflags_safe="$CXXFLAGS" +ac_ldflags_safe="$LDFLAGS" +ac_libs_safe="$LIBS" + +CXXFLAGS="$CXXFLAGS -I$qt_incdir $all_includes" +LDFLAGS="$LDFLAGS -L$qt_libdir $all_libraries $USER_LDFLAGS $KDE_MT_LDFLAGS" +LIBS="$LIBS $LIBQT $KDE_MT_LIBS" + +KDE_PRINT_QT_PROGRAM + +if AC_TRY_EVAL(ac_link) && test -s conftest; then + rm -f conftest* +else + echo "configure: failed program was:" >&AC_FD_CC + cat conftest.$ac_ext >&AC_FD_CC + ac_qt_libraries="NO" +fi +rm -f conftest* +CXXFLAGS="$ac_cxxflags_safe" +LDFLAGS="$ac_ldflags_safe" +LIBS="$ac_libs_safe" + +AC_LANG_RESTORE +if test "$ac_qt_includes" = NO || test "$ac_qt_libraries" = NO; then + ac_cv_have_qt="have_qt=no" + ac_qt_notfound="" + missing_qt_mt="" + if test "$ac_qt_includes" = NO; then + if test "$ac_qt_libraries" = NO; then + ac_qt_notfound="(headers and libraries)"; + else + ac_qt_notfound="(headers)"; + fi + else + if test "x$kde_use_qt_mt" = "xyes"; then + missing_qt_mt=" +Make sure that you have compiled Qt with thread support!" + ac_qt_notfound="(library $qtlib-mt)"; + else + ac_qt_notfound="(library $qtlib)"; + fi + fi + + AC_MSG_ERROR([Qt ($kde_qt_minversion) $ac_qt_notfound not found. Please check your installation! +For more details about this problem, look at the end of config.log.$missing_qt_mt]) +else + have_qt="yes" +fi +]) + +eval "$ac_cv_have_qt" + +if test "$have_qt" != yes; then + AC_MSG_RESULT([$have_qt]); +else + ac_cv_have_qt="have_qt=yes \ + ac_qt_includes=$ac_qt_includes ac_qt_libraries=$ac_qt_libraries" + AC_MSG_RESULT([libraries $ac_qt_libraries, headers $ac_qt_includes $USING_QT_MT]) + + qt_libraries="$ac_qt_libraries" + qt_includes="$ac_qt_includes" +fi + +if test ! "$kde_qt_libs_given" = "yes" && test ! "$kde_qtver" = 3; then + KDE_CHECK_QT_DIRECT(qt_libraries= ,[]) +fi + +AC_SUBST(qt_libraries) +AC_SUBST(qt_includes) + +if test "$qt_includes" = "$x_includes" || test -z "$qt_includes"; then + QT_INCLUDES="" +else + QT_INCLUDES="-I$qt_includes" + all_includes="$QT_INCLUDES $all_includes" +fi + +if test "$qt_libraries" = "$x_libraries" || test -z "$qt_libraries"; then + QT_LDFLAGS="" +else + QT_LDFLAGS="-L$qt_libraries" + all_libraries="$QT_LDFLAGS $all_libraries" +fi +test -z "$KDE_MT_LDFLAGS" || all_libraries="$all_libraries $KDE_MT_LDFLAGS" + +AC_SUBST(QT_INCLUDES) +AC_SUBST(QT_LDFLAGS) +AC_PATH_QT_MOC_UIC + +KDE_CHECK_QT_JPEG + +if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then +LIB_QT="$kde_int_qt $LIBJPEG_QT "'$(LIBZ) $(LIBPNG) -lXext $(LIB_X11) $(LIBSM)' +else +LIB_QT="$kde_int_qt $LIBJPEG_QT "'$(LIBZ) $(LIBPNG)' +fi +test -z "$KDE_MT_LIBS" || LIB_QT="$LIB_QT $KDE_MT_LIBS" +for a in $qt_libdir/lib`echo ${kde_int_qt} | sed 's,^-l,,'`_incremental.*; do + if test -e "$a"; then + LIB_QT="$LIB_QT ${kde_int_qt}_incremental" + break + fi +done + +AC_SUBST(LIB_QT) +AC_SUBST(LIB_QPE) + +AC_SUBST(kde_qtver) +]) + +AC_DEFUN([AC_PATH_QT], +[ +AC_PATH_QT_1_3 +]) + +AC_DEFUN([KDE_CHECK_UIC_PLUGINS], +[ +AC_REQUIRE([AC_PATH_QT_MOC_UIC]) + +if test x$ac_uic_supports_libpath = xyes; then + +AC_MSG_CHECKING([if UIC has KDE plugins available]) +AC_CACHE_VAL(kde_cv_uic_plugins, +[ +cat > actest.ui << EOF + +NewConnectionDialog + + + + testInput + + + + +EOF + + + +kde_cv_uic_plugins=no +kde_line="$UIC_PATH -L $kde_widgetdir" +if test x$ac_uic_supports_nounload = xyes; then + kde_line="$kde_line -nounload" +fi +kde_line="$kde_line -impl actest.h actest.ui > actest.cpp" +if AC_TRY_EVAL(kde_line); then + # if you're trying to debug this check and think it's incorrect, + # better check your installation. The check _is_ correct - your + # installation is not. + if test -f actest.cpp && grep klineedit actest.cpp > /dev/null; then + kde_cv_uic_plugins=yes + fi +fi +rm -f actest.ui actest.cpp +]) + +AC_MSG_RESULT([$kde_cv_uic_plugins]) +if test "$kde_cv_uic_plugins" != yes; then + AC_MSG_ERROR([ +you need to install kdelibs first. + +If you did install kdelibs, then the Qt version that is picked up by +this configure is not the same version you used to compile kdelibs. +The Qt Plugin installed by kdelibs is *ONLY* loadable if it is the +_same Qt version_, compiled with the _same compiler_ and the same Qt +configuration settings. +]) +fi +fi +]) + +AC_DEFUN([KDE_CHECK_FINAL], +[ + AC_ARG_ENABLE(final, + AC_HELP_STRING([--enable-final], + [build size optimized apps (experimental - needs lots of memory)]), + kde_use_final=$enableval, kde_use_final=no) + + if test "x$kde_use_final" = "xyes"; then + KDE_USE_FINAL_TRUE="" + KDE_USE_FINAL_FALSE="#" + else + KDE_USE_FINAL_TRUE="#" + KDE_USE_FINAL_FALSE="" + fi + AC_SUBST(KDE_USE_FINAL_TRUE) + AC_SUBST(KDE_USE_FINAL_FALSE) +]) + +AC_DEFUN([KDE_CHECK_CLOSURE], +[ + AC_ARG_ENABLE(closure, + AC_HELP_STRING([--enable-closure],[delay template instantiation]), + kde_use_closure=$enableval, kde_use_closure=no) + + KDE_NO_UNDEFINED="" + if test "x$kde_use_closure" = "xyes"; then + KDE_USE_CLOSURE_TRUE="" + KDE_USE_CLOSURE_FALSE="#" +# CXXFLAGS="$CXXFLAGS $REPO" + else + KDE_USE_CLOSURE_TRUE="#" + KDE_USE_CLOSURE_FALSE="" + KDE_NO_UNDEFINED="" + case $host in + *-*-linux-gnu) + KDE_CHECK_COMPILER_FLAG([Wl,--no-undefined], + [KDE_CHECK_COMPILER_FLAG([Wl,--allow-shlib-undefined], + [KDE_NO_UNDEFINED="-Wl,--no-undefined -Wl,--allow-shlib-undefined"], + [KDE_NO_UNDEFINED=""])], + [KDE_NO_UNDEFINED=""]) + ;; + esac + fi + AC_SUBST(KDE_USE_CLOSURE_TRUE) + AC_SUBST(KDE_USE_CLOSURE_FALSE) + AC_SUBST(KDE_NO_UNDEFINED) +]) + +dnl Check if the linker supports --enable-new-dtags and --as-needed +AC_DEFUN([KDE_CHECK_NEW_LDFLAGS], +[ + AC_ARG_ENABLE(new_ldflags, + AC_HELP_STRING([--enable-new-ldflags], + [enable the new linker flags]), + kde_use_new_ldflags=$enableval, + kde_use_new_ldflags=no) + + LDFLAGS_AS_NEEDED="" + LDFLAGS_NEW_DTAGS="" + if test "x$kde_use_new_ldflags" = "xyes"; then + LDFLAGS_NEW_DTAGS="" + KDE_CHECK_COMPILER_FLAG([Wl,--enable-new-dtags], + [LDFLAGS_NEW_DTAGS="-Wl,--enable-new-dtags"],) + + KDE_CHECK_COMPILER_FLAG([Wl,--as-needed], + [LDFLAGS_AS_NEEDED="-Wl,--as-needed"],) + fi + AC_SUBST(LDFLAGS_AS_NEEDED) + AC_SUBST(LDFLAGS_NEW_DTAGS) +]) + +AC_DEFUN([KDE_CHECK_NMCHECK], +[ + AC_ARG_ENABLE(nmcheck,AC_HELP_STRING([--enable-nmcheck],[enable automatic namespace cleanness check]), + kde_use_nmcheck=$enableval, kde_use_nmcheck=no) + + if test "$kde_use_nmcheck" = "yes"; then + KDE_USE_NMCHECK_TRUE="" + KDE_USE_NMCHECK_FALSE="#" + else + KDE_USE_NMCHECK_TRUE="#" + KDE_USE_NMCHECK_FALSE="" + fi + AC_SUBST(KDE_USE_NMCHECK_TRUE) + AC_SUBST(KDE_USE_NMCHECK_FALSE) +]) + +AC_DEFUN([KDE_EXPAND_MAKEVAR], [ +savex=$exec_prefix +test "x$exec_prefix" = xNONE && exec_prefix=$prefix +tmp=$$2 +while $1=`eval echo "$tmp"`; test "x$$1" != "x$tmp"; do tmp=$$1; done +exec_prefix=$savex +]) + +dnl ------------------------------------------------------------------------ +dnl Now, the same with KDE +dnl $(KDE_LDFLAGS) will be the kdeliblocation (if needed) +dnl and $(kde_includes) will be the kdehdrlocation (if needed) +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_BASE_PATH_KDE], +[ +AC_REQUIRE([KDE_CHECK_STL]) +AC_REQUIRE([AC_PATH_QT])dnl +AC_REQUIRE([KDE_CHECK_LIB64]) + +AC_CHECK_RPATH +AC_MSG_CHECKING([for KDE]) + +if test "${prefix}" != NONE; then + kde_includes=${includedir} + KDE_EXPAND_MAKEVAR(ac_kde_includes, includedir) + + kde_libraries=${libdir} + KDE_EXPAND_MAKEVAR(ac_kde_libraries, libdir) + +else + ac_kde_includes= + ac_kde_libraries= + kde_libraries="" + kde_includes="" +fi + +AC_CACHE_VAL(ac_cv_have_kde, +[#try to guess kde locations + +if test "$kde_qtver" = 1; then + kde_check_header="ksock.h" + kde_check_lib="libkdecore.la" +else + kde_check_header="ksharedptr.h" + kde_check_lib="libkio.la" +fi + +if test -z "$1"; then + +kde_incdirs="$kde_libs_prefix/include /usr/lib/kde/include /usr/local/kde/include /usr/local/include /usr/kde/include /usr/include/kde /usr/include /opt/kde3/include /opt/kde/include $x_includes $qt_includes" +test -n "$KDEDIR" && kde_incdirs="$KDEDIR/include $KDEDIR/include/kde $KDEDIR $kde_incdirs" +kde_incdirs="$ac_kde_includes $kde_incdirs" +AC_FIND_FILE($kde_check_header, $kde_incdirs, kde_incdir) +ac_kde_includes="$kde_incdir" + +if test -n "$ac_kde_includes" && test ! -r "$ac_kde_includes/$kde_check_header"; then + AC_MSG_ERROR([ +in the prefix, you've chosen, are no KDE headers installed. This will fail. +So, check this please and use another prefix!]) +fi + +kde_libdirs="$kde_libs_prefix/lib${kdelibsuff} /usr/lib/kde/lib${kdelibsuff} /usr/local/kde/lib${kdelibsuff} /usr/kde/lib${kdelibsuff} /usr/lib${kdelibsuff}/kde /usr/lib${kdelibsuff}/kde3 /usr/lib${kdelibsuff} /usr/X11R6/lib${kdelibsuff} /usr/local/lib${kdelibsuff} /opt/kde3/lib${kdelibsuff} /opt/kde/lib${kdelibsuff} /usr/X11R6/kde/lib${kdelibsuff}" +test -n "$KDEDIR" && kde_libdirs="$KDEDIR/lib${kdelibsuff} $KDEDIR $kde_libdirs" +kde_libdirs="$ac_kde_libraries $libdir $kde_libdirs" +AC_FIND_FILE($kde_check_lib, $kde_libdirs, kde_libdir) +ac_kde_libraries="$kde_libdir" + +kde_widgetdir=NO +dnl this might be somewhere else +AC_FIND_FILE("kde3/plugins/designer/kdewidgets.la", $kde_libdirs, kde_widgetdir) + +if test -n "$ac_kde_libraries" && test ! -r "$ac_kde_libraries/$kde_check_lib"; then +AC_MSG_ERROR([ +in the prefix, you've chosen, are no KDE libraries installed. This will fail. +So, check this please and use another prefix!]) +fi + +if test -n "$kde_widgetdir" && test ! -r "$kde_widgetdir/kde3/plugins/designer/kdewidgets.la"; then +AC_MSG_ERROR([ +I can't find the designer plugins. These are required and should have been installed +by kdelibs]) +fi + +if test -n "$kde_widgetdir"; then + kde_widgetdir="$kde_widgetdir/kde3/plugins/designer" +fi + + +if test "$ac_kde_includes" = NO || test "$ac_kde_libraries" = NO || test "$kde_widgetdir" = NO; then + ac_cv_have_kde="have_kde=no" +else + ac_cv_have_kde="have_kde=yes \ + ac_kde_includes=$ac_kde_includes ac_kde_libraries=$ac_kde_libraries" +fi + +else dnl test -z $1, e.g. from kdelibs + + ac_cv_have_kde="have_kde=no" + +fi +])dnl + +eval "$ac_cv_have_kde" + +if test "$have_kde" != "yes"; then + if test "${prefix}" = NONE; then + ac_kde_prefix="$ac_default_prefix" + else + ac_kde_prefix="$prefix" + fi + if test "$exec_prefix" = NONE; then + ac_kde_exec_prefix="$ac_kde_prefix" + AC_MSG_RESULT([will be installed in $ac_kde_prefix]) + else + ac_kde_exec_prefix="$exec_prefix" + AC_MSG_RESULT([will be installed in $ac_kde_prefix and $ac_kde_exec_prefix]) + fi + + kde_libraries="${libdir}" + kde_includes="${includedir}" + +else + ac_cv_have_kde="have_kde=yes \ + ac_kde_includes=$ac_kde_includes ac_kde_libraries=$ac_kde_libraries" + AC_MSG_RESULT([libraries $ac_kde_libraries, headers $ac_kde_includes]) + + kde_libraries="$ac_kde_libraries" + kde_includes="$ac_kde_includes" +fi +AC_SUBST(kde_libraries) +AC_SUBST(kde_includes) + +if test "$kde_includes" = "$x_includes" || test "$kde_includes" = "$qt_includes" || test "$kde_includes" = "/usr/include"; then + KDE_INCLUDES="" +else + KDE_INCLUDES="-I$kde_includes" + all_includes="$KDE_INCLUDES $all_includes" +fi + +KDE_DEFAULT_CXXFLAGS="-DQT_CLEAN_NAMESPACE -DQT_NO_ASCII_CAST -DQT_NO_STL -DQT_NO_COMPAT -DQT_NO_TRANSLATION" + +KDE_LDFLAGS="-L$kde_libraries" +if test ! "$kde_libraries" = "$x_libraries" && test ! "$kde_libraries" = "$qt_libraries" ; then + all_libraries="$KDE_LDFLAGS $all_libraries" +fi + +AC_SUBST(KDE_LDFLAGS) +AC_SUBST(KDE_INCLUDES) + +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + +all_libraries="$all_libraries $USER_LDFLAGS" +all_includes="$all_includes $USER_INCLUDES" +AC_SUBST(all_includes) +AC_SUBST(all_libraries) + +if test -z "$1"; then +KDE_CHECK_UIC_PLUGINS +fi + +ac_kde_libraries="$kde_libdir" + +AC_SUBST(AUTODIRS) + + +]) + +AC_DEFUN([KDE_CHECK_EXTRA_LIBS], +[ +AC_MSG_CHECKING(for extra includes) +AC_ARG_WITH(extra-includes,AC_HELP_STRING([--with-extra-includes=DIR],[adds non standard include paths]), + kde_use_extra_includes="$withval", + kde_use_extra_includes=NONE +) +kde_extra_includes= +if test -n "$kde_use_extra_includes" && \ + test "$kde_use_extra_includes" != "NONE"; then + + ac_save_ifs=$IFS + IFS=':' + for dir in $kde_use_extra_includes; do + kde_extra_includes="$kde_extra_includes $dir" + USER_INCLUDES="$USER_INCLUDES -I$dir" + done + IFS=$ac_save_ifs + kde_use_extra_includes="added" +else + kde_use_extra_includes="no" +fi +AC_SUBST(USER_INCLUDES) + +AC_MSG_RESULT($kde_use_extra_includes) + +kde_extra_libs= +AC_MSG_CHECKING(for extra libs) +AC_ARG_WITH(extra-libs,AC_HELP_STRING([--with-extra-libs=DIR],[adds non standard library paths]), + kde_use_extra_libs=$withval, + kde_use_extra_libs=NONE +) +if test -n "$kde_use_extra_libs" && \ + test "$kde_use_extra_libs" != "NONE"; then + + ac_save_ifs=$IFS + IFS=':' + for dir in $kde_use_extra_libs; do + kde_extra_libs="$kde_extra_libs $dir" + KDE_EXTRA_RPATH="$KDE_EXTRA_RPATH -R $dir" + USER_LDFLAGS="$USER_LDFLAGS -L$dir" + done + IFS=$ac_save_ifs + kde_use_extra_libs="added" +else + kde_use_extra_libs="no" +fi + +AC_SUBST(USER_LDFLAGS) + +AC_MSG_RESULT($kde_use_extra_libs) + +]) + +AC_DEFUN([KDE_1_CHECK_PATH_HEADERS], +[ + AC_MSG_CHECKING([for KDE headers installed]) + AC_LANG_SAVE + AC_LANG_CPLUSPLUS +cat > conftest.$ac_ext < +#endif +#include +#include "confdefs.h" +#include + +int main() { + printf("kde_htmldir=\\"%s\\"\n", KApplication::kde_htmldir().data()); + printf("kde_appsdir=\\"%s\\"\n", KApplication::kde_appsdir().data()); + printf("kde_icondir=\\"%s\\"\n", KApplication::kde_icondir().data()); + printf("kde_sounddir=\\"%s\\"\n", KApplication::kde_sounddir().data()); + printf("kde_datadir=\\"%s\\"\n", KApplication::kde_datadir().data()); + printf("kde_locale=\\"%s\\"\n", KApplication::kde_localedir().data()); + printf("kde_cgidir=\\"%s\\"\n", KApplication::kde_cgidir().data()); + printf("kde_confdir=\\"%s\\"\n", KApplication::kde_configdir().data()); + printf("kde_mimedir=\\"%s\\"\n", KApplication::kde_mimedir().data()); + printf("kde_toolbardir=\\"%s\\"\n", KApplication::kde_toolbardir().data()); + printf("kde_wallpaperdir=\\"%s\\"\n", + KApplication::kde_wallpaperdir().data()); + printf("kde_bindir=\\"%s\\"\n", KApplication::kde_bindir().data()); + printf("kde_partsdir=\\"%s\\"\n", KApplication::kde_partsdir().data()); + printf("kde_servicesdir=\\"/tmp/dummy\\"\n"); + printf("kde_servicetypesdir=\\"/tmp/dummy\\"\n"); + printf("kde_moduledir=\\"/tmp/dummy\\"\n"); + printf("kde_styledir=\\"/tmp/dummy\\"\n"); + printf("kde_widgetdir=\\"/tmp/dummy\\"\n"); + printf("xdg_appsdir=\\"/tmp/dummy\\"\n"); + printf("xdg_menudir=\\"/tmp/dummy\\"\n"); + printf("xdg_directorydir=\\"/tmp/dummy\\"\n"); + printf("kde_kcfgdir=\\"/tmp/dummy\\"\n"); + return 0; + } +EOF + + ac_save_CPPFLAGS=$CPPFLAGS + CPPFLAGS="$all_includes $CPPFLAGS" + if AC_TRY_EVAL(ac_compile); then + AC_MSG_RESULT(yes) + else + AC_MSG_ERROR([your system is not able to compile a small KDE application! +Check, if you installed the KDE header files correctly. +For more details about this problem, look at the end of config.log.]) + fi + CPPFLAGS=$ac_save_CPPFLAGS + + AC_LANG_RESTORE +]) + +AC_DEFUN([KDE_CHECK_KDEQTADDON], +[ +AC_MSG_CHECKING(for kde-qt-addon) +AC_CACHE_VAL(kde_cv_have_kdeqtaddon, +[ + kde_ldflags_safe="$LDFLAGS" + kde_libs_safe="$LIBS" + kde_cxxflags_safe="$CXXFLAGS" + + LIBS="-lkde-qt-addon $LIBQT $LIBS" + CXXFLAGS="$CXXFLAGS -I$prefix/include -I$prefix/include/kde $all_includes" + LDFLAGS="$LDFLAGS $all_libraries $USER_LDFLAGS" + + AC_TRY_LINK([ + #include + ], + [ + QDomDocument doc; + ], + kde_cv_have_kdeqtaddon=yes, + kde_cv_have_kdeqtaddon=no + ) + + LDFLAGS=$kde_ldflags_safe + LIBS=$kde_libs_safe + CXXFLAGS=$kde_cxxflags_safe +]) + +AC_MSG_RESULT($kde_cv_have_kdeqtaddon) + +if test "$kde_cv_have_kdeqtaddon" = "no"; then + AC_MSG_ERROR([Can't find libkde-qt-addon. You need to install it first. +It is a separate package (and CVS module) named kde-qt-addon.]) +fi +]) + +AC_DEFUN([KDE_CREATE_LIBS_ALIASES], +[ + AC_REQUIRE([KDE_MISC_TESTS]) + AC_REQUIRE([KDE_CHECK_LIBDL]) + AC_REQUIRE([K_PATH_X]) + +if test $kde_qtver = 3; then + case $host in + *cygwin*) lib_kded="-lkdeinit_kded" ;; + *) lib_kded="" ;; + esac + AC_SUBST(LIB_KDED, $lib_kded) + AC_SUBST(LIB_KDECORE, "-lkdecore") + AC_SUBST(LIB_KDEUI, "-lkdeui") + AC_SUBST(LIB_KIO, "-lkio") + AC_SUBST(LIB_KJS, "-lkjs") + AC_SUBST(LIB_SMB, "-lsmb") + AC_SUBST(LIB_KAB, "-lkab") + AC_SUBST(LIB_KABC, "-lkabc") + AC_SUBST(LIB_KHTML, "-lkhtml") + AC_SUBST(LIB_KSPELL, "-lkspell") + AC_SUBST(LIB_KPARTS, "-lkparts") + AC_SUBST(LIB_KDEPRINT, "-lkdeprint") + AC_SUBST(LIB_KUTILS, "-lkutils") + AC_SUBST(LIB_KDEPIM, "-lkdepim") + AC_SUBST(LIB_KIMPROXY, "-lkimproxy") + AC_SUBST(LIB_KNEWSTUFF, "-lknewstuff") + AC_SUBST(LIB_KDNSSD, "-lkdnssd") + AC_SUBST(LIB_KUNITTEST, "-lkunittest") +# these are for backward compatibility + AC_SUBST(LIB_KSYCOCA, "-lkio") + AC_SUBST(LIB_KFILE, "-lkio") +elif test $kde_qtver = 2; then + AC_SUBST(LIB_KDECORE, "-lkdecore") + AC_SUBST(LIB_KDEUI, "-lkdeui") + AC_SUBST(LIB_KIO, "-lkio") + AC_SUBST(LIB_KSYCOCA, "-lksycoca") + AC_SUBST(LIB_SMB, "-lsmb") + AC_SUBST(LIB_KFILE, "-lkfile") + AC_SUBST(LIB_KAB, "-lkab") + AC_SUBST(LIB_KHTML, "-lkhtml") + AC_SUBST(LIB_KSPELL, "-lkspell") + AC_SUBST(LIB_KPARTS, "-lkparts") + AC_SUBST(LIB_KDEPRINT, "-lkdeprint") +else + AC_SUBST(LIB_KDECORE, "-lkdecore -lXext $(LIB_QT)") + AC_SUBST(LIB_KDEUI, "-lkdeui $(LIB_KDECORE)") + AC_SUBST(LIB_KFM, "-lkfm $(LIB_KDECORE)") + AC_SUBST(LIB_KFILE, "-lkfile $(LIB_KFM) $(LIB_KDEUI)") + AC_SUBST(LIB_KAB, "-lkab $(LIB_KIMGIO) $(LIB_KDECORE)") +fi +]) + +AC_DEFUN([AC_PATH_KDE], +[ + AC_BASE_PATH_KDE + AC_ARG_ENABLE(path-check,AC_HELP_STRING([--disable-path-check],[don't try to find out, where to install]), + [ + if test "$enableval" = "no"; + then ac_use_path_checking="default" + else ac_use_path_checking="" + fi + ], + [ + if test "$kde_qtver" = 1; + then ac_use_path_checking="" + else ac_use_path_checking="default" + fi + ] + ) + + AC_CREATE_KFSSTND($ac_use_path_checking) + + AC_SUBST_KFSSTND + KDE_CREATE_LIBS_ALIASES +]) + +dnl KDE_CHECK_FUNC_EXT(, [headers], [sample-use], [C prototype], [autoheader define], [call if found]) +AC_DEFUN([KDE_CHECK_FUNC_EXT], +[ +AC_MSG_CHECKING(for $1) +AC_CACHE_VAL(kde_cv_func_$1, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +save_CXXFLAGS="$CXXFLAGS" +kde_safe_LIBS="$LIBS" +LIBS="$LIBS $X_EXTRA_LIBS" +if test "$GXX" = "yes"; then +CXXFLAGS="$CXXFLAGS -pedantic-errors" +fi +AC_TRY_COMPILE([ +$2 +], +[ +$3 +], +kde_cv_func_$1=yes, +kde_cv_func_$1=no) +CXXFLAGS="$save_CXXFLAGS" +LIBS="$kde_safe_LIBS" +AC_LANG_RESTORE +]) + +AC_MSG_RESULT($kde_cv_func_$1) + +AC_MSG_CHECKING([if $1 needs custom prototype]) +AC_CACHE_VAL(kde_cv_proto_$1, +[ +if test "x$kde_cv_func_$1" = xyes; then + kde_cv_proto_$1=no +else + case "$1" in + setenv|unsetenv|usleep|random|srandom|seteuid|mkstemps|mkstemp|revoke|vsnprintf|strlcpy|strlcat) + kde_cv_proto_$1="yes - in libkdefakes" + ;; + *) + kde_cv_proto_$1=unknown + ;; + esac +fi + +if test "x$kde_cv_proto_$1" = xunknown; then + +AC_LANG_SAVE +AC_LANG_CPLUSPLUS + kde_safe_libs=$LIBS + LIBS="$LIBS $X_EXTRA_LIBS" + AC_TRY_LINK([ +$2 + +extern "C" $4; +], +[ +$3 +], +[ kde_cv_func_$1=yes + kde_cv_proto_$1=yes ], + [kde_cv_proto_$1="$1 unavailable"] +) +LIBS=$kde_safe_libs +AC_LANG_RESTORE +fi +]) +AC_MSG_RESULT($kde_cv_proto_$1) + +if test "x$kde_cv_func_$1" = xyes; then + AC_DEFINE(HAVE_$5, 1, [Define if you have $1]) + $6 +fi +if test "x$kde_cv_proto_$1" = xno; then + AC_DEFINE(HAVE_$5_PROTO, 1, + [Define if you have the $1 prototype]) +fi + +AH_VERBATIM([_HAVE_$5_PROTO], +[ +#if !defined(HAVE_$5_PROTO) +#ifdef __cplusplus +extern "C" { +#endif +$4; +#ifdef __cplusplus +} +#endif +#endif +]) +]) + +AC_DEFUN([AC_CHECK_SETENV], +[ + KDE_CHECK_FUNC_EXT(setenv, [ +#include +], + [setenv("VAR", "VALUE", 1);], + [int setenv (const char *, const char *, int)], + [SETENV]) +]) + +AC_DEFUN([AC_CHECK_UNSETENV], +[ + KDE_CHECK_FUNC_EXT(unsetenv, [ +#include +], + [unsetenv("VAR");], + [void unsetenv (const char *)], + [UNSETENV]) +]) + +AC_DEFUN([AC_CHECK_GETDOMAINNAME], +[ + KDE_CHECK_FUNC_EXT(getdomainname, [ +#include +#include +#include +], + [ +char buffer[200]; +getdomainname(buffer, 200); +], + [#include + int getdomainname (char *, size_t)], + [GETDOMAINNAME]) +]) + +AC_DEFUN([AC_CHECK_GETHOSTNAME], +[ + KDE_CHECK_FUNC_EXT(gethostname, [ +#include +#include +], + [ +char buffer[200]; +gethostname(buffer, 200); +], + [int gethostname (char *, unsigned int)], + [GETHOSTNAME]) +]) + +AC_DEFUN([AC_CHECK_USLEEP], +[ + KDE_CHECK_FUNC_EXT(usleep, [ +#include +], + [ +usleep(200); +], + [int usleep (unsigned int)], + [USLEEP]) +]) + + +AC_DEFUN([AC_CHECK_RANDOM], +[ + KDE_CHECK_FUNC_EXT(random, [ +#include +], + [ +random(); +], + [long int random(void)], + [RANDOM]) + + KDE_CHECK_FUNC_EXT(srandom, [ +#include +], + [ +srandom(27); +], + [void srandom(unsigned int)], + [SRANDOM]) + +]) + +AC_DEFUN([AC_CHECK_INITGROUPS], +[ + KDE_CHECK_FUNC_EXT(initgroups, [ +#include +#include +#include +], + [ +char buffer[200]; +initgroups(buffer, 27); +], + [int initgroups(const char *, gid_t)], + [INITGROUPS]) +]) + +AC_DEFUN([AC_CHECK_MKSTEMPS], +[ + KDE_CHECK_FUNC_EXT(mkstemps, [ +#include +#include +], + [ +mkstemps("/tmp/aaaXXXXXX", 6); +], + [int mkstemps(char *, int)], + [MKSTEMPS]) +]) + +AC_DEFUN([AC_CHECK_MKSTEMP], +[ + KDE_CHECK_FUNC_EXT(mkstemp, [ +#include +#include +], + [ +mkstemp("/tmp/aaaXXXXXX"); +], + [int mkstemp(char *)], + [MKSTEMP]) +]) + +AC_DEFUN([AC_CHECK_MKDTEMP], +[ + KDE_CHECK_FUNC_EXT(mkdtemp, [ +#include +#include +], + [ +mkdtemp("/tmp/aaaXXXXXX"); +], + [char *mkdtemp(char *)], + [MKDTEMP]) +]) + + +AC_DEFUN([AC_CHECK_RES_INIT], +[ + AC_MSG_CHECKING([if res_init needs -lresolv]) + kde_libs_safe="$LIBS" + LIBS="$LIBS $X_EXTRA_LIBS -lresolv" + AC_TRY_LINK( + [ +#include +#include +#include +#include + ], + [ + res_init(); + ], + [ + LIBRESOLV="-lresolv" + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_RES_INIT, 1, [Define if you have the res_init function]) + ], + [ AC_MSG_RESULT(no) ] + ) + LIBS=$kde_libs_safe + AC_SUBST(LIBRESOLV) + + KDE_CHECK_FUNC_EXT(res_init, + [ +#include +#include +#include +#include + ], + [res_init()], + [int res_init(void)], + [RES_INIT]) +]) + +AC_DEFUN([AC_CHECK_STRLCPY], +[ + KDE_CHECK_FUNC_EXT(strlcpy, [ +#include +], +[ char buf[20]; + strlcpy(buf, "KDE function test", sizeof(buf)); +], + [unsigned long strlcpy(char*, const char*, unsigned long)], + [STRLCPY]) +]) + +AC_DEFUN([AC_CHECK_STRLCAT], +[ + KDE_CHECK_FUNC_EXT(strlcat, [ +#include +], +[ char buf[20]; + buf[0]='\0'; + strlcat(buf, "KDE function test", sizeof(buf)); +], + [unsigned long strlcat(char*, const char*, unsigned long)], + [STRLCAT]) +]) + +AC_DEFUN([AC_CHECK_RES_QUERY], +[ + KDE_CHECK_FUNC_EXT(res_query, [ +#include +#include +#include +#include +#include +], +[ +res_query(NULL, 0, 0, NULL, 0); +], + [int res_query(const char *, int, int, unsigned char *, int)], + [RES_QUERY]) +]) + +AC_DEFUN([AC_CHECK_DN_SKIPNAME], +[ + KDE_CHECK_FUNC_EXT(dn_skipname, [ +#include +#include +#include +#include +], +[ +dn_skipname (NULL, NULL); +], + [int dn_skipname (unsigned char *, unsigned char *)], + [DN_SKIPNAME]) +]) + + +AC_DEFUN([AC_FIND_GIF], + [AC_MSG_CHECKING([for giflib]) +AC_CACHE_VAL(ac_cv_lib_gif, +[ac_save_LIBS="$LIBS" +if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then +LIBS="$all_libraries -lgif -lX11 $LIBSOCKET" +else +LIBS="$all_libraries -lgif" +fi +AC_TRY_LINK(dnl +[ +#ifdef __cplusplus +extern "C" { +#endif +int GifLastError(void); +#ifdef __cplusplus +} +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +], + [return GifLastError();], + eval "ac_cv_lib_gif=yes", + eval "ac_cv_lib_gif=no") +LIBS="$ac_save_LIBS" +])dnl +if eval "test \"`echo $ac_cv_lib_gif`\" = yes"; then + AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(HAVE_LIBGIF, 1, [Define if you have libgif]) +else + AC_MSG_ERROR(You need giflib30. Please install the kdesupport package) +fi +]) + +AC_DEFUN([KDE_FIND_JPEG_HELPER], +[ +AC_MSG_CHECKING([for libjpeg$2]) +AC_CACHE_VAL(ac_cv_lib_jpeg_$1, +[ +ac_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS -ljpeg$2 -lm" +ac_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK( +[ +#ifdef __cplusplus +extern "C" { +#endif +void jpeg_CreateDecompress(); +#ifdef __cplusplus +} +#endif +], +[jpeg_CreateDecompress();], + eval "ac_cv_lib_jpeg_$1=-ljpeg$2", + eval "ac_cv_lib_jpeg_$1=no") +LIBS="$ac_save_LIBS" +CFLAGS="$ac_save_CFLAGS" +]) + +if eval "test ! \"`echo $ac_cv_lib_jpeg_$1`\" = no"; then + LIBJPEG="$ac_cv_lib_jpeg_$1" + AC_MSG_RESULT($ac_cv_lib_jpeg_$1) +else + AC_MSG_RESULT(no) + $3 +fi + +]) + +AC_DEFUN([AC_FIND_JPEG], +[ +dnl first look for libraries +KDE_FIND_JPEG_HELPER(6b, 6b, + KDE_FIND_JPEG_HELPER(normal, [], + [ + LIBJPEG= + ] + ) +) + +dnl then search the headers (can't use simply AC_TRY_xxx, as jpeglib.h +dnl requires system dependent includes loaded before it) +jpeg_incdirs="$includedir /usr/include /usr/local/include $kde_extra_includes" +AC_FIND_FILE(jpeglib.h, $jpeg_incdirs, jpeg_incdir) +test "x$jpeg_incdir" = xNO && jpeg_incdir= + +dnl if headers _and_ libraries are missing, this is no error, and we +dnl continue with a warning (the user will get no jpeg support in khtml) +dnl if only one is missing, it means a configuration error, but we still +dnl only warn +if test -n "$jpeg_incdir" && test -n "$LIBJPEG" ; then + AC_DEFINE_UNQUOTED(HAVE_LIBJPEG, 1, [Define if you have libjpeg]) +else + if test -n "$jpeg_incdir" || test -n "$LIBJPEG" ; then + AC_MSG_WARN([ +There is an installation error in jpeg support. You seem to have only one +of either the headers _or_ the libraries installed. You may need to either +provide correct --with-extra-... options, or the development package of +libjpeg6b. You can get a source package of libjpeg from http://www.ijg.org/ +Disabling JPEG support. +]) + else + AC_MSG_WARN([libjpeg not found. disable JPEG support.]) + fi + jpeg_incdir= + LIBJPEG= +fi + +AC_SUBST(LIBJPEG) +AH_VERBATIM(_AC_CHECK_JPEG, +[/* + * jpeg.h needs HAVE_BOOLEAN, when the system uses boolean in system + * headers and I'm too lazy to write a configure test as long as only + * unixware is related + */ +#ifdef _UNIXWARE +#define HAVE_BOOLEAN +#endif +]) +]) + +AC_DEFUN([KDE_CHECK_QT_JPEG], +[ +if test -n "$LIBJPEG"; then +AC_MSG_CHECKING([if Qt needs $LIBJPEG]) +AC_CACHE_VAL(kde_cv_qt_jpeg, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +ac_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS $LIBQT" +LIBS=`echo $LIBS | sed "s/$LIBJPEG//"` +ac_save_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK( +[#include ], + [ + int argc; + char** argv; + QApplication app(argc, argv);], + eval "kde_cv_qt_jpeg=no", + eval "kde_cv_qt_jpeg=yes") +LIBS="$ac_save_LIBS" +CXXFLAGS="$ac_save_CXXFLAGS" +AC_LANG_RESTORE +fi +]) + +if eval "test ! \"`echo $kde_cv_qt_jpeg`\" = no"; then + AC_MSG_RESULT(yes) + LIBJPEG_QT='$(LIBJPEG)' +else + AC_MSG_RESULT(no) + LIBJPEG_QT= +fi + +]) + +AC_DEFUN([AC_FIND_ZLIB], +[ +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_MSG_CHECKING([for libz]) +AC_CACHE_VAL(ac_cv_lib_z, +[ +kde_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS -lz $LIBSOCKET" +kde_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK(dnl +[ +#include +#include +], +[ + char buf[42]; + gzFile f = (gzFile) 0; + /* this would segfault.. but we only link, don't run */ + (void) gzgets(f, buf, sizeof(buf)); + + return (strcmp(zlibVersion(), ZLIB_VERSION) == 0); +], + eval "ac_cv_lib_z='-lz'", + eval "ac_cv_lib_z=no") +LIBS="$kde_save_LIBS" +CFLAGS="$kde_save_CFLAGS" +])dnl +if test ! "$ac_cv_lib_z" = no; then + AC_DEFINE_UNQUOTED(HAVE_LIBZ, 1, [Define if you have libz]) + LIBZ="$ac_cv_lib_z" + AC_MSG_RESULT($ac_cv_lib_z) +else + AC_MSG_ERROR(not found. + Possibly configure picks up an outdated version + installed by XFree86. Remove it from your system. + + Check your installation and look into config.log) + LIBZ="" +fi +AC_SUBST(LIBZ) +]) + +AC_DEFUN([KDE_TRY_TIFFLIB], +[ +AC_MSG_CHECKING([for libtiff $1]) + +AC_CACHE_VAL(kde_cv_libtiff_$1, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +kde_save_LIBS="$LIBS" +if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then +LIBS="$all_libraries $USER_LDFLAGS -l$1 $LIBJPEG $LIBZ -lX11 $LIBSOCKET -lm" +else +LIBS="$all_libraries $USER_LDFLAGS -l$1 $LIBJPEG $LIBZ -lm" +fi +kde_save_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES" + +AC_TRY_LINK(dnl +[ +#include +], + [return (TIFFOpen( "", "r") == 0); ], +[ + kde_cv_libtiff_$1="-l$1 $LIBJPEG $LIBZ" +], [ + kde_cv_libtiff_$1=no +]) + +LIBS="$kde_save_LIBS" +CXXFLAGS="$kde_save_CXXFLAGS" +AC_LANG_RESTORE +]) + +if test "$kde_cv_libtiff_$1" = "no"; then + AC_MSG_RESULT(no) + LIBTIFF="" + $3 +else + LIBTIFF="$kde_cv_libtiff_$1" + AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(HAVE_LIBTIFF, 1, [Define if you have libtiff]) + $2 +fi + +]) + +AC_DEFUN([AC_FIND_TIFF], +[ +AC_REQUIRE([K_PATH_X]) +AC_REQUIRE([AC_FIND_ZLIB]) +AC_REQUIRE([AC_FIND_JPEG]) +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + +KDE_TRY_TIFFLIB(tiff, [], + KDE_TRY_TIFFLIB(tiff34)) + +AC_SUBST(LIBTIFF) +]) + +AC_DEFUN([KDE_FIND_LIBEXR], +[ +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_REQUIRE([AC_FIND_ZLIB]) +AC_CACHE_VAL(ac_cv_libexr, +[ + if test -z "$PKG_CONFIG"; then + AC_PATH_PROG(PKG_CONFIG, pkg-config, no) + fi + + AC_MSG_CHECKING([for OpenEXR libraries]) + + if test "$PKG_CONFIG" = "no" ; then + AC_MSG_RESULT(no) + echo "*** The pkg-config script could not be found. Make sure it is" + echo "*** in your path, or set the PKG_CONFIG environment variable" + echo "*** to the full path to pkg-config." + echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." + else + if ! $PKG_CONFIG --exists OpenEXR ; then + AC_MSG_RESULT(no) + EXRSTATUS=no + else + if ! $PKG_CONFIG --atleast-version="1.1.1" OpenEXR ; then + AC_MSG_RESULT(no) + EXRSTATUS=old + else + kde_save_LIBS="$LIBS" + LIBS="$LIBS $all_libraries $USER_LDFLAGS `pkg-config --libs OpenEXR` $LIBZ" + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + kde_save_CXXFLAGS="$CXXFLAGS" + EXR_FLAGS=`$PKG_CONFIG --cflags OpenEXR` + CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES $EXR_FLAGS" + + AC_TRY_LINK(dnl + [ + #include + ], + [ + using namespace Imf; + RgbaInputFile file ("dummy"); + return 0; + ], + eval "ac_cv_libexr='`pkg-config --libs OpenEXR`'", + eval "ac_cv_libexr=no" + ) + LIBS="$kde_save_LIBS" + CXXFLAGS="$kde_save_CXXFLAGS" + AC_LANG_RESTORE + ])dnl + if eval "test ! \"`echo $ac_cv_libexr`\" = no"; then + AC_DEFINE_UNQUOTED(HAVE_EXR, 1, [Define if you have OpenEXR]) + LIB_EXR="$ac_cv_libexr" + AC_MSG_RESULT($ac_cv_libexr) + else + AC_MSG_RESULT(no) + LIB_EXR="" + fi + fi + fi + fi + AC_SUBST(LIB_EXR) + AC_SUBST(EXR_FLAGS) +]) + + + +AC_DEFUN([AC_FIND_PNG], +[ +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_REQUIRE([AC_FIND_ZLIB]) +AC_MSG_CHECKING([for libpng]) +AC_CACHE_VAL(ac_cv_lib_png, +[ +kde_save_LIBS="$LIBS" +if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then +LIBS="$LIBS $all_libraries $USER_LDFLAGS -lpng $LIBZ -lm -lX11 $LIBSOCKET" +else +LIBS="$LIBS $all_libraries $USER_LDFLAGS -lpng $LIBZ -lm" +fi +kde_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" + +AC_TRY_LINK(dnl + [ + #include + ], + [ + png_structp png_ptr = png_create_read_struct( /* image ptr */ + PNG_LIBPNG_VER_STRING, 0, 0, 0 ); + return( png_ptr != 0 ); + ], + eval "ac_cv_lib_png='-lpng $LIBZ -lm'", + eval "ac_cv_lib_png=no" +) +LIBS="$kde_save_LIBS" +CFLAGS="$kde_save_CFLAGS" +])dnl +if eval "test ! \"`echo $ac_cv_lib_png`\" = no"; then + AC_DEFINE_UNQUOTED(HAVE_LIBPNG, 1, [Define if you have libpng]) + LIBPNG="$ac_cv_lib_png" + AC_SUBST(LIBPNG) + AC_MSG_RESULT($ac_cv_lib_png) +else + AC_MSG_RESULT(no) + LIBPNG="" + AC_SUBST(LIBPNG) +fi +]) + + +AC_DEFUN([AC_FIND_JASPER], +[ +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_REQUIRE([AC_FIND_JPEG]) +AC_MSG_CHECKING([for jasper]) +AC_CACHE_VAL(ac_cv_jasper, +[ +kde_save_LIBS="$LIBS" +LIBS="$LIBS $all_libraries $USER_LDFLAGS -ljasper $LIBJPEG -lm" +kde_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" + +AC_TRY_LINK(dnl + [ + #include + ], + [ + return( jas_init() ); + ], + eval "ac_cv_jasper='-ljasper $LIBJPEG -lm'", + eval "ac_cv_jasper=no" +) +LIBS="$kde_save_LIBS" +CFLAGS="$kde_save_CFLAGS" +])dnl +if eval "test ! \"`echo $ac_cv_jasper`\" = no"; then + AC_DEFINE_UNQUOTED(HAVE_JASPER, 1, [Define if you have jasper]) + LIB_JASPER="$ac_cv_jasper" + AC_MSG_RESULT($ac_cv_jasper) +else + AC_MSG_RESULT(no) + LIB_JASPER="" +fi +AC_SUBST(LIB_JASPER) +]) + +AC_DEFUN([AC_CHECK_BOOL], +[ + AC_DEFINE_UNQUOTED(HAVE_BOOL, 1, [You _must_ have bool]) +]) + +AC_DEFUN([AC_CHECK_GNU_EXTENSIONS], +[ +AC_MSG_CHECKING(if you need GNU extensions) +AC_CACHE_VAL(ac_cv_gnu_extensions, +[ +cat > conftest.c << EOF +#include + +#ifdef __GNU_LIBRARY__ +yes +#endif +EOF + +if (eval "$ac_cpp conftest.c") 2>&5 | + egrep "yes" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_gnu_extensions=yes +else + ac_cv_gnu_extensions=no +fi +]) + +AC_MSG_RESULT($ac_cv_gnu_extensions) +if test "$ac_cv_gnu_extensions" = "yes"; then + AC_DEFINE_UNQUOTED(_GNU_SOURCE, 1, [Define if you need to use the GNU extensions]) +fi +]) + +AC_DEFUN([KDE_CHECK_COMPILER_FLAG], +[ +AC_MSG_CHECKING([whether $CXX supports -$1]) +kde_cache=`echo $1 | sed 'y% .=/+-,%____p__%'` +AC_CACHE_VAL(kde_cv_prog_cxx_$kde_cache, +[ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -$1" + AC_TRY_LINK([],[ return 0; ], [eval "kde_cv_prog_cxx_$kde_cache=yes"], []) + CXXFLAGS="$save_CXXFLAGS" + AC_LANG_RESTORE +]) +if eval "test \"`echo '$kde_cv_prog_cxx_'$kde_cache`\" = yes"; then + AC_MSG_RESULT(yes) + : + $2 +else + AC_MSG_RESULT(no) + : + $3 +fi +]) + +AC_DEFUN([KDE_CHECK_C_COMPILER_FLAG], +[ +AC_MSG_CHECKING([whether $CC supports -$1]) +kde_cache=`echo $1 | sed 'y% .=/+-,%____p__%'` +AC_CACHE_VAL(kde_cv_prog_cc_$kde_cache, +[ + AC_LANG_SAVE + AC_LANG_C + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -$1" + AC_TRY_LINK([],[ return 0; ], [eval "kde_cv_prog_cc_$kde_cache=yes"], []) + CFLAGS="$save_CFLAGS" + AC_LANG_RESTORE +]) +if eval "test \"`echo '$kde_cv_prog_cc_'$kde_cache`\" = yes"; then + AC_MSG_RESULT(yes) + : + $2 +else + AC_MSG_RESULT(no) + : + $3 +fi +]) + + +dnl AC_REMOVE_FORBIDDEN removes forbidden arguments from variables +dnl use: AC_REMOVE_FORBIDDEN(CC, [-forbid -bad-option whatever]) +dnl it's all white-space separated +AC_DEFUN([AC_REMOVE_FORBIDDEN], +[ __val=$$1 + __forbid=" $2 " + if test -n "$__val"; then + __new="" + ac_save_IFS=$IFS + IFS=" " + for i in $__val; do + case "$__forbid" in + *" $i "*) AC_MSG_WARN([found forbidden $i in $1, removing it]) ;; + *) # Careful to not add spaces, where there were none, because otherwise + # libtool gets confused, if we change e.g. CXX + if test -z "$__new" ; then __new=$i ; else __new="$__new $i" ; fi ;; + esac + done + IFS=$ac_save_IFS + $1=$__new + fi +]) + + +AC_DEFUN([KDE_CHECK_FOR_BAD_COMPILER], +[ + AC_MSG_CHECKING([whether $CC is blacklisted]) + + dnl In theory we have tu run this test against $CC and $CXX + dnl in C and in C++ mode, because its perfectly legal for + dnl the user to mix compiler versions, since C has a defined + dnl ABI. + dnl + dnl For now, we assume the user is not on crack. + + AC_TRY_COMPILE([ +#ifdef __GNUC__ +#if __GNUC__ == 4 && __GNUC_MINOR__ == 0 && __GNUC_PATCHLEVEL__ == 0 +choke me +#endif +#endif +], , + kde_bad_compiler=no, + kde_bad_compiler=yes +) + + AC_MSG_RESULT($kde_bad_compiler) + +if test "$kde_bad_compiler" = "yes"; then + AC_MSG_ERROR([ + +This particular compiler version is blacklisted because it +is known to miscompile KDE. Please use a newer version, or +if that is not yet available, choose an older version. + +Please do not report a bug or bother us reporting this +configure error. We know about it, and we introduced +it by intention to avoid untraceable bugs or crashes in KDE. + +]) +fi + +]) + + +AC_DEFUN([KDE_CHECK_FOR_OPT_NOINLINE_MATCH], +[ + AC_CACHE_CHECK([whether system headers can cope with -O2 -fno-inline], + kde_cv_opt_noinline_match, + [ + kde_cv_opt_noinline_match=irrelevant + dnl if we don't use both -O2 and -fno-inline, this check is moot + if echo "$CFLAGS" | grep -e -O2 >/dev/null 2>/dev/null \ + && echo "$CFLAGS" | grep -e -fno-inline >/dev/null 2>/dev/null ; then + + ac_cflags_save="$CFLAGS" + CFLAGS="$CFLAGS -D_USE_GNU" + + AC_TRY_LINK([ + #include +], [ const char *pt, *et; + et = __extension__ ({ char __a0, __a1, __a2; (__builtin_constant_p ( ";," ) && ((size_t)(const void *)(( ";," )+ 1) - (size_t)(const void *)( ";," ) == 1) ? ((__a0 =((__const char *) ( ";," ))[0], __a0 == '\0') ? ((void) ( pt ),((void *)0) ) : ((__a1 = ((__const char *) ( ";," ))[1], __a1== '\0') ? (__extension__ (__builtin_constant_p ( __a0 ) && ( __a0 ) == '\0' ? (char *) __rawmemchr ( pt , __a0) : strchr( pt , __a0 ))) : ((__a2 = ((__const char *) ( ";," ))[2], __a2 == '\0') ? __strpbrk_c2 ( pt , __a0, __a1) :(((__const char *) ( ";," ))[3] == '\0' ? __strpbrk_c3 ( pt ,__a0, __a1, __a2): strpbrk ( pt , ";," ))))) : strpbrk ( pt , ";," )); }) ; +], + kde_cv_opt_noinline_match=yes, + kde_cv_opt_noinline_match=no + ) + + CFLAGS="$ac_cflags_save" + fi + ]) +]) + + +dnl AC_VALIDIFY_CXXFLAGS checks for forbidden flags the user may have given +AC_DEFUN([AC_VALIDIFY_CXXFLAGS], +[dnl +if test "x$kde_use_qt_emb" != "xyes"; then + AC_REMOVE_FORBIDDEN(CXX, [-fno-rtti -rpath]) + AC_REMOVE_FORBIDDEN(CXXFLAGS, [-fno-rtti -rpath]) +else + AC_REMOVE_FORBIDDEN(CXX, [-rpath]) + AC_REMOVE_FORBIDDEN(CXXFLAGS, [-rpath]) +fi +]) + +AC_DEFUN([AC_CHECK_COMPILERS], +[ + AC_ARG_ENABLE(debug, + AC_HELP_STRING([--enable-debug=ARG],[enables debug symbols (yes|no|full) [default=no]]), + [ + case $enableval in + yes) + kde_use_debug_code="yes" + kde_use_debug_define=no + ;; + full) + kde_use_debug_code="full" + kde_use_debug_define=no + ;; + *) + kde_use_debug_code="no" + kde_use_debug_define=yes + ;; + esac + ], + [kde_use_debug_code="no" + kde_use_debug_define=no + ]) + + dnl Just for configure --help + AC_ARG_ENABLE(dummyoption, + AC_HELP_STRING([--disable-debug], + [disables debug output and debug symbols [default=no]]), + [],[]) + + AC_ARG_ENABLE(strict, + AC_HELP_STRING([--enable-strict], + [compiles with strict compiler options (may not work!)]), + [ + if test $enableval = "no"; then + kde_use_strict_options="no" + else + kde_use_strict_options="yes" + fi + ], [kde_use_strict_options="no"]) + + AC_ARG_ENABLE(warnings,AC_HELP_STRING([--disable-warnings],[disables compilation with -Wall and similar]), + [ + if test $enableval = "no"; then + kde_use_warnings="no" + else + kde_use_warnings="yes" + fi + ], [kde_use_warnings="yes"]) + + dnl enable warnings for debug build + if test "$kde_use_debug_code" != "no"; then + kde_use_warnings=yes + fi + + AC_ARG_ENABLE(profile,AC_HELP_STRING([--enable-profile],[creates profiling infos [default=no]]), + [kde_use_profiling=$enableval], + [kde_use_profiling="no"] + ) + + dnl this prevents stupid AC_PROG_CC to add "-g" to the default CFLAGS + CFLAGS=" $CFLAGS" + + AC_PROG_CC + + AC_PROG_CPP + + if test "$GCC" = "yes"; then + if test "$kde_use_debug_code" != "no"; then + if test $kde_use_debug_code = "full"; then + CFLAGS="-g3 -fno-inline $CFLAGS" + else + CFLAGS="-g -O2 -fno-schedule-insns -fno-inline $CFLAGS" + fi + else + CFLAGS="-O2 $CFLAGS" + fi + fi + + if test "$kde_use_debug_define" = "yes"; then + CFLAGS="-DNDEBUG $CFLAGS" + fi + + + case "$host" in + *-*-sysv4.2uw*) CFLAGS="-D_UNIXWARE $CFLAGS";; + *-*-sysv5uw7*) CFLAGS="-D_UNIXWARE7 $CFLAGS";; + esac + + if test -z "$LDFLAGS" && test "$kde_use_debug_code" = "no" && test "$GCC" = "yes"; then + LDFLAGS="" + fi + + CXXFLAGS=" $CXXFLAGS" + + AC_PROG_CXX + + KDE_CHECK_FOR_BAD_COMPILER + + if test "$GXX" = "yes" || test "$CXX" = "KCC"; then + if test "$kde_use_debug_code" != "no"; then + if test "$CXX" = "KCC"; then + CXXFLAGS="+K0 -Wall -pedantic -W -Wpointer-arith -Wwrite-strings $CXXFLAGS" + else + if test "$kde_use_debug_code" = "full"; then + CXXFLAGS="-g3 -fno-inline $CXXFLAGS" + else + CXXFLAGS="-g -O2 -fno-schedule-insns -fno-inline $CXXFLAGS" + fi + fi + KDE_CHECK_COMPILER_FLAG(fno-builtin,[CXXFLAGS="-fno-builtin $CXXFLAGS"]) + + dnl convenience compiler flags + KDE_CHECK_COMPILER_FLAG(Woverloaded-virtual, [WOVERLOADED_VIRTUAL="-Woverloaded-virtual"], [WOVERLOADED_VRITUAL=""]) + AC_SUBST(WOVERLOADED_VIRTUAL) + else + if test "$CXX" = "KCC"; then + CXXFLAGS="+K3 $CXXFLAGS" + else + CXXFLAGS="-O2 $CXXFLAGS" + fi + fi + fi + + if test "$kde_use_debug_define" = "yes"; then + CXXFLAGS="-DNDEBUG -DNO_DEBUG $CXXFLAGS" + fi + + if test "$kde_use_profiling" = "yes"; then + KDE_CHECK_COMPILER_FLAG(pg, + [ + CFLAGS="-pg $CFLAGS" + CXXFLAGS="-pg $CXXFLAGS" + ]) + fi + + if test "$kde_use_warnings" = "yes"; then + if test "$GCC" = "yes"; then + CXXFLAGS="-Wall -W -Wpointer-arith $CXXFLAGS" + case $host in + *-*-linux-gnu) + CFLAGS="-std=iso9899:1990 -W -Wall -Wchar-subscripts -Wshadow -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -D_XOPEN_SOURCE=500 -D_BSD_SOURCE $CFLAGS" + CXXFLAGS="-ansi -D_XOPEN_SOURCE=500 -D_BSD_SOURCE -Wcast-align -Wchar-subscripts $CXXFLAGS" + KDE_CHECK_COMPILER_FLAG(Wmissing-format-attribute, [CXXFLAGS="$CXXFLAGS -Wformat-security -Wmissing-format-attribute"]) + KDE_CHECK_C_COMPILER_FLAG(Wmissing-format-attribute, [CFLAGS="$CFLAGS -Wformat-security -Wmissing-format-attribute"]) + ;; + esac + KDE_CHECK_COMPILER_FLAG(Wundef,[CXXFLAGS="-Wundef $CXXFLAGS"]) + KDE_CHECK_COMPILER_FLAG(Wno-long-long,[CXXFLAGS="-Wno-long-long $CXXFLAGS"]) + dnl ### FIXME: revert for KDE 4 + KDE_CHECK_COMPILER_FLAG(Wno-non-virtual-dtor,[CXXFLAGS="$CXXFLAGS -Wno-non-virtual-dtor"]) + fi + fi + + if test "$GXX" = "yes" && test "$kde_use_strict_options" = "yes"; then + CXXFLAGS="-Wcast-qual -Wshadow -Wcast-align $CXXFLAGS" + fi + + AC_ARG_ENABLE(pch, + AC_HELP_STRING([--enable-pch], + [enables precompiled header support (currently only KCC or gcc >=3.4+unsermake) [default=no]]), + [ kde_use_pch=$enableval ],[ kde_use_pch=no ]) + + HAVE_GCC_VISIBILITY=0 + AC_SUBST([HAVE_GCC_VISIBILITY]) + + if test "$GXX" = "yes"; then + gcc_no_reorder_blocks=NO + KDE_CHECK_COMPILER_FLAG(fno-reorder-blocks,[gcc_no_reorder_blocks=YES]) + if test $kde_use_debug_code != "no" && \ + test $kde_use_debug_code != "full" && \ + test "YES" = "$gcc_no_reorder_blocks" ; then + CXXFLAGS="$CXXFLAGS -fno-reorder-blocks" + CFLAGS="$CFLAGS -fno-reorder-blocks" + fi + KDE_CHECK_COMPILER_FLAG(fno-exceptions,[CXXFLAGS="$CXXFLAGS -fno-exceptions"]) + KDE_CHECK_COMPILER_FLAG(fno-check-new, [CXXFLAGS="$CXXFLAGS -fno-check-new"]) + KDE_CHECK_COMPILER_FLAG(fno-common, [CXXFLAGS="$CXXFLAGS -fno-common"]) + KDE_CHECK_COMPILER_FLAG(fexceptions, [USE_EXCEPTIONS="-fexceptions"], USE_EXCEPTIONS= ) + ENABLE_PERMISSIVE_FLAG="-fpermissive" + + if test "$kde_use_pch" = "yes"; then + AC_MSG_CHECKING(whether gcc supports precompiling c header files) + echo >conftest.h + if $CC -x c-header conftest.h >/dev/null 2>/dev/null; then + kde_gcc_supports_pch=yes + AC_MSG_RESULT(yes) + else + kde_gcc_supports_pch=no + AC_MSG_RESULT(no) + fi + if test "$kde_gcc_supports_pch" = "yes"; then + AC_MSG_CHECKING(whether gcc supports precompiling c++ header files) + if $CXX -x c++-header conftest.h >/dev/null 2>/dev/null; then + kde_gcc_supports_pch=yes + AC_MSG_RESULT(yes) + else + kde_gcc_supports_pch=no + AC_MSG_RESULT(no) + fi + fi + rm -f conftest.h conftest.h.gch + fi + + KDE_CHECK_FOR_OPT_NOINLINE_MATCH + if test "x$kde_cv_opt_noinline_match" = "xno" ; then + CFLAGS="`echo "$CFLAGS" | sed "s/ -fno-inline//"`" + fi + fi + AM_CONDITIONAL(unsermake_enable_pch, test "$kde_use_pch" = "yes" && test "$kde_gcc_supports_pch" = "yes") + if test "$CXX" = "KCC"; then + dnl unfortunately we currently cannot disable exception support in KCC + dnl because doing so is binary incompatible and Qt by default links with exceptions :-( + dnl KDE_CHECK_COMPILER_FLAG(-no_exceptions,[CXXFLAGS="$CXXFLAGS --no_exceptions"]) + dnl KDE_CHECK_COMPILER_FLAG(-exceptions, [USE_EXCEPTIONS="--exceptions"], USE_EXCEPTIONS= ) + + if test "$kde_use_pch" = "yes"; then + dnl TODO: support --pch-dir! + KDE_CHECK_COMPILER_FLAG(-pch,[CXXFLAGS="$CXXFLAGS --pch"]) + dnl the below works (but the dir must exist), but it's + dnl useless for a whole package. + dnl The are precompiled headers for each source file, so when compiling + dnl from scratch, it doesn't make a difference, and they take up + dnl around ~5Mb _per_ sourcefile. + dnl KDE_CHECK_COMPILER_FLAG(-pch_dir /tmp, + dnl [CXXFLAGS="$CXXFLAGS --pch_dir `pwd`/pcheaders"]) + fi + dnl this flag controls inlining. by default KCC inlines in optimisation mode + dnl all implementations that are defined inside the class {} declaration. + dnl because of templates-compatibility with broken gcc compilers, this + dnl can cause excessive inlining. This flag limits it to a sane level + KDE_CHECK_COMPILER_FLAG(-inline_keyword_space_time=6,[CXXFLAGS="$CXXFLAGS --inline_keyword_space_time=6"]) + KDE_CHECK_COMPILER_FLAG(-inline_auto_space_time=2,[CXXFLAGS="$CXXFLAGS --inline_auto_space_time=2"]) + KDE_CHECK_COMPILER_FLAG(-inline_implicit_space_time=2.0,[CXXFLAGS="$CXXFLAGS --inline_implicit_space_time=2.0"]) + KDE_CHECK_COMPILER_FLAG(-inline_generated_space_time=2.0,[CXXFLAGS="$CXXFLAGS --inline_generated_space_time=2.0"]) + dnl Some source files are shared between multiple executables + dnl (or libraries) and some of those need template instantiations. + dnl In that case KCC needs to compile those sources with + dnl --one_instantiation_per_object. To make it easy for us we compile + dnl _all_ objects with that flag (--one_per is a shorthand). + KDE_CHECK_COMPILER_FLAG(-one_per, [CXXFLAGS="$CXXFLAGS --one_per"]) + fi + AC_SUBST(USE_EXCEPTIONS) + dnl obsolete macro - provided to keep things going + USE_RTTI= + AC_SUBST(USE_RTTI) + + case "$host" in + *-*-irix*) test "$GXX" = yes && CXXFLAGS="-D_LANGUAGE_C_PLUS_PLUS -D__LANGUAGE_C_PLUS_PLUS $CXXFLAGS" ;; + *-*-sysv4.2uw*) CXXFLAGS="-D_UNIXWARE $CXXFLAGS";; + *-*-sysv5uw7*) CXXFLAGS="-D_UNIXWARE7 $CXXFLAGS";; + *-*-solaris*) + if test "$GXX" = yes; then + libstdcpp=`$CXX -print-file-name=libstdc++.so` + if test ! -f $libstdcpp; then + AC_MSG_ERROR([You've compiled gcc without --enable-shared. This doesn't work with KDE. Please recompile gcc with --enable-shared to receive a libstdc++.so]) + fi + fi + ;; + esac + + AC_VALIDIFY_CXXFLAGS + + AC_PROG_CXXCPP + + if test "$GCC" = yes; then + NOOPT_CFLAGS=-O0 + fi + KDE_CHECK_COMPILER_FLAG(O0,[NOOPT_CXXFLAGS=-O0]) + + AC_ARG_ENABLE(coverage, + AC_HELP_STRING([--enable-coverage],[use gcc coverage testing]), [ + if test "$am_cv_CC_dependencies_compiler_type" = "gcc3"; then + ac_coverage_compiler="-fprofile-arcs -ftest-coverage" + ac_coverage_linker="-lgcc" + elif test "$am_cv_CC_dependencies_compiler_type" = "gcc"; then + ac_coverage_compiler="-fprofile-arcs -ftest-coverage" + ac_coverage_linker="" + else + AC_MSG_ERROR([coverage with your compiler is not supported]) + fi + CFLAGS="$CFLAGS $ac_coverage_compiler" + CXXFLAGS="$CXXFLAGS $ac_coverage_compiler" + LDFLAGS="$LDFLAGS $ac_coverage_linker" + ]) + + AC_SUBST(NOOPT_CXXFLAGS) + AC_SUBST(NOOPT_CFLAGS) + AC_SUBST(ENABLE_PERMISSIVE_FLAG) + + KDE_CHECK_NEW_LDFLAGS + KDE_CHECK_FINAL + KDE_CHECK_CLOSURE + KDE_CHECK_NMCHECK + + ifdef([AM_DEPENDENCIES], AC_REQUIRE([KDE_ADD_DEPENDENCIES]), []) +]) + +AC_DEFUN([KDE_CHECK_VISIBILITY_GCC_BUG], + [ + AC_CACHE_CHECK([for gcc -fvisibility-inlines-hidden bug], kde_cv_val_gcc_visibility_bug, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + + safe_CXXFLAGS=$CXXFLAGS + safe_LDFLAGS=$LDFLAGS + CXXFLAGS="$CXXFLAGS -fPIC -fvisibility-inlines-hidden -O0" + LDFLAGS="$LDFLAGS -shared -fPIC" + + AC_TRY_LINK( + [ + /* http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19664 */ + #include + int some_function( void ) __attribute__ ((visibility("default"))); + int some_function( void ) + { + std::string s("blafasel"); + return 0; + } + ], [/* elvis is alive */], + kde_cv_val_gcc_visibility_bug=no, kde_cv_val_gcc_visibility_bug=yes) + + CXXFLAGS=$safe_CXXFLAGS + LDFLAGS=$safe_LDFLAGS + AC_LANG_RESTORE + ] + ) + + if test x$kde_cv_val_gcc_visibility_bug = xno; then + CXXFLAGS="$CXXFLAGS -fvisibility-inlines-hidden" + fi + ] +) + +AC_DEFUN([KDE_ENABLE_HIDDEN_VISIBILITY], +[ + AC_BEFORE([AC_PATH_QT_1_3], [KDE_ENABLE_HIDDEN_VISIBILITY]) + + AC_MSG_CHECKING([grepping for visibility push/pop in headers]) + + if test "x$GXX" = "xyes"; then + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_EGREP_CPP( + [GCC visibility push], + [ #include + ], + [ + AC_MSG_RESULT(yes) + kde_stdc_visibility_patched=yes ], + [ + AC_MSG_RESULT(no) + AC_MSG_WARN([Your libstdc++ doesn't appear to be patched for + visibility support. Disabling -fvisibility=hidden]) + + kde_stdc_visibility_patched=no ]) + + AC_LANG_RESTORE + + kde_have_gcc_visibility=no + KDE_CHECK_COMPILER_FLAG(fvisibility=hidden, + [ + kde_have_gcc_visibility=yes + dnl the whole toolchain is just a mess, gcc is just too buggy + dnl to handle STL with visibility enabled. Lets reconsider + dnl when gcc 4.2 is out or when things get fixed in the compiler. + dnl Contact mueller@kde.org for details. + AC_ARG_ENABLE(gcc-hidden-visibility, + AC_HELP_STRING([--enable-gcc-hidden-visibility],[toolchain hidden visibility [default=no]]), + [kde_have_gcc_visibility=$enableval], + [kde_have_gcc_visibility=no]) + + AC_CACHE_CHECK([if Qt is patched for -fvisibility], kde_cv_val_qt_gcc_visibility_patched, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + + safe_CXXFLAGS=$CXXFLAGS + CXXFLAGS="$CXXFLAGS $all_includes" + + AC_TRY_COMPILE( + [ +#include +#if Q_EXPORT - 0 != 0 +/* if this compiles, then Q_EXPORT is undefined */ +/* if Q_EXPORT is nonempty, this will break compilation */ +#endif + ], [/* elvis is alive */], + kde_cv_val_qt_gcc_visibility_patched=no, kde_cv_val_qt_gcc_visibility_patched=yes) + + CXXFLAGS=$safe_CXXFLAGS + AC_LANG_RESTORE + ] + ) + + if test x$kde_have_gcc_visibility = "xyes" && test x$kde_stdc_visibility_patched = "xyes" && test x$kde_cv_val_qt_gcc_visibility_patched = "xyes"; then + CXXFLAGS="$CXXFLAGS -fvisibility=hidden" + KDE_CHECK_VISIBILITY_GCC_BUG + HAVE_GCC_VISIBILITY=1 + AC_DEFINE_UNQUOTED(__KDE_HAVE_GCC_VISIBILITY, "$HAVE_GCC_VISIBILITY", [define to 1 if -fvisibility is supported]) + fi + ]) + fi +]) + +AC_DEFUN([KDE_ADD_DEPENDENCIES], +[ + [A]M_DEPENDENCIES(CC) + [A]M_DEPENDENCIES(CXX) +]) + +dnl just a wrapper to clean up configure.in +AC_DEFUN([KDE_PROG_LIBTOOL], +[ +AC_REQUIRE([AC_CHECK_COMPILERS]) +AC_REQUIRE([AC_ENABLE_SHARED]) +AC_REQUIRE([AC_ENABLE_STATIC]) + +AC_REQUIRE([AC_LIBTOOL_DLOPEN]) +AC_REQUIRE([KDE_CHECK_LIB64]) + +AC_OBJEXT +AC_EXEEXT + +AM_PROG_LIBTOOL +AC_LIBTOOL_CXX + +LIBTOOL_SHELL="/bin/sh ./libtool" +# LIBTOOL="$LIBTOOL --silent" +KDE_PLUGIN="-avoid-version -module -no-undefined \$(KDE_NO_UNDEFINED) \$(KDE_RPATH) \$(KDE_MT_LDFLAGS)" +AC_SUBST(KDE_PLUGIN) + +# This hack ensures that libtool creates shared libs for kunittest plugins. By default check_LTLIBRARIES makes static libs. +KDE_CHECK_PLUGIN="\$(KDE_PLUGIN) -rpath \$(libdir)" +AC_SUBST(KDE_CHECK_PLUGIN) + +# we patch configure quite some so we better keep that consistent for incremental runs +AC_SUBST(AUTOCONF,'$(SHELL) $(top_srcdir)/admin/cvs.sh configure || touch configure') +]) + +AC_DEFUN([KDE_CHECK_LIB64], +[ + AC_ARG_ENABLE(libsuffix, + AC_HELP_STRING([--enable-libsuffix], + [/lib directory suffix (64,32,none,auto[=default])]), + kdelibsuff=$enableval, kdelibsuff="auto") + + if test "$kdelibsuff" = "auto"; then + +cat > conftest.c << EOF +#include +int main() { + return 0; +} +EOF + kdelibsuff=`$CC conftest.c -o conftest.out; ldd conftest.out |sed -ne '/libc.so/{ + s,.*/lib\([[^\/]]*\)/.*,\1, + p +}'` + rm -rf conftest.* + fi + + if test "$kdelibsuff" = "no" || test "$kdelibsuff" = "none"; then + kdelibsuff= + fi + if test -z "$kdelibsuff"; then + AC_MSG_RESULT([not using lib directory suffix]) + AC_DEFINE(KDELIBSUFF, [""], Suffix for lib directories) + else + if test "$libdir" = '${exec_prefix}/lib'; then + libdir="$libdir${kdelibsuff}" + AC_SUBST([libdir], ["$libdir"]) dnl ugly hack for lib64 platforms + fi + AC_DEFINE_UNQUOTED(KDELIBSUFF, ["${kdelibsuff}"], Suffix for lib directories) + AC_MSG_RESULT([using lib directory suffix $kdelibsuff]) + fi +]) + +AC_DEFUN([KDE_CHECK_TYPES], +[ AC_CHECK_SIZEOF(int, 4)dnl + AC_CHECK_SIZEOF(short)dnl + AC_CHECK_SIZEOF(long, 4)dnl + AC_CHECK_SIZEOF(char *, 4)dnl +])dnl + +dnl Not used - kept for compat only? +AC_DEFUN([KDE_DO_IT_ALL], +[ +AC_CANONICAL_SYSTEM +AC_ARG_PROGRAM +AM_INIT_AUTOMAKE($1, $2) +AM_DISABLE_LIBRARIES +AC_PREFIX_DEFAULT(${KDEDIR:-/usr/local/kde}) +AC_CHECK_COMPILERS +KDE_PROG_LIBTOOL +AM_KDE_WITH_NLS +AC_PATH_KDE +]) + +AC_DEFUN([AC_CHECK_RPATH], +[ +AC_MSG_CHECKING(for rpath) +AC_ARG_ENABLE(rpath, + AC_HELP_STRING([--disable-rpath],[do not use the rpath feature of ld]), + USE_RPATH=$enableval, USE_RPATH=yes) + +if test -z "$KDE_RPATH" && test "$USE_RPATH" = "yes"; then + + KDE_RPATH="-R \$(libdir)" + + if test "$kde_libraries" != "$libdir"; then + KDE_RPATH="$KDE_RPATH -R \$(kde_libraries)" + fi + + if test -n "$qt_libraries"; then + KDE_RPATH="$KDE_RPATH -R \$(qt_libraries)" + fi + dnl $x_libraries is set to /usr/lib in case + if test -n "$X_LDFLAGS"; then + X_RPATH="-R \$(x_libraries)" + KDE_RPATH="$KDE_RPATH $X_RPATH" + fi + if test -n "$KDE_EXTRA_RPATH"; then + KDE_RPATH="$KDE_RPATH \$(KDE_EXTRA_RPATH)" + fi +fi +AC_SUBST(KDE_EXTRA_RPATH) +AC_SUBST(KDE_RPATH) +AC_SUBST(X_RPATH) +AC_MSG_RESULT($USE_RPATH) +]) + +dnl Check for the type of the third argument of getsockname +AC_DEFUN([AC_CHECK_SOCKLEN_T], +[ + AC_MSG_CHECKING(for socklen_t) + AC_CACHE_VAL(kde_cv_socklen_t, + [ + AC_LANG_PUSH(C++) + kde_cv_socklen_t=no + AC_TRY_COMPILE([ + #include + #include + ], + [ + socklen_t len; + getpeername(0,0,&len); + ], + [ + kde_cv_socklen_t=yes + kde_cv_socklen_t_equiv=socklen_t + ]) + AC_LANG_POP(C++) + ]) + AC_MSG_RESULT($kde_cv_socklen_t) + if test $kde_cv_socklen_t = no; then + AC_MSG_CHECKING([for socklen_t equivalent for socket functions]) + AC_CACHE_VAL(kde_cv_socklen_t_equiv, + [ + kde_cv_socklen_t_equiv=int + AC_LANG_PUSH(C++) + for t in int size_t unsigned long "unsigned long"; do + AC_TRY_COMPILE([ + #include + #include + ], + [ + $t len; + getpeername(0,0,&len); + ], + [ + kde_cv_socklen_t_equiv="$t" + break + ]) + done + AC_LANG_POP(C++) + ]) + AC_MSG_RESULT($kde_cv_socklen_t_equiv) + fi + AC_DEFINE_UNQUOTED(kde_socklen_t, $kde_cv_socklen_t_equiv, + [type to use in place of socklen_t if not defined]) + AC_DEFINE_UNQUOTED(ksize_t, $kde_cv_socklen_t_equiv, + [type to use in place of socklen_t if not defined (deprecated, use kde_socklen_t)]) +]) + +dnl This is a merge of some macros out of the gettext aclocal.m4 +dnl since we don't need anything, I took the things we need +dnl the copyright for them is: +dnl > +dnl Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc. +dnl This Makefile.in is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without +dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A +dnl PARTICULAR PURPOSE. +dnl > +dnl for this file it is relicensed under LGPL + +AC_DEFUN([AM_KDE_WITH_NLS], + [ + dnl If we use NLS figure out what method + + AM_PATH_PROG_WITH_TEST_KDE(MSGFMT, msgfmt, + [test -n "`$ac_dir/$ac_word --version 2>&1 | grep 'GNU gettext'`"], msgfmt) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + + if test -z "`$GMSGFMT --version 2>&1 | grep 'GNU gettext'`"; then + AC_MSG_RESULT([found msgfmt program is not GNU msgfmt; ignore it]) + GMSGFMT=":" + fi + MSGFMT=$GMSGFMT + AC_SUBST(GMSGFMT) + AC_SUBST(MSGFMT) + + AM_PATH_PROG_WITH_TEST_KDE(XGETTEXT, xgettext, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) + + dnl Test whether we really found GNU xgettext. + if test "$XGETTEXT" != ":"; then + dnl If it is no GNU xgettext we define it as : so that the + dnl Makefiles still can work. + if $XGETTEXT --omit-header /dev/null 2> /dev/null; then + : ; + else + AC_MSG_RESULT( + [found xgettext programs is not GNU xgettext; ignore it]) + XGETTEXT=":" + fi + fi + AC_SUBST(XGETTEXT) + + ]) + +# Search path for a program which passes the given test. +# Ulrich Drepper , 1996. + +# serial 1 +# Stephan Kulow: I appended a _KDE against name conflicts + +dnl AM_PATH_PROG_WITH_TEST_KDE(VARIABLE, PROG-TO-CHECK-FOR, +dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) +AC_DEFUN([AM_PATH_PROG_WITH_TEST_KDE], +[# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL(ac_cv_path_$1, +[case "[$]$1" in + /*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in ifelse([$5], , $PATH, [$5]); do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test -n "[$]$1"; then + AC_MSG_RESULT([$]$1) +else + AC_MSG_RESULT(no) +fi +AC_SUBST($1)dnl +]) + + +# Check whether LC_MESSAGES is available in . +# Ulrich Drepper , 1995. + +# serial 1 + +AC_DEFUN([AM_LC_MESSAGES], + [if test $ac_cv_header_locale_h = yes; then + AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, + [AC_TRY_LINK([#include ], [return LC_MESSAGES], + am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) + if test $am_cv_val_LC_MESSAGES = yes; then + AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your locale.h file contains LC_MESSAGES]) + fi + fi]) + +dnl From Jim Meyering. +dnl FIXME: migrate into libit. + +AC_DEFUN([AM_FUNC_OBSTACK], +[AC_CACHE_CHECK([for obstacks], am_cv_func_obstack, + [AC_TRY_LINK([#include "obstack.h"], + [struct obstack *mem;obstack_free(mem,(char *) 0)], + am_cv_func_obstack=yes, + am_cv_func_obstack=no)]) + if test $am_cv_func_obstack = yes; then + AC_DEFINE(HAVE_OBSTACK) + else + LIBOBJS="$LIBOBJS obstack.o" + fi +]) + +dnl From Jim Meyering. Use this if you use the GNU error.[ch]. +dnl FIXME: Migrate into libit + +AC_DEFUN([AM_FUNC_ERROR_AT_LINE], +[AC_CACHE_CHECK([for error_at_line], am_cv_lib_error_at_line, + [AC_TRY_LINK([],[error_at_line(0, 0, "", 0, "");], + am_cv_lib_error_at_line=yes, + am_cv_lib_error_at_line=no)]) + if test $am_cv_lib_error_at_line = no; then + LIBOBJS="$LIBOBJS error.o" + fi + AC_SUBST(LIBOBJS)dnl +]) + +# Macro to add for using GNU gettext. +# Ulrich Drepper , 1995. + +# serial 1 +# Stephan Kulow: I put a KDE in it to avoid name conflicts + +AC_DEFUN([AM_KDE_GNU_GETTEXT], + [AC_REQUIRE([AC_PROG_MAKE_SET])dnl + AC_REQUIRE([AC_PROG_RANLIB])dnl + AC_REQUIRE([AC_HEADER_STDC])dnl + AC_REQUIRE([AC_TYPE_OFF_T])dnl + AC_REQUIRE([AC_TYPE_SIZE_T])dnl + AC_REQUIRE([AC_FUNC_ALLOCA])dnl + AC_REQUIRE([AC_FUNC_MMAP])dnl + AC_REQUIRE([AM_KDE_WITH_NLS])dnl + AC_CHECK_HEADERS([limits.h locale.h nl_types.h string.h values.h alloca.h]) + AC_CHECK_FUNCS([getcwd munmap putenv setlocale strchr strcasecmp \ +__argz_count __argz_stringify __argz_next]) + + AC_MSG_CHECKING(for stpcpy) + AC_CACHE_VAL(kde_cv_func_stpcpy, + [ + kde_safe_cxxflags=$CXXFLAGS + CXXFLAGS="-Werror" + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([ + #include + ], + [ + char buffer[200]; + stpcpy(buffer, buffer); + ], + kde_cv_func_stpcpy=yes, + kde_cv_func_stpcpy=no) + AC_LANG_RESTORE + CXXFLAGS=$kde_safe_cxxflags + ]) + AC_MSG_RESULT($kde_cv_func_stpcpy) + if eval "test \"`echo $kde_cv_func_stpcpy`\" = yes"; then + AC_DEFINE(HAVE_STPCPY, 1, [Define if you have stpcpy]) + fi + + AM_LC_MESSAGES + + if test "x$CATOBJEXT" != "x"; then + if test "x$ALL_LINGUAS" = "x"; then + LINGUAS= + else + AC_MSG_CHECKING(for catalogs to be installed) + NEW_LINGUAS= + for lang in ${LINGUAS=$ALL_LINGUAS}; do + case "$ALL_LINGUAS" in + *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;; + esac + done + LINGUAS=$NEW_LINGUAS + AC_MSG_RESULT($LINGUAS) + fi + + dnl Construct list of names of catalog files to be constructed. + if test -n "$LINGUAS"; then + for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done + fi + fi + + ]) + +AC_DEFUN([AC_HAVE_XPM], + [AC_REQUIRE_CPP()dnl + AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + + test -z "$XPM_LDFLAGS" && XPM_LDFLAGS= + test -z "$XPM_INCLUDE" && XPM_INCLUDE= + + AC_ARG_WITH(xpm,AC_HELP_STRING([--without-xpm],[disable color pixmap XPM tests]), + xpm_test=$withval, xpm_test="yes") + if test "x$xpm_test" = xno; then + ac_cv_have_xpm=no + else + AC_MSG_CHECKING(for XPM) + AC_CACHE_VAL(ac_cv_have_xpm, + [ + ac_save_ldflags="$LDFLAGS" + ac_save_cflags="$CFLAGS" + if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then + LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS $LDFLAGS $XPM_LDFLAGS $all_libraries -lXpm -lX11 -lXext $LIBZ $LIBSOCKET" + else + LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS $LDFLAGS $XPM_LDFLAGS $all_libraries -lXpm $LIBZ $LIBSOCKET" + fi + CFLAGS="$CFLAGS $X_INCLUDES $USER_INCLUDES" + test -n "$XPM_INCLUDE" && CFLAGS="-I$XPM_INCLUDE $CFLAGS" + AC_TRY_LINK([#include ],[], + ac_cv_have_xpm="yes",ac_cv_have_xpm="no") + LDFLAGS="$ac_save_ldflags" + CFLAGS="$ac_save_cflags" + ])dnl + + if test "$ac_cv_have_xpm" = no; then + AC_MSG_RESULT(no) + XPM_LDFLAGS="" + XPMINC="" + $2 + else + AC_DEFINE(HAVE_XPM, 1, [Define if you have XPM support]) + if test "$XPM_LDFLAGS" = ""; then + XPMLIB='-lXpm $(LIB_X11)' + else + XPMLIB="-L$XPM_LDFLAGS -lXpm "'$(LIB_X11)' + fi + if test "$XPM_INCLUDE" = ""; then + XPMINC="" + else + XPMINC="-I$XPM_INCLUDE" + fi + AC_MSG_RESULT(yes) + $1 + fi + fi + AC_SUBST(XPMINC) + AC_SUBST(XPMLIB) +]) + +AC_DEFUN([AC_HAVE_DPMS], + [AC_REQUIRE_CPP()dnl + AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + + test -z "$DPMS_LDFLAGS" && DPMS_LDFLAGS= + test -z "$DPMS_INCLUDE" && DPMS_INCLUDE= + DPMS_LIB= + + AC_ARG_WITH(dpms,AC_HELP_STRING([--without-dpms],[disable DPMS power saving]), + dpms_test=$withval, dpms_test="yes") + if test "x$dpms_test" = xno; then + ac_cv_have_dpms=no + else + AC_MSG_CHECKING(for DPMS) + dnl Note: ac_cv_have_dpms can be no, yes, or -lXdpms. + dnl 'yes' means DPMS_LIB="", '-lXdpms' means DPMS_LIB="-lXdpms". + AC_CACHE_VAL(ac_cv_have_dpms, + [ + if test "x$kde_use_qt_emb" = "xyes" || test "x$kde_use_qt_mac" = "xyes"; then + AC_MSG_RESULT(no) + ac_cv_have_dpms="no" + else + ac_save_ldflags="$LDFLAGS" + ac_save_cflags="$CFLAGS" + ac_save_libs="$LIBS" + LDFLAGS="$LDFLAGS $DPMS_LDFLAGS $all_libraries" + LIBS="-lX11 -lXext $LIBSOCKET" + CFLAGS="$CFLAGS $X_INCLUDES" + test -n "$DPMS_INCLUDE" && CFLAGS="-I$DPMS_INCLUDE $CFLAGS" + AC_TRY_LINK([ + #include + #include + #include + #include + int foo_test_dpms() + { return DPMSSetTimeouts( 0, 0, 0, 0 ); }],[], + ac_cv_have_dpms="yes", [ + LIBS="-lXdpms $LIBS" + AC_TRY_LINK([ + #include + #include + #include + #include + int foo_test_dpms() + { return DPMSSetTimeouts( 0, 0, 0, 0 ); }],[], + [ + ac_cv_have_dpms="-lXdpms" + ],ac_cv_have_dpms="no") + ]) + LDFLAGS="$ac_save_ldflags" + CFLAGS="$ac_save_cflags" + LIBS="$ac_save_libs" + fi + ])dnl + + if test "$ac_cv_have_dpms" = no; then + AC_MSG_RESULT(no) + DPMS_LDFLAGS="" + DPMSINC="" + $2 + else + AC_DEFINE(HAVE_DPMS, 1, [Define if you have DPMS support]) + if test "$ac_cv_have_dpms" = "-lXdpms"; then + DPMS_LIB="-lXdpms" + fi + if test "$DPMS_LDFLAGS" = ""; then + DPMSLIB="$DPMS_LIB "'$(LIB_X11)' + else + DPMSLIB="$DPMS_LDFLAGS $DPMS_LIB "'$(LIB_X11)' + fi + if test "$DPMS_INCLUDE" = ""; then + DPMSINC="" + else + DPMSINC="-I$DPMS_INCLUDE" + fi + AC_MSG_RESULT(yes) + $1 + fi + fi + ac_save_cflags="$CFLAGS" + CFLAGS="$CFLAGS $X_INCLUDES" + test -n "$DPMS_INCLUDE" && CFLAGS="-I$DPMS_INCLUDE $CFLAGS" + AH_TEMPLATE(HAVE_DPMSCAPABLE_PROTO, + [Define if you have the DPMSCapable prototype in ]) + AC_CHECK_DECL(DPMSCapable, + AC_DEFINE(HAVE_DPMSCAPABLE_PROTO),, + [#include + #include ]) + AH_TEMPLATE(HAVE_DPMSINFO_PROTO, + [Define if you have the DPMSInfo prototype in ]) + AC_CHECK_DECL(DPMSInfo, + AC_DEFINE(HAVE_DPMSINFO_PROTO),, + [#include + #include ]) + CFLAGS="$ac_save_cflags" + AC_SUBST(DPMSINC) + AC_SUBST(DPMSLIB) +]) + +AC_DEFUN([AC_HAVE_GL], + [AC_REQUIRE_CPP()dnl + AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + + test -z "$GL_LDFLAGS" && GL_LDFLAGS= + test -z "$GL_INCLUDE" && GL_INCLUDE= + + AC_ARG_WITH(gl,AC_HELP_STRING([--without-gl],[disable 3D GL modes]), + gl_test=$withval, gl_test="yes") + if test "x$kde_use_qt_emb" = "xyes"; then + # GL and Qt Embedded is a no-go for now. + ac_cv_have_gl=no + elif test "x$gl_test" = xno; then + ac_cv_have_gl=no + else + AC_MSG_CHECKING(for GL) + AC_CACHE_VAL(ac_cv_have_gl, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_save_ldflags=$LDFLAGS + ac_save_cxxflags=$CXXFLAGS + ac_save_libs=$LIBS + LDFLAGS="$LDFLAGS $GL_LDFLAGS $X_LDFLAGS $all_libraries" + LIBS="$LIBS -lGL -lGLU" + test "x$kde_use_qt_mac" != xyes && test "x$kde_use_qt_emb" != xyes && LIBS="$LIBS -lX11" + LIBS="$LIBS $LIB_XEXT -lm $LIBSOCKET" + CXXFLAGS="$CFLAGS $X_INCLUDES" + test -n "$GL_INCLUDE" && CFLAGS="-I$GL_INCLUDE $CFLAGS" + AC_TRY_LINK([#include +#include +], [], + ac_cv_have_gl="yes", ac_cv_have_gl="no") + AC_LANG_RESTORE + LDFLAGS=$ac_save_ldflags + CXXFLAGS=$ac_save_cxxflags + LIBS=$ac_save_libs + ])dnl + + if test "$ac_cv_have_gl" = "no"; then + AC_MSG_RESULT(no) + GL_LDFLAGS="" + GLINC="" + $2 + else + AC_DEFINE(HAVE_GL, 1, [Defines if you have GL (Mesa, OpenGL, ...)]) + if test "$GL_LDFLAGS" = ""; then + GLLIB='-lGLU -lGL $(LIB_X11)' + else + GLLIB="$GL_LDFLAGS -lGLU -lGL "'$(LIB_X11)' + fi + if test "$GL_INCLUDE" = ""; then + GLINC="" + else + GLINC="-I$GL_INCLUDE" + fi + AC_MSG_RESULT($ac_cv_have_gl) + $1 + fi + fi + AC_SUBST(GLINC) + AC_SUBST(GLLIB) +]) + + + dnl shadow password and PAM magic - maintained by ossi@kde.org + +AC_DEFUN([KDE_PAM], [ + AC_REQUIRE([KDE_CHECK_LIBDL]) + + want_pam= + AC_ARG_WITH(pam, + AC_HELP_STRING([--with-pam[=ARG]],[enable support for PAM: ARG=[yes|no|service name]]), + [ if test "x$withval" = "xyes"; then + want_pam=yes + pam_service=kde + elif test "x$withval" = "xno"; then + want_pam=no + else + want_pam=yes + pam_service=$withval + fi + ], [ pam_service=kde ]) + + use_pam= + PAMLIBS= + if test "x$want_pam" != xno; then + AC_CHECK_LIB(pam, pam_start, [ + AC_CHECK_HEADER(security/pam_appl.h, + [ pam_header=security/pam_appl.h ], + [ AC_CHECK_HEADER(pam/pam_appl.h, + [ pam_header=pam/pam_appl.h ], + [ + AC_MSG_WARN([PAM detected, but no headers found! +Make sure you have the necessary development packages installed.]) + ] + ) + ] + ) + ], , $LIBDL) + if test -z "$pam_header"; then + if test "x$want_pam" = xyes; then + AC_MSG_ERROR([--with-pam was specified, but cannot compile with PAM!]) + fi + else + AC_DEFINE(HAVE_PAM, 1, [Defines if you have PAM (Pluggable Authentication Modules)]) + PAMLIBS="$PAM_MISC_LIB -lpam $LIBDL" + use_pam=yes + + dnl darwin claims to be something special + if test "$pam_header" = "pam/pam_appl.h"; then + AC_DEFINE(HAVE_PAM_PAM_APPL_H, 1, [Define if your PAM headers are in pam/ instead of security/]) + fi + + dnl test whether struct pam_message is const (Linux) or not (Sun) + AC_MSG_CHECKING(for const pam_message) + AC_EGREP_HEADER([struct pam_message], $pam_header, + [ AC_EGREP_HEADER([const struct pam_message], $pam_header, + [AC_MSG_RESULT([const: Linux-type PAM])], + [AC_MSG_RESULT([nonconst: Sun-type PAM]) + AC_DEFINE(PAM_MESSAGE_NONCONST, 1, [Define if your PAM support takes non-const arguments (Solaris)])] + )], + [AC_MSG_RESULT([not found - assume const, Linux-type PAM])]) + fi + fi + + AC_SUBST(PAMLIBS) +]) + +dnl DEF_PAM_SERVICE(arg name, full name, define name) +AC_DEFUN([DEF_PAM_SERVICE], [ + AC_ARG_WITH($1-pam, + AC_HELP_STRING([--with-$1-pam=[val]],[override PAM service from --with-pam for $2]), + [ if test "x$use_pam" = xyes; then + $3_PAM_SERVICE=$withval + else + AC_MSG_ERROR([Cannot use use --with-$1-pam, as no PAM was detected. +You may want to enforce it by using --with-pam.]) + fi + ], + [ if test "x$use_pam" = xyes; then + $3_PAM_SERVICE="$pam_service" + fi + ]) + if test -n "$$3_PAM_SERVICE"; then + AC_MSG_RESULT([The PAM service used by $2 will be $$3_PAM_SERVICE]) + AC_DEFINE_UNQUOTED($3_PAM_SERVICE, "$$3_PAM_SERVICE", [The PAM service to be used by $2]) + fi + AC_SUBST($3_PAM_SERVICE) +]) + +AC_DEFUN([KDE_SHADOWPASSWD], [ + AC_REQUIRE([KDE_PAM]) + + AC_CHECK_LIB(shadow, getspent, + [ LIBSHADOW="-lshadow" + ac_use_shadow=yes + ], + [ dnl for UnixWare + AC_CHECK_LIB(gen, getspent, + [ LIBGEN="-lgen" + ac_use_shadow=yes + ], + [ AC_CHECK_FUNC(getspent, + [ ac_use_shadow=yes ], + [ ac_use_shadow=no ]) + ]) + ]) + AC_SUBST(LIBSHADOW) + AC_SUBST(LIBGEN) + + AC_MSG_CHECKING([for shadow passwords]) + + AC_ARG_WITH(shadow, + AC_HELP_STRING([--with-shadow],[If you want shadow password support]), + [ if test "x$withval" != "xno"; then + use_shadow=yes + else + use_shadow=no + fi + ], [ + use_shadow="$ac_use_shadow" + ]) + + if test "x$use_shadow" = xyes; then + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_SHADOW, 1, [Define if you use shadow passwords]) + else + AC_MSG_RESULT(no) + LIBSHADOW= + LIBGEN= + fi + + dnl finally make the relevant binaries setuid root, if we have shadow passwds. + dnl this still applies, if we could use it indirectly through pam. + if test "x$use_shadow" = xyes || + ( test "x$use_pam" = xyes && test "x$ac_use_shadow" = xyes ); then + case $host in + *-*-freebsd* | *-*-netbsd* | *-*-openbsd*) + SETUIDFLAGS="-m 4755 -o root";; + *) + SETUIDFLAGS="-m 4755";; + esac + fi + AC_SUBST(SETUIDFLAGS) + +]) + +AC_DEFUN([KDE_PASSWDLIBS], [ + AC_REQUIRE([KDE_MISC_TESTS]) dnl for LIBCRYPT + AC_REQUIRE([KDE_PAM]) + AC_REQUIRE([KDE_SHADOWPASSWD]) + + if test "x$use_pam" = "xyes"; then + PASSWDLIBS="$PAMLIBS" + else + PASSWDLIBS="$LIBCRYPT $LIBSHADOW $LIBGEN" + fi + + dnl FreeBSD uses a shadow-like setup, where /etc/passwd holds the users, but + dnl /etc/master.passwd holds the actual passwords. /etc/master.passwd requires + dnl root to read, so kcheckpass needs to be root (even when using pam, since pam + dnl may need to read /etc/master.passwd). + case $host in + *-*-freebsd*) + SETUIDFLAGS="-m 4755 -o root" + ;; + *) + ;; + esac + + AC_SUBST(PASSWDLIBS) +]) + +AC_DEFUN([KDE_CHECK_LIBDL], +[ +AC_CHECK_LIB(dl, dlopen, [ +LIBDL="-ldl" +ac_cv_have_dlfcn=yes +]) + +AC_CHECK_LIB(dld, shl_unload, [ +LIBDL="-ldld" +ac_cv_have_shload=yes +]) + +AC_SUBST(LIBDL) +]) + +AC_DEFUN([KDE_CHECK_DLOPEN], +[ +KDE_CHECK_LIBDL +AC_CHECK_HEADERS(dlfcn.h dl.h) +if test "$ac_cv_header_dlfcn_h" = "no"; then + ac_cv_have_dlfcn=no +fi + +if test "$ac_cv_header_dl_h" = "no"; then + ac_cv_have_shload=no +fi + +dnl XXX why change enable_dlopen? its already set by autoconf's AC_ARG_ENABLE +dnl (MM) +AC_ARG_ENABLE(dlopen, +AC_HELP_STRING([--disable-dlopen],[link statically [default=no]]), +enable_dlopen=$enableval, +enable_dlopen=yes) + +# override the user's opinion, if we know it better ;) +if test "$ac_cv_have_dlfcn" = "no" && test "$ac_cv_have_shload" = "no"; then + enable_dlopen=no +fi + +if test "$ac_cv_have_dlfcn" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_DLFCN, 1, [Define if you have dlfcn]) +fi + +if test "$ac_cv_have_shload" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_SHLOAD, 1, [Define if you have shload]) +fi + +if test "$enable_dlopen" = no ; then + test -n "$1" && eval $1 +else + test -n "$2" && eval $2 +fi + +]) + +AC_DEFUN([KDE_CHECK_DYNAMIC_LOADING], +[ +KDE_CHECK_DLOPEN(libtool_enable_shared=yes, libtool_enable_static=no) +KDE_PROG_LIBTOOL +AC_MSG_CHECKING([dynamic loading]) +eval "`egrep '^build_libtool_libs=' libtool`" +if test "$build_libtool_libs" = "yes" && test "$enable_dlopen" = "yes"; then + dynamic_loading=yes + AC_DEFINE_UNQUOTED(HAVE_DYNAMIC_LOADING) +else + dynamic_loading=no +fi +AC_MSG_RESULT($dynamic_loading) +if test "$dynamic_loading" = "yes"; then + $1 +else + $2 +fi +]) + +AC_DEFUN([KDE_ADD_INCLUDES], +[ +if test -z "$1"; then + test_include="Pix.h" +else + test_include="$1" +fi + +AC_MSG_CHECKING([for libg++ ($test_include)]) + +AC_CACHE_VAL(kde_cv_libgpp_includes, +[ +kde_cv_libgpp_includes=no + + for ac_dir in \ + \ + /usr/include/g++ \ + /usr/include \ + /usr/unsupported/include \ + /opt/include \ + $extra_include \ + ; \ + do + if test -r "$ac_dir/$test_include"; then + kde_cv_libgpp_includes=$ac_dir + break + fi + done +]) + +AC_MSG_RESULT($kde_cv_libgpp_includes) +if test "$kde_cv_libgpp_includes" != "no"; then + all_includes="-I$kde_cv_libgpp_includes $all_includes $USER_INCLUDES" +fi +]) +]) + +AC_DEFUN([KDE_CHECK_LIBPTHREAD], +[ + dnl This code is here specifically to handle the + dnl various flavors of threading library on FreeBSD + dnl 4-, 5-, and 6-, and the (weird) rules around it. + dnl There may be an environment PTHREAD_LIBS that + dnl specifies what to use; otherwise, search for it. + dnl -pthread is special cased and unsets LIBPTHREAD + dnl below if found. + LIBPTHREAD="" + + if test -n "$PTHREAD_LIBS"; then + if test "x$PTHREAD_LIBS" = "x-pthread" ; then + LIBPTHREAD="PTHREAD" + else + PTHREAD_LIBS_save="$PTHREAD_LIBS" + PTHREAD_LIBS=`echo "$PTHREAD_LIBS_save" | sed -e 's,^-l,,g'` + AC_MSG_CHECKING([for pthread_create in $PTHREAD_LIBS]) + KDE_CHECK_LIB($PTHREAD_LIBS, pthread_create, [ + LIBPTHREAD="$PTHREAD_LIBS_save"]) + PTHREAD_LIBS="$PTHREAD_LIBS_save" + fi + fi + + dnl Is this test really needed, in the face of the Tru64 test below? + if test -z "$LIBPTHREAD"; then + AC_CHECK_LIB(pthread, pthread_create, [LIBPTHREAD="-lpthread"]) + fi + + dnl This is a special Tru64 check, see BR 76171 issue #18. + if test -z "$LIBPTHREAD" ; then + AC_MSG_CHECKING([for pthread_create in -lpthread]) + kde_safe_libs=$LIBS + LIBS="$LIBS -lpthread" + AC_TRY_LINK([#include ],[(void)pthread_create(0,0,0,0);],[ + AC_MSG_RESULT(yes) + LIBPTHREAD="-lpthread"],[ + AC_MSG_RESULT(no)]) + LIBS=$kde_safe_libs + fi + + dnl Un-special-case for FreeBSD. + if test "x$LIBPTHREAD" = "xPTHREAD" ; then + LIBPTHREAD="" + fi + + AC_SUBST(LIBPTHREAD) +]) + +AC_DEFUN([KDE_CHECK_PTHREAD_OPTION], +[ + USE_THREADS="" + if test -z "$LIBPTHREAD"; then + KDE_CHECK_COMPILER_FLAG(pthread, [USE_THREADS="-D_THREAD_SAFE -pthread"]) + fi + + AH_VERBATIM(__svr_define, [ +#if defined(__SVR4) && !defined(__svr4__) +#define __svr4__ 1 +#endif +]) + case $host_os in + solaris*) + KDE_CHECK_COMPILER_FLAG(mt, [USE_THREADS="-mt"]) + CPPFLAGS="$CPPFLAGS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DUSE_SOLARIS -DSVR4" + ;; + freebsd*) + CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE $PTHREAD_CFLAGS" + ;; + aix*) + CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" + LIBPTHREAD="$LIBPTHREAD -lc_r" + ;; + linux*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" + if test "$CXX" = "KCC"; then + CXXFLAGS="$CXXFLAGS --thread_safe" + NOOPT_CXXFLAGS="$NOOPT_CXXFLAGS --thread_safe" + fi + ;; + *) + ;; + esac + AC_SUBST(USE_THREADS) + AC_SUBST(LIBPTHREAD) +]) + +AC_DEFUN([KDE_CHECK_THREADING], +[ + AC_REQUIRE([KDE_CHECK_LIBPTHREAD]) + AC_REQUIRE([KDE_CHECK_PTHREAD_OPTION]) + dnl default is yes if libpthread is found and no if no libpthread is available + if test -z "$LIBPTHREAD"; then + if test -z "$USE_THREADS"; then + kde_check_threading_default=no + else + kde_check_threading_default=yes + fi + else + kde_check_threading_default=yes + fi + AC_ARG_ENABLE(threading,AC_HELP_STRING([--disable-threading],[disables threading even if libpthread found]), + kde_use_threading=$enableval, kde_use_threading=$kde_check_threading_default) + if test "x$kde_use_threading" = "xyes"; then + AC_DEFINE(HAVE_LIBPTHREAD, 1, [Define if you have a working libpthread (will enable threaded code)]) + fi +]) + +AC_DEFUN([KDE_TRY_LINK_PYTHON], +[ +if test "$kde_python_link_found" = no; then + +if test "$1" = normal; then + AC_MSG_CHECKING(if a Python application links) +else + AC_MSG_CHECKING(if Python depends on $2) +fi + +AC_CACHE_VAL(kde_cv_try_link_python_$1, +[ +kde_save_cflags="$CFLAGS" +CFLAGS="$CFLAGS $PYTHONINC" +kde_save_libs="$LIBS" +LIBS="$LIBS $LIBPYTHON $2 $LIBDL $LIBSOCKET" +kde_save_ldflags="$LDFLAGS" +LDFLAGS="$LDFLAGS $PYTHONLIB" + +AC_TRY_LINK( +[ +#include +],[ + PySys_SetArgv(1, 0); +], + [kde_cv_try_link_python_$1=yes], + [kde_cv_try_link_python_$1=no] +) +CFLAGS="$kde_save_cflags" +LIBS="$kde_save_libs" +LDFLAGS="$kde_save_ldflags" +]) + +if test "$kde_cv_try_link_python_$1" = "yes"; then + AC_MSG_RESULT(yes) + kde_python_link_found=yes + if test ! "$1" = normal; then + LIBPYTHON="$LIBPYTHON $2" + fi + $3 +else + AC_MSG_RESULT(no) + $4 +fi + +fi + +]) + +AC_DEFUN([KDE_CHECK_PYTHON_DIR], +[ +AC_MSG_CHECKING([for Python directory]) + +AC_CACHE_VAL(kde_cv_pythondir, +[ + if test -z "$PYTHONDIR"; then + kde_cv_pythondir=/usr/local + else + kde_cv_pythondir="$PYTHONDIR" + fi +]) + +AC_ARG_WITH(pythondir, +AC_HELP_STRING([--with-pythondir=pythondir],[use python installed in pythondir]), +[ + ac_python_dir=$withval +], ac_python_dir=$kde_cv_pythondir +) + +AC_MSG_RESULT($ac_python_dir) +]) + +AC_DEFUN([KDE_CHECK_PYTHON_INTERN], +[ +AC_REQUIRE([KDE_CHECK_LIBDL]) +AC_REQUIRE([KDE_CHECK_LIBPTHREAD]) +AC_REQUIRE([KDE_CHECK_PYTHON_DIR]) + +if test -z "$1"; then + version="1.5" +else + version="$1" +fi + +AC_MSG_CHECKING([for Python$version]) + +python_incdirs="$ac_python_dir/include /usr/include /usr/local/include/ $kde_extra_includes" +AC_FIND_FILE(Python.h, $python_incdirs, python_incdir) +if test ! -r $python_incdir/Python.h; then + AC_FIND_FILE(python$version/Python.h, $python_incdirs, python_incdir) + python_incdir=$python_incdir/python$version + if test ! -r $python_incdir/Python.h; then + python_incdir=no + fi +fi + +PYTHONINC=-I$python_incdir + +python_libdirs="$ac_python_dir/lib$kdelibsuff /usr/lib$kdelibsuff /usr/local /usr/lib$kdelibsuff $kde_extra_libs" +AC_FIND_FILE(libpython$version.so, $python_libdirs, python_libdir) +if test ! -r $python_libdir/libpython$version.so; then + AC_FIND_FILE(libpython$version.a, $python_libdirs, python_libdir) + if test ! -r $python_libdir/libpython$version.a; then + AC_FIND_FILE(python$version/config/libpython$version.a, $python_libdirs, python_libdir) + python_libdir=$python_libdir/python$version/config + if test ! -r $python_libdir/libpython$version.a; then + python_libdir=no + fi + fi +fi + +PYTHONLIB=-L$python_libdir +kde_orig_LIBPYTHON=$LIBPYTHON +if test -z "$LIBPYTHON"; then + LIBPYTHON=-lpython$version +fi + +AC_FIND_FILE(python$version/copy.py, $python_libdirs, python_moddir) +python_moddir=$python_moddir/python$version +if test ! -r $python_moddir/copy.py; then + python_moddir=no +fi + +PYTHONMODDIR=$python_moddir + +AC_MSG_RESULT(header $python_incdir library $python_libdir modules $python_moddir) + +if test x$python_incdir = xno || test x$python_libdir = xno || test x$python_moddir = xno; then + LIBPYTHON=$kde_orig_LIBPYTHON + test "x$PYTHONLIB" = "x-Lno" && PYTHONLIB="" + test "x$PYTHONINC" = "x-Ino" && PYTHONINC="" + $2 +else + dnl Note: this test is very weak + kde_python_link_found=no + KDE_TRY_LINK_PYTHON(normal) + KDE_TRY_LINK_PYTHON(m, -lm) + KDE_TRY_LINK_PYTHON(pthread, $LIBPTHREAD) + KDE_TRY_LINK_PYTHON(tcl, -ltcl) + KDE_TRY_LINK_PYTHON(db2, -ldb2) + KDE_TRY_LINK_PYTHON(m_and_thread, [$LIBPTHREAD -lm]) + KDE_TRY_LINK_PYTHON(m_and_thread_and_util, [$LIBPTHREAD -lm -lutil]) + KDE_TRY_LINK_PYTHON(m_and_thread_and_db3, [$LIBPTHREAD -lm -ldb-3 -lutil]) + KDE_TRY_LINK_PYTHON(pthread_and_db3, [$LIBPTHREAD -ldb-3]) + KDE_TRY_LINK_PYTHON(m_and_thread_and_db, [$LIBPTHREAD -lm -ldb -ltermcap -lutil]) + KDE_TRY_LINK_PYTHON(pthread_and_dl, [$LIBPTHREAD $LIBDL -lutil -lreadline -lncurses -lm]) + KDE_TRY_LINK_PYTHON(pthread_and_panel_curses, [$LIBPTHREAD $LIBDL -lm -lpanel -lcurses]) + KDE_TRY_LINK_PYTHON(m_and_thread_and_db_special, [$LIBPTHREAD -lm -ldb -lutil], [], + [AC_MSG_WARN([it seems, Python depends on another library. + Please set LIBPYTHON to '-lpython$version -lotherlib' before calling configure to fix this + and contact the authors to let them know about this problem]) + ]) + + LIBPYTHON="$LIBPYTHON $LIBDL $LIBSOCKET" + AC_SUBST(PYTHONINC) + AC_SUBST(PYTHONLIB) + AC_SUBST(LIBPYTHON) + AC_SUBST(PYTHONMODDIR) + AC_DEFINE(HAVE_PYTHON, 1, [Define if you have the development files for python]) +fi + +]) + + +AC_DEFUN([KDE_CHECK_PYTHON], +[ + KDE_CHECK_PYTHON_INTERN("2.5", + [KDE_CHECK_PYTHON_INTERN("2.4", + [KDE_CHECK_PYTHON_INTERN("2.3", + [KDE_CHECK_PYTHON_INTERN("2.2", + [KDE_CHECK_PYTHON_INTERN("2.1", + [KDE_CHECK_PYTHON_INTERN("2.0", + [KDE_CHECK_PYTHON_INTERN($1, $2) ]) + ]) + ]) + ]) + ]) + ]) +]) + +AC_DEFUN([KDE_CHECK_STL], +[ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="`echo $CXXFLAGS | sed s/-fno-exceptions//`" + + AC_MSG_CHECKING([if C++ programs can be compiled]) + AC_CACHE_VAL(kde_cv_stl_works, + [ + AC_TRY_COMPILE([ +#include +using namespace std; +],[ + string astring="Hallo Welt."; + astring.erase(0, 6); // now astring is "Welt" + return 0; +], kde_cv_stl_works=yes, + kde_cv_stl_works=no) +]) + + AC_MSG_RESULT($kde_cv_stl_works) + + if test "$kde_cv_stl_works" = "yes"; then + # back compatible + AC_DEFINE_UNQUOTED(HAVE_SGI_STL, 1, [Define if you have a STL implementation by SGI]) + else + AC_MSG_ERROR([Your Installation isn't able to compile simple C++ programs. +Check config.log for details - if you're using a Linux distribution you might miss +a package named similar to libstdc++-dev.]) + fi + + CXXFLAGS="$ac_save_CXXFLAGS" + AC_LANG_RESTORE +]) + +AC_DEFUN([AC_FIND_QIMGIO], + [AC_REQUIRE([AC_FIND_JPEG]) +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_MSG_CHECKING([for qimgio]) +AC_CACHE_VAL(ac_cv_lib_qimgio, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +ac_save_LIBS="$LIBS" +ac_save_CXXFLAGS="$CXXFLAGS" +LIBS="$all_libraries -lqimgio -lpng -lz $LIBJPEG $LIBQT" +CXXFLAGS="$CXXFLAGS -I$qt_incdir $all_includes" +AC_TRY_RUN(dnl +[ +#include +#include +int main() { + QString t = "hallo"; + t.fill('t'); + qInitImageIO(); +} +], + ac_cv_lib_qimgio=yes, + ac_cv_lib_qimgio=no, + ac_cv_lib_qimgio=no) +LIBS="$ac_save_LIBS" +CXXFLAGS="$ac_save_CXXFLAGS" +AC_LANG_RESTORE +])dnl +if eval "test \"`echo $ac_cv_lib_qimgio`\" = yes"; then + LIBQIMGIO="-lqimgio -lpng -lz $LIBJPEG" + AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(HAVE_QIMGIO, 1, [Define if you have the Qt extension qimgio available]) + AC_SUBST(LIBQIMGIO) +else + AC_MSG_RESULT(not found) +fi +]) + +AC_DEFUN([AM_DISABLE_LIBRARIES], +[ + AC_PROVIDE([AM_ENABLE_STATIC]) + AC_PROVIDE([AM_ENABLE_SHARED]) + enable_static=no + enable_shared=yes +]) + + +AC_DEFUN([AC_CHECK_UTMP_FILE], +[ + AC_MSG_CHECKING([for utmp file]) + + AC_CACHE_VAL(kde_cv_utmp_file, + [ + kde_cv_utmp_file=no + + for ac_file in \ + \ + /var/run/utmp \ + /var/adm/utmp \ + /etc/utmp \ + ; \ + do + if test -r "$ac_file"; then + kde_cv_utmp_file=$ac_file + break + fi + done + ]) + + if test "$kde_cv_utmp_file" != "no"; then + AC_DEFINE_UNQUOTED(UTMP, "$kde_cv_utmp_file", [Define the file for utmp entries]) + $1 + AC_MSG_RESULT($kde_cv_utmp_file) + else + $2 + AC_MSG_RESULT([non found]) + fi +]) + + +AC_DEFUN([KDE_CREATE_SUBDIRSLIST], +[ + +DO_NOT_COMPILE="$DO_NOT_COMPILE CVS debian bsd-port admin" +TOPSUBDIRS="" + +if test ! -s $srcdir/subdirs; then + dnl Note: Makefile.common creates subdirs, so this is just a fallback + files=`cd $srcdir && ls -1` + dirs=`for i in $files; do if test -d $i; then echo $i; fi; done` + for i in $dirs; do + echo $i >> $srcdir/subdirs + done +fi + +ac_topsubdirs= +if test -s $srcdir/inst-apps; then + ac_topsubdirs="`cat $srcdir/inst-apps`" +elif test -s $srcdir/subdirs; then + ac_topsubdirs="`cat $srcdir/subdirs`" +fi + +for i in $ac_topsubdirs; do + AC_MSG_CHECKING([if $i should be compiled]) + if test -d $srcdir/$i; then + install_it="yes" + for j in $DO_NOT_COMPILE; do + if test $i = $j; then + install_it="no" + fi + done + else + install_it="no" + fi + AC_MSG_RESULT($install_it) + vari=`echo $i | sed -e 's,[[-+.@]],_,g'` + if test $install_it = "yes"; then + TOPSUBDIRS="$TOPSUBDIRS $i" + eval "$vari""_SUBDIR_included=yes" + else + eval "$vari""_SUBDIR_included=no" + fi +done + +AC_SUBST(TOPSUBDIRS) +]) + +AC_DEFUN([KDE_CHECK_NAMESPACES], +[ +AC_MSG_CHECKING(whether C++ compiler supports namespaces) +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +AC_TRY_COMPILE([ +], +[ +namespace Foo { + extern int i; + namespace Bar { + extern int i; + } +} + +int Foo::i = 0; +int Foo::Bar::i = 1; +],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_NAMESPACES) +], [ +AC_MSG_RESULT(no) +]) +AC_LANG_RESTORE +]) + +dnl ------------------------------------------------------------------------ +dnl Check for S_ISSOCK macro. Doesn't exist on Unix SCO. faure@kde.org +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_CHECK_S_ISSOCK], +[ +AC_MSG_CHECKING(for S_ISSOCK) +AC_CACHE_VAL(ac_cv_have_s_issock, +[ +AC_TRY_LINK( +[ +#include +], +[ +struct stat buff; +int b = S_ISSOCK( buff.st_mode ); +], +ac_cv_have_s_issock=yes, +ac_cv_have_s_issock=no) +]) +AC_MSG_RESULT($ac_cv_have_s_issock) +if test "$ac_cv_have_s_issock" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_S_ISSOCK, 1, [Define if sys/stat.h declares S_ISSOCK.]) +fi + +AH_VERBATIM(_ISSOCK, +[ +#ifndef HAVE_S_ISSOCK +#define HAVE_S_ISSOCK +#define S_ISSOCK(mode) (1==0) +#endif +]) + +]) + +dnl ------------------------------------------------------------------------ +dnl Check for MAXPATHLEN macro, defines KDEMAXPATHLEN. faure@kde.org +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_CHECK_KDEMAXPATHLEN], +[ +AC_MSG_CHECKING(for MAXPATHLEN) +AC_CACHE_VAL(ac_cv_maxpathlen, +[ +cat > conftest.$ac_ext < +#endif +#include +#include +#ifndef MAXPATHLEN +#define MAXPATHLEN 1024 +#endif + +KDE_HELLO MAXPATHLEN + +EOF + +ac_try="$ac_cpp conftest.$ac_ext 2>/dev/null | grep '^KDE_HELLO' >conftest.out" + +if AC_TRY_EVAL(ac_try) && test -s conftest.out; then + ac_cv_maxpathlen=`sed 's#KDE_HELLO ##' conftest.out` +else + ac_cv_maxpathlen=1024 +fi + +rm conftest.* + +]) +AC_MSG_RESULT($ac_cv_maxpathlen) +AC_DEFINE_UNQUOTED(KDEMAXPATHLEN,$ac_cv_maxpathlen, [Define a safe value for MAXPATHLEN] ) +]) + +AC_DEFUN([KDE_CHECK_HEADER], +[ + kde_safe_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $all_includes" + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_CHECK_HEADER([$1], [$2], [$3], [$4]) + AC_LANG_RESTORE + CPPFLAGS=$kde_safe_cppflags +]) + +AC_DEFUN([KDE_CHECK_HEADERS], +[ + AH_CHECK_HEADERS([$1]) + AC_LANG_SAVE + kde_safe_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $all_includes" + AC_LANG_CPLUSPLUS + AC_CHECK_HEADERS([$1], [$2], [$3], [$4]) + CPPFLAGS=$kde_safe_cppflags + AC_LANG_RESTORE +]) + +AC_DEFUN([KDE_FAST_CONFIGURE], +[ + dnl makes configure fast (needs perl) + AC_ARG_ENABLE(fast-perl, AC_HELP_STRING([--disable-fast-perl],[disable fast Makefile generation (needs perl)]), + with_fast_perl=$enableval, with_fast_perl=yes) +]) + +AC_DEFUN([KDE_CONF_FILES], +[ + val= + if test -f $srcdir/configure.files ; then + val=`sed -e 's%^%\$(top_srcdir)/%' $srcdir/configure.files` + fi + CONF_FILES= + if test -n "$val" ; then + for i in $val ; do + CONF_FILES="$CONF_FILES $i" + done + fi + AC_SUBST(CONF_FILES) +])dnl + +dnl This sets the prefix, for arts and kdelibs +dnl Do NOT use in any other module. +dnl It only looks at --prefix, KDEDIR and falls back to /usr/local/kde +AC_DEFUN([KDE_SET_PREFIX_CORE], +[ + unset CDPATH + dnl make $KDEDIR the default for the installation + AC_PREFIX_DEFAULT(${KDEDIR:-/usr/local/kde}) + + if test "x$prefix" = "xNONE"; then + prefix=$ac_default_prefix + ac_configure_args="$ac_configure_args --prefix=$prefix" + fi + # And delete superfluous '/' to make compares easier + prefix=`echo "$prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` + exec_prefix=`echo "$exec_prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` + + kde_libs_prefix='$(prefix)' + kde_libs_htmldir='$(kde_htmldir)' + AC_SUBST(kde_libs_prefix) + AC_SUBST(kde_libs_htmldir) + KDE_FAST_CONFIGURE + KDE_CONF_FILES +]) + + +AC_DEFUN([KDE_SET_PREFIX], +[ + unset CDPATH + dnl We can't give real code to that macro, only a value. + dnl It only matters for --help, since we set the prefix in this function anyway. + AC_PREFIX_DEFAULT(${KDEDIR:-the kde prefix}) + + KDE_SET_DEFAULT_BINDIRS + if test "x$prefix" = "xNONE"; then + dnl no prefix given: look for kde-config in the PATH and deduce the prefix from it + KDE_FIND_PATH(kde-config, KDECONFIG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(kde-config)], [], prepend) + else + dnl prefix given: look for kde-config, preferrably in prefix, otherwise in PATH + kde_save_PATH="$PATH" + PATH="$exec_prefix/bin:$prefix/bin:$PATH" + KDE_FIND_PATH(kde-config, KDECONFIG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(kde-config)], [], prepend) + PATH="$kde_save_PATH" + fi + + kde_libs_prefix=`$KDECONFIG --prefix` + if test -z "$kde_libs_prefix" || test ! -x "$kde_libs_prefix"; then + AC_MSG_ERROR([$KDECONFIG --prefix outputed the non existant prefix '$kde_libs_prefix' for kdelibs. + This means it has been moved since you installed it. + This won't work. Please recompile kdelibs for the new prefix. + ]) + fi + kde_libs_htmldir=`$KDECONFIG --install html --expandvars` + + AC_MSG_CHECKING([where to install]) + if test "x$prefix" = "xNONE"; then + prefix=$kde_libs_prefix + AC_MSG_RESULT([$prefix (as returned by kde-config)]) + else + dnl --prefix was given. Compare prefixes and warn (in configure.in.bot.end) if different + given_prefix=$prefix + AC_MSG_RESULT([$prefix (as requested)]) + fi + + # And delete superfluous '/' to make compares easier + prefix=`echo "$prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` + exec_prefix=`echo "$exec_prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` + given_prefix=`echo "$given_prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` + + AC_SUBST(KDECONFIG) + AC_SUBST(kde_libs_prefix) + AC_SUBST(kde_libs_htmldir) + + KDE_FAST_CONFIGURE + KDE_CONF_FILES +]) + +pushdef([AC_PROG_INSTALL], +[ + dnl our own version, testing for a -p flag + popdef([AC_PROG_INSTALL]) + dnl as AC_PROG_INSTALL works as it works we first have + dnl to save if the user didn't specify INSTALL, as the + dnl autoconf one overwrites INSTALL and we have no chance to find + dnl out afterwards + test -n "$INSTALL" && kde_save_INSTALL_given=$INSTALL + test -n "$INSTALL_PROGRAM" && kde_save_INSTALL_PROGRAM_given=$INSTALL_PROGRAM + test -n "$INSTALL_SCRIPT" && kde_save_INSTALL_SCRIPT_given=$INSTALL_SCRIPT + AC_PROG_INSTALL + + if test -z "$kde_save_INSTALL_given" ; then + # OK, user hasn't given any INSTALL, autoconf found one for us + # now we test, if it supports the -p flag + AC_MSG_CHECKING(for -p flag to install) + rm -f confinst.$$.* > /dev/null 2>&1 + echo "Testtest" > confinst.$$.orig + ac_res=no + if ${INSTALL} -p confinst.$$.orig confinst.$$.new > /dev/null 2>&1 ; then + if test -f confinst.$$.new ; then + # OK, -p seems to do no harm to install + INSTALL="${INSTALL} -p" + ac_res=yes + fi + fi + rm -f confinst.$$.* + AC_MSG_RESULT($ac_res) + fi + dnl the following tries to resolve some signs and wonders coming up + dnl with different autoconf/automake versions + dnl e.g.: + dnl *automake 1.4 install-strip sets A_M_INSTALL_PROGRAM_FLAGS to -s + dnl and has INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(A_M_INSTALL_PROGRAM_FLAGS) + dnl it header-vars.am, so there the actual INSTALL_PROGRAM gets the -s + dnl *automake 1.4a (and above) use INSTALL_STRIP_FLAG and only has + dnl INSTALL_PROGRAM = @INSTALL_PROGRAM@ there, but changes the + dnl install-@DIR@PROGRAMS targets to explicitly use that flag + dnl *autoconf 2.13 is dumb, and thinks it can use INSTALL_PROGRAM as + dnl INSTALL_SCRIPT, which breaks with automake <= 1.4 + dnl *autoconf >2.13 (since 10.Apr 1999) has not that failure + dnl *sometimes KDE does not use the install-@DIR@PROGRAM targets from + dnl automake (due to broken Makefile.am or whatever) to install programs, + dnl and so does not see the -s flag in automake > 1.4 + dnl to clean up that mess we: + dnl +set INSTALL_PROGRAM to use INSTALL_STRIP_FLAG + dnl which cleans KDE's program with automake > 1.4; + dnl +set INSTALL_SCRIPT to only use INSTALL, to clean up autoconf's problems + dnl with automake<=1.4 + dnl note that dues to this sometimes two '-s' flags are used (if KDE + dnl properly uses install-@DIR@PROGRAMS, but I don't care + dnl + dnl And to all this comes, that I even can't write in comments variable + dnl names used by automake, because it is so stupid to think I wanted to + dnl _use_ them, therefor I have written A_M_... instead of AM_ + dnl hmm, I wanted to say something ... ahh yes: Arghhh. + + if test -z "$kde_save_INSTALL_PROGRAM_given" ; then + INSTALL_PROGRAM='${INSTALL} $(INSTALL_STRIP_FLAG)' + fi + if test -z "$kde_save_INSTALL_SCRIPT_given" ; then + INSTALL_SCRIPT='${INSTALL}' + fi +])dnl + +AC_DEFUN([KDE_LANG_CPLUSPLUS], +[AC_LANG_CPLUSPLUS +ac_link='rm -rf SunWS_cache; ${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&AC_FD_CC' +pushdef([AC_LANG_CPLUSPLUS], [popdef([AC_LANG_CPLUSPLUS]) KDE_LANG_CPLUSPLUS]) +]) + +pushdef([AC_LANG_CPLUSPLUS], +[popdef([AC_LANG_CPLUSPLUS]) +KDE_LANG_CPLUSPLUS +]) + +AC_DEFUN([KDE_CHECK_LONG_LONG], +[ +AC_MSG_CHECKING(for long long) +AC_CACHE_VAL(kde_cv_c_long_long, +[ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_LINK([], [ + long long foo = 0; + foo = foo+1; + ], + kde_cv_c_long_long=yes, kde_cv_c_long_long=no) + AC_LANG_RESTORE +]) +AC_MSG_RESULT($kde_cv_c_long_long) +if test "$kde_cv_c_long_long" = yes; then + AC_DEFINE(HAVE_LONG_LONG, 1, [Define if you have long long as datatype]) +fi +]) + +AC_DEFUN([KDE_CHECK_LIB], +[ + kde_save_LDFLAGS="$LDFLAGS" + dnl AC_CHECK_LIB modifies LIBS, so save it here + kde_save_LIBS="$LIBS" + LDFLAGS="$LDFLAGS $all_libraries" + case $host_os in + aix*) LDFLAGS="-brtl $LDFLAGS" + test "$GCC" = yes && LDFLAGS="-Wl,$LDFLAGS" + ;; + esac + AC_CHECK_LIB($1, $2, $3, $4, $5) + LDFLAGS="$kde_save_LDFLAGS" + LIBS="$kde_save_LIBS" +]) + +AC_DEFUN([KDE_JAVA_PREFIX], +[ + dir=`dirname "$1"` + base=`basename "$1"` + list=`ls -1 $dir 2> /dev/null` + for entry in $list; do + if test -d $dir/$entry/bin; then + case $entry in + $base) + javadirs="$javadirs $dir/$entry/bin" + ;; + esac + elif test -d $dir/$entry/jre/bin; then + case $entry in + $base) + javadirs="$javadirs $dir/$entry/jre/bin" + ;; + esac + fi + done +]) + +dnl KDE_CHEC_JAVA_DIR(onlyjre) +AC_DEFUN([KDE_CHECK_JAVA_DIR], +[ + +AC_ARG_WITH(java, +AC_HELP_STRING([--with-java=javadir],[use java installed in javadir, --without-java disables]), +[ ac_java_dir=$withval +], ac_java_dir="" +) + +AC_MSG_CHECKING([for Java]) + +dnl at this point ac_java_dir is either a dir, 'no' to disable, or '' to say look in $PATH +if test "x$ac_java_dir" = "xno"; then + kde_java_bindir=no + kde_java_includedir=no + kde_java_libjvmdir=no + kde_java_libgcjdir=no + kde_java_libhpidir=no +else + if test "x$ac_java_dir" = "x"; then + + + dnl No option set -> collect list of candidate paths + if test -n "$JAVA_HOME"; then + KDE_JAVA_PREFIX($JAVA_HOME) + fi + KDE_JAVA_PREFIX(/usr/j2se) + KDE_JAVA_PREFIX(/usr/lib/j2se) + KDE_JAVA_PREFIX(/usr/j*dk*) + KDE_JAVA_PREFIX(/usr/lib/j*dk*) + KDE_JAVA_PREFIX(/opt/j*sdk*) + KDE_JAVA_PREFIX(/usr/lib/java*) + KDE_JAVA_PREFIX(/usr/java*) + KDE_JAVA_PREFIX(/usr/java/j*dk*) + KDE_JAVA_PREFIX(/usr/java/j*re*) + KDE_JAVA_PREFIX(/usr/lib/SunJava2*) + KDE_JAVA_PREFIX(/usr/lib/SunJava*) + KDE_JAVA_PREFIX(/usr/lib/IBMJava2*) + KDE_JAVA_PREFIX(/usr/lib/IBMJava*) + KDE_JAVA_PREFIX(/opt/java*) + + kde_cv_path="NONE" + kde_save_IFS=$IFS + IFS=':' + for dir in $PATH; do + if test -d "$dir"; then + javadirs="$javadirs $dir" + fi + done + IFS=$kde_save_IFS + jredirs= + + dnl Now javadirs contains a list of paths that exist, all ending with bin/ + for dir in $javadirs; do + dnl Check for the java executable + if test -x "$dir/java"; then + sane_path=$(cd $dir; /bin/pwd) + dnl And also check for a libjvm.so somewhere under there + dnl Since we have to go to the parent dir, /usr/bin is excluded, /usr is too big. + if test "$sane_path" != "/usr/bin"; then + libjvmdir=`find $dir/.. -name libjvm.so | sed 's,libjvm.so,,'|head -n 1` + if test ! -f $libjvmdir/libjvm.so; then continue; fi + jredirs="$jredirs $dir" + fi + fi + done + + dnl Now jredirs contains a reduced list, of paths where both java and ../**/libjvm.so was found + JAVAC= + JAVA= + kde_java_bindir=no + for dir in $jredirs; do + JAVA="$dir/java" + kde_java_bindir=$dir + if test -x "$dir/javac"; then + JAVAC="$dir/javac" + break + fi + done + + if test -n "$JAVAC"; then + dnl this substitution might not work - well, we test for jni.h below + kde_java_includedir=`echo $JAVAC | sed -e 's,bin/javac$,include/,'` + else + kde_java_includedir=no + fi + else + dnl config option set + kde_java_bindir=$ac_java_dir/bin + if test -x $ac_java_dir/bin/java && test ! -x $ac_java_dir/bin/javac; then + kde_java_includedir=no + else + kde_java_includedir=$ac_java_dir/include + fi + fi +fi + +dnl At this point kde_java_bindir and kde_java_includedir are either set or "no" +if test "x$kde_java_bindir" != "xno"; then + + dnl Look for libjvm.so + kde_java_libjvmdir=`find $kde_java_bindir/.. -name libjvm.so | sed 's,libjvm.so,,'|head -n 1` + dnl Look for libgcj.so + kde_java_libgcjdir=`find $kde_java_bindir/.. -name libgcj.so | sed 's,libgcj.so,,'|head -n 1` + dnl Look for libhpi.so and avoid green threads + kde_java_libhpidir=`find $kde_java_bindir/.. -name libhpi.so | grep -v green | sed 's,libhpi.so,,' | head -n 1` + + dnl Now check everything's fine under there + dnl the include dir is our flag for having the JDK + if test -d "$kde_java_includedir"; then + if test ! -x "$kde_java_bindir/javac"; then + AC_MSG_ERROR([javac not found under $kde_java_bindir - it seems you passed a wrong --with-java.]) + fi + if test ! -x "$kde_java_bindir/javah"; then + AC_MSG_ERROR([javah not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.]) + fi + if test ! -x "$kde_java_bindir/jar"; then + AC_MSG_ERROR([jar not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.]) + fi + if test ! -r "$kde_java_includedir/jni.h"; then + AC_MSG_ERROR([jni.h not found under $kde_java_includedir. Use --with-java or --without-java.]) + fi + + jni_includes="-I$kde_java_includedir" + dnl Strange thing, jni.h requires jni_md.h which is under genunix here.. + dnl and under linux here.. + + dnl not needed for gcj + + if test "x$kde_java_libgcjdir" = "x"; then + test -d "$kde_java_includedir/linux" && jni_includes="$jni_includes -I$kde_java_includedir/linux" + test -d "$kde_java_includedir/solaris" && jni_includes="$jni_includes -I$kde_java_includedir/solaris" + test -d "$kde_java_includedir/genunix" && jni_includes="$jni_includes -I$kde_java_includedir/genunix" + fi + + else + JAVAC= + jni_includes= + fi + + if test "x$kde_java_libgcjdir" = "x"; then + if test ! -r "$kde_java_libjvmdir/libjvm.so"; then + AC_MSG_ERROR([libjvm.so not found under $kde_java_libjvmdir. Use --without-java.]) + fi + else + if test ! -r "$kde_java_libgcjdir/libgcj.so"; then + AC_MSG_ERROR([libgcj.so not found under $kde_java_libgcjdir. Use --without-java.]) + fi + fi + + if test ! -x "$kde_java_bindir/java"; then + AC_MSG_ERROR([java not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.]) + fi + + dnl not needed for gcj compile + + if test "x$kde_java_libgcjdir" = "x"; then + if test ! -r "$kde_java_libhpidir/libhpi.so"; then + AC_MSG_ERROR([libhpi.so not found under $kde_java_libhpidir. Use --without-java.]) + fi + fi + + if test -n "$jni_includes"; then + dnl Check for JNI version + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_cxxflags_safe="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS $all_includes $jni_includes" + + AC_TRY_COMPILE([ + #include + ], + [ + #ifndef JNI_VERSION_1_2 + Syntax Error + #endif + ],[ kde_jni_works=yes ], + [ kde_jni_works=no ]) + + if test $kde_jni_works = no; then + AC_MSG_ERROR([Incorrect version of $kde_java_includedir/jni.h. + You need to have Java Development Kit (JDK) version 1.2. + + Use --with-java to specify another location. + Use --without-java to configure without java support. + Or download a newer JDK and try again. + See e.g. http://java.sun.com/products/jdk/1.2 ]) + fi + + CXXFLAGS="$ac_cxxflags_safe" + AC_LANG_RESTORE + + dnl All tests ok, inform and subst the variables + + JAVAC=$kde_java_bindir/javac + JAVAH=$kde_java_bindir/javah + JAR=$kde_java_bindir/jar + AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is]) + if test "x$kde_java_libgcjdir" = "x"; then + JVMLIBS="-L$kde_java_libjvmdir -ljvm -L$kde_java_libhpidir -lhpi" + else + JVMLIBS="-L$kde_java_libgcjdir -lgcj" + fi + AC_MSG_RESULT([java JDK in $kde_java_bindir]) + + else + AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is]) + AC_MSG_RESULT([java JRE in $kde_java_bindir]) + fi +elif test -d "/Library/Java/Home"; then + kde_java_bindir="/Library/Java/Home/bin" + jni_includes="-I/Library/Java/Home/include" + + JAVAC=$kde_java_bindir/javac + JAVAH=$kde_java_bindir/javah + JAR=$kde_java_bindir/jar + JVMLIBS="-Wl,-framework,JavaVM" + + AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is]) + AC_MSG_RESULT([Apple Java Framework]) +else + AC_MSG_RESULT([none found]) +fi + +AC_SUBST(JAVAC) +AC_SUBST(JAVAH) +AC_SUBST(JAR) +AC_SUBST(JVMLIBS) +AC_SUBST(jni_includes) + +# for backward compat +kde_cv_java_includedir=$kde_java_includedir +kde_cv_java_bindir=$kde_java_bindir +]) + +dnl this is a redefinition of autoconf 2.5x's AC_FOREACH. +dnl When the argument list becomes big, as in KDE for AC_OUTPUT in +dnl big packages, m4_foreach is dog-slow. So use our own version of +dnl it. (matz@kde.org) +m4_define([mm_foreach], +[m4_pushdef([$1])_mm_foreach($@)m4_popdef([$1])]) +m4_define([mm_car], [[$1]]) +m4_define([mm_car2], [[$@]]) +m4_define([_mm_foreach], +[m4_if(m4_quote($2), [], [], + [m4_define([$1], mm_car($2))$3[]_mm_foreach([$1], + mm_car2(m4_shift($2)), + [$3])])]) +m4_define([AC_FOREACH], +[mm_foreach([$1], m4_split(m4_normalize([$2])), [$3])]) + +AC_DEFUN([KDE_NEED_FLEX], +[ +kde_libs_safe=$LIBS +LIBS="$LIBS $USER_LDFLAGS" +AM_PROG_LEX +LIBS=$kde_libs_safe +if test -z "$LEXLIB"; then + AC_MSG_ERROR([You need to have flex installed.]) +fi +AC_SUBST(LEXLIB) +]) + +AC_DEFUN([AC_PATH_QTOPIA], +[ + dnl TODO: use AC_CACHE_VAL + + if test -z "$1"; then + qtopia_minver_maj=1 + qtopia_minver_min=5 + qtopia_minver_pat=0 + else + qtopia_minver_maj=`echo "$1" | sed -e "s/^\(.*\)\..*\..*$/\1/"` + qtopia_minver_min=`echo "$1" | sed -e "s/^.*\.\(.*\)\..*$/\1/"` + qtopia_minver_pat=`echo "$1" | sed -e "s/^.*\..*\.\(.*\)$/\1/"` + fi + + qtopia_minver="$qtopia_minver_maj$qtopia_minver_min$qtopia_minver_pat" + qtopia_minverstr="$qtopia_minver_maj.$qtopia_minver_min.$qtopia_minver_pat" + + AC_REQUIRE([AC_PATH_QT]) + + AC_MSG_CHECKING([for Qtopia]) + + LIB_QTOPIA="-lqpe" + AC_SUBST(LIB_QTOPIA) + + kde_qtopia_dirs="$QPEDIR /opt/Qtopia" + + ac_qtopia_incdir=NO + + AC_ARG_WITH(qtopia-dir, + AC_HELP_STRING([--with-qtopia-dir=DIR],[where the root of Qtopia is installed]), + [ ac_qtopia_incdir="$withval"/include] ) + + qtopia_incdirs="" + for dir in $kde_qtopia_dirs; do + qtopia_incdirs="$qtopia_incdirs $dir/include" + done + + if test ! "$ac_qtopia_incdir" = "NO"; then + qtopia_incdirs="$ac_qtopia_incdir $qtopia_incdirs" + fi + + qtopia_incdir="" + AC_FIND_FILE(qpe/qpeapplication.h, $qtopia_incdirs, qtopia_incdir) + ac_qtopia_incdir="$qtopia_incdir" + + if test -z "$qtopia_incdir"; then + AC_MSG_ERROR([Cannot find Qtopia headers. Please check your installation.]) + fi + + qtopia_ver_maj=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION "\(.*\)\..*\..*".*,\1,p'`; + qtopia_ver_min=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION ".*\.\(.*\)\..*".*,\1,p'`; + qtopia_ver_pat=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION ".*\..*\.\(.*\)".*,\1,p'`; + + qtopia_ver="$qtopia_ver_maj$qtopia_ver_min$qtopia_ver_pat" + qtopia_verstr="$qtopia_ver_maj.$qtopia_ver_min.$qtopia_ver_pat" + if test "$qtopia_ver" -lt "$qtopia_minver"; then + AC_MSG_ERROR([found Qtopia version $qtopia_verstr but version $qtopia_minverstr +is required.]) + fi + + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + + ac_cxxflags_safe="$CXXFLAGS" + ac_ldflags_safe="$LDFLAGS" + ac_libs_safe="$LIBS" + + CXXFLAGS="$CXXFLAGS -I$qtopia_incdir $all_includes" + LDFLAGS="$LDFLAGS $QT_LDFLAGS $all_libraries $USER_LDFLAGS $KDE_MT_LDFLAGS" + LIBS="$LIBS $LIB_QTOPIA $LIBQT" + + cat > conftest.$ac_ext < +#include + +int main( int argc, char **argv ) +{ + QPEApplication app( argc, argv ); + return 0; +} +EOF + + if AC_TRY_EVAL(ac_link) && test -s conftest; then + rm -f conftest* + else + rm -f conftest* + AC_MSG_ERROR([Cannot link small Qtopia Application. For more details look at +the end of config.log]) + fi + + CXXFLAGS="$ac_cxxflags_safe" + LDFLAGS="$ac_ldflags_safe" + LIBS="$ac_libs_safe" + + AC_LANG_RESTORE + + QTOPIA_INCLUDES="-I$qtopia_incdir" + AC_SUBST(QTOPIA_INCLUDES) + + AC_MSG_RESULT([found version $qtopia_verstr with headers at $qtopia_incdir]) +]) + + +AC_DEFUN([KDE_INIT_DOXYGEN], +[ +AC_MSG_CHECKING([for Qt docs]) +kde_qtdir= +if test "${with_qt_dir+set}" = set; then + kde_qtdir="$with_qt_dir" +fi + +AC_FIND_FILE(qsql.html, [ $kde_qtdir/doc/html $QTDIR/doc/html /usr/share/doc/packages/qt3/html /usr/lib/qt/doc /usr/lib/qt3/doc /usr/lib/qt3/doc/html /usr/doc/qt3/html /usr/doc/qt3 /usr/share/doc/qt3-doc /usr/share/qt3/doc/html /usr/X11R6/share/doc/qt/html ], QTDOCDIR) +AC_MSG_RESULT($QTDOCDIR) + +AC_SUBST(QTDOCDIR) + +KDE_FIND_PATH(dot, DOT, [], []) +if test -n "$DOT"; then + KDE_HAVE_DOT="YES" +else + KDE_HAVE_DOT="NO" +fi +AC_SUBST(KDE_HAVE_DOT) +KDE_FIND_PATH(doxygen, DOXYGEN, [], []) +AC_SUBST(DOXYGEN) + +DOXYGEN_PROJECT_NAME="$1" +DOXYGEN_PROJECT_NUMBER="$2" +AC_SUBST(DOXYGEN_PROJECT_NAME) +AC_SUBST(DOXYGEN_PROJECT_NUMBER) + +KDE_HAS_DOXYGEN=no +if test -n "$DOXYGEN" && test -x "$DOXYGEN" && test -f $QTDOCDIR/qsql.html; then + KDE_HAS_DOXYGEN=yes +fi +AC_SUBST(KDE_HAS_DOXYGEN) + +]) + + +AC_DEFUN([AC_FIND_BZIP2], +[ +AC_MSG_CHECKING([for bzDecompress in libbz2]) +AC_CACHE_VAL(ac_cv_lib_bzip2, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +kde_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS -lbz2 $LIBSOCKET" +kde_save_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK(dnl +[ +#define BZ_NO_STDIO +#include +], + [ bz_stream s; (void) bzDecompress(&s); ], + eval "ac_cv_lib_bzip2='-lbz2'", + eval "ac_cv_lib_bzip2=no") +LIBS="$kde_save_LIBS" +CXXFLAGS="$kde_save_CXXFLAGS" +AC_LANG_RESTORE +])dnl +AC_MSG_RESULT($ac_cv_lib_bzip2) + +if test ! "$ac_cv_lib_bzip2" = no; then + BZIP2DIR=bzip2 + + LIBBZ2="$ac_cv_lib_bzip2" + AC_SUBST(LIBBZ2) + +else + + cxx_shared_flag= + ld_shared_flag= + KDE_CHECK_COMPILER_FLAG(shared, [ + ld_shared_flag="-shared" + ]) + KDE_CHECK_COMPILER_FLAG(fPIC, [ + cxx_shared_flag="-fPIC" + ]) + + AC_MSG_CHECKING([for BZ2_bzDecompress in (shared) libbz2]) + AC_CACHE_VAL(ac_cv_lib_bzip2_prefix, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + kde_save_LIBS="$LIBS" + LIBS="$all_libraries $USER_LDFLAGS $ld_shared_flag -lbz2 $LIBSOCKET" + kde_save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="$CFLAGS $cxx_shared_flag $all_includes $USER_INCLUDES" + + AC_TRY_LINK(dnl + [ + #define BZ_NO_STDIO + #include + ], + [ bz_stream s; (void) BZ2_bzDecompress(&s); ], + eval "ac_cv_lib_bzip2_prefix='-lbz2'", + eval "ac_cv_lib_bzip2_prefix=no") + LIBS="$kde_save_LIBS" + CXXFLAGS="$kde_save_CXXFLAGS" + AC_LANG_RESTORE + ])dnl + + AC_MSG_RESULT($ac_cv_lib_bzip2_prefix) + + if test ! "$ac_cv_lib_bzip2_prefix" = no; then + BZIP2DIR=bzip2 + + LIBBZ2="$ac_cv_lib_bzip2_prefix" + AC_SUBST(LIBBZ2) + + AC_DEFINE(NEED_BZ2_PREFIX, 1, [Define if the libbz2 functions need the BZ2_ prefix]) + dnl else, we just ignore this + fi + +fi +AM_CONDITIONAL(include_BZIP2, test -n "$BZIP2DIR") +]) + +dnl ------------------------------------------------------------------------ +dnl Try to find the SSL headers and libraries. +dnl $(SSL_LDFLAGS) will be -Lsslliblocation (if needed) +dnl and $(SSL_INCLUDES) will be -Isslhdrlocation (if needed) +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([KDE_CHECK_SSL], +[ +LIBSSL="-lssl -lcrypto" +AC_REQUIRE([KDE_CHECK_LIB64]) + +ac_ssl_includes=NO ac_ssl_libraries=NO +ssl_libraries="" +ssl_includes="" +AC_ARG_WITH(ssl-dir, + AC_HELP_STRING([--with-ssl-dir=DIR],[where the root of OpenSSL is installed]), + [ ac_ssl_includes="$withval"/include + ac_ssl_libraries="$withval"/lib$kdelibsuff + ]) + +want_ssl=yes +AC_ARG_WITH(ssl, + AC_HELP_STRING([--without-ssl],[disable SSL checks]), + [want_ssl=$withval]) + +if test $want_ssl = yes; then + +AC_MSG_CHECKING(for OpenSSL) + +AC_CACHE_VAL(ac_cv_have_ssl, +[#try to guess OpenSSL locations + + ssl_incdirs="/usr/include /usr/local/include /usr/ssl/include /usr/local/ssl/include $prefix/include $kde_extra_includes" + ssl_incdirs="$ac_ssl_includes $ssl_incdirs" + AC_FIND_FILE(openssl/ssl.h, $ssl_incdirs, ssl_incdir) + ac_ssl_includes="$ssl_incdir" + + ssl_libdirs="/usr/lib$kdelibsuff /usr/local/lib$kdelibsuff /usr/ssl/lib$kdelibsuff /usr/local/ssl/lib$kdelibsuff $libdir $prefix/lib$kdelibsuff $exec_prefix/lib$kdelibsuff $kde_extra_libs" + if test ! "$ac_ssl_libraries" = "NO"; then + ssl_libdirs="$ac_ssl_libraries $ssl_libdirs" + fi + + test=NONE + ssl_libdir=NONE + for dir in $ssl_libdirs; do + try="ls -1 $dir/libssl*" + if test=`eval $try 2> /dev/null`; then ssl_libdir=$dir; break; else echo "tried $dir" >&AC_FD_CC ; fi + done + + ac_ssl_libraries="$ssl_libdir" + + ac_ldflags_safe="$LDFLAGS" + ac_libs_safe="$LIBS" + + LDFLAGS="$LDFLAGS -L$ssl_libdir $all_libraries" + LIBS="$LIBS $LIBSSL -lRSAglue -lrsaref" + + AC_TRY_LINK(,void RSAPrivateEncrypt(void);RSAPrivateEncrypt();, + ac_ssl_rsaref="yes" + , + ac_ssl_rsaref="no" + ) + + LDFLAGS="$ac_ldflags_safe" + LIBS="$ac_libs_safe" + + if test "$ac_ssl_includes" = NO || test "$ac_ssl_libraries" = NO; then + have_ssl=no + else + have_ssl=yes; + fi + + ]) + + eval "$ac_cv_have_ssl" + + AC_MSG_RESULT([libraries $ac_ssl_libraries, headers $ac_ssl_includes]) + + AC_MSG_CHECKING([whether OpenSSL uses rsaref]) + AC_MSG_RESULT($ac_ssl_rsaref) + + AC_MSG_CHECKING([for easter eggs]) + AC_MSG_RESULT([none found]) + +else + have_ssl=no +fi + +if test "$have_ssl" = yes; then + AC_MSG_CHECKING(for OpenSSL version) + dnl Check for SSL version + AC_CACHE_VAL(ac_cv_ssl_version, + [ + + cat >conftest.$ac_ext < +#include + int main() { + +#ifndef OPENSSL_VERSION_NUMBER + printf("ssl_version=\\"error\\"\n"); +#else + if (OPENSSL_VERSION_NUMBER < 0x00906000) + printf("ssl_version=\\"old\\"\n"); + else + printf("ssl_version=\\"ok\\"\n"); +#endif + return (0); + } +EOF + + ac_save_CPPFLAGS=$CPPFLAGS + if test "$ac_ssl_includes" != "/usr/include"; then + CPPFLAGS="$CPPFLAGS -I$ac_ssl_includes" + fi + + if AC_TRY_EVAL(ac_link); then + + if eval `./conftest 2>&5`; then + if test $ssl_version = error; then + AC_MSG_ERROR([$ssl_incdir/openssl/opensslv.h doesn't define OPENSSL_VERSION_NUMBER !]) + else + if test $ssl_version = old; then + AC_MSG_WARN([OpenSSL version too old. Upgrade to 0.9.6 at least, see http://www.openssl.org. SSL support disabled.]) + have_ssl=no + fi + fi + ac_cv_ssl_version="ssl_version=$ssl_version" + else + AC_MSG_ERROR([Your system couldn't run a small SSL test program. + Check config.log, and if you can't figure it out, send a mail to + David Faure , attaching your config.log]) + fi + + else + AC_MSG_ERROR([Your system couldn't link a small SSL test program. + Check config.log, and if you can't figure it out, send a mail to + David Faure , attaching your config.log]) + fi + CPPFLAGS=$ac_save_CPPFLAGS + + ]) + + eval "$ac_cv_ssl_version" + AC_MSG_RESULT($ssl_version) +fi + +if test "$have_ssl" != yes; then + LIBSSL=""; +else + AC_DEFINE(HAVE_SSL, 1, [If we are going to use OpenSSL]) + ac_cv_have_ssl="have_ssl=yes \ + ac_ssl_includes=$ac_ssl_includes ac_ssl_libraries=$ac_ssl_libraries ac_ssl_rsaref=$ac_ssl_rsaref" + + + ssl_libraries="$ac_ssl_libraries" + ssl_includes="$ac_ssl_includes" + + if test "$ac_ssl_rsaref" = yes; then + LIBSSL="-lssl -lcrypto -lRSAglue -lrsaref" + fi + + if test $ssl_version = "old"; then + AC_DEFINE(HAVE_OLD_SSL_API, 1, [Define if you have OpenSSL < 0.9.6]) + fi +fi + +SSL_INCLUDES= + +if test "$ssl_includes" = "/usr/include"; then + if test -f /usr/kerberos/include/krb5.h; then + SSL_INCLUDES="-I/usr/kerberos/include" + fi +elif test "$ssl_includes" != "/usr/local/include" && test -n "$ssl_includes"; then + SSL_INCLUDES="-I$ssl_includes" +fi + +if test "$ssl_libraries" = "/usr/lib" || test "$ssl_libraries" = "/usr/local/lib" || test -z "$ssl_libraries" || test "$ssl_libraries" = "NONE"; then + SSL_LDFLAGS="" +else + SSL_LDFLAGS="-L$ssl_libraries -R$ssl_libraries" +fi + +AC_SUBST(SSL_INCLUDES) +AC_SUBST(SSL_LDFLAGS) +AC_SUBST(LIBSSL) +]) + +AC_DEFUN([KDE_CHECK_STRLCPY], +[ + AC_REQUIRE([AC_CHECK_STRLCAT]) + AC_REQUIRE([AC_CHECK_STRLCPY]) + AC_CHECK_SIZEOF(size_t) + AC_CHECK_SIZEOF(unsigned long) + + AC_MSG_CHECKING([sizeof size_t == sizeof unsigned long]) + AC_TRY_COMPILE(,[ + #if SIZEOF_SIZE_T != SIZEOF_UNSIGNED_LONG + choke me + #endif + ],AC_MSG_RESULT([yes]),[ + AC_MSG_RESULT(no) + AC_MSG_ERROR([ + Apparently on your system our assumption sizeof size_t == sizeof unsigned long + does not apply. Please mail kde-devel@kde.org with a description of your system! + ]) + ]) +]) + +AC_DEFUN([KDE_CHECK_BINUTILS], +[ + AC_MSG_CHECKING([if ld supports unversioned version maps]) + + kde_save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map" + echo "{ local: extern \"C++\" { foo }; };" > conftest.map + AC_TRY_LINK([int foo;], +[ +#ifdef __INTEL_COMPILER +icc apparently does not support libtools version-info and version-script +at the same time. Dunno where the bug is, but until somebody figured out, +better disable the optional version scripts. +#endif + + foo = 42; +], kde_supports_versionmaps=yes, kde_supports_versionmaps=no) + LDFLAGS="$kde_save_LDFLAGS" + rm -f conftest.map + AM_CONDITIONAL(include_VERSION_SCRIPT, + [test "$kde_supports_versionmaps" = "yes" && test "$kde_use_debug_code" = "no"]) + + AC_MSG_RESULT($kde_supports_versionmaps) +]) + +AC_DEFUN([AM_PROG_OBJC],[ +AC_CHECK_PROGS(OBJC, gcc, gcc) +test -z "$OBJC" && AC_MSG_ERROR([no acceptable objective-c gcc found in \$PATH]) +if test "x${OBJCFLAGS-unset}" = xunset; then + OBJCFLAGS="-g -O2" +fi +AC_SUBST(OBJCFLAGS) +_AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES(OBJC)]) +]) + +AC_DEFUN([KDE_CHECK_PERL], +[ + KDE_FIND_PATH(perl, PERL, [$bindir $exec_prefix/bin $prefix/bin], [ + AC_MSG_ERROR([No Perl found in your $PATH. +We need perl to generate some code.]) + ]) + AC_SUBST(PERL) +]) + +AC_DEFUN([KDE_CHECK_LARGEFILE], +[ +AC_SYS_LARGEFILE +if test "$ac_cv_sys_file_offset_bits" != no; then + CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits" +fi + +if test "x$ac_cv_sys_large_files" != "xno"; then + CPPFLAGS="$CPPFLAGS -D_LARGE_FILES=1" +fi + +]) + +dnl A small extension to PKG_CHECK_MODULES (defined in pkg.m4.in) +dnl which allows to search for libs that get installed into the KDE prefix. +dnl +dnl Syntax: KDE_PKG_CHECK_MODULES(KSTUFF, libkexif >= 0.2 glib = 1.3.4, action-if, action-not) +dnl defines KSTUFF_LIBS, KSTUFF_CFLAGS, see pkg-config man page +dnl also defines KSTUFF_PKG_ERRORS on error +AC_DEFUN([KDE_PKG_CHECK_MODULES], [ + + PKG_CONFIG_PATH="$prefix/lib${kdelibsuff}/pkgconfig:$PKG_CONFIG_PATH" + if test "$prefix" != "$kde_libs_prefix"; then + PKG_CONFIG_PATH="$kde_libs_prefix/lib${kdelibsuff}/pkgconfig:$PKG_CONFIG_PATH" + fi + export PKG_CONFIG_PATH + PKG_CHECK_MODULES([$1],[$2],[$3],[$4]) +]) + + +dnl Check for PIE support in the compiler and linker +AC_DEFUN([KDE_CHECK_PIE_SUPPORT], +[ + AC_CACHE_CHECK([for PIE support], kde_cv_val_pie_support, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + safe_CXXFLAGS=$CXXFLAGS + safe_LDFLAGS=$LDFLAGS + CXXFLAGS="$CXXFLAGS -fPIE" + LDFLAGS="$LDFLAGS -pie" + + AC_TRY_LINK([int foo;], [], [kde_cv_val_pie_support=yes], [kde_cv_val_pie_support=no]) + + CXXFLAGS=$safe_CXXFLAGS + LDFLAGS=$safe_LDFLAGS + AC_LANG_RESTORE + ]) + + AC_MSG_CHECKING(if enabling -pie/fPIE support) + + AC_ARG_ENABLE(pie, + AC_HELP_STRING([--enable-pie],[platform supports PIE linking [default=detect]]), + [kde_has_pie_support=$enableval], + [kde_has_pie_support=detect]) + + if test "$kde_has_pie_support" = "detect"; then + kde_has_pie_support=$kde_cv_val_pie_support + fi + + AC_MSG_RESULT([$kde_has_pie_support]) + + KDE_USE_FPIE="" + KDE_USE_PIE="" + + AC_SUBST([KDE_USE_FPIE]) + AC_SUBST([KDE_USE_PIE]) + + if test "$kde_has_pie_support" = "yes"; then + KDE_USE_FPIE="-fPIE" + KDE_USE_PIE="-pie" + fi +]) +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +## Copyright 1996, 1997, 1998, 1999, 2000, 2001 +## Free Software Foundation, Inc. +## Originally by Gordon Matzigkeit , 1996 +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## 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, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +## +## As a special exception to the GNU General Public License, if you +## distribute this file as part of a program that contains a +## configuration script generated by Autoconf, you may include it under +## the same distribution terms that you use for the rest of that program. + +# serial 47 AC_PROG_LIBTOOL + + +# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) +# ----------------------------------------------------------- +# If this macro is not defined by Autoconf, define it here. +m4_ifdef([AC_PROVIDE_IFELSE], + [], + [m4_define([AC_PROVIDE_IFELSE], + [m4_ifdef([AC_PROVIDE_$1], + [$2], [$3])])]) + + +# AC_PROG_LIBTOOL +# --------------- +AC_DEFUN([AC_PROG_LIBTOOL], +[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl +dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX +dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. + AC_PROVIDE_IFELSE([AC_PROG_CXX], + [AC_LIBTOOL_CXX], + [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX + ])]) +dnl And a similar setup for Fortran 77 support + AC_PROVIDE_IFELSE([AC_PROG_F77], + [AC_LIBTOOL_F77], + [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 +])]) + +dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. +dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run +dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. + AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [ifdef([AC_PROG_GCJ], + [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([A][M_PROG_GCJ], + [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([LT_AC_PROG_GCJ], + [define([LT_AC_PROG_GCJ], + defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) +])])# AC_PROG_LIBTOOL + + +# _AC_PROG_LIBTOOL +# ---------------- +AC_DEFUN([_AC_PROG_LIBTOOL], +[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl +AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl +AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl +AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool --silent' +AC_SUBST(LIBTOOL)dnl + +# Prevent multiple expansion +define([AC_PROG_LIBTOOL], []) +])# _AC_PROG_LIBTOOL + + +# AC_LIBTOOL_SETUP +# ---------------- +AC_DEFUN([AC_LIBTOOL_SETUP], +[AC_PREREQ(2.50)dnl +AC_REQUIRE([AC_ENABLE_SHARED])dnl +AC_REQUIRE([AC_ENABLE_STATIC])dnl +AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_LD])dnl +AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl +AC_REQUIRE([AC_PROG_NM])dnl + +AC_REQUIRE([AC_PROG_LN_S])dnl +AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! +AC_REQUIRE([AC_OBJEXT])dnl +AC_REQUIRE([AC_EXEEXT])dnl +dnl + +AC_LIBTOOL_SYS_MAX_CMD_LEN +AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +AC_LIBTOOL_OBJDIR + +AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +_LT_AC_PROG_ECHO_BACKSLASH + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] + +# Same as above, but do not quote variable references. +[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +AC_CHECK_TOOL(AR, ar, false) +AC_CHECK_TOOL(RANLIB, ranlib, :) +AC_CHECK_TOOL(STRIP, strip, :) + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" + ;; + *) + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + AC_PATH_MAGIC + fi + ;; +esac + +AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +enable_win32_dll=yes, enable_win32_dll=no) + +AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +AC_ARG_WITH([pic], + [AC_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) +test -z "$pic_mode" && pic_mode=default + +# Use C for the default configuration in the libtool script +tagname= +AC_LIBTOOL_LANG_C_CONFIG +_LT_AC_TAGCONFIG +])# AC_LIBTOOL_SETUP + + +# _LT_AC_SYS_COMPILER +# ------------------- +AC_DEFUN([_LT_AC_SYS_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_AC_SYS_COMPILER + + +# _LT_AC_SYS_LIBPATH_AIX +# ---------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], +[AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_AC_SYS_LIBPATH_AIX + + +# _LT_AC_SHELL_INIT(ARG) +# ---------------------- +AC_DEFUN([_LT_AC_SHELL_INIT], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +$1 +AC_DIVERT_POP +])# _LT_AC_SHELL_INIT + + +# _LT_AC_PROG_ECHO_BACKSLASH +# -------------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], +[_LT_AC_SHELL_INIT([ +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +echo=${ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null && + echo_test_string="`eval $cmd`" && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(ECHO) +])])# _LT_AC_PROG_ECHO_BACKSLASH + + +# _LT_AC_LOCK +# ----------- +AC_DEFUN([_LT_AC_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case "`/usr/bin/file conftest.o`" in + *32-bit*) + LINUX_64_MODE="32" + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + LINUX_64_MODE="64" + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +[*-*-cygwin* | *-*-mingw* | *-*-pw32*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; + ]) +esac + +need_locks="$enable_libtool_lock" + +])# _LT_AC_LOCK + + +# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], +[AC_REQUIRE([LT_AC_PROG_SED]) +AC_CACHE_CHECK([$1], [$2], + [$2=no + ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + $2=yes + fi + fi + $rm conftest* +]) + +if test x"[$]$2" = xyes; then + ifelse([$5], , :, [$5]) +else + ifelse([$6], , :, [$6]) +fi +])# AC_LIBTOOL_COMPILER_OPTION + + +# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ------------------------------------------------------------ +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], +[AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + else + $2=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + ifelse([$4], , :, [$4]) +else + ifelse([$5], , :, [$5]) +fi +])# AC_LIBTOOL_LINKER_OPTION + + +# AC_LIBTOOL_SYS_MAX_CMD_LEN +# -------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], +[# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + testring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + *) + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while (test "X"`$CONFIG_SHELL [$]0 --fallback-echo "X$testring" 2>/dev/null` \ + = "XX$testring") >/dev/null 2>&1 && + new_result=`expr "X$testring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + testring=$testring$testring + done + testring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +])# AC_LIBTOOL_SYS_MAX_CMD_LEN + + +# _LT_AC_CHECK_DLFCN +# -------------------- +AC_DEFUN([_LT_AC_CHECK_DLFCN], +[AC_CHECK_HEADERS(dlfcn.h)dnl +])# _LT_AC_CHECK_DLFCN + + +# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ------------------------------------------------------------------ +AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +}] +EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_unknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_AC_TRY_DLOPEN_SELF + + +# AC_LIBTOOL_DLOPEN_SELF +# ------------------- +AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +])# AC_LIBTOOL_DLOPEN_SELF + + +# AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) +# --------------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler +AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + # According to Tom Tromey, Ian Lance Taylor reported there are C compilers + # that will create temporary files in the current directory regardless of + # the output directory. Thus, making CWD read-only will cause this test + # to fail, enabling locking or at least warning the user not to do parallel + # builds. + chmod -w . + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . + $rm conftest* out/* + rmdir out + cd .. + rmdir conftest + $rm conftest* +]) +])# AC_LIBTOOL_PROG_CC_C_O + + +# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) +# ----------------------------------------- +# Check to see if we can do hard links to lock some files if needed +AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], +[AC_REQUIRE([_LT_AC_LOCK])dnl + +hard_links="nottested" +if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS + + +# AC_LIBTOOL_OBJDIR +# ----------------- +AC_DEFUN([AC_LIBTOOL_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +])# AC_LIBTOOL_OBJDIR + + +# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) +# ---------------------------------------------- +# Check hardcoding attributes. +AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_AC_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ + test -n "$_LT_AC_TAGVAR(runpath_var $1)" || \ + test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)"="Xyes" ; then + + # We can hardcode non-existant directories. + if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_AC_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_AC_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_AC_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH + + +# AC_LIBTOOL_SYS_LIB_STRIP +# ------------------------ +AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], +[striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) +fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +])# AC_LIBTOOL_SYS_LIB_STRIP + + +# AC_LIBTOOL_SYS_DYNAMIC_LINKER +# ----------------------------- +# PORTME Fill in your ld.so characteristics +AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], +[AC_MSG_CHECKING([dynamic linker characteristics]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + libsuff= + if test "x$LINUX_64_MODE" = x64; then + # Some platforms are per default 64-bit, so there's no /lib64 + if test -d /lib64 -a ! -h /lib64; then + libsuff=64 + fi + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff}" + sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no +])# AC_LIBTOOL_SYS_DYNAMIC_LINKER + + +# _LT_AC_TAGCONFIG +# ---------------- +AC_DEFUN([_LT_AC_TAGCONFIG], +[AC_ARG_WITH([tags], + [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], + [include additional configurations @<:@automatic@:>@])], + [tagnames="$withval"]) + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + AC_MSG_WARN([output file `$ofile' does not exist]) + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) + else + AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) + fi + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in + "") ;; + *) AC_MSG_ERROR([invalid tag name: $tagname]) + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + AC_MSG_ERROR([tag name \"$tagname\" already exists]) + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && test "X$CXX" != "Xno"; then + AC_LIBTOOL_LANG_CXX_CONFIG + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + AC_LIBTOOL_LANG_F77_CONFIG + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + AC_LIBTOOL_LANG_GCJ_CONFIG + else + tagname="" + fi + ;; + + RC) + AC_LIBTOOL_LANG_RC_CONFIG + ;; + + *) + AC_MSG_ERROR([Unsupported tag name: $tagname]) + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + AC_MSG_ERROR([unable to update list of available tagged configurations.]) + fi +fi +])# _LT_AC_TAGCONFIG + + +# AC_LIBTOOL_DLOPEN +# ----------------- +# enable checks for dlopen support +AC_DEFUN([AC_LIBTOOL_DLOPEN], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_DLOPEN + + +# AC_LIBTOOL_WIN32_DLL +# -------------------- +# declare package support for building win32 dll's +AC_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_WIN32_DLL + + +# AC_ENABLE_SHARED([DEFAULT]) +# --------------------------- +# implement the --enable-shared flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_SHARED], +[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([shared], + [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]AC_ENABLE_SHARED_DEFAULT) +])# AC_ENABLE_SHARED + + +# AC_DISABLE_SHARED +# ----------------- +#- set the default shared flag to --disable-shared +AC_DEFUN([AC_DISABLE_SHARED], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_SHARED(no) +])# AC_DISABLE_SHARED + + +# AC_ENABLE_STATIC([DEFAULT]) +# --------------------------- +# implement the --enable-static flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_STATIC], +[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([static], + [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]AC_ENABLE_STATIC_DEFAULT) +])# AC_ENABLE_STATIC + + +# AC_DISABLE_STATIC +# ----------------- +# set the default static flag to --disable-static +AC_DEFUN([AC_DISABLE_STATIC], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_STATIC(no) +])# AC_DISABLE_STATIC + + +# AC_ENABLE_FAST_INSTALL([DEFAULT]) +# --------------------------------- +# implement the --enable-fast-install flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_FAST_INSTALL], +[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([fast-install], + [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) +])# AC_ENABLE_FAST_INSTALL + + +# AC_DISABLE_FAST_INSTALL +# ----------------------- +# set the default to --disable-fast-install +AC_DEFUN([AC_DISABLE_FAST_INSTALL], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_FAST_INSTALL(no) +])# AC_DISABLE_FAST_INSTALL + + +# AC_LIBTOOL_PICMODE([MODE]) +# -------------------------- +# implement the --with-pic flag +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +AC_DEFUN([AC_LIBTOOL_PICMODE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +pic_mode=ifelse($#,1,$1,default) +])# AC_LIBTOOL_PICMODE + + +# AC_PROG_EGREP +# ------------- +# This is predefined starting with Autoconf 2.54, so this conditional +# definition can be removed once we require Autoconf 2.54 or later. +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], +[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], + [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi]) + EGREP=$ac_cv_prog_egrep + AC_SUBST([EGREP]) +])]) + + +# AC_PATH_TOOL_PREFIX +# ------------------- +# find a file program which can recognise shared library +AC_DEFUN([AC_PATH_TOOL_PREFIX], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="ifelse([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +])# AC_PATH_TOOL_PREFIX + + +# AC_PATH_MAGIC +# ------------- +# find a file program which can recognise a shared library +AC_DEFUN([AC_PATH_MAGIC], +[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# AC_PATH_MAGIC + + +# AC_PROG_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([AC_PROG_LD], +[AC_ARG_WITH([gnu-ld], + [AC_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no]) +AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case "$host_cpu" in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + irix5* | nonstopux*) + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" + ;; + *) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[[1234]] dynamic lib MIPS - version 1" + ;; + esac + lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*` + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux*) + case $host_cpu in + alpha* | hppa* | i*86 | ia64* | m68* | mips* | powerpc* | sparc* | s390* | sh* | x86_64* ) + lt_cv_deplibs_check_method=pass_all ;; + # the debian people say, arm and glibc 2.3.1 works for them with pass_all + arm* ) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; + esac + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +nto-qnx*) + lt_cv_deplibs_check_method=unknown + ;; + +openbsd*) + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object' + else + lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' + fi + ;; + +osf3* | osf4* | osf5*) + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method='file_magic COFF format alpha shared library' + lt_cv_file_magic_test_file=/shlib/libc.so + lt_cv_deplibs_check_method=pass_all + ;; + +sco3.2v5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + lt_cv_file_magic_test_file=/lib/libc.so + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown +])# AC_DEPLIBS_CHECK_METHOD + + +# AC_PROG_NM +# ---------- +# find the pathname to a BSD-compatible name lister +AC_DEFUN([AC_PROG_NM], +[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/${ac_tool_prefix}nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + esac + fi + done + IFS="$lt_save_ifs" + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi]) +NM="$lt_cv_path_NM" +])# AC_PROG_NM + + +# AC_CHECK_LIBM +# ------------- +# check for math library +AC_DEFUN([AC_CHECK_LIBM], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +])# AC_CHECK_LIBM + + +# AC_LIBLTDL_CONVENIENCE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl convenience library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL +# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If +# DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will +# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with +# '${top_srcdir}/' (note the single quotes!). If your package is not +# flat and you're not using automake, define top_builddir and +# top_srcdir appropriately in the Makefiles. +AC_DEFUN([AC_LIBLTDL_CONVENIENCE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case $enable_ltdl_convenience in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_CONVENIENCE + + +# AC_LIBLTDL_INSTALLABLE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl installable library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-install to the configure arguments. Note that LIBLTDL +# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If +# DIRECTORY is not provided and an installed libltdl is not found, it is +# assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/' +# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single +# quotes!). If your package is not flat and you're not using automake, +# define top_builddir and top_srcdir appropriately in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +AC_DEFUN([AC_LIBLTDL_INSTALLABLE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, lt_dlinit, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + LTDLINCL= + fi + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_INSTALLABLE + + +# AC_LIBTOOL_CXX +# -------------- +# enable support for C++ libraries +AC_DEFUN([AC_LIBTOOL_CXX], +[AC_REQUIRE([_LT_AC_LANG_CXX]) +])# AC_LIBTOOL_CXX + + +# _LT_AC_LANG_CXX +# --------------- +AC_DEFUN([_LT_AC_LANG_CXX], +[AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([AC_PROG_CXXCPP]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) +])# _LT_AC_LANG_CXX + + +# AC_LIBTOOL_F77 +# -------------- +# enable support for Fortran 77 libraries +AC_DEFUN([AC_LIBTOOL_F77], +[AC_REQUIRE([_LT_AC_LANG_F77]) +])# AC_LIBTOOL_F77 + + +# _LT_AC_LANG_F77 +# --------------- +AC_DEFUN([_LT_AC_LANG_F77], +[AC_REQUIRE([AC_PROG_F77]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) +])# _LT_AC_LANG_F77 + + +# AC_LIBTOOL_GCJ +# -------------- +# enable support for GCJ libraries +AC_DEFUN([AC_LIBTOOL_GCJ], +[AC_REQUIRE([_LT_AC_LANG_GCJ]) +])# AC_LIBTOOL_GCJ + + +# _LT_AC_LANG_GCJ +# --------------- +AC_DEFUN([_LT_AC_LANG_GCJ], +[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], + [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], + [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], + [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) +])# _LT_AC_LANG_GCJ + + +# AC_LIBTOOL_RC +# -------------- +# enable support for Windows resource files +AC_DEFUN([AC_LIBTOOL_RC], +[AC_REQUIRE([LT_AC_PROG_RC]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) +])# AC_LIBTOOL_RC + + +# AC_LIBTOOL_LANG_C_CONFIG +# ------------------------ +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) +AC_DEFUN([_LT_AC_LANG_C_CONFIG], +[lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}\n' + +_LT_AC_SYS_COMPILER + +# +# Check for any special shared library compilation flags. +# +_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)= +if test "$GCC" = no; then + case $host_os in + sco3.2v5*) + _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)='-belf' + ;; + esac +fi +if test -n "$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)"; then + AC_MSG_WARN([`$CC' requires `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to build shared libraries]) + if echo "$old_CC $old_CFLAGS " | grep "[[ ]]$]_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)[[[ ]]" >/dev/null; then : + else + AC_MSG_WARN([add `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to the CC or CFLAGS env variable and reconfigure]) + _LT_AC_TAGVAR(lt_cv_prog_cc_can_build_shared, $1)=no + fi +fi + + +# +# Check to make sure the static flag actually works. +# +AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $_LT_AC_TAGVAR(lt_prog_compiler_static, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), + $_LT_AC_TAGVAR(lt_prog_compiler_static, $1), + [], + [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF($1) + +# Report which librarie types wil actually be built +AC_MSG_CHECKING([if libtool supports shared libraries]) +AC_MSG_RESULT([$can_build_shared]) + +AC_MSG_CHECKING([whether to build shared libraries]) +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + darwin* | rhapsody*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,dynamic_lookup' + ;; + esac + fi + ;; + esac + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; +esac +AC_MSG_RESULT([$enable_shared]) + +AC_MSG_CHECKING([whether to build static libraries]) +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +AC_MSG_RESULT([$enable_static]) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_C_CONFIG + + +# AC_LIBTOOL_LANG_CXX_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) +AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], +[AC_LANG_PUSH(C++) +AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([AC_PROG_CXXCPP]) + +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_AC_TAGVAR(allow_undefined_flag, $1)= +_LT_AC_TAGVAR(always_export_symbols, $1)=no +_LT_AC_TAGVAR(archive_expsym_cmds, $1)= +_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_direct, $1)=no +_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= +_LT_AC_TAGVAR(hardcode_minus_L, $1)=no +_LT_AC_TAGVAR(hardcode_automatic, $1)=no +_LT_AC_TAGVAR(module_cmds, $1)= +_LT_AC_TAGVAR(module_expsym_cmds, $1)= +_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_AC_TAGVAR(no_undefined_flag, $1)= +_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= +_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Dependencies to place before and after the object being linked: +_LT_AC_TAGVAR(predep_objects, $1)= +_LT_AC_TAGVAR(postdep_objects, $1)= +_LT_AC_TAGVAR(predeps, $1)= +_LT_AC_TAGVAR(postdeps, $1)= +_LT_AC_TAGVAR(compiler_lib_search_path, $1)= + +# Source file extension for C++ test sources. +ac_ext=cc + +# Object file extension for compiled C++ test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' +else + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + AC_PROG_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +_LT_AC_TAGVAR(ld_shlibs, $1)=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # KDE requires run time linking. Make it the default. + aix_use_runtimelinking=yes + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='-qmkshrobj ${wl}-G' + else + shared_flag='-qmkshrobj' + fi + fi + fi + + # Let the compiler handle the export list. + _LT_AC_TAGVAR(always_export_symbols, $1)=no + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_AC_TAGVAR(archive_cmds, $1)="\$CC"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '" $shared_flag" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds it's shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=no + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes; then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $compiler_flags $deplibs -install_name $rpath/$soname $verstring' + fi + _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs' + + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $compiler_flags $deplibs -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + dgux*) + case $cc_basename in + ec++) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + freebsd[12]*) + # C++ shared libraries reported to be fairly broken before switch to ELF + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + freebsd-elf*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + ;; + gnu*) + ;; + hpux9*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | egrep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + *) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + *) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC) + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case "$host_cpu" in + ia64*|hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + irix5* | irix6*) + case $cc_basename in + CC) + # SGI C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + linux*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects --soname $soname -o \$templib; mv \$templib $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc) + # Intel C++ + with_gnu_ld=yes + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + cxx) + # Compaq C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + m88k*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + mvs*) + case $cc_basename in + cxx) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + osf3*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ + $rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + sco*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + lcc) + # Lucid + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects~$rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The C++ compiler is used as linker so we must use $wl + # flag to pass the commands to the underlying system + # linker. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[[LR]]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + fi + ;; + esac + ;; + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; +esac +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_AC_TAGVAR(GCC, $1)="$GXX" +_LT_AC_TAGVAR(LD, $1)="$LD" + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +AC_LIBTOOL_POSTDEP_PREDEP($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +])# AC_LIBTOOL_LANG_CXX_CONFIG + +# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) +# ------------------------ +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[ +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <> "$cfgfile" +ifelse([$1], [], +[#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# 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, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG], +[# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) + +# Is the compiler the GNU C compiler? +with_gcc=$_LT_AC_TAGVAR(GCC, $1) + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_[]_LT_AC_TAGVAR(LD, $1) + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext='$shrext' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) + +# Commands used to build and install a shared archive. +archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) +archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) +module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)" + +# Set to yes if exported symbols are required. +always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) + +# The commands to list exported symbols. +export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) + +# Symbols that must always be exported. +include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) + +ifelse([$1],[], +[# ### END LIBTOOL CONFIG], +[# ### END LIBTOOL TAG CONFIG: $tagname]) + +__EOF__ + +ifelse([$1],[], [ + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +]) +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + test -f Makefile && make "$ltmain" +fi +])# AC_LIBTOOL_CONFIG + + +# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl + +_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI + + +# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +# --------------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], +[AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_NM]) +AC_REQUIRE([AC_OBJEXT]) +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Transform the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris* | sysv5*) + symcode='[[BDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGISTW]]' ;; +esac + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if grep ' nm_test_var$' "$nlist" >/dev/null; then + if grep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[[]] = +{ +EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi +]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + + +# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) +# --------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], +[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_static, $1)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) + ifelse([$1],[CXX],[ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix4* | aix5*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux*) + case $cc_basename in + KCC) + # KAI C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + icpc) + # Intel C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + cxx) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC) + # Rational C++ 2.4.1 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx) + # Digital/Compaq C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + sco*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + *) + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc) + # Lucid + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + unixware*) + ;; + vxworks*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + newsos6) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + linux*) + case $CC in + icc* | ecc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + ccc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + sco3.2v5*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-dn' + ;; + + solaris*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sunos4*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + uts4*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then + AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1), + [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" + ;; +esac +]) + + +# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) +# ------------------------------------ +# See if the linker supports building shared libraries. +AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], +[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +ifelse([$1],[CXX],[ + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix4* | aix5*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +],[ + runpath_var= + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)= + _LT_AC_TAGVAR(archive_expsym_cmds, $1)= + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown + _LT_AC_TAGVAR(hardcode_automatic, $1)=no + _LT_AC_TAGVAR(module_cmds, $1)= + _LT_AC_TAGVAR(module_expsym_cmds, $1)= + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_AC_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=no + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $compiler_flags $libobjs $deplibs -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sunos4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = yes; then + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + + # KDE requires run time linking. Make it the default. + aix_use_runtimelinking=yes + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='-qmkshrobj ${wl}-G' + else + shared_flag='-qmkshrobj' + fi + fi + fi + + # Let the compiler handle the export list. + _LT_AC_TAGVAR(always_export_symbols, $1)=no + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_AC_TAGVAR(archive_cmds, $1)="\$CC"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '" $shared_flag" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds it's shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + # see comment about different semantics on the GNU ld section + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + bsdi4*) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=no + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $compiler_flags $libobjs `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes ; then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $compiler_flags $deplibs -install_name $rpath/$soname $verstring' + fi + _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $compiler_flags $deplibs -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + dgux*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $compiler_flags $libobjs $deplibs' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $compiler_flags $libobjs $deplibs~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10* | hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $compiler_flags $libobjs $deplibs' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $compiler_flags $libobjs $deplibs' + ;; + esac + else + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + *) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + openbsd*) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $compiler_flags $libobjs $deplibs' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $compiler_flags $libobjs $deplibs' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $compiler_flags $libobjs $deplibs$output_objdir/$libname.def' + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $compiler_flags $libobjs $deplibs ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $compiler_flags $libobjs $deplibs ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + sco3.2v5*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $compiler_flags $libobjs $deplibs' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $compiler_flags $libobjs $deplibs~$rm $lib.exp' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $compiler_flags $libobjs $deplibs' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4.2uw2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z ${wl}text' + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $compiler_flags $libobjs $deplibs' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h ${wl}$soname -o $lib $compiler_flags $libobjs $deplibs' + fi + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv5*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_AC_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) + then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + else + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) + ;; + esac + fi + ;; +esac +])# AC_LIBTOOL_PROG_LD_SHLIBS + + +# _LT_AC_FILE_LTDLL_C +# ------------------- +# Be careful that the start marker always follows a newline. +AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include +# +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ +])# _LT_AC_FILE_LTDLL_C + + +# _LT_AC_TAGVAR(VARNAME, [TAGNAME]) +# --------------------------------- +AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) + + +# old names +AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) +AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) +AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) +AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) +AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) + +# This is just to silence aclocal about the macro not being used +ifelse([AC_DISABLE_FAST_INSTALL]) + +AC_DEFUN([LT_AC_PROG_GCJ], +[AC_CHECK_TOOL(GCJ, gcj, no) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS) +]) + +AC_DEFUN([LT_AC_PROG_RC], +[AC_CHECK_TOOL(RC, windres, no) +]) + +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +# LT_AC_PROG_SED +# -------------- +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +AC_DEFUN([LT_AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && break + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_MSG_RESULT([$SED]) +]) + +dnl PKG_CHECK_MODULES(GSTUFF, gtk+-2.0 >= 1.3 glib = 1.3.4, action-if, action-not) +dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page +dnl also defines GSTUFF_PKG_ERRORS on error +AC_DEFUN([PKG_CHECK_MODULES], [ + succeeded=no + + if test -z "$PKG_CONFIG"; then + AC_PATH_PROG(PKG_CONFIG, pkg-config, no) + fi + + if test "$PKG_CONFIG" = "no" ; then + echo "*** The pkg-config script could not be found. Make sure it is" + echo "*** in your path, or set the PKG_CONFIG environment variable" + echo "*** to the full path to pkg-config." + echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." + else + PKG_CONFIG_MIN_VERSION=0.9.0 + if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then + AC_MSG_CHECKING(for $2) + + if $PKG_CONFIG --exists "$2" ; then + AC_MSG_RESULT(yes) + succeeded=yes + + AC_MSG_CHECKING($1_CFLAGS) + $1_CFLAGS=`$PKG_CONFIG --cflags "$2"` + AC_MSG_RESULT($$1_CFLAGS) + + AC_MSG_CHECKING($1_LIBS) + $1_LIBS=`$PKG_CONFIG --libs "$2"` + AC_MSG_RESULT($$1_LIBS) + else + $1_CFLAGS="" + $1_LIBS="" + ## If we have a custom action on failure, don't print errors, but + ## do set a variable so people can do so. + $1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` + ifelse([$4], ,echo $$1_PKG_ERRORS,) + fi + + AC_SUBST($1_CFLAGS) + AC_SUBST($1_LIBS) + else + echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer." + echo "*** See http://www.freedesktop.org/software/pkgconfig" + fi + fi + + if test $succeeded = yes; then + ifelse([$3], , :, [$3]) + else + ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4]) + fi +]) + + diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..c033748 --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,903 @@ +# generated automatically by aclocal 1.10.1 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(AC_AUTOCONF_VERSION, [2.61],, +[m4_warning([this file was generated for autoconf 2.61. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically `autoreconf'.])]) + +# Copyright (C) 2002, 2003, 2005, 2006, 2007 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.10' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.10.1], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AC_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.10.1])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(AC_AUTOCONF_VERSION)]) + +# Figure out how to run the assembler. -*- Autoconf -*- + +# Copyright (C) 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# AM_PROG_AS +# ---------- +AC_DEFUN([AM_PROG_AS], +[# By default we simply use the C compiler to build assembly code. +AC_REQUIRE([AC_PROG_CC]) +test "${CCAS+set}" = set || CCAS=$CC +test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS +AC_ARG_VAR([CCAS], [assembler compiler command (defaults to CC)]) +AC_ARG_VAR([CCASFLAGS], [assembler compiler flags (defaults to CFLAGS)]) +_AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES([CCAS])])dnl +]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 8 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 9 + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], UPC, [depcc="$UPC" am_compiler_list=], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +#serial 3 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 8 + +# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. +AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 13 + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.60])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AM_PROG_INSTALL_SH +AM_PROG_INSTALL_STRIP +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl +]) +]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"} +AC_SUBST(install_sh)]) + +# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 3 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_MKDIR_P +# --------------- +# Check for `mkdir -p'. +AC_DEFUN([AM_PROG_MKDIR_P], +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 3 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# ------------------------------ +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ---------------------------------- +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of `v7', `ustar', or `pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. +AM_MISSING_PROG([AMTAR], [tar]) +m4_if([$1], [v7], + [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi +done +rm -rf conftest.dir + +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([acinclude.m4]) diff --git a/config.h.in b/config.h.in new file mode 100644 index 0000000..9602074 --- /dev/null +++ b/config.h.in @@ -0,0 +1,362 @@ +/* config.h.in. Generated from configure.in by autoheader. */ + +/* defined if K3b should check cdrecord for suid root */ +#undef CDRECORD_SUID_ROOT_CHECK + +/* Define to 1 if your flac library's version is newer than or equal to 1.1.2 + */ +#undef FLAC_NEWER_THAN_1_1_1 + +/* HAL API version 0.4 */ +#undef HAL_0_4 + +/* Define to 1 if you have the header file. */ +#undef HAVE_ARTSC_ARTSC_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_BYTESWAP_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_CARBON_CARBON_H + +/* Define if you have the CoreAudio API */ +#undef HAVE_COREAUDIO + +/* Define to 1 if you have the header file. */ +#undef HAVE_CRT_EXTERNS_H + +/* Defines if your system has the crypt function */ +#undef HAVE_CRYPT + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_DVDREAD_DVD_READER_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_FLAC___DECODER_H + +/* compile in HAL support */ +#undef HAVE_HAL + +/* Define to 1 if you have the header file. */ +#undef HAVE_ICONV_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* defined if K3bSetup is compiled */ +#undef HAVE_K3BSETUP + +/* defined if you have the lame header and lib */ +#undef HAVE_LAME + +/* Define to 1 if you have the header file. */ +#undef HAVE_LAME_LAME_H + +/* Defined if you have libdvdread headers and libs installed. */ +#undef HAVE_LIBDVDREAD + +/* Define if you have libjpeg */ +#undef HAVE_LIBJPEG + +/* defined if you have libmad headers and libraries */ +#undef HAVE_LIBMAD + +/* Define if you have libpng */ +#undef HAVE_LIBPNG + +/* Define if you have a working libpthread (will enable threaded code) */ +#undef HAVE_LIBPTHREAD + +/* defined if you have libsamplerate library and header */ +#undef HAVE_LIBSAMPLERATE + +/* Define if you have libz */ +#undef HAVE_LIBZ + +/* Define if lrint is not supported */ +#undef HAVE_LRINT + +/* Define if lrintf is not supported */ +#undef HAVE_LRINTF + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MPCDEC_MPCDEC_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MUSEPACK_MUSEPACK_H + +/* have MusicBrainz */ +#undef HAVE_MUSICBRAINZ + +/* Define if your system needs _NSGetEnviron to set up the environment */ +#undef HAVE_NSGETENVIRON + +/* Define to 1 if the assembler supports AltiVec instructions. */ +#undef HAVE_PPC_ALTIVEC + +/* defined if you have resmgr libraries and headers */ +#undef HAVE_RESMGR + +/* Define to 1 if you have the header file. */ +#undef HAVE_RESMGR_H + +/* Define if you have res_init */ +#undef HAVE_RES_INIT + +/* Define if you have the res_init prototype */ +#undef HAVE_RES_INIT_PROTO + +/* Define to 1 if you have the header file. */ +#undef HAVE_SAMPLERATE_H + +/* Define if you have a STL implementation by SGI */ +#undef HAVE_SGI_STL + +/* Set to 1 if you have libsndfile. */ +#undef HAVE_SNDFILE + +/* Define to 1 if you have the `snprintf' function. */ +#undef HAVE_SNPRINTF + +/* Define to 1 if you have the `stat64' function. */ +#undef HAVE_STAT64 + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define if you have strlcat */ +#undef HAVE_STRLCAT + +/* Define if you have the strlcat prototype */ +#undef HAVE_STRLCAT_PROTO + +/* Define if you have strlcpy */ +#undef HAVE_STRLCPY + +/* Define if you have the strlcpy prototype */ +#undef HAVE_STRLCPY_PROTO + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_BITYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STATVFS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_VFS_H + +/* have TagLib */ +#undef HAVE_TAGLIB + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if you have the `vsnprintf' function. */ +#undef HAVE_VSNPRINTF + +/* Define to 1 if the assembler supports 3DNOW instructions. */ +#undef HAVE_X86_3DNOW + +/* Define to 1 if the assembler supports MMX instructions. */ +#undef HAVE_X86_MMX + +/* Define to 1 if the assembler supports SSE instructions. */ +#undef HAVE_X86_SSE + +/* Define to 1 if the assembler supports SSE2 instructions. */ +#undef HAVE_X86_SSE2 + +/* K3b additional debugging support */ +#undef K3B_DEBUG + +/* Defined if all ffmpeg codecs should be allowed */ +#undef K3B_FFMPEG_ALL_CODECS + +/* Suffix for lib directories */ +#undef KDELIBSUFF + +/* The header to include for MPC decoding. */ +#undef MPC_HEADER_FILE + +/* Define if you have ogg/vorbis installed */ +#undef OGG_VORBIS + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* The size of `char *', as computed by sizeof. */ +#undef SIZEOF_CHAR_P + +/* The size of `int', as computed by sizeof. */ +#undef SIZEOF_INT + +/* The size of `long', as computed by sizeof. */ +#undef SIZEOF_LONG + +/* The size of `short', as computed by sizeof. */ +#undef SIZEOF_SHORT + +/* The size of `size_t', as computed by sizeof. */ +#undef SIZEOF_SIZE_T + +/* The size of `unsigned long', as computed by sizeof. */ +#undef SIZEOF_UNSIGNED_LONG + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Version number of package */ +#undef VERSION + +/* Defined if compiling without arts */ +#undef WITHOUT_ARTS + +/* defined if arts support is compiled in */ +#undef WITH_ARTS + +/* Define to 1 if your processor stores words with the most significant byte + first (like Motorola and SPARC, unlike Intel and VAX). */ +#undef WORDS_BIGENDIAN + +/* + * jpeg.h needs HAVE_BOOLEAN, when the system uses boolean in system + * headers and I'm too lazy to write a configure test as long as only + * unixware is related + */ +#ifdef _UNIXWARE +#define HAVE_BOOLEAN +#endif + + + +/* + * AIX defines FD_SET in terms of bzero, but fails to include + * that defines bzero. + */ + +#if defined(_AIX) +#include +#endif + + + +#if defined(HAVE_NSGETENVIRON) && defined(HAVE_CRT_EXTERNS_H) +# include +# include +# define environ (*_NSGetEnviron()) +#endif + + + +#if !defined(HAVE_RES_INIT_PROTO) +#ifdef __cplusplus +extern "C" { +#endif +int res_init(void); +#ifdef __cplusplus +} +#endif +#endif + + + +#if !defined(HAVE_STRLCAT_PROTO) +#ifdef __cplusplus +extern "C" { +#endif +unsigned long strlcat(char*, const char*, unsigned long); +#ifdef __cplusplus +} +#endif +#endif + + + +#if !defined(HAVE_STRLCPY_PROTO) +#ifdef __cplusplus +extern "C" { +#endif +unsigned long strlcpy(char*, const char*, unsigned long); +#ifdef __cplusplus +} +#endif +#endif + + + +/* + * On HP-UX, the declaration of vsnprintf() is needed every time ! + */ + +#if !defined(HAVE_VSNPRINTF) || defined(hpux) +#if __STDC__ +#include +#include +#else +#include +#endif +#ifdef __cplusplus +extern "C" +#endif +int vsnprintf(char *str, size_t n, char const *fmt, va_list ap); +#ifdef __cplusplus +extern "C" +#endif +int snprintf(char *str, size_t n, char const *fmt, ...); +#endif + + +/* define to 1 if -fvisibility is supported */ +#undef __KDE_HAVE_GCC_VISIBILITY + + +#if defined(__SVR4) && !defined(__svr4__) +#define __svr4__ 1 +#endif + + +/* type to use in place of socklen_t if not defined */ +#undef kde_socklen_t + +/* type to use in place of socklen_t if not defined (deprecated, use + kde_socklen_t) */ +#undef ksize_t + +/* backwards compatibility stuff */ +#undef mpc_bool_t diff --git a/configure.files b/configure.files new file mode 100644 index 0000000..1225922 --- /dev/null +++ b/configure.files @@ -0,0 +1,26 @@ +./admin/configure.in.min +configure.in.in +./libk3b/configure.in.in +./libk3b/plugin/libsamplerate/configure.in.in +./libk3b/videodvd/configure.in.bot +./libk3b/videodvd/configure.in.in +./libk3bdevice/configure.in.bot +./libk3bdevice/configure.in.in +./plugins/audiooutput/alsa/configure.in.bot +./plugins/audiooutput/alsa/configure.in.in +./plugins/decoder/ffmpeg/configure.in.bot +./plugins/decoder/ffmpeg/configure.in.in +./plugins/decoder/flac/configure.in.bot +./plugins/decoder/flac/configure.in.in +./plugins/decoder/libsndfile/configure.in.bot +./plugins/decoder/libsndfile/configure.in.in +./plugins/decoder/mp3/configure.in.bot +./plugins/decoder/mp3/configure.in.in +./plugins/decoder/musepack/configure.in.bot +./plugins/decoder/musepack/configure.in.in +./plugins/decoder/ogg/configure.in.bot +./plugins/decoder/ogg/configure.in.in +./plugins/encoder/lame/configure.in.bot +./plugins/encoder/lame/configure.in.in +./src/fastscale/configure.in.in +configure.in.bot diff --git a/configure.in b/configure.in new file mode 100644 index 0000000..4bcf6eb --- /dev/null +++ b/configure.in @@ -0,0 +1,1244 @@ +dnl ======================================================= +dnl FILE: ./admin/configure.in.min +dnl ======================================================= + +dnl This file is part of the KDE libraries/packages +dnl Copyright (C) 2001 Stephan Kulow (coolo@kde.org) + +dnl This file is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Library General Public +dnl License as published by the Free Software Foundation; either +dnl version 2 of the License, or (at your option) any later version. + +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Library General Public License for more details. + +dnl You should have received a copy of the GNU Library General Public License +dnl along with this library; see the file COPYING.LIB. If not, write to +dnl the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +dnl Boston, MA 02110-1301, USA. + +# Original Author was Kalle@kde.org +# I lifted it in some mater. (Stephan Kulow) +# I used much code from Janos Farkas + +dnl Process this file with autoconf to produce a configure script. + +AC_INIT(acinclude.m4) dnl a source file from your sub dir + +dnl This is so we can use kde-common +AC_CONFIG_AUX_DIR(admin) + +dnl This ksh/zsh feature conflicts with `cd blah ; pwd` +unset CDPATH + +dnl Checking host/target/build systems, for make, install etc. +AC_CANONICAL_SYSTEM +dnl Perform program name transformation +AC_ARG_PROGRAM + +dnl Automake doc recommends to do this only here. (Janos) +AM_INIT_AUTOMAKE(k3b-1.0.5, "3.5.9") dnl searches for some needed programs + +KDE_SET_PREFIX + +dnl generate the config header +AM_CONFIG_HEADER(config.h) dnl at the distribution this done + +dnl Checks for programs. +AC_CHECK_COMPILERS +AC_ENABLE_SHARED(yes) +AC_ENABLE_STATIC(no) +KDE_PROG_LIBTOOL + +dnl for NLS support. Call them in this order! +dnl WITH_NLS is for the po files +AM_KDE_WITH_NLS + +KDE_USE_QT(3.2) +AC_PATH_KDE +dnl ======================================================= +dnl FILE: configure.in.in +dnl ======================================================= + +#MIN_CONFIG(3.2) +#AM_KDE_MIN_VERSION(3.4) + +AC_CHECK_HEADERS(byteswap.h) + +dnl - check the byte order - +dnl this will define WORDS_BIGENDIAN or do nothing +AC_C_BIGENDIAN() + +AC_ARG_WITH( + external-libsamplerate, + [ --with-external-libsamplerate use the libsamplerate provided by the system (default=yes)], + [external_sampletrate=$withval], + [external_sampletrate=yes] +) + +LIBSAMPLERATE="" + +if test x$external_sampletrate != xno; then + +dnl === check for libsamplerate ========== +KDE_CHECK_HEADERS(samplerate.h, [ + KDE_CHECK_LIB(samplerate, src_new, [ + LIBSAMPLERATE="-lsamplerate" + AC_DEFINE(HAVE_LIBSAMPLERATE,1,[defined if you have libsamplerate library and header]) + ]) +]) + +fi + +AC_SUBST(LIBSAMPLERATE) +AM_CONDITIONAL(compile_libsamplerate, [test -z "$LIBSAMPLERATE"]) + + +ARTS_LIBS="" +if test "x$build_arts" = "xyes"; then + dnl Find aRts + KDE_CHECK_HEADERS(artsc/artsc.h, + [arts_available=yes + ARTS_LIBS="-lartsc"], + [arts_available=no] + ) +fi +AC_SUBST(ARTS_LIBS) +AM_CONDITIONAL(include_arts, [test -n "$ARTS_LIBS"]) +if test "x$build_arts" = "xyes" -a "x$arts_available" = "xyes"; then + AC_DEFINE(WITH_ARTS,1,[defined if arts support is compiled in]) +fi + +KDE_CHECK_THREADING + +compile_k3bsetup=yes +AC_ARG_WITH( + k3bsetup, + [ --with-k3bsetup[=ARG] do compile K3bSetup2 KControl Module (default=yes)], + [compile_k3bsetup=$withval] +) + +if test x$compile_k3bsetup = xyes; then + AC_DEFINE(HAVE_K3BSETUP,1,[defined if K3bSetup is compiled]) +fi + +AM_CONDITIONAL(with_k3bsetup1, [test x$compile_k3bsetup = xyes]) + + +cdrecord_suid_root=yes +AC_ARG_WITH( + cdrecord-suid-root, + AS_HELP_STRING( + [--without-cdrecord-suid-root], + [enable or disable K3b's suid root check for cdrecord/cdrdao/wodim (default=enabled)]), + [cdrecord_suid_root=$withval], + [cdrecord_suid_root=yes] +) +if test x$cdrecord_suid_root = xyes; then + AC_DEFINE(CDRECORD_SUID_ROOT_CHECK,1,[defined if K3b should check cdrecord for suid root]) +fi + + +# Extra SCSI support libs can go in CAM_LIB, and are linked into +# libk3bdevice. For Linux, nothing is needed. FreeBSD requires -lcam +# (which is in base, so no test is needed). +case "$host_os" in +freebsd* | dragonfly*) + CAM_LIB="-lcam" + ;; +*) + CAM_LIB="" + ;; +esac +AC_SUBST(CAM_LIB) + + + +dnl ---------- TAGLIB CHECK ---------- + +AC_DEFUN([AC_HAVE_TAGLIB], +[ + AC_DEFINE(HAVE_TAGLIB, 1, [have TagLib]) + taglib_includes=[`$TAGLIB_CONFIG --cflags`] + taglib_libs=[`$TAGLIB_CONFIG --libs`] + have_taglib=true +]) + +AC_DEFUN([AC_NO_TAGLIB], +[ + taglib_includes="" + taglib_libs="" + have_taglib=false +]) + +AC_PATH_PROG(TAGLIB_CONFIG, taglib-config, [no], [$PATH:$prefix/bin]) +if test "x$TAGLIB_CONFIG" = "xno" ; then + AC_NO_TAGLIB +else + AC_HAVE_TAGLIB +fi + +AC_SUBST(taglib_includes) +AC_SUBST(taglib_libs) + +dnl ---------- END TAGLIB CHECK ---------- + + + +dnl ----------- TUNEPIMP/MUSICBRAINZ CHECK ----------- + +AC_ARG_WITH( + musicbrainz, + AS_HELP_STRING( + [--without-musicbrainz], + [build K3b without Musicbrainz support (default=no)]), + [ac_cv_use_musicbrainz=$withval], + [ac_cv_use_musicbrainz=yes] +) + +have_mb=false +MUSICBRAINZ_LIBS="" +if test "$ac_cv_use_musicbrainz" = "yes"; then + KDE_CHECK_HEADER(musicbrainz/mb_c.h, + [ + KDE_CHECK_LIB(musicbrainz,mb_New,[ + AC_DEFINE(HAVE_MUSICBRAINZ, 1, [have MusicBrainz]) + MUSICBRAINZ_LIBS="-lmusicbrainz" + have_mb=true + ]) + ], []) +fi +AC_SUBST(MUSICBRAINZ_LIBS) + +dnl --------- TUNEPIMP/MUSICBRAINZ CHECK END ----------- + + +dnl --------- K3b debugging stuff (only for developers) ---- + +AC_ARG_WITH( + k3b-debug, + AS_HELP_STRING( + [--with-k3b-debug], + [Enable additional K3b debugging output and functionality (default=no)]), + [use_k3b_debug=$withval], + [use_k3b_debug=no] +) +if test "$use_k3b_debug" = "yes"; then + AC_DEFINE(K3B_DEBUG, "1", [K3b additional debugging support]) +fi + +dnl -------------------------------------------------------- + + + + +dnl --------------- libiconv check ------------------------- + +AC_CHECK_HEADERS(iconv.h) + +dnl -------------------------------------------------------- + + +#AC_DEFINE(LIBK3B_VERSION, "0.11.98", [k3b library version]) +#AC_SUBST(LIBK3B_VERSION, 0.11.98) +#AC_CONFIG_FILES([k3b/libk3b/libk3b.pc]) + +KDE_ENABLE_HIDDEN_VISIBILITY +dnl ======================================================= +dnl FILE: ./libk3b/configure.in.in +dnl ======================================================= + +AC_CHECK_FUNCS(stat64) +AC_CHECK_HEADERS(sys/vfs.h) +AC_CHECK_HEADERS(sys/statvfs.h) +dnl ======================================================= +dnl FILE: ./libk3b/plugin/libsamplerate/configure.in.in +dnl ======================================================= + +LIBS="-lm $all_libraries" + +AC_CHECK_DECL(lrint, + AC_DEFINE(HAVE_LRINT,1,[Define if lrint is supported]), + AC_DEFINE(HAVE_LRINT,0,[Define if lrint is not supported]), + [#include ] +) + +AC_CHECK_DECL(lrintf, + AC_DEFINE(HAVE_LRINTF,1,[Define if lrintf is supported]), + AC_DEFINE(HAVE_LRINTF,0,[Define if lrintf is not supported]), + [#include ] +) +dnl ======================================================= +dnl FILE: ./libk3b/videodvd/configure.in.in +dnl ======================================================= + +AC_ARG_WITH( + libdvdread, + AS_HELP_STRING( + [--without-libdvdread], + [build K3b without libdvdread (Video DVD ripping) support (default=no)]), + [ac_cv_use_libdvdread=$withval], + [ac_cv_use_libdvdread=yes] +) + +have_libdvdread=no +if test "$ac_cv_use_libdvdread" = "yes"; then + KDE_CHECK_HEADERS(dvdread/dvd_reader.h, + [ + AC_CHECK_LIB(dvdread, + DVDOpen, + [ + AC_DEFINE(HAVE_LIBDVDREAD,1,[Defined if you have libdvdread headers and libs installed.]) + have_libdvdread=yes + ] + ) + ]) +fi +AM_CONDITIONAL(include_videodvdrip, [test x$have_libdvdread = xyes]) + +#if test "$have_libdvdread" = "no"; then +# AC_MSG_ERROR([Could not find libdvdread. Please install.]) +# DO_NOT_COMPILE="$DO_NOT_COMPILE k3b" +#fi +dnl ======================================================= +dnl FILE: ./libk3bdevice/configure.in.in +dnl ======================================================= + +dnl FIXME: only make the linux header check on linux systems. + +linux_scsi=no +AC_MSG_CHECKING(for linux scsi headers) +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +AC_TRY_COMPILE([ + #include + #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,50) + typedef unsigned char u8; + #endif + #include + #include /* cope with silly includes */ + ], + [], + [linux_scsi=yes]) +AC_MSG_RESULT($linux_scsi) + +case "$host_os" in +freebsd*|dragonfly*) + # I'll be damned if lousy coding prevents us from running + # this application. + linux_scsi=yes + ;; +esac + +if test "x$linux_scsi" = "xno" ; then + DO_NOT_COMPILE="$DO_NOT_COMPILE k3b" +fi +AC_LANG_RESTORE + +dnl - find the cam_* functions +AC_CHECK_FUNC(cam_close_device, + [CAM_LIB=""], + [AC_CHECK_LIB(cam, cam_close_device, [CAM_LIB=-lcam], [CAM_LIB=""])] + ) +AC_SUBST(CAM_LIB) + + + +dnl === check for resmgr - begin ============ +AC_ARG_WITH( + resmgr, + AS_HELP_STRING([--without-resmgr], [build K3b without ResMgr support (default=no)]), + [ac_cv_use_resmgr=$withval], + [ac_cv_use_resmgr=yes] +) + +if test "$ac_cv_use_resmgr" = "yes"; then + RESMGR_LIB="" + KDE_CHECK_HEADERS(resmgr.h, [ + KDE_CHECK_LIB(resmgr,rsm_open_device,[ + RESMGR_LIB="-lresmgr" + AC_DEFINE(HAVE_RESMGR,1,[defined if you have resmgr libraries and headers]) + ]) + ]) + AC_SUBST(RESMGR_LIB) +fi +dnl === check for resmgr - end ============ + + + + + +# HAL check from kdebase/kioslave/media + +AC_ARG_WITH( + hal, + AS_HELP_STRING( + [--without-hal], + [build K3b without HAL support (default=no)]), + [ac_cv_use_hal=$withval], + [ac_cv_use_hal=yes] +) + +if test "x$ac_cv_use_hal" = "xyes" ; then + +########### Check for the HAL + + AC_MSG_CHECKING(for the HAL) + + hal_inc=NOTFOUND + hal_lib=NOTFOUND + hal=NOTFOUND + + search_incs="$kde_includes /usr/include /usr/include/hal /usr/local/include /usr/local/include/hal" + AC_FIND_FILE(libhal.h libhal-storage.h, $search_incs, hal_incdir) + + if [test -r $hal_incdir/libhal.h] ; then + HAL_INCS="-I$hal_incdir" + hal_inc=FOUND + fi + + if test -r $hal_incdir/libhal-storage.h ; then + hal_storage_version=4 + grep LibHalVolume $hal_incdir/libhal-storage.h \ + > /dev/null 2>&1 && hal_storage_version=5 + if test $hal_storage_version = 4 ; then + AC_DEFINE(HAL_0_4, , [HAL API version 0.4]) + fi + fi + + search_libs="$kde_libraries /usr/lib64 /usr/lib /usr/local/lib /lib /lib64" + AC_FIND_FILE(libhal.so, $search_libs, hal_libdir) + + if [test -r $hal_libdir/libhal.so] ; then + HAL_LIBS="-L$hal_libdir -lhal" + hal_lib=FOUND + fi + + + if [test $hal_inc = FOUND] && [test $hal_lib = FOUND] ; then + AC_MSG_RESULT(headers $hal_incdir libraries $hal_libdir) + hal=FOUND + else + AC_MSG_RESULT(searched but not found) + fi + + AC_SUBST(HAL_INCS) + AC_SUBST(HAL_LIBS) + + +########### Check for DBus + + AC_MSG_CHECKING(for DBus) + + dbus_inc=NOTFOUND + dbus_lib=NOTFOUND + dbus=NOTFOUND + + search_incs="$kde_includes /usr/include /usr/include/dbus-1.0 /usr/local/include /usr/local/include/dbus-1.0" + AC_FIND_FILE(dbus/dbus.h, $search_incs, dbus_incdir) + + search_incs_arch_deps="$kde_includes /usr/lib64/dbus-1.0/include /usr/lib/dbus-1.0/include /usr/local/lib/dbus-1.0/include" + AC_FIND_FILE(dbus/dbus-arch-deps.h, $search_incs_arch_deps, dbus_incdir_arch_deps) + + if [test -r $dbus_incdir/dbus/dbus.h] && [test -r $dbus_incdir_arch_deps/dbus/dbus-arch-deps.h] ; then + DBUS_INCS="-I$dbus_incdir -I$dbus_incdir_arch_deps" + dbus_inc=FOUND + fi + + search_libs="$kde_libraries /usr/lib64 /usr/lib /usr/local/lib /lib /lib64" + AC_FIND_FILE(libdbus-1.so, $search_libs, dbus_libdir) + + if test -r $dbus_libdir/libdbus-1.so ; then + DBUS_LIBS="-L$dbus_libdir -ldbus-1" + dbus_lib=FOUND + fi + + if [test $dbus_inc = FOUND] && [test $dbus_lib = FOUND] ; then + AC_MSG_RESULT(headers $dbus_incdir $dbus_incdir_arch_deps libraries $dbus_libdir) + dbus=FOUND + else + AC_MSG_RESULT(searched but not found) + fi + + AC_SUBST(DBUS_INCS) + AC_SUBST(DBUS_LIBS) + +########### Check for DBus-Qt bindings + + AC_MSG_CHECKING(for DBus-Qt bindings) + + dbusqt_inc=NOTFOUND + dbusqt_lib=NOTFOUND + dbusqt=NOTFOUND + + search_incs="$kde_includes /usr/include /usr/include/dbus-1.0 /usr/local/include /usr/local/include/dbus-1.0" + AC_FIND_FILE(dbus/connection.h, $search_incs, dbusqt_incdir) + + if test -r $dbusqt_incdir/dbus/connection.h ; then + have_qt_patch=0 + grep dbus_connection_setup_with_qt_main $dbusqt_incdir/dbus/connection.h \ + > /dev/null 2>&1 && have_qt_patch=1 + if test $have_qt_patch = 1 ; then + DBUSQT_INCS="-I$dbusqt_incdir" + dbusqt_inc=FOUND + fi + fi + + search_libs="$kde_libraries /usr/lib /usr/lib64 /usr/local/lib" + AC_FIND_FILE(libdbus-qt-1.so, $search_libs, dbusqt_libdir) + + if test -r $dbusqt_libdir/libdbus-qt-1.so ; then + DBUSQT_LIBS="-L$dbusqt_libdir -ldbus-qt-1" + dbusqt_lib=FOUND + fi + + if [test $dbusqt_inc = FOUND] && [test $dbusqt_lib = FOUND] ; then + AC_MSG_RESULT(headers $dbusqt_incdir libraries $dbusqt_libdir) + dbusqt=FOUND + else + AC_MSG_RESULT(searched but not found) + fi + + AC_SUBST(DBUSQT_INCS) + AC_SUBST(DBUSQT_LIBS) +fi + +########### Check if media HAL backend sould be compiled + +have_hal=no +HAL_DBUS_LIBS="" +if [test "x$hal" = "xFOUND"] && [test "x$dbus" = "xFOUND"] && [test "x$dbusqt" = "xFOUND"] && [ test $hal_storage_version = 5 ] ; then + AC_DEFINE(HAVE_HAL, , [compile in HAL support]) + have_hal=yes + HAL_DBUS_LIBS="$HAL_LIBS $DBUS_LIBS $DBUSQT_LIBS" +fi + +AM_CONDITIONAL(include_HAL, [test x$have_hal = xyes]) +AC_SUBST(HAL_DBUS_LIBS) + +dnl ======================================================= +dnl FILE: ./plugins/audiooutput/alsa/configure.in.in +dnl ======================================================= + +dnl --------- ALSA CHECK BEGIN ------------- + +AC_DEFUN([KDE_CHECK_ALSA], +[ + PKG_CHECK_MODULES([ALSA], [alsa >= 0.9], [have_alsa=yes], [have_alsa=no]) + AC_SUBST([ALSA_CFLAGS]) + AC_SUBST([ALSA_LIBS]) +]) + +AC_ARG_WITH(alsa, + [AS_HELP_STRING(--with-alsa, + [enable support for ALSA output @<:@default=check@:>@])], + [], with_alsa=check) + +have_alsa=no +if test "x$with_alsa" != xno; then + KDE_CHECK_ALSA + + if test "x$with_alsa" != xcheck && test "x$have_alsa" != xyes; then + AC_MSG_FAILURE([--with-alsa was given, but test for ALSA failed]) + fi +fi + +AM_CONDITIONAL(include_ALSA, [test "x$have_alsa" = "xyes"]) + +dnl --------- ALSA CHECK END --------------- +dnl ======================================================= +dnl FILE: ./plugins/decoder/ffmpeg/configure.in.in +dnl ======================================================= + +dnl --------------- FFMPEG CHECK --------------------------------- + +AC_ARG_WITH( + ffmpeg, + AS_HELP_STRING( + [--without-ffmpeg], + [build K3b without ffmpeg audio decoder support (default=no)]), + [ac_cv_use_ffmpeg=$withval], + [ac_cv_use_ffmpeg=yes] +) + +# +# The ffmpeg decoder plugin needs ffmpeg 0.4.9 or higher +# +have_ffmpeg=no +if test "$ac_cv_use_ffmpeg" = "yes"; then + k3b_cxxflags_save="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -D__STDC_CONSTANT_MACROS" + AC_MSG_CHECKING(for ffmpeg >= 0.4.9) + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_COMPILE_IFELSE( + extern "C" { + #include + #include + } + + int main() { + AVFormatContext* fc = 0; + AVPacket* p = 0; + av_register_all(); + return av_read_frame( fc, p ); + }, + [ffmpeg_compiles=yes], [ffmpeg_compiles=no] ) + OLD_LIBS=$LIBS + LIBS="-lavformat -lavcodec $LIBS" + AC_LINK_IFELSE( + extern "C" { + #include + #include + } + + int main() { + AVFormatContext* fc = 0; + AVPacket* p = 0; + av_register_all(); + return av_read_frame( fc, p ); + }, + [ffmpeg_links=yes], [ffmpeg_links=no] ) + AC_LANG_RESTORE + LIBS=$OLD_LIBS + have_ffmpeg=$ffmpeg_links + AC_MSG_RESULT($have_ffmpeg) + CXXFLAGS=$k3b_cxxflags_save +fi +AM_CONDITIONAL(include_FFMPEG, [test x$have_ffmpeg = xyes]) + +dnl --------------- FFMPEG CHECK END ------------------------------ + +AC_ARG_ENABLE( + ffmpeg-all-codecs, + AS_HELP_STRING( + [--enable-ffmpeg-all-codecs], + [Build K3b's ffmeg decoder plugin with all audio codecs enabled (default=disabled)]), + [AC_DEFINE(K3B_FFMPEG_ALL_CODECS, 1, [Defined if all ffmpeg codecs should be allowed]) + enable_ffmpeg_all_codecs=yes], + [enable_ffmpeg_all_codecs=no] +) +dnl ======================================================= +dnl FILE: ./plugins/decoder/flac/configure.in.in +dnl ======================================================= + +dnl === test for FLAC++ and FLAC - begin ==== +AC_ARG_WITH( + flac, + AS_HELP_STRING([--without-flac], [build K3b without FLAC support (default=no)]), + [ac_cv_use_flac=$withval], + [ac_cv_use_flac=yes] +) + +have_flac=no +if test "$ac_cv_use_flac" = "yes"; then + KDE_CHECK_HEADERS(FLAC++/decoder.h, [ + AC_CHECK_LIB(FLAC,FLAC__stream_decoder_process_single, + have_flac=yes,[],$all_libraries)]) + + AC_MSG_CHECKING(for libFLAC newer than 1.1.1) + AC_CACHE_VAL(k3b_flac_new, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE( + [ + #include + ], [ + FLAC::Metadata::VorbisComment* vc; + vc->get_vendor_string().get_field(); + ], k3b_flac_new=no, k3b_flac_new=yes ) + AC_LANG_RESTORE + ]) + AC_MSG_RESULT($k3b_flac_new) + if test $k3b_flac_new = yes; then + AC_DEFINE(FLAC_NEWER_THAN_1_1_1, + 1, + [Define to 1 if your flac library's version is newer than or equal to 1.1.2] + ) + fi +else + have_flac=no +fi + +AM_CONDITIONAL(include_FLAC, [test x$have_flac = xyes]) +dnl === test for FLAC++ and FLAC - end ==== +dnl ======================================================= +dnl FILE: ./plugins/decoder/libsndfile/configure.in.in +dnl ======================================================= + +dnl === test for libsndfile - begin === +dnl +dnl Don't use PKG_CHECK, since if there is no pkg-config installed, +dnl then there is no auto* magic for it either. +dnl +dnl Tests copied from kdebase/kioslave/thumbnail/ +dnl +if test -z "$PKG_CONFIG"; then + AC_PATH_PROG(PKG_CONFIG, pkg-config, no) +fi + +AC_ARG_WITH( + sndfile, + AS_HELP_STRING([--without-sndfile], + [build K3b without libsndfile support (default=no)]), + [ac_cv_use_sndfile=$withval], + [ac_cv_use_sndfile=yes] +) + +if test "$ac_cv_use_sndfile" = "yes"; then + SNDFILE_CFLAGS="" + SNDFILE_LIBS="" + if test "$PKG_CONFIG" = "no" ; then + ac_cv_sndfile=0 + echo "*** The pkg-config script could not be found. Make sure it is" + echo "*** in your path, or set the PKG_CONFIG environment variable" + echo "*** to the full path to pkg-config." + echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." + else + if !(`$PKG_CONFIG --exists sndfile`) ; then + echo "*** sndfile is not installed." + ac_cv_sndfile=0 + else + if !(`$PKG_CONFIG --atleast-version="1.0.2" sndfile`) ; then + echo "*** You need at least version 1.0.2 of sndfile." + ac_cv_sndfile=0 + else + ac_cv_sndfile=1 + SNDFILE_CFLAGS=`$PKG_CONFIG --cflags sndfile` + SNDFILE_LIBS=`$PKG_CONFIG --libs sndfile` + fi + fi + fi + + AC_DEFINE_UNQUOTED([HAVE_SNDFILE],${ac_cv_sndfile}, + [Set to 1 if you have libsndfile.]) + AC_SUBST(SNDFILE_CFLAGS) + AC_SUBST(SNDFILE_LIBS) +fi + +AM_CONDITIONAL(include_AIFF, [test x$ac_cv_sndfile = x1]) +dnl === test for libsndfile - end === +dnl ======================================================= +dnl FILE: ./plugins/decoder/mp3/configure.in.in +dnl ======================================================= + +dnl === libmad MPEG decoder check - begin === +AC_ARG_WITH( + libmad, + AS_HELP_STRING([--without-libmad], [build K3b without libmad support (default=no)]), + [ac_cv_use_libmad=$withval], + [ac_cv_use_libmad=yes] +) + +if test "$ac_cv_use_libmad" = "yes"; then + MAD_LIB="" + KDE_CHECK_HEADER(mad.h, [ + AC_CHECK_LIB(mad, mad_synth_frame, [ + MAD_LIB="-lmad" + AC_DEFINE(HAVE_LIBMAD,1,[defined if you have libmad headers and libraries])], + [], + $all_libraries + ) + ]) + AC_SUBST(MAD_LIB) + +fi + +AM_CONDITIONAL(include_MP3, [test -n "$MAD_LIB"]) +dnl === libmad MPeg decoder check - end === +dnl ======================================================= +dnl FILE: ./plugins/decoder/musepack/configure.in.in +dnl ======================================================= + +dnl --------- MUSEPACK CHECK --------------- + +AC_ARG_WITH( + musepack, + AS_HELP_STRING( + [--without-musepack], + [build K3b without Musepack audio support (default=no)]), + [ac_cv_use_mpc=$withval], + [ac_cv_use_mpc=yes] +) + +have_mpc=no +if test "$ac_cv_use_mpc" = "yes"; then + + dnl - search for both the new and the old naming - + + KDE_CHECK_HEADERS(mpcdec/mpcdec.h, [ + AC_CHECK_LIB(mpcdec, mpc_decoder_setup, [ + have_mpc=yes + MPC_LIBS="-lmpcdec" + AC_DEFINE( + MPC_HEADER_FILE, + , + [The header to include for MPC decoding.]) + ], + [], [], []) + ]) + + if test "$have_mpc" = "no"; then + KDE_CHECK_HEADERS(musepack/musepack.h, [ + AC_CHECK_LIB(musepack, mpc_decoder_setup, [ + have_mpc=yes + MPC_LIBS="-lmusepack" + AC_DEFINE( + MPC_HEADER_FILE, + , + [The header to include for MPC decoding.] + ) + AC_DEFINE( + mpc_bool_t, + BOOL, + [backwards compatibility stuff] + ) + ], [], []) + ]) + fi +fi +AC_SUBST(MPC_LIBS) + +AM_CONDITIONAL(include_MPC, [test x$have_mpc = xyes]) + +dnl --------- MUSEPACK CHECK END ----------- +dnl ======================================================= +dnl FILE: ./plugins/decoder/ogg/configure.in.in +dnl ======================================================= + +dnl === Ogg Vorbis Test - Begin === +AC_ARG_WITH( + oggvorbis, + AS_HELP_STRING([--without-oggvorbis], [build K3b without OggVorbis support (default=no)]), + [ac_cv_use_oggvorbis=$withval], + [ac_cv_use_oggvorbis=yes] +) + +if test "$ac_cv_use_oggvorbis" = "yes"; then + + AC_MSG_CHECKING(for ogg/vorbis headers) + ogg_vorbis=no + AC_TRY_COMPILE([ + #include + #include + ],[ + ],[ + ogg_vorbis=yes + ]) + AC_MSG_RESULT($ogg_vorbis) + if test x$ogg_vorbis = xyes; then + dnl we need the ogg_vorbis_lib because otherwise we override LIBS ! + AC_CHECK_LIB(vorbisfile,ov_open,ogg_vorbis_lib=yes, + ogg_vorbis=no,[$all_libraries -lvorbisfile -lvorbis -logg]) + fi + if test x$ogg_vorbis = xyes; then + AC_DEFINE(OGG_VORBIS,1,[Define if you have ogg/vorbis installed]) + fi +fi + +AM_CONDITIONAL(include_OGG, [test x$ogg_vorbis = xyes]) +dnl === Ogg Vorbis Test - End === +dnl ======================================================= +dnl FILE: ./plugins/encoder/lame/configure.in.in +dnl ======================================================= + +dnl === test for LAME - begin ==== +AC_ARG_WITH( + lame, + AS_HELP_STRING([--without-lame], [build K3b without LAME support (default=no)]), + [ac_cv_use_lame=$withval], + [ac_cv_use_lame=yes] +) + +have_lame=no +if test "$ac_cv_use_lame" = "yes"; then + KDE_CHECK_HEADERS(lame/lame.h, [ + AC_CHECK_LIB(mp3lame, lame_init, [ + have_lame=yes + AC_DEFINE(HAVE_LAME,1,[defined if you have the lame header and lib]) + ], [], $all_libraries -lm) + ]) +fi + +AM_CONDITIONAL(include_LAME, [test x$have_lame = xyes]) +dnl === test for LAME - end ==== +dnl ======================================================= +dnl FILE: ./src/fastscale/configure.in.in +dnl ======================================================= + +# +# Imlib/Mosfet scaling +# +AM_PROG_AS + +# MMX test duped from kdelibs/kdefx - it should be probably moved to admin/ +dnl ----------------------------------------------------- +dnl IA32 checks +dnl ----------------------------------------------------- + +gv_asm_defs= +case $host_cpu in + i*86 ) + AC_MSG_CHECKING(for assembler support for IA32 extensions) + + dnl MMX check + AC_TRY_COMPILE(, [ __asm__("pxor %mm0, %mm0") ], + [ + echo $ECHO_N "MMX yes$ECHO_C" + AC_DEFINE_UNQUOTED(HAVE_X86_MMX, 1, [Define to 1 if the assembler supports MMX instructions.]) + gv_asm_defs="$gv_asm_defs -DHAVE_X86_MMX" + ], [ echo $ECHO_N "MMX no$ECHO_C" ]) + + dnl SSE check + AC_TRY_COMPILE(,[ __asm__("xorps %xmm0, %xmm0") ], + [ + echo $ECHO_N ", SSE yes$ECHO_C" + AC_DEFINE_UNQUOTED(HAVE_X86_SSE, 1, [Define to 1 if the assembler supports SSE instructions.]) + gv_asm_defs="$gv_asm_defs -DHAVE_X86_SSE" + ], [ echo $ECHO_N ", SSE no$ECHO_C" ]) + + dnl SSE2 check + AC_TRY_COMPILE(, [ __asm__("xorpd %xmm0, %xmm0") ], + [ + echo $ECHO_N ", SSE2 yes$ECHO_C" + AC_DEFINE_UNQUOTED(HAVE_X86_SSE2, 1, [Define to 1 if the assembler supports SSE2 instructions.]) + gv_asm_defs="$gv_asm_defs -DHAVE_X86_SSE2" + ], [ echo $ECHO_N ", SSE2 no$ECHO_C" ]) + + dnl 3DNOW check + AC_TRY_COMPILE(, [ __asm__("femms") ], + [ + echo $ECHO_N ", 3DNOW yes$ECHO_C" + AC_DEFINE_UNQUOTED(HAVE_X86_3DNOW, 1, [Define to 1 if the assembler supports 3DNOW instructions.]) + gv_asm_defs="$gv_asm_defs -DHAVE_X86_3DNOW" + ], [ echo $ECHO_N ", 3DNOW no$ECHO_C" ]) + echo + ;; + powerpc ) + AC_MSG_CHECKING(for assembler support for AltiVec instructions) + dnl AltiVec check + AC_TRY_COMPILE(, [ __asm__("mtspr 256, %0\n\t" "vand %%v0, %%v0, %%v0" : : "r"(-1) ) ], + [ + echo $ECHO_N " yes$ECHO_C" + AC_DEFINE_UNQUOTED(HAVE_PPC_ALTIVEC, 1, [Define to 1 if the assembler supports AltiVec instructions.]) + gv_asm_defs="$gv_asm_defs -DHAVE_PPC_ALTIVEC" + ], [ echo $ECHO_N ", AltiVec no$ECHO_C" ]) + echo + ;; +esac + +GV_ASM_DEFS="$gv_asm_defs" +AC_SUBST(GV_ASM_DEFS) +KDE_CREATE_SUBDIRSLIST +AC_CONFIG_FILES([ Makefile ]) +AC_CONFIG_FILES([ doc/Makefile ]) +AC_CONFIG_FILES([ k3bsetup/Makefile ]) +AC_CONFIG_FILES([ kfile-plugins/Makefile ]) +AC_CONFIG_FILES([ kfile-plugins/k3bproject/Makefile ]) +AC_CONFIG_FILES([ kioslaves/Makefile ]) +AC_CONFIG_FILES([ kioslaves/videodvd/Makefile ]) +AC_CONFIG_FILES([ libk3b/Makefile ]) +AC_CONFIG_FILES([ libk3b/cddb/Makefile ]) +AC_CONFIG_FILES([ libk3b/core/Makefile ]) +AC_CONFIG_FILES([ libk3b/jobs/Makefile ]) +AC_CONFIG_FILES([ libk3b/plugin/Makefile ]) +AC_CONFIG_FILES([ libk3b/plugin/libsamplerate/Makefile ]) +AC_CONFIG_FILES([ libk3b/projects/Makefile ]) +AC_CONFIG_FILES([ libk3b/projects/audiocd/Makefile ]) +AC_CONFIG_FILES([ libk3b/projects/datacd/Makefile ]) +AC_CONFIG_FILES([ libk3b/projects/datadvd/Makefile ]) +AC_CONFIG_FILES([ libk3b/projects/mixedcd/Makefile ]) +AC_CONFIG_FILES([ libk3b/projects/movixcd/Makefile ]) +AC_CONFIG_FILES([ libk3b/projects/movixdvd/Makefile ]) +AC_CONFIG_FILES([ libk3b/projects/videocd/Makefile ]) +AC_CONFIG_FILES([ libk3b/projects/videocd/cdi/Makefile ]) +AC_CONFIG_FILES([ libk3b/projects/videocd/extra/Makefile ]) +AC_CONFIG_FILES([ libk3b/projects/videocd/mpeginfo/Makefile ]) +AC_CONFIG_FILES([ libk3b/projects/videodvd/Makefile ]) +AC_CONFIG_FILES([ libk3b/scripts/Makefile ]) +AC_CONFIG_FILES([ libk3b/tools/Makefile ]) +AC_CONFIG_FILES([ libk3b/tools/libisofs/Makefile ]) +AC_CONFIG_FILES([ libk3b/videodvd/Makefile ]) +AC_CONFIG_FILES([ libk3bdevice/Makefile ]) +AC_CONFIG_FILES([ plugins/Makefile ]) +AC_CONFIG_FILES([ plugins/audiooutput/Makefile ]) +AC_CONFIG_FILES([ plugins/audiooutput/alsa/Makefile ]) +AC_CONFIG_FILES([ plugins/audiooutput/arts/Makefile ]) +AC_CONFIG_FILES([ plugins/decoder/Makefile ]) +AC_CONFIG_FILES([ plugins/decoder/ffmpeg/Makefile ]) +AC_CONFIG_FILES([ plugins/decoder/flac/Makefile ]) +AC_CONFIG_FILES([ plugins/decoder/libsndfile/Makefile ]) +AC_CONFIG_FILES([ plugins/decoder/mp3/Makefile ]) +AC_CONFIG_FILES([ plugins/decoder/musepack/Makefile ]) +AC_CONFIG_FILES([ plugins/decoder/ogg/Makefile ]) +AC_CONFIG_FILES([ plugins/decoder/wave/Makefile ]) +AC_CONFIG_FILES([ plugins/encoder/Makefile ]) +AC_CONFIG_FILES([ plugins/encoder/external/Makefile ]) +AC_CONFIG_FILES([ plugins/encoder/lame/Makefile ]) +AC_CONFIG_FILES([ plugins/encoder/ogg/Makefile ]) +AC_CONFIG_FILES([ plugins/encoder/sox/Makefile ]) +AC_CONFIG_FILES([ plugins/project/Makefile ]) +AC_CONFIG_FILES([ plugins/project/audiometainforenamer/Makefile ]) +AC_CONFIG_FILES([ plugins/project/audioprojectcddb/Makefile ]) +AC_CONFIG_FILES([ src/Makefile ]) +AC_CONFIG_FILES([ src/fastscale/Makefile ]) +AC_CONFIG_FILES([ src/icons/Makefile ]) +AC_CONFIG_FILES([ src/icons/actions/Makefile ]) +AC_CONFIG_FILES([ src/konqi/Makefile ]) +AC_CONFIG_FILES([ src/mimetypes/Makefile ]) +AC_CONFIG_FILES([ src/misc/Makefile ]) +AC_CONFIG_FILES([ src/option/Makefile ]) +AC_CONFIG_FILES([ src/pics/Makefile ]) +AC_CONFIG_FILES([ src/pics/73lab/Makefile ]) +AC_CONFIG_FILES([ src/pics/RobsTheme/Makefile ]) +AC_CONFIG_FILES([ src/pics/crystal/Makefile ]) +AC_CONFIG_FILES([ src/pics/quant/Makefile ]) +AC_CONFIG_FILES([ src/projects/Makefile ]) +AC_CONFIG_FILES([ src/projects/kostore/Makefile ]) +AC_CONFIG_FILES([ src/rip/Makefile ]) +AC_CONFIG_FILES([ src/rip/videodvd/Makefile ]) +AC_CONFIG_FILES([ src/sounds/Makefile ]) +AC_OUTPUT +echo "" + +echo "K3b - Include libdvdread (Video DVD ripping) support:" +if test "$have_libdvdread" = "yes"; then + echo "K3b - yes" +else + echo "K3b - no" + if test "$ac_cv_use_libdvdread" = "yes"; then + echo "K3b - You are missing the libdvdread library." + fi +fi +echo "" + +if test -n "$RESMGR_LIB"; then + echo "K3b - Resmgr support: yes" +else + echo "K3b - Resmgr support: no" +fi + +echo "" + + +if test x$have_hal = xyes; then + echo "K3b - Compile HAL support yes" +else + echo "K3b - Compile HAL support no" +if test "x$ac_cv_use_hal" = "xyes" ; then + echo "K3b - You are missing the HAL >= 0.5 headers and libraries" + echo "K3b - or the DBus Qt bindings." +fi +fi +echo "" + +if test "x$have_alsa" = xyes; then + echo "K3b - Audioplayer available (alsa) yes" +else + echo "K3b - Audioplayer available (alsa) no" +fi +echo "" + +echo "K3b - FFMpeg decoder plugin (decodes wma and others):" +if test x$have_ffmpeg = xyes; then + echo "K3b - yes" + if test x$enable_ffmpeg_all_codecs = xyes; then + echo "K3b - WARNING: You enabled all codecs in the ffmpeg decoder plugin." + echo "K3b - Be aware that most are not tested and track lengths" + echo "K3b - will be wrong in many cases." + fi +else + echo "K3b - no" +if test "$ac_cv_use_ffmpeg" = "yes"; then + if test "$ffmpeg_compiles" = "yes"; then + echo "K3b - You are missing the ffmpeg libraries." + echo "K3b - Make sure ffmpeg has been configured as a" + echo "K3b - shared library (which is not the default)." + else + echo "K3b - You are missing the ffmpeg headers and libraries" + echo "K3b - version 0.4.9 or higher." + fi + echo "K3b - The ffmpeg audio decoding plugin (decodes wma and" + echo "K3b - others) won't be compiled." +fi +fi +echo "" + +if test x$have_flac = xyes; then + echo "K3b - FLAC support: yes" +else + echo "K3b - FLAC support: no" +if test "$ac_cv_use_flac" = "yes"; then + if test "$have_flac" = "no"; then + echo "K3b - You are missing the FLAC++ headers and libraries." + echo "K3b - The FLAC decoding plugin won't be compiled." + fi +fi +fi +echo "" + +if $av_cv_sndfile; then + echo "K3b - libsndfile audio decoding support: yes" +else + echo "K3b - libsndfile audio decoding support: no" +if test "$ac_cv_use_sndfile" = "yes"; then + echo "K3b - You are missing the libsndfile headers and libraries." + echo "K3b - The libsndfile audio decoding plugin won't be compiled." +fi +fi +echo "" + +if test -n "$MAD_LIB"; then + echo "K3b - Mp3 decoding support (libmad): yes" +else + echo "K3b - Mp3 decoding support (libmad): no" +if test "$ac_cv_use_libmad" = "yes"; then + echo "K3b - You are missing the libmad headers and libraries." + echo "K3b - The Mp3 decoding plugin won't be compiled." +fi +fi +echo "" + +if test x$have_mpc = xyes; then + echo "K3b - Musepack support: yes" +else + echo "K3b - Musepack support: no" +if test "$ac_cv_use_mpc" = "yes"; then + echo "K3b - You are missing the Musepack headers and libraries >= 1.1." + echo "K3b - The Musepack audio decoding plugin won't be compiled." +fi +fi + +echo "" + +if test x$ogg_vorbis = xyes; then + echo "K3b - Ogg Vorbis support: yes" +else + echo "K3b - Ogg Vorbis support: no" +if test "$ac_cv_use_oggvorbis" = "yes"; then + echo "K3b - You are missing the Ogg-Vorbis headers and libraries." + echo "K3b - The Ogg Vorbis decoding and encoding plugins won't be compiled." +fi +fi +echo "" + +if test x$have_lame = xyes; then + echo "K3b - Lame Mp3 encoder plugin: yes" +else + echo "K3b - Lame Mp3 encoder plugin no" +if test "$ac_cv_use_lame" = "yes"; then + echo "K3b - You are missing the Lame headers and libraries." + echo "K3b - The Lame Mp3 encoding plugin won't be compiled." +fi +fi +echo "" + +if test "$use_k3b_debug" = "yes"; then + echo "" + echo "K3b - K3B DEBUGGING ENABLED! THIS ENABLES ADDITIONAL DEBUGGING OUTPUT" + echo "K3b - AND FUNCTIONALITY WHICH IS ONLY INTENDED FOR K3B DEVELOPERS!" + echo "K3b - THIS MAY EVEN SLOW DOWN K3B IN SOME PLACES!" + echo "" +fi + +if test "$cdrecord_suid_root" != "yes"; then + echo "" + echo "K3b - Suid root test for cdrecord, cdrdao, and wodim deactivated" + echo "K3b - This is NOT recommended although it might work out fine ;)" + echo "" +fi + +if $have_taglib; then + echo "K3b - Audio meta data reading with Taglib: yes" +else + echo "K3b - Audio meta data reading with Taglib: no" + echo "K3b - You are missing the Taglib headers and libraries." + echo "K3b - The mp3 and flac decoder plugins will fall back to" + echo "K3b - using KMetaFileInfo." +fi + +echo "" + +echo "K3b - Audio resampling:" +if test -n "$LIBSAMPLERATE"; then + echo "K3b - using installed version" +else + echo "K3b - using version bundled with K3b" +fi + +echo "" + +if test x$arts_available = xyes; then + echo "K3b - Audioplayer available (aRts) yes" +else + echo "K3b - Audioplayer available (aRts) no" +fi + +echo "" + +if test x$compile_k3bsetup = xyes; then + echo "K3b - Compile K3bSetup 2: yes" +else + echo "K3b - Compile K3bSetup 2: no" +fi + +echo "" + +if $have_mb; then + echo "K3b - Tag guessing using MusicBrainz yes" +else + echo "K3b - Tag guessing using MusicBrainz no" +if test "$ac_cv_use_musicbrainz" = "yes"; then + echo "K3b - You are missing the musicbrainz headers and libraries." + echo "K3b - K3b will be compiled without support for tag guessing." +fi +fi +# Check if KDE_SET_PREFIX was called, and --prefix was passed to configure +if test -n "$kde_libs_prefix" -a -n "$given_prefix"; then + # And if so, warn when they don't match + if test "$kde_libs_prefix" != "$given_prefix"; then + # And if kde doesn't know about the prefix yet + echo ":"`kde-config --path exe`":" | grep ":$given_prefix/bin/:" 2>&1 >/dev/null + if test $? -ne 0; then + echo "" + echo "Warning: you chose to install this package in $given_prefix," + echo "but KDE was found in $kde_libs_prefix." + echo "For this to work, you will need to tell KDE about the new prefix, by ensuring" + echo "that KDEDIRS contains it, e.g. export KDEDIRS=$given_prefix:$kde_libs_prefix" + echo "Then restart KDE." + echo "" + fi + fi +fi + +if test x$GXX = "xyes" -a x$kde_have_gcc_visibility = "xyes" -a x$kde_cv_val_qt_gcc_visibility_patched = "xno"; then + echo "" + echo "Your GCC supports symbol visibility, but the patch for Qt supporting visibility" + echo "was not included. Therefore, GCC symbol visibility support remains disabled." + echo "" + echo "For better performance, consider including the Qt visibility supporting patch" + echo "located at:" + echo "" + echo "http://bugs.kde.org/show_bug.cgi?id=109386" + echo "" + echo "and recompile all of Qt and KDE. Note, this is entirely optional and" + echo "everything will continue to work just fine without it." + echo "" +fi + +if test "$all_tests" = "bad"; then + if test ! "$cache_file" = "/dev/null"; then + echo "" + echo "Please remove the file $cache_file after changing your setup" + echo "so that configure will find the changes next time." + echo "" + fi +else + echo "" + echo "Good - your configure finished. Start make now" + echo "" +fi diff --git a/configure.in.bot b/configure.in.bot new file mode 100644 index 0000000..718d6ba --- /dev/null +++ b/configure.in.bot @@ -0,0 +1,62 @@ +echo "" + +if test "$use_k3b_debug" = "yes"; then + echo "" + echo "K3b - K3B DEBUGGING ENABLED! THIS ENABLES ADDITIONAL DEBUGGING OUTPUT" + echo "K3b - AND FUNCTIONALITY WHICH IS ONLY INTENDED FOR K3B DEVELOPERS!" + echo "K3b - THIS MAY EVEN SLOW DOWN K3B IN SOME PLACES!" + echo "" +fi + +if test "$cdrecord_suid_root" != "yes"; then + echo "" + echo "K3b - Suid root test for cdrecord, cdrdao, and wodim deactivated" + echo "K3b - This is NOT recommended although it might work out fine ;)" + echo "" +fi + +if $have_taglib; then + echo "K3b - Audio meta data reading with Taglib: yes" +else + echo "K3b - Audio meta data reading with Taglib: no" + echo "K3b - You are missing the Taglib headers and libraries." + echo "K3b - The mp3 and flac decoder plugins will fall back to" + echo "K3b - using KMetaFileInfo." +fi + +echo "" + +echo "K3b - Audio resampling:" +if test -n "$LIBSAMPLERATE"; then + echo "K3b - using installed version" +else + echo "K3b - using version bundled with K3b" +fi + +echo "" + +if test x$arts_available = xyes; then + echo "K3b - Audioplayer available (aRts) yes" +else + echo "K3b - Audioplayer available (aRts) no" +fi + +echo "" + +if test x$compile_k3bsetup = xyes; then + echo "K3b - Compile K3bSetup 2: yes" +else + echo "K3b - Compile K3bSetup 2: no" +fi + +echo "" + +if $have_mb; then + echo "K3b - Tag guessing using MusicBrainz yes" +else + echo "K3b - Tag guessing using MusicBrainz no" +if test "$ac_cv_use_musicbrainz" = "yes"; then + echo "K3b - You are missing the musicbrainz headers and libraries." + echo "K3b - K3b will be compiled without support for tag guessing." +fi +fi diff --git a/configure.in.in b/configure.in.in new file mode 100644 index 0000000..27cec92 --- /dev/null +++ b/configure.in.in @@ -0,0 +1,184 @@ +#MIN_CONFIG(3.2) +#AM_KDE_MIN_VERSION(3.4) + +AC_CHECK_HEADERS(byteswap.h) + +dnl - check the byte order - +dnl this will define WORDS_BIGENDIAN or do nothing +AC_C_BIGENDIAN() + +AC_ARG_WITH( + external-libsamplerate, + [ --with-external-libsamplerate use the libsamplerate provided by the system (default=yes)], + [external_sampletrate=$withval], + [external_sampletrate=yes] +) + +LIBSAMPLERATE="" + +if test x$external_sampletrate != xno; then + +dnl === check for libsamplerate ========== +KDE_CHECK_HEADERS(samplerate.h, [ + KDE_CHECK_LIB(samplerate, src_new, [ + LIBSAMPLERATE="-lsamplerate" + AC_DEFINE(HAVE_LIBSAMPLERATE,1,[defined if you have libsamplerate library and header]) + ]) +]) + +fi + +AC_SUBST(LIBSAMPLERATE) +AM_CONDITIONAL(compile_libsamplerate, [test -z "$LIBSAMPLERATE"]) + + +ARTS_LIBS="" +if test "x$build_arts" = "xyes"; then + dnl Find aRts + KDE_CHECK_HEADERS(artsc/artsc.h, + [arts_available=yes + ARTS_LIBS="-lartsc"], + [arts_available=no] + ) +fi +AC_SUBST(ARTS_LIBS) +AM_CONDITIONAL(include_arts, [test -n "$ARTS_LIBS"]) +if test "x$build_arts" = "xyes" -a "x$arts_available" = "xyes"; then + AC_DEFINE(WITH_ARTS,1,[defined if arts support is compiled in]) +fi + +KDE_CHECK_THREADING + +compile_k3bsetup=yes +AC_ARG_WITH( + k3bsetup, + [ --with-k3bsetup[=ARG] do compile K3bSetup2 KControl Module (default=yes)], + [compile_k3bsetup=$withval] +) + +if test x$compile_k3bsetup = xyes; then + AC_DEFINE(HAVE_K3BSETUP,1,[defined if K3bSetup is compiled]) +fi + +AM_CONDITIONAL(with_k3bsetup1, [test x$compile_k3bsetup = xyes]) + + +cdrecord_suid_root=yes +AC_ARG_WITH( + cdrecord-suid-root, + AS_HELP_STRING( + [--without-cdrecord-suid-root], + [enable or disable K3b's suid root check for cdrecord/cdrdao/wodim (default=enabled)]), + [cdrecord_suid_root=$withval], + [cdrecord_suid_root=yes] +) +if test x$cdrecord_suid_root = xyes; then + AC_DEFINE(CDRECORD_SUID_ROOT_CHECK,1,[defined if K3b should check cdrecord for suid root]) +fi + + +# Extra SCSI support libs can go in CAM_LIB, and are linked into +# libk3bdevice. For Linux, nothing is needed. FreeBSD requires -lcam +# (which is in base, so no test is needed). +case "$host_os" in +freebsd* | dragonfly*) + CAM_LIB="-lcam" + ;; +*) + CAM_LIB="" + ;; +esac +AC_SUBST(CAM_LIB) + + + +dnl ---------- TAGLIB CHECK ---------- + +AC_DEFUN([AC_HAVE_TAGLIB], +[ + AC_DEFINE(HAVE_TAGLIB, 1, [have TagLib]) + taglib_includes=[`$TAGLIB_CONFIG --cflags`] + taglib_libs=[`$TAGLIB_CONFIG --libs`] + have_taglib=true +]) + +AC_DEFUN([AC_NO_TAGLIB], +[ + taglib_includes="" + taglib_libs="" + have_taglib=false +]) + +AC_PATH_PROG(TAGLIB_CONFIG, taglib-config, [no], [$PATH:$prefix/bin]) +if test "x$TAGLIB_CONFIG" = "xno" ; then + AC_NO_TAGLIB +else + AC_HAVE_TAGLIB +fi + +AC_SUBST(taglib_includes) +AC_SUBST(taglib_libs) + +dnl ---------- END TAGLIB CHECK ---------- + + + +dnl ----------- TUNEPIMP/MUSICBRAINZ CHECK ----------- + +AC_ARG_WITH( + musicbrainz, + AS_HELP_STRING( + [--without-musicbrainz], + [build K3b without Musicbrainz support (default=no)]), + [ac_cv_use_musicbrainz=$withval], + [ac_cv_use_musicbrainz=yes] +) + +have_mb=false +MUSICBRAINZ_LIBS="" +if test "$ac_cv_use_musicbrainz" = "yes"; then + KDE_CHECK_HEADER(musicbrainz/mb_c.h, + [ + KDE_CHECK_LIB(musicbrainz,mb_New,[ + AC_DEFINE(HAVE_MUSICBRAINZ, 1, [have MusicBrainz]) + MUSICBRAINZ_LIBS="-lmusicbrainz" + have_mb=true + ]) + ], []) +fi +AC_SUBST(MUSICBRAINZ_LIBS) + +dnl --------- TUNEPIMP/MUSICBRAINZ CHECK END ----------- + + +dnl --------- K3b debugging stuff (only for developers) ---- + +AC_ARG_WITH( + k3b-debug, + AS_HELP_STRING( + [--with-k3b-debug], + [Enable additional K3b debugging output and functionality (default=no)]), + [use_k3b_debug=$withval], + [use_k3b_debug=no] +) +if test "$use_k3b_debug" = "yes"; then + AC_DEFINE(K3B_DEBUG, "1", [K3b additional debugging support]) +fi + +dnl -------------------------------------------------------- + + + + +dnl --------------- libiconv check ------------------------- + +AC_CHECK_HEADERS(iconv.h) + +dnl -------------------------------------------------------- + + +#AC_DEFINE(LIBK3B_VERSION, "0.11.98", [k3b library version]) +#AC_SUBST(LIBK3B_VERSION, 0.11.98) +#AC_CONFIG_FILES([k3b/libk3b/libk3b.pc]) + +KDE_ENABLE_HIDDEN_VISIBILITY diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 0000000..6385fe8 --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,4 @@ + +KDE_LANG = en +KDE_DOCS = k3b + diff --git a/doc/audiocd-howto.docbook b/doc/audiocd-howto.docbook new file mode 100644 index 0000000..b993db5 --- /dev/null +++ b/doc/audiocd-howto.docbook @@ -0,0 +1,96 @@ + + + Quickguide: Burning an Audio-CD in 4 Steps + + + This Quickguide shows you how to create a AudioCD with &k3b;. To reproduce + these steps you need a working &k3b; and a directory in which you have + audiofiles. + + + Step 1 + + When you start &k3b; you should see something like this. + + Here you can select one of four projects &k3b; offers + + + + + + Screenshot + + + + + + + Step 2 + + Now you click on "New Audio CD Project" + + This is a dialog where you can select which files you want to burn on a CD + + + + + + Screenshot + + + + + + The files you see on the top-part of &k3b; can be dropped with the mouse to the bottom-widget. + Another way is to right-click on a file an select Add to Project. In order to rearrange + the order of the audio-tracks you can simply move the tracks with the left mouse-button. The properties + of the tracks can be changed by clicking with the &RMB; and choosing Properties. + As soon as you like the arrangement of the tracks click on Burn... in the right-bottom + corner. + + + + When you burn AudioCD from MP3s or other lossy compressed music, remember that if you encode this CD back to MP3, you'll get poorer quality regardless the bitrate you use. To check whether AudioCD was burnt from lossy format, try auCDtect. + + + + + Step 3 + + This is a dialog where you can decide the settings for the CD. + + + + + + Screenshot + + + + + In this dialog you can control the settings of the burning itself. The default-settings of &k3b; + are probably correct for you. In the top-right corner you can control the speed. One last + step before the actual burning you can give the CD a title by choosing CD-Text and + selecting Write CD-Text. The two which are probably most important for you + are Title and Performer. As soon as you are content with + the settings click on Burn. + + + + Step 4 + + + In this dialog you can see the progress of you burning + + + + + + Screenshot + + + + In this dialog is nothing you can do. Just wait for you computer to finish the session. + + + diff --git a/doc/burndialog_audio.png b/doc/burndialog_audio.png new file mode 100644 index 0000000000000000000000000000000000000000..936ea3b8b150df8810946b746b6ce13485f30459 GIT binary patch literal 19980 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

Fo!jd~y4j+~0H9@4HG9X$z=N!Y{@upr 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�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 literal 0 HcmV?d00001 diff --git a/doc/cdcopy-howto.docbook b/doc/cdcopy-howto.docbook new file mode 100644 index 0000000..ded1ae0 --- /dev/null +++ b/doc/cdcopy-howto.docbook @@ -0,0 +1,86 @@ + + + Quickguide: Copying a Data-CD in 4 Steps + + + This Quickguide shows you how to create a Data-CD with &k3b;. To reproduce + these steps you need a working &k3b; and the CD you wish to copy inserted in your + CD-ROM. + + + Step 1 + + To copy a Data-CD you select Tools,CDCopy CD... + You will see a dialog where you can set up the burning. + + In this dialog you can select the settings you want to use for the burning. + + + + + + Screenshot + + + + + + + Step 2 + + After you have set up &k3b; click on Start CD Copy. You will get a dialog similar to this: + + In this dialog you can watch to progress of the copying. As soon as the writing of the + image-file is done you will be asked for a emtpy CD on which the data will be burned. + + + + + + Screenshot + + + + + + In this dialog you can watch to progress of the copying. As soon as the writing of the + image-file is done you will be asked for a emtpy CD on which the data will be burned. + + + + Step 3 + + &k3b; is burning the Image file. You have to wait until the Overall process + is at 100% + + + + + + Screenshot + + + + + &k3b; is burning the Image file. You have to wait until the Overall process + is at 100%. + + + + Step 4 + + + In this dialog you can see the result of your burning + + + + + + Screenshot + + + + &k3b; has finished the burning. Click on Close to close the dialog. + + + diff --git a/doc/cdcopy_done.png b/doc/cdcopy_done.png new file mode 100644 index 0000000000000000000000000000000000000000..20cd3d451c9ef70bb631eb264860aa4c30d053c0 GIT binary patch literal 22164 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 WGnqy7>4pA4Bw%TZJ@vrEi}G*x^(3tT literal 0 HcmV?d00001 diff --git a/doc/cdcopy_settings.png b/doc/cdcopy_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8a1aa760bf022047cf321a1a895952dc9bffbe GIT binary patch literal 21191 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 Q`jRpst{Pvd)U$i?Kbb>xQUCw| literal 0 HcmV?d00001 diff --git a/doc/commands.docbook b/doc/commands.docbook new file mode 100644 index 0000000..a6f69ae --- /dev/null +++ b/doc/commands.docbook @@ -0,0 +1,700 @@ + + + + The Menu Entries + + + The <guimenu>File</guimenu> Menu + + + + + + + &Ctrl;N + + + File + New Project + + + + + Creates a new project. + You have to choose the project type (Audio CD, Data DVD, ...). + + + + + + + + &Ctrl;O + + + File + Open... + + + + + Opens an existing project which + can be selected with KDE's Open File dialog. + + + + + + + + &Ctrl;R + + + File + Open Recent + + + + + This is a shortcut to re-open recently opened + projects. The sub-menu belonging to this item + contains a list of these projects, clicking on a specific file + will open it again. + + + + + + + + &Ctrl;S + + + File + Save + + + + + Saves the current project. + If there has already been a save of the document then this + will overwrite the previously saved file without asking + for the user's consent. If it is the first save of a new + document the Save As dialog will be invoked. + + + + + + + File + Save As... + + + + + Saves the current project with a new + file name. KDE's Save As dialog appears to specify + name and directory of the new project file. + + + + + + + File + Save All + + + + + Saves all open projects. + This is the same as selecting + + File + Save + for each of them. + + + + + + + + &Ctrl;C + + + File + Close + + + + + Closes the current project. + If a project has been modified but not yet saved + then &k3b; will ask what to do. + You can choose to save or discard the changes, + and you also have the opportunity to cancel closing + and keep the project open. + + + + + + + File + Close All + + + + + Closes all open projects. For each unsaved + project &k3b; will ask what to do, just like it does when + + File + Close + is selected. + + + + + + + + &Ctrl;Q + + + File + Quit + + + + + Quits &k3b; after closing all of its open + projects. For every unsaved project &k3b; will ask what to do, + just like it does when + + File + Close + is selected. + + + + + + + + + + The <guimenu>Project</guimenu> Menu + + + + + + Project + Add Files... + + + + + When this item is selected, the appearing dialog + lets you choose one or more files to be added + to the project. This has the same effect as dragging + files directly from the Contents View into the Project View. + If the current project is a data disc project, + the added files will appear in the disc's root directory. + + + + + + + Project + Clear Project + + + + + Removes all files and directories + from the current project. + The project itself remains open. + + + + + + + + &Ctrl;B + + + Project + Burn... + + + + + Opens the Burn dialog for the current project. + This is in fact the same as the Properties dialog - the only + difference is that there is an additional Burn button which + causes &k3b; to burn a disc from project data. The Burn dialog + won't open if the project does not contain any files. + + + + + + + + &Ctrl;P + + + Project + Properties... + + + + + Opens the Properties dialog for the current project. + Here you can specify a lot of options concerning + the project. Every project type has got a different set of + options, most of them can be explained by using What's This + (accessible by right-mouse-clicking). + + + + + + + Project + Import Session + + + + + This Item only appears if a Data CD/DVD or Video DVD project + is active. It causes K3b to import the file entries + from the previous session to the current project. + You can use this when compiling files for multi-session discs. + Hence that data from the previous session is always included, + even if you don't choose to make use of this command. + It just helps to know what's on the disc already. + + + + + + + Project + Clear Imported Session + + + + + This Item only appears if a Data CD/DVD or Video DVD project + is active. It causes K3b to remove the file entries + from the current project that were imported by + + Project + Import Session + while keeping all of the other data + in the project. Hence that making use of this command doesn't + actually remove anything from the disc that will be burned, + it just hides these files again. + + + + + + + Project + Edit Boot Images + + + + + This Item only appears if a Data CD/DVD or Video DVD project + is active. Here you can specify boot images + in order to create bootable CDs or DVDs. A boot image can be + a direct copy of a floppy or hard disk (for example, created + by the dd shell command) as well as another disc's boot image. + In any case it's a single file containing a complete, bootable + system that is burned as a normal file. In order to let the + computer know that the disc contains a boot image, the burning + application creates a boot catalog file whose name can be + determined in the dialog window. + + + + + + + + + + + + + The <guimenu>Tools</guimenu> Menu + + + + + + Tools + Copy CD... + + + + + Opens the CD Copy dialog. + Without the need of a project file, it provides + the ability to copy a CD's content to another disc. + Alternatively, you can choose only to create an image + of the source CD which can be burned anytime. There is + also an option to clone the CD instead of normal + copying, which should be preferred when copying CDs + with defective sectors or Video CDs. + + + + + + + Tools + Copy DVD... + + + + + Opens the DVD Copy dialog. + Without the need of a project file, it provides + the ability to copy a DVD's content to another disc. + Alternatively, you can choose only to create an image + of the source DVD which can be burned anytime. + Video transcoding within the DVD Copy dialog + is not yet supported, so the destination disc + has to be large enough to contain all of the + source disc's (video) data in its original form. + + + + + + + Tools + Erase CD-RW... + + + + + Opens the Erase CD-RW dialog. + With its help you can clear the contents of a CD-RW, + or part of it. + + + + + + + Tools + Format DVD±RW... + + + + + Opens the DVD Formatting dialog. + With its help you can format a DVD-R(W) or DVD+R(W), + which causes the disc's contents to be deleted. + &k3b; gives the choice between the "Overwrite" and + "Incremental" writing modes. + + + + + + + Tools + Burn CD Image... + + + + + Burns a previously created CD image. + The Burn CD Image dialog asks to select an + *.iso, + *.cue or + *.toc file + as data source that you can instantly burn by pressing + the Start button. + (Nero *.nrg files + are currently not supported, so you have to make use + of other tools like + Nrg2Iso.) + + + + + + + Tools + Burn DVD ISO Image... + + + + + Burns a previously created DVD image. + The Burn Iso9660 Image dialog asks to select an + *.iso file as data + source that you can instantly burn by pressing + the Start button. + + + + + + + Tools + Encode Video... + + + + + A DVD video that has already been ripped can be + encoded with a little help from the Encoding Video + dialog. This dialog box normally opens after ripping the DVD + from within the Contents View, but can also be used standalone. + It contains information about the ripped DVD video, encoding + options and even video resizing and cropping abilities. + + + + + + + Tools + Diskinfo + + + + + Shows information about the inserted disk. + This information will be displayed in the Contents View and + covers disk properties like type, size and track length + of the CD or DVD in your drive. + + + + + + + + + + The <guimenu>Settings</guimenu> Menu + + + + + + Settings + Toolbars + + + + + Pops up a list of &k3b;'s toolbars. + If a toolbar entry is checked, it means that + the toolbar is currently visible. + + + + + + + Settings + Show/Hide Statusbar + + + + + This enables you to show or hide the small bar + at the bottom of the main window containing + various information about &k3b;'s status and activities. + + + + + + + Settings + Show Directories + + + + + Toggles the visibility of the Directory View. + This view enables you to select directories and disc drives. + When selected, their contents will appear in the Contents View. + Disc drives have also got a context menu providing functions + like Disk Info, (un)mounting the drive or ejecting the medium. + + + + + + + Settings + Show Contents + + + + + Toggles the visibility of the Contents View. + This view enables you to select files that can be dragged + into the Project View in order to add them to the project. + The Contents View also acts as an interface to rip + audio CDs and video discs when a disc drive containing + an appropriate CD/DVD is selected in the Directory View. + + + + + + + Settings + Show Document Header + + + + + Toggles the visibility of the document header + belonging to the Project View. This is a small bar that is + only visible if the Project View contains any open projects. + The document header has no functionality, yet it's nice + eye candy and improves clarity by separating + the Project View from the other views. + + + + + + + Settings + Configure Shortcuts... + + + + + This command opens a dialog box where the key bindings + for &k3b;'s menu commands may be changed. + After selecting one of the available commands + from the upper part of the dialog, the shortcut + for this action can be changed in the lower part. + + + + + + + Settings + Configure Toolbars... + + + + + This command opens a dialog box where the toolbars + can be customized. The drop down box on top + of the dialog determines which toolbar can be edited + at the moment. The Available Actions list on the left contains + all commands that can be added to the toolbar, + the Current Actions list on the right shows the ones + that are already there. Items can be added by selecting + the appropriate command out of the Available Actions list and + pressing the right button to move it to the Current Actions + list. Removing an item works the other way round. + The up and down buttons change the commands's position + within the toolbar. + + + + + + + Settings + &k3b; Setup + + + + + This opens &k3bsetup; which helps setting the + right permissions needed by &k3b; in order to burn + CDs and DVDs. Linux' user rights management permits program + execution and access to disc drives if no permissions have + been granted by the administrator. &k3bsetup; cannot set + permissions without administrator privileges, so you have + to enter the root password when starting up. + + + + + + + Settings + Configure &k3b;... + + + + + Opens the Options dialog + where general program settings can be configured. + Although most of &k3b;'s functionality should work out + of the box, this dialog allows to customize and fine-tune + the program. + + + + + + + + + + The <guimenu>Help</guimenu> Menu +&help.menu.documentation; + + + + \ No newline at end of file diff --git a/doc/dcop.docbook b/doc/dcop.docbook new file mode 100644 index 0000000..82b05a6 --- /dev/null +++ b/doc/dcop.docbook @@ -0,0 +1,104 @@ + + The &k3b; &DCOP; Interface + &k3b; features, like many other &kde; applications as well, a + &DCOP; interface which makes it possible to control a part of it's + functionality from ⪚ a shellscript. + To use these &DCOP; functions you can either use the + dcop commandline program or the more convenient + Kdcop application. Both provide the same + functionality so it's mostly a matter of taste and context of usage when + deciding which way to choose. + This chapter assumes that you're using the dcop + commandline program. To access &k3b;'s &DCOP; functions, make sure that + &k3b; is started and then enter something like this at a console: + +# dcop [function] + + + +Besides the generic &DCOP; functions available to all &kde; +applications, &k3b;'s DCOP interface mainly consists of two parts as described below. + + +The default K3bInterface + +The default K3b DCOP interface provides functionality like copyCD, formatDVD, and methods for creating new projects. + + +DCOPRef createDataCDProject() +DCOPRef createAudioCDProject() +DCOPRef createMixedCDProject() +DCOPRef createVideoCDProject() +DCOPRef createMovixCDProject() +DCOPRef createDataDVDProject() +DCOPRef createVideoDVDProject() +DCOPRef createMovixDVDProject() +DCOPRef openProject(KURL url) +QValueList<DCOPRef> projects() +DCOPRef currentProject() +void copyCd() +void copyDvd() +void eraseCdrw() +void formatDvd() +void burnCdImage(KURL url) +void burnDvdImage(KURL url) + + +As result from one of the createXXXProject methods one gets a DCOP reference to the newly created project: + +DCOPRef(k3b,K3bProject-0) + +Alternatively you may create a project using the command line: + + +# k3b --audiocd + + +and then retrieve a reference to this project with + + +# dcop currentProject + + +Using this reference it is possible to manipulate the project using the K3bProjectInterface. + + + + +K3bProjectInterface + + +void addUrls(KURL::List urls) +void addUrl(KURL url) +void burn() + + +K3b offers the K3bProjectInterface as listed above or the more powerful K3bDataProjectInterface which only applies to data projects (CD and DVD): + + +void createFolder(QString name) +void createFolder(QString name,QString parent) +void addUrl(KURL url,QString parent) +void addUrls(KURL::List urls,QString parent) +void removeItem(QString path) +void renameItem(QString path,QString newName) +void setVolumeID(QString id) + + + +Using this it is possible to fill a data project with files and folders from a script. +The following script for example creates a new data project, adds several folders to the project, and adds files to the newly created folders: + + +#!/bin/bash +PROJECT=$(dcop k3b K3bInterface createDataCDProject) +dcop $PROJECT createFolder test +dcop $PROJECT createFolder foo +dcop $PROJECT createFolder bar /foo +dcop $PROJECT addUrl /home/trueg/somefile.txt /foo/bar + + + + + + diff --git a/doc/index.docbook b/doc/index.docbook new file mode 100644 index 0000000..fcb6f96 --- /dev/null +++ b/doc/index.docbook @@ -0,0 +1,340 @@ + +K3b"> +cdrdao"> +DVD+RW-Tools"> +mkisofs"> +cdrecord"> +K3bSetup"> + + + + + + + + +]> + + + + +The &k3b; Handbook + + + + Carsten + Niehaus + + + Jakob + Petsovits + + + + + + + + + 2003-2004 +Carsten Niehaus + + +&FDLNotice; + +2005-06-21 +0.03.00 + + + + + + &k3b; is a CD and DVD burning application for &kde; with a comfortable user interface. + + + + +KDE +kdeextragear +cdrecord +DVD +CD +burning +ripping +iso +K3b + + + + + +Introduction + + + &k3b; is a CD and DVD burning application for Linux systems + optimized for &kde;. It provides a comfortable user interface + to perform most CD/DVD burning tasks like creating an Audio CD + from a set of audio files or copying a CD. + While the experienced user can take influence in all steps + of the burning process, the beginner may find comfort + in the automatic settings and the reasonable &k3b; defaults + which allow a quick start. The actual burning in K3b is done + by the command line utilities + cdrecord, + cdrdao, and + growisofs. + + + + +&k3b-commands; + + + HOWTOs for a quickstart to &k3b; + + &k3b-audiocd-howto; + &k3b-cdcopy-howto; + + + + +&k3b-dcop; + + + +Questions and Answers + + + +&reporting.bugs; +&updating.documentation; + + + + + + Compiling &k3b; fails with undefined type "struct KComboBox". + + + + + The QTDesigner tool uic is not able to find the kde widget plugins. + To solve this run qtconfig and add + $KDEDIR/lib/kde3/plugins to the + plugin search path (replace $KDEDIR with your kde base dir). + + + + + + + + + + + +Credits and License + + +&k3b; + + + Program copyright 1999-2005 Sebastian Trueg trueg@k3b.org + and the K3b team + + +Contributors: + + Thomas Froescher tfroescher@k3b.org + +Christian Kvasny chris@k3b.org + +Klaus-Dieter Krannich kd@k3b.org + + + + + + Documentation Copyright © 2003-2004 Carsten Niehaus cniehaus@kde.org + + + + +&underFDL; + + + +&underGPL; + + + +Installation + + +How to obtain &k3b; + + + + + + The main information site for &k3b; is + www.k3b.org. + For the most current version of &k3b;, feedback and + community help as well as &k3b; news and other information, + this is the place to go. + + + + + +Requirements + + + In order to successfully use &k3b;, you need &kde; >= 3.1 and &Qt; >= 3.1. + + + &cdrdao;: Records audio or data CD-Rs in disk-at-once (DAO) + mode based on a textual description of the CD contents (toc-file). + + + &cdrecord;/&mkisofs;: Records any kind of CD-Rs. &cdrecord; contains all of &cdrdao;'s features and extended functionality and therefore is &k3b;'s standard choice for CD burning. In some cases, &cdrdao; reaches better audio CD burning quality though. + + + &dvdtools;: The &dvdtools; are used to burn and format DVD+R(W) and DVD-R(W) media. + + + + Optionally &k3b; can make use of all these libraries: + + + +cdparanoia: A Compact Disc Digital Audio (CDDA) extraction tool, +commonly known on the net as a 'ripper'. + + + +Ogg Vorbis library: Ogg Vorbis is a completely open, patent-free, +professional audio encoding and streaming technology with all the benefits +of Open Source, and in direct competition with the MP3 format. +Used by the Ogg Vorbis Decoder and Encoder plugins. + + + +MAD (MPEG Audio Decoder) Library: A high-quality MPEG audio decoder, +supporting the MPEG-1, MPEG-2 and MPEG 2.5 formats. All three audio +layers Layer I, Layer II, and Layer III (i.e. MP3) are fully implemented. +Used by the MP3 Decoder plugin. + + + +LAME: A highly evolved MP3 encoder, with quality and speed able to rival +state of the art commercial encoders. Used by the MP3 Encoder plugin. + + + +FLAC: A free, open source codec for lossless audio compression and +decompression. Used by the FLAC Decoder plugin and the +External Audio Encoder plugin, so you can read and write FLAC files. + + + +Libsndfile, FFmpeg, FLAC, Musepack decoders: Other libraries for processing a +broad range of audio file formats. For example, with FFmpeg it is possible to +decode WMA files in order to burn them onto audio CDs. +Used by the respective plugins. + + + +SoX: A utility that can convert between various audio file formats. +Used by the SoX Audio Encoder plugin. + + + +transcode: A Linux text-console utility for video stream processing. +You need this if you want to rip DVD video. + + + +VCDImager: A full-featured mastering suite for authoring, +disassembling and analyzing Video CDs and Super Video CDs. + + + +Normalize: A tool for adjusting the volume of audio files to a standard level. +This is useful for things like creating mixed CDs and MP3 collections, where +different recording levels on different albums can cause the volume to vary +greatly from song to song. + + + +eMovix: A tiny Linux distribution that is burned on CD together with video +files. eMovix contains all the software to boot from a CD and automatically +play every video file localized in the CD root. + + + + +You can find a list of changes to &k3b; at http://www.k3b.org. + + + + +Compilation and Installation + + + + + +&install.compile.documentation; + + + + + +&documentation.index; + + + diff --git a/doc/select_audiofiles.png b/doc/select_audiofiles.png new file mode 100644 index 0000000000000000000000000000000000000000..b50a8a9b31569ebe39e4c8d324c4dc628ea3bb33 GIT binary patch literal 46007 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 Gum2ab{e9m6 literal 0 HcmV?d00001 diff --git a/doc/select_project.png b/doc/select_project.png new file mode 100644 index 0000000000000000000000000000000000000000..9cedf35400784a5950da1fe4e9c1f025bdd9cf12 GIT binary patch literal 25449 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 BHlhFk literal 0 HcmV?d00001 diff --git a/k3b.lsm b/k3b.lsm new file mode 100644 index 0000000..ad825b8 --- /dev/null +++ b/k3b.lsm @@ -0,0 +1,14 @@ +Begin3 +Title: K3b +Version: 1.0 +Entered-date: +Description: CD writing software for KDE 3.2 and above +Keywords: CD-Writing, Ripping, CD-Audio, CDDA +Author: Sebastian Trueg +Maintained-by: Sebastian Trueg +Primary-site: +Home-page: http://www.k3b.org +Original-site: +Platforms: Linux +Copying-policy: GNU Public License +End diff --git a/k3bsetup/Makefile.am b/k3bsetup/Makefile.am new file mode 100644 index 0000000..42d3bee --- /dev/null +++ b/k3bsetup/Makefile.am @@ -0,0 +1,18 @@ +AM_CPPFLAGS = -I$(srcdir)/../src -I$(srcdir)/../libk3b/core -I$(srcdir)/../libk3b/tools -I$(srcdir)/../libk3bdevice $(all_includes) + +METASOURCES = AUTO + +# Install this plugin in the KDE modules directory +kde_module_LTLIBRARIES = kcm_k3bsetup2.la + +kcm_k3bsetup2_la_SOURCES = base_k3bsetup2.ui k3bsetup2.cpp +kcm_k3bsetup2_la_LIBADD = $(LIB_KDEUI) ../libk3b/libk3b.la +kcm_k3bsetup2_la_LDFLAGS = -module -avoid-version $(all_libraries) -no-undefined + +k3bsetup2_DATA = k3bsetup2.desktop +k3bsetup2dir = $(kde_appsdir)/Settings/System + +bin_SCRIPTS = k3bsetup + +messages: rc.cpp + $(XGETTEXT) *.cpp -o $(podir)/k3bsetup.pot diff --git a/k3bsetup/base_k3bsetup2.ui b/k3bsetup/base_k3bsetup2.ui new file mode 100644 index 0000000..05af5fd --- /dev/null +++ b/k3bsetup/base_k3bsetup2.ui @@ -0,0 +1,380 @@ + +base_K3bSetup2 + + + Form1 + + + + 0 + 0 + 500 + 450 + + + + + unnamed + + + 0 + + + + layout6 + + + + unnamed + + + + groupBox3 + + + Settings + + + + unnamed + + + + layout1 + + + + unnamed + + + + m_checkUseBurningGroup + + + Use burning group: + + + <p>If this option is checked, only the users in the specified group will be able to burn CDs and DVDs, since only they will have access to the devices and the CD recording programs used by K3b.</p> +<p>Otherwise all users on the system have access to the devices and to all K3b functionality. + + + + + m_editBurningGroup + + + false + + + burning + + + + + + + layout2 + + + + unnamed + + + + spacer1 + + + Horizontal + + + Fixed + + + + 20 + 10 + + + + + + textLabel2 + + + Users allowed to burn (separated by space): + + + + + m_editUsers + + + false + + + + + + + + + groupBox1 + + + Devices + + + + unnamed + + + + textLabel1_2 + + + Check the devices whose permissions you want to be changed + + + + + + Device + + + true + + + true + + + + + Devicenode + + + true + + + true + + + + + Permissions + + + true + + + true + + + + + New Permissions + + + true + + + true + + + + m_viewDevices + + + + + layout3 + + + + unnamed + + + + spacer2 + + + Horizontal + + + Expanding + + + + 40 + 20 + + + + + + m_buttonAddDevice + + + Add Device... + + + + + + + + + groupBox2 + + + External Programs + + + + unnamed + + + + tabWidget2 + + + + tab + + + Found Programs + + + + unnamed + + + + textLabel1 + + + Check the programs whose permissions you want to be changed + + + + + + Program + + + true + + + true + + + + + Version + + + true + + + true + + + + + Path + + + true + + + true + + + + + Permissions + + + true + + + true + + + + + New Permissions + + + true + + + true + + + + m_viewPrograms + + + + + + + tab + + + Search Path + + + + unnamed + + + + m_editSearchPath + + + Search Path + + + false + + + + + textLabel1_3 + + + <qt><b>Hint:</b> to force K3b to use another than the default name for the executable specify it in the search path.</qt> + + + + + + + + + + + + + + m_checkUseBurningGroup + toggled(bool) + m_editBurningGroup + setEnabled(bool) + + + m_checkUseBurningGroup + toggled(bool) + m_editUsers + setEnabled(bool) + + + + + klistview.h + klistview.h + keditlistbox.h + klineedit.h + + diff --git a/k3bsetup/k3bsetup b/k3bsetup/k3bsetup new file mode 100644 index 0000000..0851430 --- /dev/null +++ b/k3bsetup/k3bsetup @@ -0,0 +1,20 @@ +# +# $Id: k3bsetup 476230 2005-10-31 23:05:34Z thiago $ +# Copyright (C) 2003 Sebastian Trueg +# +# This file is part of the K3b project. +# Copyright (C) 1998-2003 Sebastian Trueg +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# See the file "COPYING" for the exact licensing terms. +# + + +#!/usr/bin/sh + +#TODO: if kdesu not found and not currently root use kdialog to display an error message + +kdesu kcmshell k3bsetup2 diff --git a/k3bsetup/k3bsetup2.cpp b/k3bsetup/k3bsetup2.cpp new file mode 100644 index 0000000..37c23a1 --- /dev/null +++ b/k3bsetup/k3bsetup2.cpp @@ -0,0 +1,560 @@ +/* + * + * $Id: k3bsetup2.cpp 623771 2007-01-15 13:47:39Z trueg $ + * Copyright (C) 2003-2007 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "k3bsetup2.h" +#include "base_k3bsetup2.h" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + + + +static bool shouldRunSuidRoot( K3bExternalBin* bin ) +{ + // + // Since kernel 2.6.8 older cdrecord versions are not able to use the SCSI subsystem when running suid root anymore + // So for we ignore the suid root issue with kernel >= 2.6.8 and cdrecord < 2.01.01a02 + // + // Some kernel version 2.6.16.something again introduced a problem here. Since I do not know the exact version + // and a workaround was introduced in cdrecord 2.01.01a05 just use that version as the first for suid root. + // + // Seems as if cdrdao never had problems with suid root... + // + + if( bin->name() == "cdrecord" ) { + return ( K3b::simpleKernelVersion() < K3bVersion( 2, 6, 8 ) || + bin->version >= K3bVersion( 2, 1, 1, "a05" ) || + bin->hasFeature( "wodim" ) ); + } + else if( bin->name() == "cdrdao" ) { + return true; + } + else if( bin->name() == "growisofs" ) { + // + // starting with 6.0 growiofs raises it's priority using nice(-20) + // BUT: newer kernels have ridiculously low default memorylocked resource limit, which prevents privileged + // users from starting growisofs 6.0 with "unable to anonymously mmap 33554432: Resource temporarily unavailable" + // error message. Until Andy releases a version including a workaround we simply never configure growisofs suid root + return false; // bin->version >= K3bVersion( 6, 0 ); + } + else + return false; +} + + +class K3bSetup2::Private +{ +public: + K3bDevice::DeviceManager* deviceManager; + K3bExternalBinManager* externalBinManager; + + bool changesNeeded; + + QMap listDeviceMap; + QMap deviceListMap; + + QMap listBinMap; + QMap binListMap; + + KConfig* config; +}; + + + +K3bSetup2::K3bSetup2( QWidget *parent, const char *, const QStringList& ) + : KCModule( parent, "k3bsetup" ) +{ + d = new Private(); + d->config = new KConfig( "k3bsetup2rc" ); + + m_aboutData = new KAboutData("k3bsetup2", + "K3bSetup 2", + 0, 0, KAboutData::License_GPL, + "(C) 2003-2007 Sebastian Trueg"); + m_aboutData->addAuthor("Sebastian Trueg", 0, "trueg@k3b.org"); + + setButtons( KCModule::Apply|KCModule::Cancel|KCModule::Ok|KCModule::Default ); + + QHBoxLayout* box = new QHBoxLayout( this ); + box->setAutoAdd(true); + box->setMargin(0); + box->setSpacing( KDialog::spacingHint() ); + + KTextEdit* label = new KTextEdit( this ); + label->setText( "

K3bSetup

" + + i18n("

This simple setup assistant is able to set the permissions needed by K3b in order to " + "burn CDs and DVDs. " + "

It does not take things like devfs or resmgr into account. In most cases this is not a " + "problem but on some systems the permissions may be altered the next time you login or restart " + "your computer. In those cases it is best to consult the distribution documentation." + "

Caution: Although K3bSetup 2 should not be able " + "to mess up your system no guarantee can be given.") ); + label->setReadOnly( true ); + label->setFixedWidth( 200 ); + + w = new base_K3bSetup2( this ); + + // TODO: enable this and let root specify users + w->m_editUsers->hide(); + w->textLabel2->hide(); + + + connect( w->m_checkUseBurningGroup, SIGNAL(toggled(bool)), + this, SLOT(updateViews()) ); + connect( w->m_editBurningGroup, SIGNAL(textChanged(const QString&)), + this, SLOT(updateViews()) ); + connect( w->m_editSearchPath, SIGNAL(changed()), + this, SLOT(slotSearchPrograms()) ); + connect( w->m_buttonAddDevice, SIGNAL(clicked()), + this, SLOT(slotAddDevice()) ); + + + d->externalBinManager = new K3bExternalBinManager( this ); + d->deviceManager = new K3bDevice::DeviceManager( this ); + + // these are the only programs that need special permissions + d->externalBinManager->addProgram( new K3bCdrdaoProgram() ); + d->externalBinManager->addProgram( new K3bCdrecordProgram(false) ); + d->externalBinManager->addProgram( new K3bGrowisofsProgram() ); + + d->externalBinManager->search(); + d->deviceManager->scanBus(); + + load(); + + // + // This is a hack to work around a kcm bug which makes the faulty assumption that + // every module starts without anything to apply + // + QTimer::singleShot( 0, this, SLOT(updateViews()) ); + + if( getuid() != 0 || !d->config->checkConfigFilesWritable( true ) ) + makeReadOnly(); +} + + +K3bSetup2::~K3bSetup2() +{ + delete d->config; + delete d; + delete m_aboutData; +} + + +void K3bSetup2::updateViews() +{ + d->changesNeeded = false; + + updatePrograms(); + updateDevices(); + + emit changed( ( getuid() != 0 ) ? false : d->changesNeeded ); +} + + +void K3bSetup2::updatePrograms() +{ + // first save which were checked + QMap checkMap; + QListViewItemIterator listIt( w->m_viewPrograms ); + for( ; listIt.current(); ++listIt ) + checkMap.insert( d->listBinMap[(QCheckListItem*)*listIt], ((QCheckListItem*)*listIt)->isOn() ); + + w->m_viewPrograms->clear(); + d->binListMap.clear(); + d->listBinMap.clear(); + + // load programs + const QMap& map = d->externalBinManager->programs(); + for( QMap::const_iterator it = map.begin(); it != map.end(); ++it ) { + K3bExternalProgram* p = it.data(); + + QPtrListIterator binIt( p->bins() ); + for( ; binIt.current(); ++binIt ) { + K3bExternalBin* b = *binIt; + + QFileInfo fi( b->path ); + // we need the uid bit which is not supported by QFileInfo + struct stat s; + if( ::stat( QFile::encodeName(b->path), &s ) ) { + kdDebug() << "(K3bSetup2) unable to stat " << b->path << endl; + } + else { + // create a checkviewitem + QCheckListItem* bi = new QCheckListItem( w->m_viewPrograms, b->name(), QCheckListItem::CheckBox ); + bi->setText( 1, b->version ); + bi->setText( 2, b->path ); + + d->listBinMap.insert( bi, b ); + d->binListMap.insert( b, bi ); + + // check the item on first insertion or if it was checked before + bi->setOn( checkMap.contains(b) ? checkMap[b] : true ); + + int perm = s.st_mode & 0007777; + + QString wantedGroup("root"); + if( w->m_checkUseBurningGroup->isChecked() ) + wantedGroup = burningGroup(); + + int wantedPerm = 0; + if( shouldRunSuidRoot( b ) ) { + if( w->m_checkUseBurningGroup->isChecked() ) + wantedPerm = 0004710; + else + wantedPerm = 0004711; + } + else { + if( w->m_checkUseBurningGroup->isChecked() ) + wantedPerm = 0000750; + else + wantedPerm = 0000755; + } + + bi->setText( 3, QString::number( perm, 8 ).rightJustify( 4, '0' ) + " " + fi.owner() + "." + fi.group() ); + if( perm != wantedPerm || + fi.owner() != "root" || + fi.group() != wantedGroup ) { + bi->setText( 4, QString("%1 root.%2").arg(wantedPerm,0,8).arg(wantedGroup) ); + if( bi->isOn() ) + d->changesNeeded = true; + } + else + bi->setText( 4, i18n("no change") ); + } + } + } +} + + +void K3bSetup2::updateDevices() +{ + // first save which were checked + QMap checkMap; + QListViewItemIterator listIt( w->m_viewDevices ); + for( ; listIt.current(); ++listIt ) + checkMap.insert( d->listDeviceMap[(QCheckListItem*)*listIt], ((QCheckListItem*)*listIt)->isOn() ); + + w->m_viewDevices->clear(); + d->listDeviceMap.clear(); + d->deviceListMap.clear(); + + QPtrListIterator it( d->deviceManager->allDevices() ); + for( ; it.current(); ++it ) { + K3bDevice::Device* device = *it; + // check the item on first insertion or if it was checked before + QCheckListItem* item = createDeviceItem( device->blockDeviceName() ); + item->setOn( checkMap.contains(device->blockDeviceName()) ? checkMap[device->blockDeviceName()] : true ); + item->setText( 0, device->vendor() + " " + device->description() ); + + if( !device->genericDevice().isEmpty() ) { + QCheckListItem* item = createDeviceItem( device->genericDevice() ); + item->setOn( checkMap.contains(device->genericDevice()) ? checkMap[device->genericDevice()] : true ); + item->setText( 0, device->vendor() + " " + device->description() + " (" + i18n("Generic SCSI Device") + ")" ); + } + } +} + + +QCheckListItem* K3bSetup2::createDeviceItem( const QString& deviceNode ) +{ + QFileInfo fi( deviceNode ); + struct stat s; + if( ::stat( QFile::encodeName(deviceNode), &s ) ) { + kdDebug() << "(K3bSetup2) unable to stat " << deviceNode << endl; + return 0; + } + else { + // create a checkviewitem + QCheckListItem* bi = new QCheckListItem( w->m_viewDevices, + deviceNode, + QCheckListItem::CheckBox ); + + d->listDeviceMap.insert( bi, deviceNode ); + d->deviceListMap.insert( deviceNode, bi ); + + bi->setText( 1, deviceNode ); + + int perm = s.st_mode & 0000777; + + bi->setText( 2, QString::number( perm, 8 ).rightJustify( 3, '0' ) + " " + fi.owner() + "." + fi.group() ); + if( w->m_checkUseBurningGroup->isChecked() ) { + // we ignore the device's owner here + if( perm != 0000660 || + fi.group() != burningGroup() ) { + bi->setText( 3, "660 " + fi.owner() + "." + burningGroup() ); + if( bi->isOn() ) + d->changesNeeded = true; + } + else + bi->setText( 3, i18n("no change") ); + } + else { + // we ignore the device's owner and group here + if( perm != 0000666 ) { + bi->setText( 3, "666 " + fi.owner() + "." + fi.group() ); + if( bi->isOn() ) + d->changesNeeded = true; + } + else + bi->setText( 3, i18n("no change") ); + } + + return bi; + } +} + + +void K3bSetup2::load() +{ + if( d->config->hasGroup("External Programs") ) { + d->config->setGroup( "External Programs" ); + d->externalBinManager->readConfig( d->config ); + } + if( d->config->hasGroup("Devices") ) { + d->config->setGroup( "Devices" ); + d->deviceManager->readConfig( d->config ); + } + + d->config->setGroup( "General Settings" ); + w->m_checkUseBurningGroup->setChecked( d->config->readBoolEntry( "use burning group", false ) ); + w->m_editBurningGroup->setText( d->config->readEntry( "burning group", "burning" ) ); + + + // load search path + w->m_editSearchPath->clear(); + w->m_editSearchPath->insertStringList( d->externalBinManager->searchPath() ); + + updateViews(); +} + + +void K3bSetup2::defaults() +{ + w->m_checkUseBurningGroup->setChecked(false); + w->m_editBurningGroup->setText( "burning" ); + + // + // This is a hack to work around a kcm bug which makes the faulty assumption that + // every module defaults to a state where nothing is to be applied + // + QTimer::singleShot( 0, this, SLOT(updateViews()) ); +} + + +void K3bSetup2::save() +{ + d->config->setGroup( "General Settings" ); + d->config->writeEntry( "use burning group", w->m_checkUseBurningGroup->isChecked() ); + d->config->writeEntry( "burning group", burningGroup() ); + d->config->setGroup( "External Programs"); + d->externalBinManager->saveConfig( d->config ); + d->config->setGroup( "Devices"); + d->deviceManager->saveConfig( d->config ); + + + bool success = true; + + struct group* g = 0; + if( w->m_checkUseBurningGroup->isChecked() ) { + // TODO: create the group if it's not there + g = getgrnam( burningGroup().local8Bit() ); + if( !g ) { + KMessageBox::error( this, i18n("There is no group %1.").arg(burningGroup()) ); + return; + } + } + + + // save the device permissions + QListViewItemIterator listIt( w->m_viewDevices ); + for( ; listIt.current(); ++listIt ) { + + QCheckListItem* checkItem = (QCheckListItem*)listIt.current(); + + if( checkItem->isOn() ) { + QString dev = d->listDeviceMap[checkItem]; + + if( w->m_checkUseBurningGroup->isChecked() ) { + if( ::chmod( QFile::encodeName(dev), S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP ) ) + success = false; + + if( ::chown( QFile::encodeName(dev), (gid_t)-1, g->gr_gid ) ) + success = false; + } + else { + if( ::chmod( QFile::encodeName(dev), S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH ) ) + success = false; + } + } + } + + + // save the program permissions + listIt = QListViewItemIterator( w->m_viewPrograms ); + for( ; listIt.current(); ++listIt ) { + + QCheckListItem* checkItem = (QCheckListItem*)listIt.current(); + + if( checkItem->isOn() ) { + + K3bExternalBin* bin = d->listBinMap[checkItem]; + + if( w->m_checkUseBurningGroup->isChecked() ) { + if( ::chown( QFile::encodeName(bin->path), (gid_t)0, g->gr_gid ) ) + success = false; + + int perm = 0; + if( shouldRunSuidRoot( bin ) ) + perm = S_ISUID|S_IRWXU|S_IXGRP; + else + perm = S_IRWXU|S_IXGRP|S_IRGRP; + + if( ::chmod( QFile::encodeName(bin->path), perm ) ) + success = false; + } + else { + if( ::chown( QFile::encodeName(bin->path), 0, 0 ) ) + success = false; + + int perm = 0; + if( shouldRunSuidRoot( bin ) ) + perm = S_ISUID|S_IRWXU|S_IXGRP|S_IXOTH; + else + perm = S_IRWXU|S_IXGRP|S_IRGRP|S_IXOTH|S_IROTH; + + if( ::chmod( QFile::encodeName(bin->path), perm ) ) + success = false; + } + } + } + + + if( success ) + KMessageBox::information( this, i18n("Successfully updated all permissions.") ); + else { + if( getuid() ) + KMessageBox::error( this, i18n("Could not update all permissions. You should run K3bSetup 2 as root.") ); + else + KMessageBox::error( this, i18n("Could not update all permissions.") ); + } + + // WE MAY USE "newgrp -" to reinitialize the environment if we add users to a group + + updateViews(); +} + + +QString K3bSetup2::quickHelp() const +{ + return i18n("

K3bSetup 2

" + "

This simple setup assistant is able to set the permissions needed by K3b in order to " + "burn CDs and DVDs." + "

It does not take into account devfs or resmgr, or similar. In most cases this is not a " + "problem, but on some systems the permissions may be altered the next time you login or restart " + "your computer. In these cases it is best to consult the distribution's documentation." + "

The important task that K3bSetup 2 performs is grant write access to the CD and DVD devices." + "

Caution: Although K3bSetup 2 should not be able " + "to damage your system, no guarantee can be given."); +} + + +QString K3bSetup2::burningGroup() const +{ + QString g = w->m_editBurningGroup->text(); + return g.isEmpty() ? QString("burning") : g; +} + + +void K3bSetup2::slotSearchPrograms() +{ + d->externalBinManager->setSearchPath( w->m_editSearchPath->items() ); + d->externalBinManager->search(); + updatePrograms(); + + emit changed( d->changesNeeded ); +} + + +void K3bSetup2::slotAddDevice() +{ + bool ok; + QString newDevicename = KInputDialog::getText( i18n("Location of New Drive"), + i18n("Please enter the device name where K3b should search\n" + "for a new drive (example: /dev/mebecdrom):"), + "/dev/", &ok, this ); + + if( ok ) { + if( d->deviceManager->addDevice( newDevicename ) ) { + updateDevices(); + + emit changed( d->changesNeeded ); + } + else + KMessageBox::error( this, i18n("Could not find an additional device at\n%1").arg(newDevicename), + i18n("Error"), false ); + } +} + +void K3bSetup2::makeReadOnly() +{ + w->m_checkUseBurningGroup->setEnabled( false ); + w->m_editBurningGroup->setEnabled( false ); + w->m_editUsers->setEnabled( false ); + w->m_viewDevices->setEnabled( false ); + w->m_buttonAddDevice->setEnabled( false ); + w->m_viewPrograms->setEnabled( false ); + w->m_editSearchPath->setEnabled( false ); +} + + +typedef KGenericFactory K3bSetup2Factory; +K_EXPORT_COMPONENT_FACTORY( kcm_k3bsetup2, K3bSetup2Factory("k3bsetup") ) + + +#include "k3bsetup2.moc" diff --git a/k3bsetup/k3bsetup2.desktop b/k3bsetup/k3bsetup2.desktop new file mode 100644 index 0000000..5f73b03 --- /dev/null +++ b/k3bsetup/k3bsetup2.desktop @@ -0,0 +1,148 @@ +[Desktop Entry] +Encoding=UTF-8 +Comment=K3bSetup 2 - modify permission for CD/DVD burning with K3b +Comment[af]=K3bSetup 2 - verander regte vir CD/DVD skryf met K3b +Comment[ar]= اعداد K3B 2 - غيًر الصلاحيات (الاذون ) كي تستطيع كتابة الاقراص المدمجة (CD) او الاقراص المرئية الرقمية (DVD) بواسطة K3B +Comment[bg]=ÐаÑтройване на K3b (2) - промÑна на правата за Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° CD/DVD Ñ K3b +Comment[bn]=কে-থà§à¦°à¦¿-বি বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾à¦ªà¦¨à¦¾ ২ - কে-থà§à¦°à¦¿-বি দিয়ে সিডি/ডিভিডি লিখনের জনà§à¦¯ অনà§à¦®à¦¤à¦¿ পরিবরà§à¦¤à¦¨ করে +Comment[bs]=K3bSetup 2 - promijenite privilegije za CD/DVD prženje sa K3b-om +Comment[ca]=K3bSetup 2 - modifica els permisos per a cremar CD i DVD amb K3b +Comment[cs]=K3bSetup 2 - zmÄ›na oprávnÄ›ní pro vypalování CD/DVD s K3b +Comment[da]=K3bSetup 2 - ændring af tilladelser for cd/dvd-brænding med K3b +Comment[de]=K3b Einrichtungsassistent - Zugriffsrechte zum Brennen mit K3b anpassen +Comment[el]=ΡÏθμιση K3b 2 - Ï„Ïοποποίηση δικαιωμάτων για εγγÏαφή CD/DVD με το K3b +Comment[eo]=K3bAgordo 2 - ÅanÄu rajtojn por KD/DVD enskribo per K3b +Comment[es]=K3bSetup 2 - modifica los permisos para la grabación de CD o DVD con K3b +Comment[et]=K3b seadistamine - võimalus muuta õigusi CD/DVD kirjutamiseks K3b-ga +Comment[fa]=K3bSetup 2 - تغییر مجوز برای سوزاندن دیسک ÙØ´Ø±Ø¯Ù‡/دی ÙˆÛŒ دی با K3b +Comment[fi]=K3bSetup 2 - aseta K3b:n poltto-oikeudet +Comment[fr]=K3bSetup 2 - Modification des permissions pour la gravure de CD / DVD avec K3b +Comment[gl]=K3bSetup 2 - modifica os permisos para gravar CDs/DVDs con K3b +Comment[he]=K3bSetup 2 - שינוי הרש×ות עבור צריבת תקליטורי CD/DVD ×¢× K3b +Comment[hi]=के3बी-सेटअप 2 - के3बी के साथ सीडी/डीवीडी बरà¥à¤¨à¤¿à¤‚ग हेतॠआजà¥à¤žà¤¾à¤à¤ परिवरà¥à¤§à¤¿à¤¤ करें +Comment[hu]=K3bSetup 2 - jogosultságbeállítás CD/DVD-íráshoz a K3b-ben +Comment[is]=K3b uppsetning 2 - breyta aðgangsheimildum á CD/DVD skrifun með K3b +Comment[it]=Impostazioni di K3b 2 - modifica i permessi per CD/DVD per scrivere con K3b +Comment[ja]=K3bSetup 2 - K3b ã§ CD/DVD ã«æ›¸ã込むãŸã‚ã®æ¨©é™ã‚’設定 +Comment[ka]=K3bSetup 2 - K3b-ით CD/DVD-ის ჩáƒáƒ¬áƒ”რის უფლების შეცვლრ+Comment[km]=K3bSetup 2 - កែប្រែ​សិទ្ធិ​ដើម្បី​ដុážâ€‹ážŸáŸŠáž¸ážŒáž¸ ឬ ឌីវីឌី​​ដោយ​ប្រើ K3b +Comment[lt]=K3bSetup 2 – pakeiskite leidimus CD/DVD kÅ«rimui su K3b +Comment[mk]=K3bSetup 2 - менување на дозволите за Ñнимање на CD/DVD Ñо K3b +Comment[ms]=K3bSetup2 - mengubahsuai kebenaran untuk membakar CD/DVD dengan K3b +Comment[nb]=K3bSetup 2 – endre tillatelser for CD-/DVD-brenning med K3b +Comment[nds]=K3b-Inrichthölper - Verlöven för't Brennen vun CD/DVD mit K3b ännern +Comment[ne]=K3bSetup 2 - ले K3b सà¤à¤— सीडी/डीभीडी बरà¥à¤¨à¤¿à¤™à¤•ा लागि अनà¥à¤®à¤¤à¤¿ परिमारà¥à¤œà¤¨ गरà¥à¤¦à¤› +Comment[nl]=K3bSetup 2 - stelt de toegangsrechten in voor cd/dvd-branden met K3b +Comment[nn]=K3b-oppsett 2 – endra løyve for CD- og DVD-brenning med K3b +Comment[pa]=K3bSetup 2 - K3b ਨਾਲ CD/DVD ਲਿਖਣ ਲਈ ਅਧਿਕਾਰ ਸੋਧ +Comment[pl]=K3bSetup 2 - modyfikacja uprawnieÅ„ do nagrywania pÅ‚yt CD/DVD za pomocÄ… K3b +Comment[pt]=K3bSetup 2 - modificar as permissões para a gravação de CDs/DVDs com o K3b +Comment[pt_BR]=Configurações Avançadas do K3b - modificar as permissões para a queima de CD/DVD com o K3b +Comment[ru]=K3bSetup 2 - наÑтроить права Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи при помощи K3b +Comment[sk]=K3bSetup 2 - zmena práv pre napaľovanie CD/DVD s K3b +Comment[sl]=K3bSetup - spremeni dovoljenja za pisanje CD/DVD-jev s K3b +Comment[sr]=K3bSetup 2 — мења дозволе за резање CD/DVD-а помоћу K3b-а +Comment[sr@Latn]=K3bSetup 2 — menja dozvole za rezanje CD/DVD-a pomoću K3b-a +Comment[sv]=Ställ in K3b 2: ändra rättigheter för att bränna cd/dvd med K3b +Comment[ta]= K3bஅமைவà¯2 - K3b à® CD/DVD களோட௠எழà¯à®¤à¯à®µà®¤à®±à¯à®•ாக அனà¯à®®à®¤à®¿ மாறà¯à®±à¯à®µà®¤à®±à¯à®•ாக +Comment[tg]=K3bSetup 2 - танзим кардани иҷозат барои Ñабт бо ёрии K3b +Comment[tr]=K3bSetup 2 - K3b ile CD/DVD kaydetme izinlerini ayarlama +Comment[uk]=K3bSetup 2 - зміна прав доÑтупу Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу КД/DVD за допомогою K3b +Comment[uz]=K3bSetup 2 - K3b yordamida CD/DVD'ga yozish huquqini moslash +Comment[uz@cyrillic]=K3bSetup 2 - K3b ёрдамида CD/DVD'га ёзиш ҳуқуқини моÑлаш +Comment[zh_CN]=K3b 设置 2 - 修改使用 K3b 烧录 CD/DVD çš„æƒé™ +Comment[zh_TW]=K3bSetup 2 - 為 K3b 燒錄 CD/DVD ä¿®æ”¹æ¬Šé™ +Exec=k3bsetup +Keywords=K3bSetup2,k3bsetup2 +Keywords[ar]=اعداد K3b , K3b2 +Keywords[bg]=K3bSetup2,k3bsetup2,ÐаÑтройване на K3b (2) +Keywords[de]=K3b, Einrichtungsassistent, Rechte +Keywords[el]=ΡÏθμιση K3b 2,k3bsetup2 +Keywords[eo]=K3bAgordo2,k3bagordo2 +Keywords[et]=K3bSetup2,k3bsetup2,k3b seadistamine +Keywords[hi]=के3बी-सेटअप 2,के3बी-सेटअप2 +Keywords[nds]=K3bSetup2,k3bsetup2,K3b-Inrichthölper +Keywords[nl]=K3bSetup2,k3bsetup2,branden,cd branden,dvd,dvd branden +Keywords[nn]=K3b-oppsett 2,k3b-oppsett 2 +Keywords[pl]=K3bSetup2,k3bsetup2,k3b,ustawienia,uprawnienia +Keywords[pt_BR]=Configurações Avançadas do K3b,configurações avançadas do K3b +Keywords[sv]=Ställ in K3b 2,k3bsetup2 +Keywords[ta]=K3bஅமைவà¯2,K3bஅமைவà¯2 +Keywords[tg]=ТанзимиK3b2,танзимиk3b2 +Keywords[uz]=K3bSetup2,k3bsetup2,CD,kompakt-disk +Keywords[uz@cyrillic]=K3bSetup2,k3bsetup2,CD,компакт-диÑк +Name=K3bSetup +Name[ar]= اعداد K3b +Name[bg]=ÐаÑтройване на K3b +Name[bn]=কে-থà§à¦°à¦¿-বি বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾à¦ªà¦¨à¦¾ +Name[de]=K3b Einrichtungsassistent +Name[eo]=K3bAgordo +Name[et]=K3b seadistamine +Name[hi]=के3बी-सेटअप +Name[is]=K3b uppsetning +Name[it]=Impostazioni di K3b +Name[nds]=K3b-Inrichthölper +Name[nn]=K3b-oppsett +Name[pa]=K3b-ਸੈੱਟਅੱਪ +Name[pt_BR]=Configurar K3b +Name[sv]=Ställ in K3b +Name[ta]=K3b அமைவ௠+Name[tg]=ТанзимиK3b +Name[zh_TW]=K3b 設定 +Terminal=false +Type=Application +Icon=k3b +X-KDE-FactoryName=k3bsetup2 +X-KDE-Library=k3bsetup2 +X-KDE-ModuleType=Library +X-KDE-RootOnly=true +Categories=Application;System;X-KDE-System; +GenericName=CD & DVD Burning Setup +GenericName[af]=CD & DVD Skryf Opstelling +GenericName[ar]=العام اعداد كتابة القرص المدمج (CD) Ùˆ القرص المرئي الرقمي (DVD) +GenericName[bg]=ÐаÑтройване запиÑа на CD и DVD +GenericName[bn]=সিডি à¦à¦¬à¦‚ ডিভিডি লিখন বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾à¦ªà¦¨à¦¾ +GenericName[ca]=Programa per gravar CDs i DVDs +GenericName[cs]=Nastavení vypalování CD a DVD +GenericName[da]=Cd & dvd opsætning til brænding +GenericName[de]=CD & DVD-Brennen einrichten +GenericName[el]=ΡÏθμιση εγγÏαφής CD & DVD +GenericName[eo]=KD & DVD Enskriba agordo +GenericName[es]=Configurar grabación de CD y DVD +GenericName[et]=CD ja DVD kirjutamise seadistamine +GenericName[fa]=برپایی سوزاندن دیسک ÙØ´Ø±Ø¯Ù‡ Ùˆ دی ÙˆÛŒ دی +GenericName[fi]=K3b-poltto-ohjelman asetusten määritys +GenericName[fr]=Configuration de la gravure de CD et de DVD +GenericName[gl]=Configurazón da Grabazón de CDs e DVDs +GenericName[hu]=CD- és DVD-írási beállítások +GenericName[is]=Uppsetning á CD og DVD brennslu +GenericName[it]=Impostazioni di masterizzazione CD e DVD +GenericName[ja]=CD / DVD 作æˆã®è¨­å®š +GenericName[ka]=CD-ის დრDVD-ის ჩáƒáƒ¬áƒ”რის გáƒáƒ›áƒáƒ áƒ—ვრ+GenericName[km]=រៀបចំ​ការ​ដុážâ€‹ážŸáŸŠáž¸ážŒáž¸ & ឌីវីឌី +GenericName[lt]=CD & DVD kÅ«rimo parinktys +GenericName[mk]=ПоÑтавувања за Ñнимање на CD и DVD +GenericName[ms]=Tetapan Membakar CD & DVD +GenericName[nb]=Oppsett av CD- og DVD-brenning +GenericName[nds]=Brennen vun CD & DVD instellen +GenericName[ne]=सीडी र डीभीडी बरà¥à¤¨à¤¿à¤™ सेटअप +GenericName[nl]=CD- en dvd-branden instellen +GenericName[nn]=Oppsett av CD- og DVD-brenning +GenericName[pa]=CD & DVD ਲਿਖਣ ਸੈਟਅੱਪ +GenericName[pl]=Konfiguracja nagrywania pÅ‚yt CD i DVD +GenericName[pt]=Configuração da Gravação de CDs e DVDs +GenericName[pt_BR]=Configuração da Queima de CD & DVD +GenericName[ru]=ÐаÑтройка запиÑи CD и DVD +GenericName[sk]=Nastavenie CD & DVD napaľovania +GenericName[sl]=Nastavitve za pisanje CD-jev in DVD-jev +GenericName[sr]=Подешавање резања CD-а и DVD-а +GenericName[sr@Latn]=PodeÅ¡avanje rezanja CD-a i DVD-a +GenericName[sv]=Cd och dvd-bränninställning +GenericName[ta]=சிடி & DVD நகல௠எடà¯à®•à¯à®•à¯à®®à¯ அமைபà¯à®ªà¯ +GenericName[tg]=Танзимоти Ñабткунии CD ва DVD +GenericName[tr]=CD ve DVD Kaydetme Kurulumu +GenericName[uk]=ÐÐ°Ð»Ð°Ð¶Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñу КД та DVD +GenericName[uz]=CD va DVD diskka yozishni moslash +GenericName[uz@cyrillic]=CD ва DVD диÑкка ёзишни моÑлаш +GenericName[zh_CN]=CD & DVD 刻录程åºè®¾ç½® +GenericName[zh_TW]=CD & DVD 燒錄設定 diff --git a/k3bsetup/k3bsetup2.h b/k3bsetup/k3bsetup2.h new file mode 100644 index 0000000..ea86664 --- /dev/null +++ b/k3bsetup/k3bsetup2.h @@ -0,0 +1,65 @@ +/* + * + * $Id: k3bsetup2.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef _K3BSETUP2_H_ +#define _K3BSETUP2_H_ + +#include +#include + + +class base_K3bSetup2; +class QCheckListItem; + + +class K3bSetup2: public KCModule +{ + Q_OBJECT + + public: + K3bSetup2( QWidget* parent = 0, const char* name = 0, const QStringList& args = QStringList() ); + ~K3bSetup2(); + + QString quickHelp() const; + const KAboutData* aboutData() { return m_aboutData; }; + + void load(); + void save(); + void defaults(); + + public slots: + void updateViews(); + + private slots: + void slotSearchPrograms(); + void slotAddDevice(); + + private: + void updatePrograms(); + void updateDevices(); + QString burningGroup() const; + void makeReadOnly(); + QCheckListItem* createDeviceItem( const QString& deviceNode ); + + class Private; + Private* d; + + base_K3bSetup2* w; + + KAboutData* m_aboutData; +}; + +#endif diff --git a/kfile-plugins/Makefile.am b/kfile-plugins/Makefile.am new file mode 100644 index 0000000..c1ba442 --- /dev/null +++ b/kfile-plugins/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = k3bproject \ No newline at end of file diff --git a/kfile-plugins/k3bproject/Makefile.am b/kfile-plugins/k3bproject/Makefile.am new file mode 100644 index 0000000..d229c41 --- /dev/null +++ b/kfile-plugins/k3bproject/Makefile.am @@ -0,0 +1,27 @@ +AM_CPPFLAGS = -I$(srcdir)/../../libk3b/core \ + -I$(srcdir)/../../libk3b/core \ + -I$(srcdir)/../../libk3b/plugin \ + -I$(srcdir)/../../libk3b/tools \ + -I$(srcdir)/../../libk3b/projects \ + -I$(srcdir)/../../libk3b/projects/datacd \ + -I$(srcdir)/../../libk3bdevice \ + -I$(srcdir)/../../src/projects \ + $(all_includes) + +# these are the headers for your project +noinst_HEADERS = kfile_k3bprojectfileplugin.h + +kde_module_LTLIBRARIES = kfile_k3b.la + +kfile_k3b_la_SOURCES = kfile_k3bprojectfileplugin.cpp +kfile_k3b_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN) +kfile_k3b_la_LIBADD = $(LIB_KIO) ../../libk3b/libk3b.la ../../src/projects/kostore/libkostore.la + +# let automoc handle all of the meta source files (moc) +METASOURCES = AUTO + +services_DATA = kfile_k3b.desktop +servicesdir = $(kde_servicesdir) + +messages: + $(XGETTEXT) *.cpp -o $(podir)/kfile_k3b.pot diff --git a/kfile-plugins/k3bproject/kfile_k3b.desktop b/kfile-plugins/k3bproject/kfile_k3b.desktop new file mode 100644 index 0000000..b0156d0 --- /dev/null +++ b/kfile-plugins/k3bproject/kfile_k3b.desktop @@ -0,0 +1,53 @@ +[Desktop Entry] +Encoding=UTF-8 +Type=Service +Name=K3b Project Info +Name[af]=K3b Projek Informasie +Name[ar]= معلومات عن مشروع K3B +Name[bg]=Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° K3b проект +Name[bn]=কে-থà§à¦°à¦¿-বি পà§à¦°à¦•লà§à¦ª তথà§à¦¯ +Name[br]=Titouroù raktres K3b +Name[ca]=Informació sobre el projecte de K3b +Name[cs]=Info o K3b projektu +Name[da]=K3b Projektinformation +Name[de]=K3b Projektinformationen +Name[el]=ΠληÏοφοÏίες έÏγου K3b +Name[eo]=K3b projekta informo +Name[es]=Información de proyecto K3b +Name[et]=K3b projekti info +Name[fa]= اطلاعات پروژۀ K3b +Name[fi]=K3b-projektin kuvaus +Name[fr]=Information sur le projet K3b +Name[ga]=Eolas faoin Tionscadal K3b +Name[gl]=Informazón de Proxecto K3b +Name[hu]=K3b-projektinformáció +Name[is]=K3b verkefnisupplýsingar +Name[it]=Informazioni progetto K3b +Name[ja]=K3b プロジェクト情報 +Name[km]=áž–áŸážáŸŒáž˜áž¶áž“​របស់​​គម្រោង K3b +Name[lt]=K3b projekto informacija +Name[mk]=Информации за проект од K3b +Name[nb]=K3b-prosjektinformasjon +Name[nds]=K3b-Projektinformatschonen +Name[nl]=K3b-projectinformatie +Name[nn]=K3b-prosjektinfo +Name[pa]=K3b ਪà©à¨°à©‹à¨œà©ˆà©±à¨•ਟ ਜਾਣਕਾਰੀ +Name[pl]=Informacja dla projektu K3b +Name[pt]=Informação do Projecto do K3b +Name[pt_BR]=Informações do Projeto do K3b +Name[ru]=Ð¡Ð²Ð´ÐµÐ½Ð¸Ñ Ð¾ проекте K3b +Name[sk]=K3b informácie o projekte +Name[sr]=Инфо о K3b пројекту +Name[sr@Latn]=Info o K3b projektu +Name[sv]=K3b-projektinformation +Name[tr]=K3b Proje Bilgisi +Name[uk]=Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ñƒ K3b +Name[uz]=K3b loyihasi haqida maʼlumot +Name[uz@cyrillic]=K3b лойиҳаÑи ҳақида маълумот +Name[zh_CN]=K3b æ–¹æ¡ˆä¿¡æ¯ +Name[zh_TW]=K3b 專案資訊 +ServiceTypes=KFilePlugin +X-KDE-Library=kfile_k3b +MimeType=application/x-k3b +PreferredGroups=General +PreferredItems=documenttype diff --git a/kfile-plugins/k3bproject/kfile_k3bprojectfileplugin.cpp b/kfile-plugins/k3bproject/kfile_k3bprojectfileplugin.cpp new file mode 100644 index 0000000..b868c94 --- /dev/null +++ b/kfile-plugins/k3bproject/kfile_k3bprojectfileplugin.cpp @@ -0,0 +1,135 @@ +/* + * + * $Id: sourceheader,v 1.3 2005/01/19 13:03:46 trueg Exp $ + * Copyright (C) 2005 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include + +#include "kfile_k3bprojectfileplugin.h" +#include "kostore/koStore.h" +#include "kostore/koStoreDevice.h" + +#include + +#include + +#include +#include +#include + + + +K_EXPORT_COMPONENT_FACTORY(kfile_k3b, KGenericFactory("kfile_k3b")) + + +K3bProjectFilePlugin::K3bProjectFilePlugin( QObject *parent, const char *name, + const QStringList &args) + : KFilePlugin(parent, name, args) +{ + KFileMimeTypeInfo* info = addMimeTypeInfo( "application/x-k3b" ); + + KFileMimeTypeInfo::GroupInfo* group = addGroupInfo( info, "General", i18n("General") ); + + addItemInfo( group, "documenttype", i18n("Document Type"), QVariant::String ); +} + + +bool K3bProjectFilePlugin::readInfo( KFileMetaInfo& info, uint /*what*/) +{ + if( !info.url().isLocalFile() ) { + kdDebug() << "(K3bProjectFilePluginInfo) no local file." << endl; + return false; + } + + // open the file + bool success = false; + QDomDocument xmlDoc; + + // try opening a store + KoStore* store = KoStore::createStore( info.url().path(), KoStore::Read ); + if( store && !store->bad() && store->open( "maindata.xml" ) ) { + QIODevice* dev = store->device(); + dev->open( IO_ReadOnly ); + if( xmlDoc.setContent( dev ) ) + success = true; + dev->close(); + store->close(); + } + else + kdDebug() << "(K3bProjectFilePluginInfo) failed to open the store." << endl; + + if( success ) { + // check the documents DOCTYPE + K3bDoc::DocType type = K3bDoc::AUDIO; + if( xmlDoc.doctype().name() == "k3b_audio_project" ) + type = K3bDoc::AUDIO; + else if( xmlDoc.doctype().name() == "k3b_data_project" ) + type = K3bDoc::DATA; + else if( xmlDoc.doctype().name() == "k3b_vcd_project" ) + type = K3bDoc::VCD; + else if( xmlDoc.doctype().name() == "k3b_mixed_project" ) + type = K3bDoc::MIXED; + else if( xmlDoc.doctype().name() == "k3b_movix_project" ) + type = K3bDoc::MOVIX; + else if( xmlDoc.doctype().name() == "k3b_movixdvd_project" ) + type = K3bDoc::MOVIX_DVD; + else if( xmlDoc.doctype().name() == "k3b_dvd_project" ) + type = K3bDoc::DVD; + else if( xmlDoc.doctype().name() == "k3b_video_dvd_project" ) + type = K3bDoc::VIDEODVD; + else { + kdDebug() << "(K3bDoc) unknown doc type: " << xmlDoc.doctype().name() << endl; + success = false; + } + + QString stringType; + switch( type ) { + case K3bDoc::AUDIO: + stringType = i18n("Audio CD"); + break; + case K3bDoc::DATA: + stringType = i18n("Data CD"); + break; + case K3bDoc::MIXED: + stringType = i18n("Mixed Mode CD"); + break; + case K3bDoc::VCD: + stringType = i18n("Video CD"); + break; + case K3bDoc::MOVIX: + stringType = i18n("eMovix CD"); + break; + case K3bDoc::MOVIX_DVD: + stringType = i18n("eMovix DVD"); + break; + case K3bDoc::DVD: + stringType = i18n("Data DVD"); + break; + case K3bDoc::VIDEODVD: + stringType = i18n("Video DVD"); + break; + } + + // and finally display it! + KFileMetaInfoGroup group = appendGroup(info, "General"); + appendItem( group, "documenttype", stringType ); + } + + delete store; + + return success; +} + +#include "kfile_k3bprojectfileplugin.moc" + diff --git a/kfile-plugins/k3bproject/kfile_k3bprojectfileplugin.h b/kfile-plugins/k3bproject/kfile_k3bprojectfileplugin.h new file mode 100644 index 0000000..c90b678 --- /dev/null +++ b/kfile-plugins/k3bproject/kfile_k3bprojectfileplugin.h @@ -0,0 +1,37 @@ +/* + * + * $Id: sourceheader,v 1.3 2005/01/19 13:03:46 trueg Exp $ + * Copyright (C) 2005 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef __KFILE_K3BPROJECTFILEPLUGIN_H__ +#define __KFILE_K3BPROJECTFILEPLUGIN_H__ + +/** + * Note: For further information look into <$KDEDIR/include/kfilemetainfo.h> + */ +#include + +class QStringList; + +class K3bProjectFilePlugin: public KFilePlugin +{ + Q_OBJECT + + public: + K3bProjectFilePlugin( QObject *parent, const char *name, const QStringList& args ); + + virtual bool readInfo( KFileMetaInfo& info, uint what); +}; + +#endif + diff --git a/kioslaves/Makefile.am b/kioslaves/Makefile.am new file mode 100644 index 0000000..55ab08d --- /dev/null +++ b/kioslaves/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = videodvd diff --git a/kioslaves/videodvd/Makefile.am b/kioslaves/videodvd/Makefile.am new file mode 100644 index 0000000..d8dca0e --- /dev/null +++ b/kioslaves/videodvd/Makefile.am @@ -0,0 +1,19 @@ +INCLUDES = -I$(srcdir)/../../libk3b/tools \ + -I$(srcdir)/../../libk3b/core \ + -I$(srcdir)/../../libk3bdevice \ + $(all_includes) + +kde_module_LTLIBRARIES = kio_videodvd.la + +kio_videodvd_la_SOURCES = videodvd.cpp +kio_videodvd_la_LIBADD = -lkio ../../libk3b/libk3b.la +kio_videodvd_la_LDFLAGS = -avoid-version -module $(all_libraries) $(KDE_PLUGIN) + +protocol_DATA = videodvd.protocol +protocoldir = $(kde_servicesdir) + +konq_sidebartree_init_services_data_DATA = videodvd.desktop +konq_sidebartree_init_services_datadir = $(kde_datadir)/konqsidebartng/virtual_folders/services + +messages: + $(XGETTEXT) *.cpp -o $(podir)/kio_videodvd.pot diff --git a/kioslaves/videodvd/videodvd.cpp b/kioslaves/videodvd/videodvd.cpp new file mode 100644 index 0000000..b453037 --- /dev/null +++ b/kioslaves/videodvd/videodvd.cpp @@ -0,0 +1,407 @@ +/* + * + * $Id: sourceheader 380067 2005-01-19 13:03:46Z trueg $ + * Copyright (C) 2005 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +#include "videodvd.h" + +using namespace KIO; + +extern "C" +{ + LIBK3B_EXPORT int kdemain( int argc, char **argv ) + { + KInstance instance( "kio_videodvd" ); + + kdDebug(7101) << "*** Starting kio_videodvd " << endl; + + if (argc != 4) + { + kdDebug(7101) << "Usage: kio_videodvd protocol domain-socket1 domain-socket2" << endl; + exit(-1); + } + + kio_videodvdProtocol slave(argv[2], argv[3]); + slave.dispatchLoop(); + + kdDebug(7101) << "*** kio_videodvd Done" << endl; + return 0; + } +} + + + +// FIXME: Does it really make sense to use a static device manager? Are all instances +// of videodvd started in another process? +K3bDevice::DeviceManager* kio_videodvdProtocol::s_deviceManager = 0; +int kio_videodvdProtocol::s_instanceCnt = 0; + +kio_videodvdProtocol::kio_videodvdProtocol(const QCString &pool_socket, const QCString &app_socket) + : SlaveBase("kio_videodvd", pool_socket, app_socket) +{ + kdDebug() << "kio_videodvdProtocol::kio_videodvdProtocol()" << endl; + if( !s_deviceManager ) + { + s_deviceManager = new K3bDevice::DeviceManager(); + s_deviceManager->setCheckWritingModes( false ); + s_deviceManager->scanBus(); + } + s_instanceCnt++; +} + + +kio_videodvdProtocol::~kio_videodvdProtocol() +{ + kdDebug() << "kio_videodvdProtocol::~kio_videodvdProtocol()" << endl; + s_instanceCnt--; + if( s_instanceCnt == 0 ) + { + delete s_deviceManager; + s_deviceManager = 0; + } +} + + +KIO::UDSEntry kio_videodvdProtocol::createUDSEntry( const K3bIso9660Entry* e ) const +{ + KIO::UDSEntry uds; + KIO::UDSAtom a; + + a.m_uds = KIO::UDS_NAME; + a.m_str = e->name(); + uds.append( a ); + + a.m_uds = KIO::UDS_ACCESS; + a.m_long = e->permissions(); + uds.append( a ); + + a.m_uds = KIO::UDS_CREATION_TIME; + a.m_long = e->date(); + uds.append( a ); + + a.m_uds = KIO::UDS_MODIFICATION_TIME; + a.m_long = e->date(); + uds.append( a ); + + if( e->isDirectory() ) + { + a.m_uds = KIO::UDS_FILE_TYPE; + a.m_long = S_IFDIR; + uds.append( a ); + + a.m_uds = KIO::UDS_MIME_TYPE; + a.m_str = "inode/directory"; + uds.append( a ); + } + else + { + const K3bIso9660File* file = static_cast( e ); + + a.m_uds = KIO::UDS_SIZE; + a.m_long = file->size(); + uds.append( a ); + + a.m_uds = KIO::UDS_FILE_TYPE; + a.m_long = S_IFREG; + uds.append( a ); + + a.m_uds = KIO::UDS_MIME_TYPE; + if( e->name().endsWith( "VOB" ) ) + a.m_str = "video/mpeg"; + else + a.m_str = "unknown"; + uds.append( a ); + } + + return uds; +} + + +// FIXME: remember the iso instance for quicker something and search for the videodvd +// in the available devices. +K3bIso9660* kio_videodvdProtocol::openIso( const KURL& url, QString& plainIsoPath ) +{ + // get the volume id from the url + QString volumeId = url.path().section( '/', 1, 1 ); + + kdDebug() << "(kio_videodvdProtocol) searching for Video dvd: " << volumeId << endl; + + // now search the devices for this volume id + // FIXME: use the cache created in listVideoDVDs + for( QPtrListIterator it( s_deviceManager->dvdReader() ); *it; ++it ) { + K3bDevice::Device* dev = *it; + K3bDevice::DiskInfo di = dev->diskInfo(); + + // we search for a DVD with a single track. + // this time let K3bIso9660 decide if we need dvdcss or not + // FIXME: check for encryption and libdvdcss and report an error + if( di.isDvdMedia() && di.numTracks() == 1 ) { + K3bIso9660* iso = new K3bIso9660( dev ); + iso->setPlainIso9660( true ); + if( iso->open() && iso->primaryDescriptor().volumeId == volumeId ) { + plainIsoPath = url.path().section( "/", 2, -1 ) + "/"; + kdDebug() << "(kio_videodvdProtocol) using iso path: " << plainIsoPath << endl; + return iso; + } + delete iso; + } + } + + error( ERR_SLAVE_DEFINED, i18n("No VideoDVD found") ); + return 0; +} + + +void kio_videodvdProtocol::get(const KURL& url ) +{ + kdDebug() << "kio_videodvd::get(const KURL& url)" << endl ; + + QString isoPath; + if( K3bIso9660* iso = openIso( url, isoPath ) ) + { + const K3bIso9660Entry* e = iso->firstIsoDirEntry()->entry( isoPath ); + if( e && e->isFile() ) + { + const K3bIso9660File* file = static_cast( e ); + totalSize( file->size() ); + QByteArray buffer( 10*2048 ); + int read = 0; + int cnt = 0; + KIO::filesize_t totalRead = 0; + while( (read = file->read( totalRead, buffer.data(), buffer.size() )) > 0 ) + { + buffer.resize( read ); + data(buffer); + ++cnt; + totalRead += read; + if( cnt == 10 ) + { + cnt = 0; + processedSize( totalRead ); + } + } + + delete iso; + + data(QByteArray()); // empty array means we're done sending the data + + if( read == 0 ) + finished(); + else + error( ERR_SLAVE_DEFINED, i18n("Read error.") ); + } + else + error( ERR_DOES_NOT_EXIST, url.path() ); + } +} + + +void kio_videodvdProtocol::listDir( const KURL& url ) +{ + if( url.path() == "/" ) { + listVideoDVDs(); + } + else { + QString isoPath; + K3bIso9660* iso = openIso( url, isoPath ); + if( iso ) { + const K3bIso9660Directory* mainDir = iso->firstIsoDirEntry(); + const K3bIso9660Entry* e = mainDir->entry( isoPath ); + if( e ) { + if( e->isDirectory() ) { + const K3bIso9660Directory* dir = static_cast(e); + QStringList el = dir->entries(); + el.remove( "." ); + el.remove( ".." ); + UDSEntryList udsl; + for( QStringList::const_iterator it = el.begin(); it != el.end(); ++it ) + udsl.append( createUDSEntry( dir->entry( *it ) ) ); + listEntries( udsl ); + finished(); + } + else { + error( ERR_CANNOT_ENTER_DIRECTORY, url.path() ); + } + } + else { + error( ERR_CANNOT_ENTER_DIRECTORY, url.path() ); + } + + // for testing we always do the whole thing + delete iso; + } + } +} + + +void kio_videodvdProtocol::listVideoDVDs() +{ + int cnt = 0; + + for( QPtrListIterator it( s_deviceManager->dvdReader() ); *it; ++it ) { + K3bDevice::Device* dev = *it; + K3bDevice::DiskInfo di = dev->diskInfo(); + + // we search for a DVD with a single track. + if( di.isDvdMedia() && di.numTracks() == 1 ) { + // + // now do a quick check for VideoDVD. + // - no dvdcss for speed + // - only a check for the VIDEO_TS dir + // + K3bIso9660 iso( new K3bIso9660DeviceBackend(dev) ); + iso.setPlainIso9660( true ); + if( iso.open() && iso.firstIsoDirEntry()->entry( "VIDEO_TS" ) ) { + // FIXME: cache the entry for speedup + + UDSEntryList udsl; + KIO::UDSEntry uds; + KIO::UDSAtom a; + + a.m_uds = KIO::UDS_NAME; + a.m_str = iso.primaryDescriptor().volumeId; + uds.append( a ); + + a.m_uds = KIO::UDS_FILE_TYPE; + a.m_long = S_IFDIR; + uds.append( a ); + + a.m_uds = KIO::UDS_MIME_TYPE; + a.m_str = "inode/directory"; + uds.append( a ); + + a.m_uds = KIO::UDS_ICON_NAME; + a.m_str = "dvd_unmount"; + uds.append( a ); + + udsl.append( uds ); + + listEntries( udsl ); + + ++cnt; + } + } + } + + if( cnt ) + finished(); + else + error( ERR_SLAVE_DEFINED, i18n("No VideoDVD found") ); +} + + +void kio_videodvdProtocol::stat( const KURL& url ) +{ + if( url.path() == "/" ) { + // + // stat the root path + // + KIO::UDSEntry uds; + KIO::UDSAtom a; + + a.m_uds = KIO::UDS_NAME; + a.m_str = "/"; + uds.append( a ); + + a.m_uds = KIO::UDS_FILE_TYPE; + a.m_long = S_IFDIR; + uds.append( a ); + + a.m_uds = KIO::UDS_MIME_TYPE; + a.m_str = "inode/directory"; + uds.append( a ); + + statEntry( uds ); + finished(); + } + else { + QString isoPath; + K3bIso9660* iso = openIso( url, isoPath ); + if( iso ) { + const K3bIso9660Entry* e = iso->firstIsoDirEntry()->entry( isoPath ); + if( e ) { + statEntry( createUDSEntry( e ) ); + finished(); + } + else + error( ERR_DOES_NOT_EXIST, url.path() ); + + delete iso; + } + } +} + + +// FIXME: when does this get called? It seems not to be used for the files. +void kio_videodvdProtocol::mimetype( const KURL& url ) +{ + if( url.path() == "/" ) { + error( ERR_UNSUPPORTED_ACTION, "mimetype(/)" ); + return; + } + + QString isoPath; + K3bIso9660* iso = openIso( url, isoPath ); + if( iso ) + { + const K3bIso9660Entry* e = iso->firstIsoDirEntry()->entry( isoPath ); + if( e ) + { + if( e->isDirectory() ) + mimeType( "inode/directory" ); + else if( e->name().endsWith( ".VOB" ) ) + { + mimetype( "video/mpeg" ); + } + else + { + // send some data + const K3bIso9660File* file = static_cast( e ); + QByteArray buffer( 10*2048 ); + int read = file->read( 0, buffer.data(), buffer.size() ); + if( read > 0 ) + { + buffer.resize( read ); + data(buffer); + data(QByteArray()); + finished(); + // FIXME: do we need to emit finished() after emitting the end of data()? + } + else + error( ERR_SLAVE_DEFINED, i18n("Read error.") ); + } + } + delete iso; + } +} diff --git a/kioslaves/videodvd/videodvd.desktop b/kioslaves/videodvd/videodvd.desktop new file mode 100644 index 0000000..942e860 --- /dev/null +++ b/kioslaves/videodvd/videodvd.desktop @@ -0,0 +1,48 @@ +[Desktop Entry] +Encoding=UTF-8 +Type=Link +URL=videodvd:/ +Icon=dvd_unmount +Name=Video DVD Browser +Name[af]=Video DVD Blaaier +Name[ar]= قارىء القرص المدمج المرئي الرقمي DVD +Name[bg]=Браузър за видео DVD +Name[br]=Furcher DVD Video +Name[ca]=Navegador de DVDs de vídeo +Name[cs]=ProhlížeÄ Video DVD +Name[da]=Video-dvd browser +Name[de]=Video-DVD-Browser +Name[el]=ΠεÏιηγητής Video DVD +Name[eo]=Videa DVD foliumilo +Name[es]=Navegador de DVD de vídeo +Name[et]=Video DVD sirvija +Name[fa]= مرورگر دی ÙˆÛŒ دی ویدئویی +Name[fi]=Video-dvd selain +Name[fr]=Navigateur de DVD +Name[gl]=Explorador de Vídeo DVD +Name[hu]=Video DVD-böngészÅ‘ +Name[is]=Vídeó DVD flakkari +Name[it]=Navigatore DVD video +Name[ja]=ビデオ DVD ブラウザ +Name[ka]=ვიდერDVD-ის ბრáƒáƒ£áƒ–ერი +Name[km]=កម្មវិធី​រុករក​ឌីវីឌី​វីដáŸáž¢áž¼ +Name[lt]=Video DVD narÅ¡yklÄ— +Name[nds]=Video-DVD-Kieker +Name[nn]=Film-DVD-lesar +Name[pa]=ਵੀਡਿਓ DVD à¨à¨²à¨•ਾਰਾ +Name[pl]=PrzeglÄ…darka pÅ‚yt DVD Video +Name[pt]=Navegador de DVD de Vídeo +Name[pt_BR]=Navegador de DVD de Vídeo +Name[sk]=Video DVD prehliadaÄ +Name[sr]=Прегледач видео DVD-а +Name[sr@Latn]=PregledaÄ video DVD-a +Name[sv]=Video-dvd bläddrare +Name[tr]=Görüntü DVD'si Gezgini +Name[uk]=Ðавігатор відео-DVD +Name[uz]=Video-DVD brauzeri +Name[uz@cyrillic]=Видео-DVD браузери +Name[zh_CN]=视频 DVD æµè§ˆå™¨ +Name[zh_TW]=Video DVD ç€è¦½å™¨ +Open=false +X-KDE-TreeModule=Directory +X-KDE-KonqSidebarModule=konqsidebar_tree diff --git a/kioslaves/videodvd/videodvd.h b/kioslaves/videodvd/videodvd.h new file mode 100644 index 0000000..e27e54f --- /dev/null +++ b/kioslaves/videodvd/videodvd.h @@ -0,0 +1,55 @@ +/* + * + * $Id: sourceheader 380067 2005-01-19 13:03:46Z trueg $ + * Copyright (C) 2005 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef _videodvd_H_ +#define _videodvd_H_ + +#include +#include + +#include +#include +#include + +class QCString; +class K3bIso9660Entry; +class K3bIso9660; +namespace K3bDevice +{ + class DeviceManager; +} + +class kio_videodvdProtocol : public KIO::SlaveBase +{ +public: + kio_videodvdProtocol(const QCString &pool_socket, const QCString &app_socket); + ~kio_videodvdProtocol(); + + void mimetype( const KURL& url ); + void stat( const KURL& url ); + void get( const KURL& url ); + void listDir( const KURL& url ); + +private: + K3bIso9660* openIso( const KURL&, QString& plainIsoPath ); + KIO::UDSEntry createUDSEntry( const K3bIso9660Entry* e ) const; + void listVideoDVDs(); + + static K3bDevice::DeviceManager* s_deviceManager; + static int s_instanceCnt; +}; + +#endif diff --git a/kioslaves/videodvd/videodvd.protocol b/kioslaves/videodvd/videodvd.protocol new file mode 100644 index 0000000..6337443 --- /dev/null +++ b/kioslaves/videodvd/videodvd.protocol @@ -0,0 +1,52 @@ +[Protocol] +exec=kio_videodvd +protocol=videodvd +input=none +output=filesystem +reading=true +listing=Name,Type,Size,Date +Icon=dvd_unmount +Class=:local +Description=A kioslave that allows files to be copied from a Video DVD (including decryption) +Description[af]='n 'Kioslave' wat jou toelaat om lêers vanaf 'n Video DVD te kopiëer. Dit doen ook die nodige dekripsie. +Description[ar]= يسمح هذا ال-kioslave بنسخ Ø§Ù„Ù…Ù„ÙØ§Øª من قرص مدمج مرئي رقمي DVD ( بما Ùيه ÙÙƒ التشÙير ) +Description[bg]=kioslave, позволÑващ ви да копирате файлове от видео DVD (включително разшифроването) +Description[bn]=à¦à¦•টি কে-আই-ও সà§à¦²à§‡à¦­ যেটি à¦à¦•টি ভিডিও ডিভিডি থেকে ফাইল কপি করতে অনà§à¦®à¦¤à¦¿à¦¦à§‡à§Ÿ (ডিকà§à¦°à¦¿à¦ªà¦¶à¦¨ সহ) +Description[ca]=Un kioslave que permet que es copiïn fitxers des d'un DVD de vídeo (incloent el desxifrat) +Description[cs]=Kioslave umožňující kopírování video DVD (vÄetnÄ› dekódování) +Description[da]=En kioslave som gør det muligt at kopiere filer fra en video-dvd (inklusive afkodning) +Description[de]=Ein-/Ausgabemodul, mit dem man Dateien von einer Video-DVD kopieren kann (inkl. Entschlüsselung) +Description[el]=Ένα kioslave που επιτÏέπει την αντιγÏαφή αÏχείων από ένα DVD βίντεο (δυνατότητα αποκÏυπτογÏάφησης) +Description[eo]=Kioslave kiu permesas kopii dosierojn el videa DVD (inklude malĉifro) +Description[es]=Un kioslave que permite copiar archivos de un DVD de vídeo (incluye descifrado) +Description[et]=KIO-moodul, mis võimaldab kopeerida faile video DVD-lt (vajadusel dekrüpteerib) +Description[fa]=یک kioslave Ú©Ù‡ اجازه می‌دهد پرونده‌ها از یک دی ÙˆÛŒ دی ویدئویی )شامل سرگشایی( رونوشت شوند +Description[fi]=Kioslave-palvelu, joka mahdollistaa tiedostojen purkamisen dvd-levyltä. +Description[fr]=Un kioslave qui permet de copier des fichiers depuis un DVD Vidéo (incluant le déchiffrement) +Description[gl]=Un kioslave que permite copiar ficheiros dun Video DVD (incluindo descifrar) +Description[he]=עבד קלט/פלט של KDE המ×פשר ×œ×§×‘×¦×™× ×œ×”×™×•×ª ×ž×•×¢×ª×§×™× ×ž×ª×§×œ×™×˜×•×¨ ויד×ו של DVD (כולל פענוח) +Description[hu]=Kioslave, amellyel fájlokat lehet másolni Video DVD-rÅ‘l (dekódolással együtt) +Description[is]=Kioslave sem leyfir afritun af skrám frá vídeó DVD (með afkóðun) +Description[it]=Un kioslave che permette ai file di essere copiati da un DVD video (incluso decifrazione) +Description[ja]=ビデオ DVD ã‹ã‚‰ãƒ•ァイルをコピーã™ã‚‹ã“ã¨ã‚’å¯èƒ½ã«ã™ã‚‹ kioslave (æš—å·è§£é™¤ã‚‚å«ã‚€) +Description[ka]=Kioslave, რáƒáƒ›áƒ”ლიც იძლევრVideo DVD-დáƒáƒœ áƒáƒ¡áƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბის მიღების სáƒáƒ¨áƒ£áƒ”ლებáƒáƒ¡ (გáƒáƒ¨áƒ˜áƒ¤áƒ áƒ•áƒáƒ¡áƒ—áƒáƒœ ერთáƒáƒ“) +Description[km]=​kioslave ដែល​អនុញ្ញាážâ€‹áž²áŸ’យ​ចម្លង​​ឯកសារ​ពី​ឌីវីឌី​វីដáŸáž¢áž¼(រួម​ទាំង​ការ​ឌិគ្រីប) +Description[lt]=Priedas (kioslave) leidžiantis kopijuoti bylas iÅ¡ Video DVD (taip pat ir atÅ¡ifruoti) +Description[ms]=kioslave yang membenarkan fail untuk disalin dari DVD Video (termasuk nyahenkripsi) +Description[nb]=En kioslave som gjør det mulig Ã¥ kopiere filer fra en Video-DVD (medregnet dekryptering) +Description[nds]=En In-/Utgaavmoduul, mit dat sik Dateien vun en Video-DVD koperen laat (ok mit Opslöteln) +Description[nl]=Een kioslave waarmee u bestanden van een video-dvd kunt kopiëren (inclusief versleuteling) +Description[nn]=Ein kioslave som gjer det mogleg Ã¥ kopiera filer frÃ¥ ein film-DVD (inkludert kryptering) +Description[pa]=ਇੱਕ kioslave ਹੈ, ਜੋ ਕਿ ਫਾਇਲਾਂ ਨੂੰ ਇੱਕ DVD (ਡਿਸਕਰਿਪਸ਼ਨ ਸਮੇ) ਤੋਂ ਨਕਲ ਕਰਨ ਲਈ ਸਹਾਇਕ ਹੈ +Description[pl]=Wtyczka protokoÅ‚u pozwalajÄ…ca kopiować pliki z pÅ‚yt DVD Video (łącznie z odszyfrowywaniem) +Description[pt]=Um 'kioslave' que permite copiar ficheiros de um DVD Vídeo (incluindo decifrar) +Description[pt_BR]=Um kioslave que permite que arquivos sejam copiados de um DVD de Vídeo (incluindo a quebra da proteção) +Description[ru]=ПозволÑет копировать файлы Ñ Video DVD (Ñ Ð´ÐµÑˆÐ¸Ñ„Ñ€Ð¾Ð²ÐºÐ¾Ð¹) +Description[sk]=kioslave, ktorý umožňuje kopírovaÅ¥ súbory z Video DVD (vrátane deÅ¡ifrovania) +Description[sr]=kioslave који омогућава копирање фајлова Ñа видео DVD-а (укључујући дешифровање) +Description[sr@Latn]=kioslave koji omogućava kopiranje fajlova sa video DVD-a (ukljuÄujući deÅ¡ifrovanje) +Description[sv]=En I/O-slav som gör det möjligt att kopiera filer frÃ¥n en video-dvd (inklusive avkodning) +Description[tr]= Bir Görüntü DVD'sinden dosyaların kopyalanmasını (ve kodunun çözülmesini) saÄŸlayan kioslave +Description[uk]=Підлеглий Ð’/Ð’, Ñкий дає змогу копіювати файли з Відео DVD (включаючи розшифруваннÑ) +Description[zh_CN]=å…许从视频 DVD(包括加密影碟)中å¤åˆ¶æ–‡ä»¶çš„ kioslave +Description[zh_TW]=å…許直接從 Video DVD 複製檔案的 kioslave(會自動解密) diff --git a/libk3b/Makefile.am b/libk3b/Makefile.am new file mode 100644 index 0000000..4c74f7d --- /dev/null +++ b/libk3b/Makefile.am @@ -0,0 +1,28 @@ +if include_videodvdrip +VIDEODVDDIR = videodvd +VIDEODVDLIB = videodvd/libvideodvd.la +endif + + +lib_LTLIBRARIES = libk3b.la + +libk3b_la_SOURCES = dummy.cpp + +libk3b_la_LIBADD = core/libk3bcore.la \ + cddb/libcddb.la \ + projects/libk3bproject.la \ + plugin/libk3bplugin.la \ + tools/libk3btools.la \ + jobs/libjobs.la \ + $(VIDEODVDLIB) \ + ../libk3bdevice/libk3bdevice.la + +libk3b_la_LDFLAGS = $(all_libraries) -version-info 3:0:0 -no-undefined + +SUBDIRS = core plugin tools projects cddb jobs $(VIDEODVDDIR) + +#pkgconfigdir = $(libdir)/pkgconfig +#pkgconfig_DATA = libk3b.pc + +messages: + $(XGETTEXT) `find -name "*.cpp" -o -name "*.h"` -o $(podir)/libk3b.pot diff --git a/libk3b/README b/libk3b/README new file mode 100644 index 0000000..a1ba273 --- /dev/null +++ b/libk3b/README @@ -0,0 +1,29 @@ +libk3b +========================= + +This is the k3b library which provides a lot of CD/DVD writing classes. + +If you want to use it please be aware that the API is far from stable and +there will be no binary compatibility (or even source compatibility) before +K3b 1.0. + +But you are welcome to help fix the API and improve it whereever it is needed. + + +Usage +========================== + +Just a very basic scetch how to create an audio cd: + +1. create a k3bcore instance (this provides all the stuff that is needed by the lib) +1.1 K3bCore::init() to initialize the core. + +2. create a K3bAudioDoc object and add urls to it + +3. create a K3bJobHandler derived class (for example a widget which displays the progress) + +4. call K3bAudioDoc::newBurnJob or create a K3bAudioJob manually. + +5. modify the doc's settings. + +6. call K3bAudioJob::start() to start the burning process. diff --git a/libk3b/cddb/Makefile.am b/libk3b/cddb/Makefile.am new file mode 100644 index 0000000..e73c5ce --- /dev/null +++ b/libk3b/cddb/Makefile.am @@ -0,0 +1,9 @@ +AM_CPPFLAGS = -I$(srcdir)/../core -I$(srcdir)/../../libk3bdevice -I$(srcdir)/../../src $(all_includes) + +METASOURCES = AUTO + +noinst_LTLIBRARIES = libcddb.la + +libcddb_la_SOURCES = k3bcddbquery.cpp k3bcddb.cpp k3bcddbresult.cpp k3bcddbhttpquery.cpp k3bcddbpquery.cpp k3bcddblocalquery.cpp k3bcddbsubmit.cpp k3bcddblocalsubmit.cpp k3bcddbmultientriesdialog.cpp + +include_HEADERS = k3bcddb.h k3bcddbresult.h diff --git a/libk3b/cddb/k3bcddb.cpp b/libk3b/cddb/k3bcddb.cpp new file mode 100644 index 0000000..a0e4fe1 --- /dev/null +++ b/libk3b/cddb/k3bcddb.cpp @@ -0,0 +1,280 @@ +/* + * + * $Id: k3bcddb.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "k3bcddb.h" +#include "k3bcddbhttpquery.h" +#include "k3bcddbpquery.h" +#include "k3bcddblocalquery.h" +#include "k3bcddblocalsubmit.h" + +#include +#include +#include "k3bcddbmultientriesdialog.h" + + +K3bCddb::K3bCddb( QObject* parent, const char* name ) + : QObject( parent, name ) +{ + m_httpQuery = 0; + m_cddbpQuery = 0; + m_localQuery = 0; + m_localSubmit = 0; + + m_lastUsedQuery = 0; +} + + +K3bCddb::~K3bCddb() +{ +} + + +void K3bCddb::readConfig( KConfig* c ) +{ + c->setGroup( "Cddb" ); + + m_bRemoteCddbQuery = c->readBoolEntry( "use remote cddb", true ); + m_bLocalCddbQuery = c->readBoolEntry( "use local cddb query", false ); + + // old config <= 0.7.3 + QStringList cddbpServer = c->readListEntry( "cddbp server" ); + QStringList httpServer = c->readListEntry( "http server" ); + + // new config + m_cddbServer = c->readListEntry( "cddb server" ); + + m_localCddbDirs = c->readPathListEntry( "local cddb dirs" ); + + m_bUseManualCgiPath = c->readBoolEntry( "use manual cgi path", false ); + m_cgiPath = c->readEntry( "cgi path", "/~cddb/cddb.cgi" ); + + if( m_localCddbDirs.isEmpty() ) + m_localCddbDirs.append( "~/.cddb/" ); + + // old config <= 0.7.3 + if( !httpServer.isEmpty() ) { + for( QStringList::iterator it = httpServer.begin(); it != httpServer.end(); ++it ) { + m_cddbServer.append( "Http " + *it ); + } + } + if( !cddbpServer.isEmpty() ) { + for( QStringList::iterator it = cddbpServer.begin(); it != cddbpServer.end(); ++it ) { + m_cddbServer.append( "Cddbp " + *it ); + } + } + + if( m_cddbServer.isEmpty() ) + m_cddbServer.append( "Http freedb2.org:80" ); +} + + +void K3bCddb::query( const K3bDevice::Toc& toc ) +{ + m_toc = toc; + + if( m_bLocalCddbQuery ) { + m_iCurrentQueriedLocalDir = 0; + QTimer::singleShot( 0, this, SLOT(localQuery()) ); + } + else if( m_bRemoteCddbQuery ) { + m_iCurrentQueriedServer = 0; + QTimer::singleShot( 0, this, SLOT(remoteQuery()) ); + } + else { + QTimer::singleShot( 0, this, SLOT(slotNoEntry()) ); + } +} + + +void K3bCddb::slotNoEntry() +{ + emit queryFinished( K3bCddbQuery::NO_ENTRY_FOUND ); +} + + +void K3bCddb::remoteQuery() +{ + K3bCddbQuery* q = getQuery( m_cddbServer[m_iCurrentQueriedServer] ); + q->query(m_toc); +} + + +void K3bCddb::slotMultibleMatches( K3bCddbQuery* query ) +{ + K3bCddbResultHeader hdr = K3bCddbMultiEntriesDialog::selectCddbEntry( query, 0 ); + if( !hdr.discid.isEmpty() ) + query->queryMatch( hdr ); + else + emit queryFinished( K3bCddbQuery::CANCELED ); +} + + +void K3bCddb::slotQueryFinished( K3bCddbQuery* query ) +{ + m_lastUsedQuery = query; + + if( query->error() == K3bCddbQuery::SUCCESS ) { + m_lastResult = m_lastUsedQuery->result(); + + // make sure the result has the requested discid since otherwise local saving does not make much sense + m_lastResult.discid = QString::number( m_toc.discId(), 16 ).rightJustify( 8, '0' ); + + emit queryFinished( K3bCddbQuery::SUCCESS ); + } + else if( query == m_localQuery ) { + m_iCurrentQueriedLocalDir++; + if( m_iCurrentQueriedLocalDir < m_localCddbDirs.size() ) + localQuery(); + else if( m_bRemoteCddbQuery ) { + m_iCurrentQueriedServer = 0; + remoteQuery(); + } + else { + emit queryFinished( query->error() ); + } + } + else { + m_iCurrentQueriedServer++; + if( m_iCurrentQueriedServer < m_cddbServer.size() ) { + remoteQuery(); + } + else { + emit queryFinished( query->error() ); + } + } +} + + +K3bCddbQuery* K3bCddb::getQuery( const QString& s ) +{ + QStringList buf = QStringList::split( ":", s.mid( s.find(" ")+1 ) ); + QString server = buf[0]; + int port = buf[1].toInt(); + + if( s.startsWith("Http") ) { + if( !m_httpQuery ) { + m_httpQuery = new K3bCddbHttpQuery( this ); + connect( m_httpQuery, SIGNAL(infoMessage(const QString&)), + this, SIGNAL(infoMessage(const QString&)) ); + connect( m_httpQuery, SIGNAL(queryFinished(K3bCddbQuery*)), + this, SLOT(slotQueryFinished(K3bCddbQuery*)) ); + connect( m_httpQuery, SIGNAL(inexactMatches(K3bCddbQuery*)), + this, SLOT(slotMultibleMatches(K3bCddbQuery*)) ); + } + + m_httpQuery->setServer( server, port ); + m_httpQuery->setCgiPath( m_bUseManualCgiPath ? m_cgiPath : QString::fromLatin1("/~cddb/cddb.cgi") ); + + return m_httpQuery; + } + else { + if( !m_cddbpQuery ) { + m_cddbpQuery = new K3bCddbpQuery( this ); + connect( m_cddbpQuery, SIGNAL(infoMessage(const QString&)), + this, SIGNAL(infoMessage(const QString&)) ); + connect( m_cddbpQuery, SIGNAL(queryFinished(K3bCddbQuery*)), + this, SLOT(slotQueryFinished(K3bCddbQuery*)) ); + connect( m_cddbpQuery, SIGNAL(inexactMatches(K3bCddbQuery*)), + this, SLOT(slotMultibleMatches(K3bCddbQuery*)) ); + } + + m_cddbpQuery->setServer( server, port ); + + return m_cddbpQuery; + } +} + + +void K3bCddb::localQuery() +{ + if( !m_localQuery ) { + m_localQuery = new K3bCddbLocalQuery( this ); + connect( m_localQuery, SIGNAL(infoMessage(const QString&)), + this, SIGNAL(infoMessage(const QString&)) ); + connect( m_localQuery, SIGNAL(queryFinished(K3bCddbQuery*)), + this, SLOT(slotQueryFinished(K3bCddbQuery*)) ); + connect( m_localQuery, SIGNAL(inexactMatches(K3bCddbQuery*)), + this, SLOT(slotMultibleMatches(K3bCddbQuery*)) ); + } + + m_localQuery->setCddbDir( m_localCddbDirs[m_iCurrentQueriedLocalDir] ); + + m_localQuery->query( m_toc ); +} + + +QString K3bCddb::errorString() const +{ + if( !m_lastUsedQuery ) + return "no query"; + + switch( m_lastUsedQuery->error() ) { + case K3bCddbQuery::SUCCESS: + return i18n("Found freedb entry."); + case K3bCddbQuery::NO_ENTRY_FOUND: + return i18n("No entry found"); + case K3bCddbQuery::CONNECTION_ERROR: + return i18n("Error while connecting to host."); + case K3bCddbQuery::WORKING: + return i18n("Working..."); + case K3bCddbQuery::QUERY_ERROR: + case K3bCddbQuery::READ_ERROR: + case K3bCddbQuery::FAILURE: + default: + return i18n("Communication error."); + } +} + + +const K3bCddbResultEntry& K3bCddb::result() const +{ + // return m_lastUsedQuery->result(); + return m_lastResult; +} + + +void K3bCddb::saveEntry( const K3bCddbResultEntry& entry ) +{ + if( !m_localSubmit ) { + m_localSubmit = new K3bCddbLocalSubmit( this ); + connect( m_localSubmit, SIGNAL(submitFinished(K3bCddbSubmit*)), + this, SLOT(slotSubmitFinished(K3bCddbSubmit*)) ); + } + + m_localSubmit->setCddbDir( m_localCddbDirs[0] ); + + m_localSubmit->submit( entry ); +} + + +void K3bCddb::slotSubmitFinished( K3bCddbSubmit* s ) +{ + emit submitFinished( s->error() == K3bCddbSubmit::SUCCESS ); +} + +#include "k3bcddb.moc" + diff --git a/libk3b/cddb/k3bcddb.h b/libk3b/cddb/k3bcddb.h new file mode 100644 index 0000000..86b67c5 --- /dev/null +++ b/libk3b/cddb/k3bcddb.h @@ -0,0 +1,103 @@ +/* + * + * $Id: k3bcddb.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef K3BCDDB_H +#define K3BCDDB_H + +#include +#include +#include + +#include + +#include "k3bcddbresult.h" +#include "k3b_export.h" + +class KConfig; +class K3bCddbQuery; +class K3bCddbHttpQuery; +class K3bCddbpQuery; +class K3bCddbLocalQuery; +class K3bCddbSubmit; +class K3bCddbLocalSubmit; + + +class LIBK3B_EXPORT K3bCddb : public QObject +{ + Q_OBJECT + + public: + K3bCddb( QObject* parent = 0, const char* name = 0 ); + ~K3bCddb(); + + QString errorString() const; + + /** + * Do NOT call this before queryResult has + * been emitted + */ + const K3bCddbResultEntry& result() const; + + public slots: + /** query a cd and connect to the queryFinished signal */ + void query( const K3bDevice::Toc& ); + void readConfig( KConfig* c ); + void saveEntry( const K3bCddbResultEntry& ); + + signals: + void queryFinished( int error ); + void submitFinished( bool success ); + void infoMessage( const QString& ); + + private slots: + void localQuery(); + void remoteQuery(); + void slotQueryFinished( K3bCddbQuery* ); + void slotSubmitFinished( K3bCddbSubmit* ); + void slotMultibleMatches( K3bCddbQuery* ); + void slotNoEntry(); + + private: + K3bCddbQuery* getQuery( const QString& ); + + K3bCddbHttpQuery* m_httpQuery; + K3bCddbpQuery* m_cddbpQuery; + K3bCddbLocalQuery* m_localQuery; + K3bCddbLocalSubmit* m_localSubmit; + + K3bDevice::Toc m_toc; + unsigned int m_iCurrentQueriedServer; + unsigned int m_iCurrentQueriedLocalDir; + + const K3bCddbQuery* m_lastUsedQuery; + K3bCddbResultEntry m_lastResult; + + // config + QStringList m_cddbServer; + QString m_proxyServer; + int m_proxyPort; + QString m_cgiPath; + bool m_bUseProxyServer; + bool m_bUseKdeSettings; + QStringList m_localCddbDirs; + bool m_bSaveCddbEntriesLocally; + bool m_bUseManualCgiPath; + bool m_bRemoteCddbQuery; + bool m_bLocalCddbQuery; +}; + + +#endif diff --git a/libk3b/cddb/k3bcddbhttpquery.cpp b/libk3b/cddb/k3bcddbhttpquery.cpp new file mode 100644 index 0000000..a453c3e --- /dev/null +++ b/libk3b/cddb/k3bcddbhttpquery.cpp @@ -0,0 +1,233 @@ +/* + * + * $Id: k3bcddbhttpquery.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + + +#include "k3bcddbhttpquery.h" + +#include "k3bcddbresult.h" + +#include +#include +#include + +#include +#include +#include +#include + + +K3bCddbHttpQuery::K3bCddbHttpQuery( QObject* parent, const char* name ) + : K3bCddbQuery( parent, name ) +{ + m_server = "freedb.org"; + m_port = 80; + m_cgiPath = "/~cddb/cddb.cgi"; +} + + +K3bCddbHttpQuery::~K3bCddbHttpQuery() +{ +} + + +void K3bCddbHttpQuery::doQuery() +{ + setError( WORKING ); + m_state = QUERY; + + performCommand( queryString() ); +} + + +void K3bCddbHttpQuery::doMatchQuery() +{ + setError( WORKING ); + m_state = READ; + m_parsingBuffer.truncate(0); + + performCommand( QString( "cddb read %1 %2").arg( header().category ).arg( header().discid ) ); +} + + +void K3bCddbHttpQuery::performCommand( const QString& cmd ) +{ + KURL url; + url.setProtocol( "http" ); + url.setHost( m_server ); + url.setPort( m_port ); + url.setPath( m_cgiPath ); + + url.addQueryItem( "cmd", cmd ); + url.addQueryItem( "hello", handshakeString() ); + url.addQueryItem( "proto", "6" ); + + m_data.truncate(0); + + kdDebug() << "(K3bCddbHttpQuery) getting url: " << url.prettyURL() << endl; + + KIO::TransferJob* job = KIO::get( url, false, false ); + + if( !job ) { + setError( CONNECTION_ERROR ); + emit infoMessage( i18n("Could not connect to host %1").arg(m_server) ); + emitQueryFinished(); + return; + } + + connect( job, SIGNAL(data(KIO::Job*, const QByteArray&)), + SLOT(slotData(KIO::Job*, const QByteArray&)) ); + connect( job, SIGNAL(result(KIO::Job*)), + SLOT(slotResult(KIO::Job*)) ); +} + + + +void K3bCddbHttpQuery::slotData( KIO::Job*, const QByteArray& data ) +{ + if( data.size() ) { + QDataStream stream( m_data, IO_WriteOnly | IO_Append ); + stream.writeRawBytes( data.data(), data.size() ); + } +} + + +void K3bCddbHttpQuery::slotResult( KIO::Job* job ) +{ + if( job->error() ) { + emit infoMessage( job->errorString() ); + setError( CONNECTION_ERROR ); + emitQueryFinished(); + return; + } + + QStringList lines = QStringList::split( "\n", QString::fromUtf8( m_data.data(), m_data.size() ) ); + + for( QStringList::const_iterator it = lines.begin(); it != lines.end(); ++it ) { + QString line = *it; + + // kdDebug() << "(K3bCddbHttpQuery) line: " << line << endl; + + switch( m_state ) { + + case QUERY: + if( getCode( line ) == 200 ) { + // parse exact match and send a read command + K3bCddbResultHeader header; + parseMatchHeader( line.mid(4), header ); + + queryMatch( header ); + } + + else if( getCode( line ) == 210 ) { + // TODO: perhaps add an "exact" field to K3bCddbEntry + kdDebug() << "(K3bCddbHttpQuery) Found multiple exact matches" << endl; + + emit infoMessage( i18n("Found multiple exact matches") ); + + m_state = QUERY_DATA; + } + + else if( getCode( line ) == 211 ) { + kdDebug() << "(K3bCddbHttpQuery) Found inexact matches" << endl; + + emit infoMessage( i18n("Found inexact matches") ); + + m_state = QUERY_DATA; + } + + else if( getCode( line ) == 202 ) { + kdDebug() << "(K3bCddbHttpQuery) no match found" << endl; + emit infoMessage( i18n("No match found") ); + setError(NO_ENTRY_FOUND); + m_state = FINISHED; + emitQueryFinished(); + return; + } + + else { + kdDebug() << "(K3bCddbHttpQuery) Error while querying: " << line << endl; + emit infoMessage( i18n("Error while querying") ); + setError(QUERY_ERROR); + m_state = FINISHED; + emitQueryFinished(); + return; + } + break; + + case QUERY_DATA: + if( line.startsWith( "." ) ) { + // finished query + // go on reading + + + // here we have the inexact matches headers and should emit the + // inexactMatches signal + emit inexactMatches( this ); + } + else { + kdDebug() << "(K3bCddbHttpQuery) inexact match: " << line << endl; + + // create a new resultHeader + K3bCddbResultHeader header; + parseMatchHeader( line, header ); + m_inexactMatches.append(header); + } + break; + + case READ: + if( getCode( line ) == 210 ) { + + // we just start parsing the read data + m_state = READ_DATA; + } + + else { + emit infoMessage( i18n("Could not read match") ); + setError(READ_ERROR); + m_state = FINISHED; + emitQueryFinished(); + return; + } + break; + + + case READ_DATA: + + // kdDebug() << "parsing line: " << line << endl; + + if( line.startsWith( "." ) ) { + + kdDebug() << "(K3bCddbHttpQuery query finished." << endl; + + QTextStream strStream( m_parsingBuffer, IO_ReadOnly ); + parseEntry( strStream, result() ); + + setError(SUCCESS); + m_state = FINISHED; + emitQueryFinished(); + return; + } + + else { + m_parsingBuffer.append(line + "\n"); + } + break; + } + } +} + + +#include "k3bcddbhttpquery.moc" diff --git a/libk3b/cddb/k3bcddbhttpquery.h b/libk3b/cddb/k3bcddbhttpquery.h new file mode 100644 index 0000000..b1e544e --- /dev/null +++ b/libk3b/cddb/k3bcddbhttpquery.h @@ -0,0 +1,64 @@ +/* + * + * $Id: k3bcddbhttpquery.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef K3BCDDB_HTTP_QUERY_H +#define K3BCDDB_HTTP_QUERY_H + +#include "k3bcddbquery.h" +#include "k3bcddbresult.h" + +#include + +namespace KIO { + class Job; +} + +class K3bCddbHttpQuery : public K3bCddbQuery +{ + Q_OBJECT + + public: + K3bCddbHttpQuery( QObject* parent = 0, const char* name = 0 ); + ~K3bCddbHttpQuery(); + + public slots: + void setServer( const QString& s, int port = 80 ) { m_server = s; m_port = port; } + void setCgiPath( const QString& p ) { m_cgiPath = p; } + + protected slots: + void doQuery(); + void doMatchQuery(); + void slotResult( KIO::Job* ); + void slotData( KIO::Job*, const QByteArray& data ); + + private: + void performCommand( const QString& ); + + enum State { QUERY, QUERY_DATA, READ, READ_DATA, FINISHED }; + + int m_state; + QString m_server; + int m_port; + QString m_cgiPath; + + QString m_currentlyConnectingServer; + + QByteArray m_data; + QString m_parsingBuffer; +}; + +#endif + diff --git a/libk3b/cddb/k3bcddblocalquery.cpp b/libk3b/cddb/k3bcddblocalquery.cpp new file mode 100644 index 0000000..b3a1264 --- /dev/null +++ b/libk3b/cddb/k3bcddblocalquery.cpp @@ -0,0 +1,129 @@ +/* + * + * $Id: k3bcddblocalquery.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include "k3bcddblocalquery.h" + +#include +#include +#include + +#include +#include +#include + + +K3bCddbLocalQuery::K3bCddbLocalQuery( QObject* parent , const char* name ) + : K3bCddbQuery( parent, name ) +{ +} + + +K3bCddbLocalQuery::~K3bCddbLocalQuery() +{ +} + + +void K3bCddbLocalQuery::doQuery() +{ + emit infoMessage( i18n("Searching entry in %1").arg( m_cddbDir ) ); + kapp->processEvents(); //BAD! + + QString path = preparePath( m_cddbDir ); + + kdDebug() << "(K3bCddbLocalQuery) searching in dir " << path << " for " + << QString::number( toc().discId(), 16 ).rightJustify( 8, '0' ) << endl; + + for( QStringList::const_iterator it = categories().begin(); + it != categories().end(); ++it ) { + + QString file = path + *it + "/" + QString::number( toc().discId(), 16 ).rightJustify( 8, '0' ); + + if( QFile::exists( file ) ) { + // found file + + QFile f( file ); + if( !f.open( IO_ReadOnly ) ) { + kdDebug() << "(K3bCddbLocalQuery) Could not open file" << endl; + } + else { + QTextStream t( &f ); + + K3bCddbResultEntry entry; + parseEntry( t, entry ); + K3bCddbResultHeader header; + header.discid = QString::number( toc().discId(), 16 ).rightJustify( 8, '0' ); + header.category = *it; + header.title = entry.cdTitle; + header.artist = entry.cdArtist; + m_inexactMatches.append(header); + } + } + else { + kdDebug() << "(K3bCddbLocalQuery) Could not find local entry in category " << *it << endl; + } + } + + if( m_inexactMatches.count() > 0 ) { + setError( SUCCESS ); + if( m_inexactMatches.count() == 1 ) { + queryMatch( m_inexactMatches.first() ); + } + else { + emit inexactMatches( this ); + } + } + else { + setError( NO_ENTRY_FOUND ); + emit queryFinished( this ); + } +} + + +void K3bCddbLocalQuery::doMatchQuery() +{ + QString path = preparePath( m_cddbDir ) + header().category + "/" + header().discid; + + QFile f( path ); + if( !f.open( IO_ReadOnly ) ) { + kdDebug() << "(K3bCddbLocalQuery) Could not open file" << endl; + setError( READ_ERROR ); + } + else { + QTextStream t( &f ); + + parseEntry( t, result() ); + result().discid = header().discid; + result().category = header().category; + setError( SUCCESS ); + } + emit queryFinished( this ); +} + + +QString K3bCddbLocalQuery::preparePath( const QString& p ) +{ + QString path = p; + if( path.startsWith( "~" ) ) + path.replace( 0, 1, QDir::homeDirPath() ); + else if( !path.startsWith( "/" ) ) + path.prepend( QDir::homeDirPath() ); + if( path[path.length()-1] != '/' ) + path.append( "/" ); + + return path; +} + +#include "k3bcddblocalquery.moc" diff --git a/libk3b/cddb/k3bcddblocalquery.h b/libk3b/cddb/k3bcddblocalquery.h new file mode 100644 index 0000000..d68d379 --- /dev/null +++ b/libk3b/cddb/k3bcddblocalquery.h @@ -0,0 +1,48 @@ +/* + * + * $Id: k3bcddblocalquery.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + + +#ifndef K3BCDDB_LOCAL_QUERY_H +#define K3BCDDB_LOCAL_QUERY_H + +#include "k3bcddbquery.h" +#include "k3bcddbresult.h" + +#include + + +class K3bCddbLocalQuery : public K3bCddbQuery +{ + Q_OBJECT + + public: + K3bCddbLocalQuery( QObject* parent = 0, const char* name = 0 ); + ~K3bCddbLocalQuery(); + + public slots: + void setCddbDir( const QString& dir ) { m_cddbDir = dir; } + + protected: + void doQuery(); + void doMatchQuery(); + + private: + QString preparePath( const QString& p ); + + QString m_cddbDir; +}; + +#endif diff --git a/libk3b/cddb/k3bcddblocalsubmit.cpp b/libk3b/cddb/k3bcddblocalsubmit.cpp new file mode 100644 index 0000000..f2d1e69 --- /dev/null +++ b/libk3b/cddb/k3bcddblocalsubmit.cpp @@ -0,0 +1,102 @@ +/* + * + * $Id: k3bcddblocalsubmit.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + + +#include "k3bcddblocalsubmit.h" + +#include +#include +#include + +#include +#include + + +K3bCddbLocalSubmit::K3bCddbLocalSubmit( QObject* parent, const char* name ) + : K3bCddbSubmit( parent, name ) +{ +} + + +K3bCddbLocalSubmit::~K3bCddbLocalSubmit() +{ +} + + +void K3bCddbLocalSubmit::doSubmit() +{ + QString path = m_cddbDir; + if( path.startsWith( "~" ) ) + path.replace( 0, 1, QDir::homeDirPath() + "/" ); + else if( !path.startsWith( "/" ) ) + path.prepend( QDir::homeDirPath() + "/" ); + if( path[path.length()-1] != '/' ) + path.append( "/" ); + + if( !QFile::exists( path ) && !QDir().mkdir( path ) ) { + kdDebug() << "(K3bCddbLocalSubmit) could not create directory: " << path << endl; + setError( IO_ERROR ); + emit submitFinished( this ); + return; + } + + if( QFile::exists( path ) ) { + // if the category dir does not exists + // create it + + path += resultEntry().category; + + if( !QFile::exists( path ) ) { + if( !QDir().mkdir( path ) ) { + kdDebug() << "(K3bCddbLocalSubmit) could not create directory: " << path << endl; + setError( IO_ERROR ); + emit submitFinished( this ); + return; + } + } + + // we always overwrite existing entries + path += "/" + resultEntry().discid; + QFile entryFile( path ); + if( entryFile.exists() ) { + kdDebug() << "(K3bCddbLocalSubmit) file already exists: " << path << endl; + } + + if( !entryFile.open( IO_WriteOnly ) ) { + kdDebug() << "(K3bCddbLocalSubmit) could not create file: " << path << endl; + setError( IO_ERROR ); + emit submitFinished( this ); + } + else { + kdDebug() << "(K3bCddbLocalSubmit) creating file: " << path << endl; + QTextStream entryStream( &entryFile ); + entryStream.setEncoding( QTextStream::UnicodeUTF8 ); + entryStream << resultEntry().rawData; + entryFile.close(); + + setError( SUCCESS ); + emit submitFinished( this ); + } + } + else { + kdDebug() << "(K3bCddbLocalSubmit) could not find directory: " << path << endl; + setError( IO_ERROR ); + emit infoMessage( i18n("Could not find directory: %1").arg(path) ); + emit submitFinished( this ); + } +} + +#include "k3bcddblocalsubmit.moc" diff --git a/libk3b/cddb/k3bcddblocalsubmit.h b/libk3b/cddb/k3bcddblocalsubmit.h new file mode 100644 index 0000000..8b7ea91 --- /dev/null +++ b/libk3b/cddb/k3bcddblocalsubmit.h @@ -0,0 +1,43 @@ +/* + * + * $Id: k3bcddblocalsubmit.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef K3BCDDB_LOCAL_SUBMIT_H +#define K3BCDDB_LOCAL_SUBMIT_H + +#include "k3bcddbsubmit.h" + +#include + + +class K3bCddbLocalSubmit : public K3bCddbSubmit +{ + Q_OBJECT + + public: + K3bCddbLocalSubmit( QObject* parent = 0, const char* name = 0 ); + ~K3bCddbLocalSubmit(); + + public slots: + void setCddbDir( const QString& dir ) { m_cddbDir = dir; } + + protected slots: + void doSubmit(); + + private: + QString m_cddbDir; +}; + +#endif diff --git a/libk3b/cddb/k3bcddbmultientriesdialog.cpp b/libk3b/cddb/k3bcddbmultientriesdialog.cpp new file mode 100644 index 0000000..094176a --- /dev/null +++ b/libk3b/cddb/k3bcddbmultientriesdialog.cpp @@ -0,0 +1,74 @@ +/* + * + * $Id: k3bcddbmultientriesdialog.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include "k3bcddbmultientriesdialog.h" + +#include +#include +#include + +#include +#include + + + +K3bCddbMultiEntriesDialog::K3bCddbMultiEntriesDialog( QWidget* parent, const char* name ) + : KDialogBase( Plain, i18n("CDDB Database Entry"), Ok|Cancel, Ok, parent, name ) +{ + QFrame* frame = plainPage(); + QVBoxLayout* layout = new QVBoxLayout( frame ); + layout->setAutoAdd( true ); + layout->setSpacing( spacingHint() ); + layout->setMargin( 0 ); + + QLabel* infoLabel = new QLabel( i18n("K3b found multiple inexact CDDB entries. Please select one."), frame ); + infoLabel->setAlignment( WordBreak ); + + m_listBox = new KListBox( frame, "list_box"); + + setMinimumSize( 280, 200 ); +} + +K3bCddbResultHeader K3bCddbMultiEntriesDialog::selectCddbEntry( K3bCddbQuery* query, QWidget* parent ) +{ + K3bCddbMultiEntriesDialog d( parent ); + + const QValueList headers = query->getInexactMatches(); + + int i = 1; + for( QValueListConstIterator it = headers.begin(); + it != headers.end(); ++it ) { + d.m_listBox->insertItem( QString::number(i) + " " + + (*it).artist + " - " + + (*it).title + " (" + + (*it).category + ")" ); + ++i; + } + + d.m_listBox->setSelected( 0, true ); + + if( d.exec() == QDialog::Accepted ) + return headers[ d.m_listBox->currentItem() >= 0 ? d.m_listBox->currentItem() : 0 ]; + else + return K3bCddbResultHeader(); +} + + +K3bCddbMultiEntriesDialog::~K3bCddbMultiEntriesDialog(){ +} + + +#include "k3bcddbmultientriesdialog.moc" diff --git a/libk3b/cddb/k3bcddbmultientriesdialog.h b/libk3b/cddb/k3bcddbmultientriesdialog.h new file mode 100644 index 0000000..15cc6f8 --- /dev/null +++ b/libk3b/cddb/k3bcddbmultientriesdialog.h @@ -0,0 +1,48 @@ +/* + * + * $Id: k3bcddbmultientriesdialog.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef K3BCDDBMULTIENTRIESDIALOG_H +#define K3BCDDBMULTIENTRIESDIALOG_H + +#include + +#include "k3bcddbquery.h" +#include "k3bcddbresult.h" + + +class QStringList; +class KListBox; + +/** + *@author Sebastian Trueg + */ +class K3bCddbMultiEntriesDialog : public KDialogBase +{ + Q_OBJECT + + public: + ~K3bCddbMultiEntriesDialog(); + + static K3bCddbResultHeader selectCddbEntry( K3bCddbQuery* query, QWidget* parent = 0 ); + + protected: + K3bCddbMultiEntriesDialog( QWidget* parent = 0, const char* name = 0); + + private: + KListBox *m_listBox; +}; + +#endif diff --git a/libk3b/cddb/k3bcddbpquery.cpp b/libk3b/cddb/k3bcddbpquery.cpp new file mode 100644 index 0000000..fefc8e4 --- /dev/null +++ b/libk3b/cddb/k3bcddbpquery.cpp @@ -0,0 +1,278 @@ +/* + * + * $Id: k3bcddbpquery.cpp 619556 2007-01-03 17:38:12Z trueg $ + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include "k3bcddbpquery.h" + +#include +#include +#include + +#include +#include + + + + +K3bCddbpQuery::K3bCddbpQuery( QObject* parent, const char* name ) + :K3bCddbQuery( parent, name ) +{ + m_socket = new QSocket( this ); + m_stream.setDevice( m_socket ); + m_stream.setEncoding( QTextStream::UnicodeUTF8 ); + + connect( m_socket, SIGNAL(connected()), this, SLOT(slotConnected()) ); + connect( m_socket, SIGNAL(hostFound()), this, SLOT(slotHostFound()) ); + connect( m_socket, SIGNAL(connectionClosed()), this, SLOT(slotConnectionClosed()) ); + connect( m_socket, SIGNAL(error(int)), this, SLOT(slotError(int)) ); + connect( m_socket, SIGNAL(readyRead()), this, SLOT(slotReadyRead()) ); +} + + +K3bCddbpQuery::~K3bCddbpQuery() +{ + delete m_socket; +} + +void K3bCddbpQuery::doQuery() +{ + setError( WORKING ); + + m_state = GREETING; + + // connect to the server + + m_socket->connectToHost( m_server, m_port ); + emit infoMessage( i18n("Searching %1 on port %2").arg(m_server).arg(m_port) ); +} + + +void K3bCddbpQuery::doMatchQuery() +{ + // we should still be connected + // TODO: check this + + QString read = QString( "cddb read %1 %2").arg( header().category ).arg( header().discid ); + + m_state = READ; + m_parsingBuffer = ""; + + kdDebug() << "(K3bCddbpQuery) Read: " << read << endl; + + m_stream << read << endl << flush; +} + + +void K3bCddbpQuery::slotHostFound() +{ + emit infoMessage( i18n("Host found") ); +} + + +void K3bCddbpQuery::slotConnected() +{ + emit infoMessage( i18n("Connected") ); +} + + +void K3bCddbpQuery::slotConnectionClosed() +{ + emit infoMessage( i18n("Connection closed") ); + emitQueryFinished(); +} + + +void K3bCddbpQuery::cddbpQuit() +{ + m_state = QUIT; + m_stream << "quit" << endl << flush; +} + + +void K3bCddbpQuery::slotReadyRead() +{ + while( m_socket->canReadLine() ) { + QString line = m_stream.readLine(); + + // kdDebug() << "(K3bCddbpQuery) line: " << line << endl; + + switch( m_state ) { + case GREETING: + if( getCode( line ) == 200 || getCode( line ) == 201) { + emit infoMessage( i18n("OK, read access") ); + m_state = HANDSHAKE; + + m_stream << "cddb hello " << handshakeString() << endl << flush; + } + + else { + emit infoMessage( i18n("Connection refused") ); + setError( CONNECTION_ERROR ); + m_socket->close(); + } + break; + + case HANDSHAKE: + if( getCode( line ) == 200 ) { + emit infoMessage( i18n("Handshake successful") ); + + m_state = PROTO; + + m_stream << "proto 6" << endl << flush; + } + + else { + emit infoMessage( i18n("Handshake failed") ); // server closes connection + setError( CONNECTION_ERROR ); + m_socket->close(); // just to be sure + } + break; + + case PROTO: + { + if( getCode( line ) == 501 ) { + kdDebug() << "(K3bCddbpQuery) illigal protocol level!" << endl; + } + + // just ignore the reply since it's not important for the functionality + m_state = QUERY; + + m_stream << queryString() << endl << flush; + break; + } + + case QUERY: + if( getCode( line ) == 200 ) { + // parse exact match and send a read command + K3bCddbResultHeader header; + parseMatchHeader( line.mid( 4 ), header ); + + emit infoMessage( i18n("Found exact match") ); + + queryMatch( header ); + } + + else if( getCode( line ) == 210 ) { + // TODO: perhaps add an "exact" field to K3bCddbEntry + kdDebug() << "(K3bCddbpQuery) Found multiple exact matches" << endl; + + emit infoMessage( i18n("Found multiple exact matches") ); + + m_state = QUERY_DATA; + } + + else if( getCode( line ) == 211 ) { + kdDebug() << "(K3bCddbpQuery) Found inexact matches" << endl; + + emit infoMessage( i18n("Found inexact matches") ); + + m_state = QUERY_DATA; + } + + else if( getCode( line ) == 202 ) { + kdDebug() << "(K3bCddbpQuery) no match found" << endl; + emit infoMessage( i18n("No match found") ); + setError( NO_ENTRY_FOUND ); + cddbpQuit(); + } + + else { + kdDebug() << "(K3bCddbpQuery) Error while querying: " << line << endl; + emit infoMessage( i18n("Error while querying") ); + setError( QUERY_ERROR ); + cddbpQuit(); + } + break; + + case QUERY_DATA: + if( line.startsWith( "." ) ) { + // finished query + // go on reading + + emit inexactMatches( this ); + return; + } + else { + kdDebug() << "(K3bCddbpQuery) inexact match: " << line << endl; + K3bCddbResultHeader header; + parseMatchHeader( line, header ); + m_inexactMatches.append( header ); + } + break; + + case READ: + if( getCode( line ) == 210 ) { + + // we just start parsing the read data + m_state = READ_DATA; + } + + else { + emit infoMessage( i18n("Could not read match") ); + setError( READ_ERROR ); + cddbpQuit(); + } + break; + + + case READ_DATA: + + // kdDebug() << "(K3bCddbpQuery) parsing line: " << line << endl; + + if( line.startsWith( "." ) ) { + + kdDebug() << "(K3bCddbpQuery) query finished." << endl; + + QTextStream strStream( m_parsingBuffer, IO_ReadOnly ); + parseEntry( strStream, result() ); + + setError( SUCCESS ); + cddbpQuit(); + } + + else { + m_parsingBuffer.append(line + "\n"); + } + break; + + case QUIT: + // no parsing needed + break; + } + } +} + + +void K3bCddbpQuery::slotError( int e ) +{ + switch(e) { + case QSocket::ErrConnectionRefused: + kdDebug() << i18n("Connection to %1 refused").arg( m_server ) << endl; + emit infoMessage( i18n("Connection to %1 refused").arg( m_server ) ); + break; + case QSocket::ErrHostNotFound: + kdDebug() << i18n("Could not find host %1").arg( m_server ) << endl; + emit infoMessage( i18n("Could not find host %1").arg( m_server ) ); + break; + case QSocket::ErrSocketRead: + kdDebug() << i18n("Error while reading from %1").arg( m_server ) << endl; + emit infoMessage( i18n("Error while reading from %1").arg( m_server ) ); + break; + } + + m_socket->close(); + emitQueryFinished(); +} + +#include "k3bcddbpquery.moc" diff --git a/libk3b/cddb/k3bcddbpquery.h b/libk3b/cddb/k3bcddbpquery.h new file mode 100644 index 0000000..78fe5df --- /dev/null +++ b/libk3b/cddb/k3bcddbpquery.h @@ -0,0 +1,62 @@ +/* + * + * $Id: k3bcddbpquery.h 619556 2007-01-03 17:38:12Z trueg $ + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef K3BCDDBP_QUERY_H +#define K3BCDDBP_QUERY_H + +#include "k3bcddbquery.h" +#include "k3bcddbresult.h" + +#include +#include +#include + +class QSocket; + +class K3bCddbpQuery : public K3bCddbQuery +{ + Q_OBJECT + + public: + K3bCddbpQuery( QObject* parent = 0, const char* name = 0 ); + ~K3bCddbpQuery(); + + public slots: + void setServer( const QString& s, int port = 8080 ) { m_server = s; m_port = port; } + + protected slots: + void slotHostFound(); + void slotConnected(); + void slotConnectionClosed(); + void slotReadyRead(); + void slotError( int e ); + void doQuery(); + void doMatchQuery(); + + private: + void cddbpQuit(); + enum State { GREETING, HANDSHAKE, PROTO, QUERY, QUERY_DATA, READ, READ_DATA, QUIT }; + + int m_state; + QString m_server; + int m_port; + + QSocket* m_socket; + QTextStream m_stream; + + QString m_parsingBuffer; +}; + +#endif diff --git a/libk3b/cddb/k3bcddbquery.cpp b/libk3b/cddb/k3bcddbquery.cpp new file mode 100644 index 0000000..783f9a4 --- /dev/null +++ b/libk3b/cddb/k3bcddbquery.cpp @@ -0,0 +1,275 @@ +/* + * + * $Id: k3bcddbquery.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + + +#include "k3bcddbquery.h" + +#include "k3bcddbresult.h" + +#include +#include +#include +#include + + +#include +#include +#include +#include + +#include + + + + +K3bCddbQuery::K3bCddbQuery( QObject* parent, const char* name ) + : QObject(parent, name) +{ + m_bQueryFinishedEmited = false; +} + + +K3bCddbQuery::~K3bCddbQuery() +{ +} + + +void K3bCddbQuery::query( const K3bDevice::Toc& toc ) +{ + m_bQueryFinishedEmited = false; + m_toc = toc; + m_inexactMatches.clear(); + + QTimer::singleShot( 0, this, SLOT(doQuery()) ); +} + + +void K3bCddbQuery::queryMatch( const K3bCddbResultHeader& header ) +{ + m_header = header; + m_result = K3bCddbResultEntry(); + m_result.category = header.category; + m_result.discid = header.discid; + + QTimer::singleShot( 0, this, SLOT(doMatchQuery()) ); +} + + +const QStringList& K3bCddbQuery::categories() +{ + static QStringList s_cat = QStringList::split( ",", "rock,blues,misc,classical," + "country,data,folk,jazz,newage,reggae,soundtrack" ); + return s_cat; +} + + +bool K3bCddbQuery::parseEntry( QTextStream& stream, K3bCddbResultEntry& entry ) +{ + entry.rawData = ""; + + stream.setEncoding( QTextStream::UnicodeUTF8 ); + + // parse data + QString line; + while( !(line = stream.readLine()).isNull() ) { + entry.rawData.append(line + "\n"); + + // !all fields may be splitted into several lines! + + if( line.startsWith( "DISCID" ) ) { + // TODO: this could be several discids separated by comma! + } + + else if( line.startsWith( "DYEAR" ) ) { + QString year = line.mid( 6 ); + if( year.length() == 4 ) + entry.year = year.toInt(); + } + + else if( line.startsWith( "DGENRE" ) ) { + entry.genre = line.mid( 7 ); + } + + else if( line.startsWith( "DTITLE" ) ) { + entry.cdTitle += line.mid( 7 ); + } + + else if( line.startsWith( "TTITLE" ) ) { + int eqSgnPos = line.find( "=" ); + bool ok; + uint trackNum = (uint)line.mid( 6, eqSgnPos - 6 ).toInt( &ok ); + if( !ok ) + kdDebug() << "(K3bCddbQuery) !!! PARSE ERROR: " << line << endl; + else { + // kdDebug() << "(K3bCddbQuery) Track title for track " << trackNum << endl; + + // make sure the list is big enough + while( entry.titles.count() <= trackNum ) + entry.titles.append( "" ); + + entry.titles[trackNum] += line.mid( eqSgnPos+1 ); + } + } + + else if( line.startsWith( "EXTD" ) ) { + entry.cdExtInfo += line.mid( 5 ); + } + + else if( line.startsWith( "EXTT" ) ) { + int eqSgnPos = line.find( "=" ); + bool ok; + uint trackNum = (uint)line.mid( 4, eqSgnPos - 4 ).toInt( &ok ); + if( !ok ) + kdDebug() << "(K3bCddbQuery) !!! PARSE ERROR: " << line << endl; + else { + // kdDebug() << "(K3bCddbQuery) Track extr track " << trackNum << endl; + + // make sure the list is big enough + while( entry.extInfos.count() <= trackNum ) + entry.extInfos.append( "" ); + + entry.extInfos[trackNum] += line.mid( eqSgnPos+1 ); + } + } + + else if( line.startsWith( "#" ) ) { + // kdDebug() << "(K3bCddbQuery) comment: " << line << endl; + } + + else { + kdDebug() << "(K3bCddbQuery) Unknown field: " << line << endl; + } + } + + // now split the titles in the last added match + // if no " / " delimiter is present title and artist are the same + // ------------------------------------------------------------------- + QString fullTitle = entry.cdTitle; + int splitPos = fullTitle.find( " / " ); + if( splitPos < 0 ) + entry.cdArtist = fullTitle; + else { + // split + entry.cdTitle = fullTitle.mid( splitPos + 3 ); + entry.cdArtist = fullTitle.left( splitPos ); + } + + + for( QStringList::iterator it = entry.titles.begin(); + it != entry.titles.end(); ++it ) { + QString fullTitle = *it; + int splitPos = fullTitle.find( " / " ); + if( splitPos < 0 ) + entry.artists.append( entry.cdArtist ); + else { + // split + *it = fullTitle.mid( splitPos + 3 ); + entry.artists.append( fullTitle.left( splitPos ) ); + } + } + + + // replace all "\\n" with "\n" + for( QStringList::iterator it = entry.titles.begin(); + it != entry.titles.end(); ++it ) { + (*it).replace( "\\\\\\\\n", "\\n" ); + } + + for( QStringList::iterator it = entry.artists.begin(); + it != entry.artists.end(); ++it ) { + (*it).replace( "\\\\\\\\n", "\\n" ); + } + + for( QStringList::iterator it = entry.extInfos.begin(); + it != entry.extInfos.end(); ++it ) { + (*it).replace( "\\\\\\\\n", "\\n" ); + } + + entry.cdTitle.replace( "\\\\\\\\n", "\\n" ); + entry.cdArtist.replace( "\\\\\\\\n", "\\n" ); + entry.cdExtInfo.replace( "\\\\\\\\n", "\\n" ); + entry.genre.replace( "\\\\\\\\n", "\\n" ); + + return true; +} + + +int K3bCddbQuery::getCode( const QString& line ) +{ + bool ok; + int code = line.left( 3 ).toInt( &ok ); + if( !ok ) + code = -1; + return code; +} + + +QString K3bCddbQuery::handshakeString() const +{ + QString user( getenv("USER") ); + QString host( getenv("HOST") ); + if( user.isEmpty() ) + user = "kde-user"; + if( host.isEmpty() ) + host = "kde-host"; + + return QString("%1 %2 K3b %3").arg(user).arg(host).arg(kapp->aboutData()->version()); +} + + +QString K3bCddbQuery::queryString() const +{ + QString query = "cddb query " + + QString::number( m_toc.discId(), 16 ).rightJustify( 8, '0' ) + + " " + + QString::number( (unsigned int)m_toc.count() ); + + for( K3bDevice::Toc::const_iterator it = m_toc.begin(); it != m_toc.end(); ++it ) { + query.append( QString( " %1" ).arg( (*it).firstSector().lba() ) ); + } + + query.append( QString( " %1" ).arg( m_toc.length().lba() / 75 ) ); + + return query; +} + + +bool K3bCddbQuery::parseMatchHeader( const QString& line, K3bCddbResultHeader& header ) +{ + // format: category id title + // where title could be artist and title splitted with a / + header.category = line.section( ' ', 0, 0 ); + header.discid = line.section( ' ', 1, 1 ); + header.title = line.mid( header.category.length() + header.discid.length() + 2 ); + int slashPos = header.title.find( "/" ); + if( slashPos > 0 ) { + header.artist = header.title.left(slashPos).stripWhiteSpace(); + header.title = header.title.mid( slashPos+1 ).stripWhiteSpace(); + } + return true; +} + + +void K3bCddbQuery::emitQueryFinished() +{ + if( !m_bQueryFinishedEmited ) { + m_bQueryFinishedEmited = true; + emit queryFinished( this ); + } +} + + +#include "k3bcddbquery.moc" diff --git a/libk3b/cddb/k3bcddbquery.h b/libk3b/cddb/k3bcddbquery.h new file mode 100644 index 0000000..569e882 --- /dev/null +++ b/libk3b/cddb/k3bcddbquery.h @@ -0,0 +1,115 @@ +/* + * + * $Id: k3bcddbquery.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef K3BCDDB_QUERY_H +#define K3BCDDB_QUERY_H + +#include +#include +#include + +#include "k3bcddbresult.h" + +#include +#include "k3b_export.h" + + +class LIBK3B_EXPORT K3bCddbQuery : public QObject +{ + Q_OBJECT + + public: + K3bCddbQuery( QObject* parent = 0, const char* name = 0 ); + virtual ~K3bCddbQuery(); + + void query( const K3bDevice::Toc& ); + + /** + * Use this if the query returned multiple matches + */ + void queryMatch( const K3bCddbResultHeader& ); + + const K3bCddbResultEntry& result() const { return m_result; } + + /** + * After emitting the signal inexactMatches one has to choose one + * of these entries and query it with queryInexactMatch + */ + const QValueList& getInexactMatches() const { return m_inexactMatches; } + + static const QStringList& categories(); + + enum Error { SUCCESS = 0, + CANCELED, + NO_ENTRY_FOUND, + CONNECTION_ERROR, + QUERY_ERROR, + READ_ERROR, + FAILURE, + WORKING }; + + int error() const { return m_error; } + + signals: + /** + * This gets emitted if a single entry has been found or + * no entry has been found. + */ + void queryFinished( K3bCddbQuery* ); + + /** + * This gets emitted if multiple entries have been found. + * Call queryInexactMatch() after receiving it. + */ + void inexactMatches( K3bCddbQuery* ); + + void infoMessage( const QString& ); + + protected slots: + virtual void doQuery() = 0; + virtual void doMatchQuery() = 0; + + protected: + const K3bDevice::Toc& toc() const { return m_toc; } + K3bCddbResultHeader& header() { return m_header; } + K3bCddbResultEntry& result() { return m_result; } + void setError( int e ) { m_error = e; } + + bool parseEntry( QTextStream&, K3bCddbResultEntry& ); + int getCode( const QString& ); + QString handshakeString() const; + QString queryString() const; + bool parseMatchHeader( const QString& line, K3bCddbResultHeader& header ); + + /** + * since I'm not quite sure when the socket will emit connectionClosed + * this method makes sure the queryFinished signal + * gets emited only once. + */ + void emitQueryFinished(); + + QValueList m_inexactMatches; + + private: + K3bDevice::Toc m_toc; + K3bCddbResultEntry m_result; + K3bCddbResultHeader m_header; + int m_error; + + bool m_bQueryFinishedEmited; +}; + +#endif diff --git a/libk3b/cddb/k3bcddbresult.cpp b/libk3b/cddb/k3bcddbresult.cpp new file mode 100644 index 0000000..b33b16e --- /dev/null +++ b/libk3b/cddb/k3bcddbresult.cpp @@ -0,0 +1,49 @@ +/* + * + * $Id: k3bcddbresult.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + + +#include "k3bcddbresult.h" + + +K3bCddbResult::K3bCddbResult() +{ +} + + +void K3bCddbResult::clear() +{ + m_entries.clear(); +} + + +int K3bCddbResult::foundEntries() const +{ + return m_entries.count(); +} + +const K3bCddbResultEntry& K3bCddbResult::entry( unsigned int number ) const +{ + if( number >= m_entries.count() ) + return m_emptyEntry; + + return m_entries[number]; +} + + +void K3bCddbResult::addEntry( const K3bCddbResultEntry& entry ) +{ + m_entries.append( entry ); +} diff --git a/libk3b/cddb/k3bcddbresult.h b/libk3b/cddb/k3bcddbresult.h new file mode 100644 index 0000000..46dcb9a --- /dev/null +++ b/libk3b/cddb/k3bcddbresult.h @@ -0,0 +1,79 @@ +/* + * + * $Id: k3bcddbresult.h 768492 2008-01-30 08:39:42Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + + +#ifndef K3B_CDDB_RESULT_H +#define K3B_CDDB_RESULT_H + + +#include +#include "k3b_export.h" + + +class LIBK3B_EXPORT K3bCddbResultHeader +{ + public: + QString category; + QString title; + QString artist; + QString discid; +}; + + +class LIBK3B_EXPORT K3bCddbResultEntry +{ + public: + // just to set a default + K3bCddbResultEntry() + : category("misc"), + year(0) { + } + + QStringList titles; + QStringList artists; + QStringList extInfos; + + QString cdTitle; + QString cdArtist; + QString cdExtInfo; + + QString genre; + QString category; + int year; + QString discid; + + QString rawData; +}; + + +class LIBK3B_EXPORT K3bCddbResult +{ + public: + K3bCddbResult(); + // K3bCddbQuery( const K3bCddbQuery& ); + + void clear(); + void addEntry( const K3bCddbResultEntry& = K3bCddbResultEntry() ); + const K3bCddbResultEntry& entry( unsigned int number = 0 ) const; + int foundEntries() const; + + private: + QValueList m_entries; + + K3bCddbResultEntry m_emptyEntry; +}; + +#endif diff --git a/libk3b/cddb/k3bcddbsubmit.cpp b/libk3b/cddb/k3bcddbsubmit.cpp new file mode 100644 index 0000000..a04dbcb --- /dev/null +++ b/libk3b/cddb/k3bcddbsubmit.cpp @@ -0,0 +1,84 @@ +/* + * + * $Id: k3bcddbsubmit.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include "k3bcddbsubmit.h" + +#include + + +K3bCddbSubmit::K3bCddbSubmit( QObject* parent, const char* name ) + : QObject( parent, name ) +{ +} + + +K3bCddbSubmit::~K3bCddbSubmit() +{ +} + + +void K3bCddbSubmit::submit( const K3bCddbResultEntry& entry ) +{ + m_resultEntry = entry; + + if( m_resultEntry.rawData.isEmpty() ) + createDataStream( m_resultEntry ); + + QTimer::singleShot( 0, this, SLOT(doSubmit()) ); +} + + +void K3bCddbSubmit::createDataStream( K3bCddbResultEntry& entry ) +{ + entry.rawData.truncate(0); + + QTextStream ts( &entry.rawData, IO_WriteOnly ); + + ts << "#" << endl + << "# Submitted via: K3b" << endl + << "#" << endl; + + ts << "DISCID=" << entry.discid << endl + << "DTITLE=" << entry.cdArtist << " / " << entry.cdTitle << endl + << "DYEAR="; + if( entry.year > 0 ) + ts << entry.year; + ts << endl; + ts << "DGENRE=" << entry.genre << endl; + + bool allEqualArtist = true; + for( unsigned int i = 0; i < entry.artists.count(); ++i ) + if( entry.artists[i] != entry.cdArtist && + !entry.artists[i].isEmpty() ) { + allEqualArtist = false; + break; + } + + for( unsigned int i = 0; i < entry.titles.count(); ++i ) { + ts << "TTITLE" << i << "="; + if( !allEqualArtist ) + ts << entry.artists[i] << " / "; + ts << entry.titles[i] << endl; + } + + ts << "EXTD=" << entry.cdExtInfo << endl; + + for( unsigned int i = 0; i < entry.titles.count(); ++i ) { + ts << "EXTT" << i << "=" << entry.extInfos[i] << endl; + } +} + +#include "k3bcddbsubmit.moc" diff --git a/libk3b/cddb/k3bcddbsubmit.h b/libk3b/cddb/k3bcddbsubmit.h new file mode 100644 index 0000000..ff57101 --- /dev/null +++ b/libk3b/cddb/k3bcddbsubmit.h @@ -0,0 +1,60 @@ +/* + * + * $Id: k3bcddbsubmit.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef K3BCDDB_SUBMIT_H +#define K3BCDDB_SUBMIT_H + +#include +#include + +#include "k3bcddbresult.h" + + + +class K3bCddbSubmit : public QObject +{ + Q_OBJECT + + public: + K3bCddbSubmit( QObject* parent = 0, const char* name = 0 ); + virtual ~K3bCddbSubmit(); + + int error() const { return m_error; } + + enum State { SUCCESS, WORKING, IO_ERROR, CONNECTION_ERROR }; + + public slots: + void submit( const K3bCddbResultEntry& ); + + signals: + void infoMessage( const QString& ); + void submitFinished( K3bCddbSubmit* ); + + protected slots: + virtual void doSubmit() = 0; + void setError( int e ) { m_error = e; } + + protected: + K3bCddbResultEntry& resultEntry() { return m_resultEntry; } + + private: + void createDataStream( K3bCddbResultEntry& entry ); + + int m_error; + K3bCddbResultEntry m_resultEntry; +}; + +#endif diff --git a/libk3b/configure.in.in b/libk3b/configure.in.in new file mode 100644 index 0000000..af0c8f5 --- /dev/null +++ b/libk3b/configure.in.in @@ -0,0 +1,3 @@ +AC_CHECK_FUNCS(stat64) +AC_CHECK_HEADERS(sys/vfs.h) +AC_CHECK_HEADERS(sys/statvfs.h) diff --git a/libk3b/core/Makefile.am b/libk3b/core/Makefile.am new file mode 100644 index 0000000..3764d86 --- /dev/null +++ b/libk3b/core/Makefile.am @@ -0,0 +1,19 @@ +AM_CPPFLAGS = -I$(srcdir)/../../libk3bdevice -I$(srcdir)/../plugin -I$(srcdir)/../tools $(all_includes) + +noinst_LTLIBRARIES = libk3bcore.la + +libk3bcore_la_LIBADD = $(LIB_KIO) $(ARTSC_LIB) + +libk3bcore_la_LDFLAGS = $(all_libraries) + +libk3bcore_la_SOURCES = k3bcore.cpp k3bglobals.cpp k3bdefaultexternalprograms.cpp \ + k3bexternalbinmanager.cpp k3bversion.cpp k3bprocess.cpp k3bjob.cpp \ + k3bthread.cpp k3bthreadjob.cpp k3bglobalsettings.cpp k3bsimplejobhandler.cpp + +include_HEADERS = k3bcore.h k3bdefaultexternalprograms.h k3bexternalbinmanager.h \ + k3bprocess.h k3bversion.h k3bglobals.h k3bjob.h k3bthread.h \ + k3bthreadjob.h k3bglobalsettings.h k3bjobhandler.h \ + k3b_export.h k3bjobhandler.h k3bsimplejobhandler.h + +METASOURCES = AUTO + diff --git a/libk3b/core/k3b_export.h b/libk3b/core/k3b_export.h new file mode 100644 index 0000000..b6272f1 --- /dev/null +++ b/libk3b/core/k3b_export.h @@ -0,0 +1,33 @@ +/* + * + * $Id: sourceheader 511311 2006-02-19 14:51:05Z trueg $ + * Copyright (c) 2005 Laurent Montel + * Copyright (C) 2005-2007 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_EXPORT_H_ +#define _K3B_EXPORT_H_ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef __KDE_HAVE_GCC_VISIBILITY +#define LIBK3B_NO_EXPORT __attribute__ ((visibility("hidden"))) +#define LIBK3B_EXPORT __attribute__ ((visibility("default"))) +#else +#define LIBK3B_NO_EXPORT +#define LIBK3B_EXPORT +#endif + +#endif + diff --git a/libk3b/core/k3bcore.cpp b/libk3b/core/k3bcore.cpp new file mode 100644 index 0000000..c10fec0 --- /dev/null +++ b/libk3b/core/k3bcore.cpp @@ -0,0 +1,375 @@ +/* + * + * $Id: k3bcore.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include + +#include "k3bcore.h" +#include "k3bjob.h" + +#include +#ifdef HAVE_HAL +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + + +static Qt::HANDLE s_guiThreadHandle = QThread::currentThread(); + +// We cannot use QWaitCondition here since the event might be handled faster +// than the thread starts the waiting +class DeviceBlockingEventDoneCondition { +public: + DeviceBlockingEventDoneCondition() + : m_done(false) { + } + + void done() { + m_doneMutex.lock(); + m_done = true; + m_doneMutex.unlock(); + } + + void wait() { + while( true ) { + m_doneMutex.lock(); + bool done = m_done; + m_doneMutex.unlock(); + if( done ) + return; + } + } + +private: + QMutex m_doneMutex; + bool m_done; +}; + +class DeviceBlockingEvent : public QCustomEvent +{ +public: + DeviceBlockingEvent( bool block_, K3bDevice::Device* dev, DeviceBlockingEventDoneCondition* cond_, bool* success_ ) + : QCustomEvent( QEvent::User + 33 ), + block(block_), + device(dev), + cond(cond_), + success(success_) { + } + + bool block; + K3bDevice::Device* device; + DeviceBlockingEventDoneCondition* cond; + bool* success; +}; + + +class K3bCore::Private { +public: + Private() + : version( LIBK3B_VERSION ), + config(0), + deleteConfig(false), + deviceManager(0), + externalBinManager(0), + pluginManager(0), + globalSettings(0) { + } + + K3bVersion version; + KConfig* config; + bool deleteConfig; + K3bDevice::DeviceManager* deviceManager; + K3bExternalBinManager* externalBinManager; + K3bPluginManager* pluginManager; + K3bGlobalSettings* globalSettings; + + QValueList runningJobs; + QValueList blockedDevices; +}; + + + +K3bCore* K3bCore::s_k3bCore = 0; + + + +K3bCore::K3bCore( QObject* parent, const char* name ) + : QObject( parent, name ) +{ + d = new Private(); + + if( s_k3bCore ) + qFatal("ONLY ONE INSTANCE OF K3BCORE ALLOWED!"); + s_k3bCore = this; + + // create the thread widget instance in the GUI thread + K3bThreadWidget::instance(); +} + + +K3bCore::~K3bCore() +{ + s_k3bCore = 0; + + delete d->globalSettings; + delete d; +} + + +K3bDevice::DeviceManager* K3bCore::deviceManager() const +{ + const_cast(this)->initDeviceManager(); + return d->deviceManager; +} + + +K3bExternalBinManager* K3bCore::externalBinManager() const +{ + const_cast(this)->initExternalBinManager(); + return d->externalBinManager; +} + + +K3bPluginManager* K3bCore::pluginManager() const +{ + const_cast(this)->initPluginManager(); + return d->pluginManager; +} + + +K3bGlobalSettings* K3bCore::globalSettings() const +{ + const_cast(this)->initGlobalSettings(); + return d->globalSettings; +} + + +const K3bVersion& K3bCore::version() const +{ + return d->version; +} + + +KConfig* K3bCore::config() const +{ + if( !d->config ) { + kdDebug() << "(K3bCore) opening k3b config file." << endl; + kdDebug() << "(K3bCore) while I am a " << className() << endl; + d->deleteConfig = true; + d->config = new KConfig( "k3brc" ); + } + + return d->config; +} + + +void K3bCore::init() +{ + initGlobalSettings(); + initExternalBinManager(); + initDeviceManager(); + initPluginManager(); + + // load the plugins before doing anything else + // they might add external bins + pluginManager()->loadAll(); + + externalBinManager()->search(); + +#ifdef HAVE_HAL + connect( K3bDevice::HalConnection::instance(), SIGNAL(deviceAdded(const QString&)), + deviceManager(), SLOT(addDevice(const QString&)) ); + connect( K3bDevice::HalConnection::instance(), SIGNAL(deviceRemoved(const QString&)), + deviceManager(), SLOT(removeDevice(const QString&)) ); + QStringList devList = K3bDevice::HalConnection::instance()->devices(); + if( devList.isEmpty() ) + deviceManager()->scanBus(); + else + for( unsigned int i = 0; i < devList.count(); ++i ) + deviceManager()->addDevice( devList[i] ); +#else + deviceManager()->scanBus(); +#endif +} + + +void K3bCore::initGlobalSettings() +{ + if( !d->globalSettings ) + d->globalSettings = new K3bGlobalSettings(); +} + + +void K3bCore::initExternalBinManager() +{ + if( !d->externalBinManager ) { + d->externalBinManager = new K3bExternalBinManager( this ); + K3b::addDefaultPrograms( d->externalBinManager ); + } +} + + +void K3bCore::initDeviceManager() +{ + if( !d->deviceManager ) + d->deviceManager = new K3bDevice::DeviceManager( this ); +} + + +void K3bCore::initPluginManager() +{ + if( !d->pluginManager ) + d->pluginManager = new K3bPluginManager( this ); +} + + +void K3bCore::readSettings( KConfig* cnf ) +{ + KConfig* c = cnf; + if( !c ) + c = config(); + + QString oldGrp = c->group(); + + globalSettings()->readSettings( c ); + deviceManager()->readConfig( c ); + externalBinManager()->readConfig( c ); + + c->setGroup( oldGrp ); +} + + +void K3bCore::saveSettings( KConfig* cnf ) +{ + KConfig* c = cnf; + if( !c ) + c = config(); + + QString oldGrp = c->group(); + + c->setGroup( "General Options" ); + c->writeEntry( "config version", version() ); + + deviceManager()->saveConfig( c ); + externalBinManager()->saveConfig( c ); + d->globalSettings->saveSettings( c ); + + c->setGroup( oldGrp ); +} + + +void K3bCore::registerJob( K3bJob* job ) +{ + d->runningJobs.append( job ); + emit jobStarted( job ); + if( K3bBurnJob* bj = dynamic_cast( job ) ) + emit burnJobStarted( bj ); +} + + +void K3bCore::unregisterJob( K3bJob* job ) +{ + d->runningJobs.remove( job ); + emit jobFinished( job ); + if( K3bBurnJob* bj = dynamic_cast( job ) ) + emit burnJobFinished( bj ); +} + + +bool K3bCore::jobsRunning() const +{ + return !d->runningJobs.isEmpty(); +} + + +const QValueList& K3bCore::runningJobs() const +{ + return d->runningJobs; +} + + +bool K3bCore::blockDevice( K3bDevice::Device* dev ) +{ + if( QThread::currentThread() == s_guiThreadHandle ) { + return internalBlockDevice( dev ); + } + else { + bool success = false; + DeviceBlockingEventDoneCondition w; + QApplication::postEvent( this, new DeviceBlockingEvent( true, dev, &w, &success ) ); + w.wait(); + return success; + } +} + + +void K3bCore::unblockDevice( K3bDevice::Device* dev ) +{ + if( QThread::currentThread() == s_guiThreadHandle ) { + internalUnblockDevice( dev ); + } + else { + DeviceBlockingEventDoneCondition w; + QApplication::postEvent( this, new DeviceBlockingEvent( false, dev, &w, 0 ) ); + w.wait(); + } +} + + +bool K3bCore::internalBlockDevice( K3bDevice::Device* dev ) +{ + if( !d->blockedDevices.contains( dev ) ) { + d->blockedDevices.append( dev ); + return true; + } + else + return false; +} + + +void K3bCore::internalUnblockDevice( K3bDevice::Device* dev ) +{ + d->blockedDevices.remove( dev ); +} + + +void K3bCore::customEvent( QCustomEvent* e ) +{ + if( DeviceBlockingEvent* de = dynamic_cast(e) ) { + if( de->block ) + *de->success = internalBlockDevice( de->device ); + else + internalUnblockDevice( de->device ); + de->cond->done(); + } +} + +#include "k3bcore.moc" diff --git a/libk3b/core/k3bcore.h b/libk3b/core/k3bcore.h new file mode 100644 index 0000000..ce73e32 --- /dev/null +++ b/libk3b/core/k3bcore.h @@ -0,0 +1,181 @@ +/* + * + * $Id: k3bcore.h 733470 2007-11-06 12:10:29Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef _K3B_CORE_H_ +#define _K3B_CORE_H_ + +#include +#include + +#include "k3b_export.h" + + +#define LIBK3B_VERSION "1.0.5" + +#define k3bcore K3bCore::k3bCore() + + +class K3bExternalBinManager; +class K3bVersion; +class KConfig; +class KAboutData; +class K3bJob; +class K3bBurnJob; +class K3bGlobalSettings; +class K3bPluginManager; +class QCustomEvent; + + +namespace K3bDevice { + class DeviceManager; + class Device; +} + + +/** + * The K3b core takes care of the managers. + * This has been separated from K3bApplication to + * make creating a K3bPart easy. + * This is the heart of the K3b system. Every plugin may use this + * to get the information it needs. + */ +class LIBK3B_EXPORT K3bCore : public QObject +{ + Q_OBJECT + + public: + /** + * Although K3bCore is a singlelton it's constructor is not private to make inheritance + * possible. Just make sure to only create one instance. + */ + K3bCore( QObject* parent = 0, const char* name = 0 ); + virtual ~K3bCore(); + + const QValueList& runningJobs() const; + + /** + * Equals to !runningJobs().isEmpty() + */ + bool jobsRunning() const; + + /** + * The default implementation calls add four initXXX() methods, + * scans for devices, applications, and reads the global settings. + */ + virtual void init(); + + /** + * @param c if 0 K3bCore uses the K3b configuration + */ + virtual void readSettings( KConfig* c = 0 ); + + /** + * @param c if 0 K3bCore uses the K3b configuration + */ + virtual void saveSettings( KConfig* c = 0 ); + + /** + * If this is reimplemented it is recommended to also reimplement + * init(). + */ + virtual K3bDevice::DeviceManager* deviceManager() const; + + /** + * Returns the external bin manager from K3bCore. + * + * By default K3bCore only adds the default programs: + * cdrecord, cdrdao, growisofs, mkisofs, dvd+rw-format, readcd + * + * If you need other programs you have to add them manually like this: + *

externalBinManager()->addProgram( new K3bNormalizeProgram() );
+ */ + K3bExternalBinManager* externalBinManager() const; + K3bPluginManager* pluginManager() const; + + /** + * Global settings used throughout libk3b. Change the settings directly in the + * K3bGlobalSettings object. They will be saved by K3bCore::saveSettings + */ + K3bGlobalSettings* globalSettings() const; + + /** + * returns the version of the library as defined by LIBK3B_VERSION + */ + const K3bVersion& version() const; + + /** + * Default implementation returns the K3b configuration from k3brc. + * Normally this should not be used. + */ + virtual KConfig* config() const; + + /** + * Used by the writing jobs to block a device. + * This makes sure no device is used twice within libk3b + * + * When using this method in a job be aware that reimplementations might + * open dialogs and resulting in a blocking call. + * + * This method calls internalBlockDevice() to do the actual work. + */ + bool blockDevice( K3bDevice::Device* ); + void unblockDevice( K3bDevice::Device* ); + + static K3bCore* k3bCore() { return s_k3bCore; } + + signals: + /** + * Emitted once a new job has been started. This includes burn jobs. + */ + void jobStarted( K3bJob* ); + void burnJobStarted( K3bBurnJob* ); + void jobFinished( K3bJob* ); + void burnJobFinished( K3bBurnJob* ); + + public slots: + /** + * Every running job registers itself with the core. + * For now this is only used to determine if some job + * is running. + */ + void registerJob( K3bJob* job ); + void unregisterJob( K3bJob* job ); + + protected: + /** + * Reimplement this to add additonal checks. + * + * This method is thread safe. blockDevice makes sure + * it is only executed in the GUI thread. + */ + virtual bool internalBlockDevice( K3bDevice::Device* ); + virtual void internalUnblockDevice( K3bDevice::Device* ); + + virtual void initGlobalSettings(); + virtual void initExternalBinManager(); + virtual void initDeviceManager(); + virtual void initPluginManager(); + + virtual void customEvent( QCustomEvent* e ); + + private: + class Private; + Private* d; + + static K3bCore* s_k3bCore; +}; + +#endif diff --git a/libk3b/core/k3bdataevent.h b/libk3b/core/k3bdataevent.h new file mode 100644 index 0000000..b6a4334 --- /dev/null +++ b/libk3b/core/k3bdataevent.h @@ -0,0 +1,48 @@ +/* + * + * $Id: k3bdataevent.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef K3B_DATA_EVENT_H +#define K3B_DATA_EVENT_H + +#include + + +/** + * Custom event class for posting events corresponding to the + * K3bJob signals. This is useful for a threaded job since + * in that case it's not possible to emit signals that directly + * change the GUI (see QThread docu). + */ +class K3bDataEvent : public QCustomEvent +{ + public: + // make sure we get not in the way of K3bProgressInfoEvent + static const int EVENT_TYPE = QEvent::User + 100; + + K3bDataEvent( const char* data, int len ) + : QCustomEvent( EVENT_TYPE ), + m_data(data), + m_length(len) + {} + + const char* data() const { return m_data; } + int length() const { return m_length; } + + private: + const char* m_data; + int m_length; +}; + +#endif diff --git a/libk3b/core/k3bdefaultexternalprograms.cpp b/libk3b/core/k3bdefaultexternalprograms.cpp new file mode 100644 index 0000000..b654d22 --- /dev/null +++ b/libk3b/core/k3bdefaultexternalprograms.cpp @@ -0,0 +1,1030 @@ +/* + * + * $Id: k3bdefaultexternalprograms.cpp 731898 2007-11-02 08:22:18Z trueg $ + * Copyright (C) 2003-2007 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include "k3bdefaultexternalprograms.h" +#include "k3bexternalbinmanager.h" +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + + + +void K3b::addDefaultPrograms( K3bExternalBinManager* m ) +{ + m->addProgram( new K3bCdrecordProgram(false) ); + m->addProgram( new K3bMkisofsProgram() ); + m->addProgram( new K3bReadcdProgram() ); + m->addProgram( new K3bCdrdaoProgram() ); + m->addProgram( new K3bGrowisofsProgram() ); + m->addProgram( new K3bDvdformatProgram() ); + // m->addProgram( new K3bDvdBooktypeProgram() ); +} + + +void K3b::addTranscodePrograms( K3bExternalBinManager* m ) +{ + static const char* transcodeTools[] = { "transcode", + 0, // K3b 1.0 only uses the transcode binary + "tcprobe", + "tccat", + "tcscan", + "tcextract", + "tcdecode", + 0 }; + + for( int i = 0; transcodeTools[i]; ++i ) + m->addProgram( new K3bTranscodeProgram( transcodeTools[i] ) ); +} + + +void K3b::addVcdimagerPrograms( K3bExternalBinManager* m ) +{ + // don't know if we need more vcdTools in the future (vcdxrip) + static const char* vcdTools[] = { "vcdxbuild", + "vcdxminfo", + "vcdxrip", + 0 }; + + for( int i = 0; vcdTools[i]; ++i ) + m->addProgram( new K3bVcdbuilderProgram( vcdTools[i] ) ); +} + + +K3bCdrecordProgram::K3bCdrecordProgram( bool dvdPro ) + : K3bExternalProgram( dvdPro ? "cdrecord-prodvd" : "cdrecord" ), + m_dvdPro(dvdPro) +{ +} + + +// +// This is a hack for Debian based systems which use +// a wrapper cdrecord script to call cdrecord.mmap or cdrecord.shm +// depending on the kernel version. +// For 2.0.x and 2.2.x kernels the shm version is used. In all +// other cases it's the mmap version. +// +// But since it may be that someone manually installed cdrecord +// replacing the wrapper we check if cdrecord is a script. +// +static QString& debianWeirdnessHack( QString& path ) +{ + if( QFile::exists( path + ".mmap" ) ) { + kdDebug() << "(K3bCdrecordProgram) checking for Debian cdrecord wrapper script." << endl; + if( QFileInfo( path ).size() < 1024 ) { + kdDebug() << "(K3bCdrecordProgram) Debian Wrapper script size fits. Checking file." << endl; + QFile f( path ); + f.open( IO_ReadOnly ); + QString s = QTextStream( &f ).read(); + if( s.contains( "cdrecord.mmap" ) && s.contains( "cdrecord.shm" ) ) { + kdDebug() << "(K3bCdrecordProgram) Found Debian Wrapper script." << endl; + QString ext; + if( K3b::kernelVersion().versionString().left(3) > "2.2" ) + ext = ".mmap"; + else + ext = ".shm"; + + kdDebug() << "(K3bCdrecordProgram) Using cdrecord" << ext << endl; + + path += ext; + } + } + } + + return path; +} + + +bool K3bCdrecordProgram::scan( const QString& p ) +{ + if( p.isEmpty() ) + return false; + + bool wodim = false; + QString path = p; + QFileInfo fi( path ); + if( fi.isDir() ) { + if( path[path.length()-1] != '/' ) + path.append("/"); + + if( QFile::exists( path + "wodim" ) ) { + wodim = true; + path += "wodim"; + } + else if( QFile::exists( path + "cdrecord" ) ) { + path += "cdrecord"; + } + else + return false; + } + + debianWeirdnessHack( path ); + + K3bExternalBin* bin = 0; + + // probe version + KProcess vp; + K3bProcessOutputCollector out( &vp ); + + vp << path << "-version"; + if( vp.start( KProcess::Block, KProcess::AllOutput ) ) { + int pos = -1; + if( wodim ) { + pos = out.output().find( "Wodim" ); + } + else if( m_dvdPro ) { + pos = out.output().find( "Cdrecord-ProDVD" ); + } + else { + pos = out.output().find( "Cdrecord" ); + } + + if( pos < 0 ) + return false; + + pos = out.output().find( QRegExp("[0-9]"), pos ); + if( pos < 0 ) + return false; + + int endPos = out.output().find( QRegExp("\\s"), pos+1 ); + if( endPos < 0 ) + return false; + + bin = new K3bExternalBin( this ); + bin->path = path; + bin->version = out.output().mid( pos, endPos-pos ); + + if( wodim ) + bin->addFeature( "wodim" ); + + pos = out.output().find( "Copyright") + 14; + endPos = out.output().find( "\n", pos ); + + // cdrecord does not use local encoding for the copyright statement but plain latin1 + bin->copyright = QString::fromLatin1( out.output().mid( pos, endPos-pos ).local8Bit() ).stripWhiteSpace(); + } + else { + kdDebug() << "(K3bCdrecordProgram) could not start " << path << endl; + return false; + } + + if( !m_dvdPro && bin->version.suffix().endsWith( "-dvd" ) ) { + bin->addFeature( "dvd-patch" ); + bin->version = QString(bin->version.versionString()).remove("-dvd"); + } + + // probe features + KProcess fp; + out.setProcess( &fp ); + fp << path << "-help"; + if( fp.start( KProcess::Block, KProcess::AllOutput ) ) { + if( out.output().contains( "gracetime" ) ) + bin->addFeature( "gracetime" ); + if( out.output().contains( "-overburn" ) ) + bin->addFeature( "overburn" ); + if( out.output().contains( "-text" ) ) + bin->addFeature( "cdtext" ); + if( out.output().contains( "-clone" ) ) + bin->addFeature( "clone" ); + if( out.output().contains( "-tao" ) ) + bin->addFeature( "tao" ); + if( out.output().contains( "cuefile=" ) && + ( wodim || bin->version > K3bVersion( 2, 1, -1, "a14") ) ) // cuefile handling was still buggy in a14 + bin->addFeature( "cuefile" ); + + // new mode 2 options since cdrecord 2.01a12 + // we use both checks here since the help was not updated in 2.01a12 yet (well, I + // just double-checked and the help page is proper but there is no harm in having + // two checks) + // and the version check does not handle versions like 2.01-dvd properly + if( out.output().contains( "-xamix" ) || + bin->version >= K3bVersion( 2, 1, -1, "a12" ) || + wodim ) + bin->addFeature( "xamix" ); + + // check if we run cdrecord as root + struct stat s; + if( !::stat( QFile::encodeName(path), &s ) ) { + if( (s.st_mode & S_ISUID) && s.st_uid == 0 ) + bin->addFeature( "suidroot" ); + } + } + else { + kdDebug() << "(K3bCdrecordProgram) could not start " << bin->path << endl; + delete bin; + return false; + } + + if( bin->version < K3bVersion( 2, 0 ) && !wodim ) + bin->addFeature( "outdated" ); + + // FIXME: are these version correct? + if( bin->version >= K3bVersion("1.11a38") || wodim ) + bin->addFeature( "plain-atapi" ); + if( bin->version > K3bVersion("1.11a17") || wodim ) + bin->addFeature( "hacked-atapi" ); + + if( bin->version >= K3bVersion( 2, 1, 1, "a02" ) || wodim ) + bin->addFeature( "short-track-raw" ); + + if( bin->version >= K3bVersion( 2, 1, -1, "a13" ) || wodim ) + bin->addFeature( "audio-stdin" ); + + if( bin->version >= K3bVersion( "1.11a02" ) || wodim ) + bin->addFeature( "burnfree" ); + else + bin->addFeature( "burnproof" ); + + addBin( bin ); + return true; +} + + + +K3bMkisofsProgram::K3bMkisofsProgram() + : K3bExternalProgram( "mkisofs" ) +{ +} + +bool K3bMkisofsProgram::scan( const QString& p ) +{ + if( p.isEmpty() ) + return false; + + bool genisoimage = false; + QString path = p; + QFileInfo fi( path ); + if( fi.isDir() ) { + if( path[path.length()-1] != '/' ) + path.append("/"); + + if( QFile::exists( path + "genisoimage" ) ) { + genisoimage = true; + path += "genisoimage"; + } + else if( QFile::exists( path + "mkisofs" ) ) { + path += "mkisofs"; + } + else + return false; + } + + K3bExternalBin* bin = 0; + + // probe version + KProcess vp; + vp << path << "-version"; + K3bProcessOutputCollector out( &vp ); + if( vp.start( KProcess::Block, KProcess::AllOutput ) ) { + int pos = -1; + if( genisoimage ) + pos = out.output().find( "genisoimage" ); + else + pos = out.output().find( "mkisofs" ); + + if( pos < 0 ) + return false; + + pos = out.output().find( QRegExp("[0-9]"), pos ); + if( pos < 0 ) + return false; + + int endPos = out.output().find( ' ', pos+1 ); + if( endPos < 0 ) + return false; + + bin = new K3bExternalBin( this ); + bin->path = path; + bin->version = out.output().mid( pos, endPos-pos ); + + if( genisoimage ) + bin->addFeature( "genisoimage" ); + } + else { + kdDebug() << "(K3bMkisofsProgram) could not start " << path << endl; + return false; + } + + + + // probe features + KProcess fp; + fp << path << "-help"; + out.setProcess( &fp ); + if( fp.start( KProcess::Block, KProcess::AllOutput ) ) { + if( out.output().contains( "-udf" ) ) + bin->addFeature( "udf" ); + if( out.output().contains( "-dvd-video" ) ) + bin->addFeature( "dvd-video" ); + if( out.output().contains( "-joliet-long" ) ) + bin->addFeature( "joliet-long" ); + if( out.output().contains( "-xa" ) ) + bin->addFeature( "xa" ); + if( out.output().contains( "-sectype" ) ) + bin->addFeature( "sectype" ); + + // check if we run mkisofs as root + struct stat s; + if( !::stat( QFile::encodeName(path), &s ) ) { + if( (s.st_mode & S_ISUID) && s.st_uid == 0 ) + bin->addFeature( "suidroot" ); + } + } + else { + kdDebug() << "(K3bMkisofsProgram) could not start " << bin->path << endl; + delete bin; + return false; + } + + if( bin->version < K3bVersion( 1, 14) && !genisoimage ) + bin->addFeature( "outdated" ); + + if( bin->version >= K3bVersion( 1, 15, -1, "a40" ) || genisoimage ) + bin->addFeature( "backslashed_filenames" ); + + if ( genisoimage && bin->version >= K3bVersion( 1, 1, 4 ) ) + bin->addFeature( "no-4gb-limit" ); + + if ( !genisoimage && bin->version >= K3bVersion( 2, 1, 1, "a32" ) ) + bin->addFeature( "no-4gb-limit" ); + + addBin(bin); + return true; +} + + +K3bReadcdProgram::K3bReadcdProgram() + : K3bExternalProgram( "readcd" ) +{ +} + +bool K3bReadcdProgram::scan( const QString& p ) +{ + if( p.isEmpty() ) + return false; + + bool readom = false; + QString path = p; + QFileInfo fi( path ); + if( fi.isDir() ) { + if( path[path.length()-1] != '/' ) + path.append("/"); + + if( QFile::exists( path + "readom" ) ) { + readom = true; + path += "readom"; + } + else if( QFile::exists( path + "readcd" ) ) { + path += "readcd"; + } + else + return false; + } + + if( !QFile::exists( path ) ) + return false; + + K3bExternalBin* bin = 0; + + // probe version + KProcess vp; + vp << path << "-version"; + K3bProcessOutputCollector out( &vp ); + if( vp.start( KProcess::Block, KProcess::AllOutput ) ) { + int pos = -1; + if( readom ) + pos = out.output().find( "readom" ); + else + pos = out.output().find( "readcd" ); + if( pos < 0 ) + return false; + + pos = out.output().find( QRegExp("[0-9]"), pos ); + if( pos < 0 ) + return false; + + int endPos = out.output().find( ' ', pos+1 ); + if( endPos < 0 ) + return false; + + bin = new K3bExternalBin( this ); + bin->path = path; + bin->version = out.output().mid( pos, endPos-pos ); + + if( readom ) + bin->addFeature( "readom" ); + } + else { + kdDebug() << "(K3bMkisofsProgram) could not start " << path << endl; + return false; + } + + + + // probe features + KProcess fp; + fp << path << "-help"; + out.setProcess( &fp ); + if( fp.start( KProcess::Block, KProcess::AllOutput ) ) { + if( out.output().contains( "-clone" ) ) + bin->addFeature( "clone" ); + + // check if we run mkisofs as root + struct stat s; + if( !::stat( QFile::encodeName(path), &s ) ) { + if( (s.st_mode & S_ISUID) && s.st_uid == 0 ) + bin->addFeature( "suidroot" ); + } + } + else { + kdDebug() << "(K3bReadcdProgram) could not start " << bin->path << endl; + delete bin; + return false; + } + + + // FIXME: are these version correct? + if( bin->version >= K3bVersion("1.11a38") || readom ) + bin->addFeature( "plain-atapi" ); + if( bin->version > K3bVersion("1.11a17") || readom ) + bin->addFeature( "hacked-atapi" ); + + addBin(bin); + return true; +} + + +K3bCdrdaoProgram::K3bCdrdaoProgram() + : K3bExternalProgram( "cdrdao" ) +{ +} + +bool K3bCdrdaoProgram::scan( const QString& p ) +{ + if( p.isEmpty() ) + return false; + + QString path = p; + QFileInfo fi( path ); + if( fi.isDir() ) { + if( path[path.length()-1] != '/' ) + path.append("/"); + path.append("cdrdao"); + } + + if( !QFile::exists( path ) ) + return false; + + K3bExternalBin* bin = 0; + + // probe version + KProcess vp; + vp << path ; + K3bProcessOutputCollector out( &vp ); + if( vp.start( KProcess::Block, KProcess::AllOutput ) ) { + int pos = out.output().find( "Cdrdao version" ); + if( pos < 0 ) + return false; + + pos = out.output().find( QRegExp("[0-9]"), pos ); + if( pos < 0 ) + return false; + + int endPos = out.output().find( ' ', pos+1 ); + if( endPos < 0 ) + return false; + + bin = new K3bExternalBin( this ); + bin->path = path; + bin->version = out.output().mid( pos, endPos-pos ); + + pos = out.output().find( "(C)", endPos+1 ) + 4; + endPos = out.output().find( '\n', pos ); + bin->copyright = out.output().mid( pos, endPos-pos ); + } + else { + kdDebug() << "(K3bCdrdaoProgram) could not start " << path << endl; + return false; + } + + + + // probe features + KProcess fp; + fp << path << "write" << "-h"; + out.setProcess( &fp ); + if( fp.start( KProcess::Block, KProcess::AllOutput ) ) { + if( out.output().contains( "--overburn" ) ) + bin->addFeature( "overburn" ); + if( out.output().contains( "--multi" ) ) + bin->addFeature( "multisession" ); + + if( out.output().contains( "--buffer-under-run-protection" ) ) + bin->addFeature( "disable-burnproof" ); + + // check if we run cdrdao as root + struct stat s; + if( !::stat( QFile::encodeName(path), &s ) ) { + if( (s.st_mode & S_ISUID) && s.st_uid == 0 ) + bin->addFeature( "suidroot" ); + } + } + else { + kdDebug() << "(K3bCdrdaoProgram) could not start " << bin->path << endl; + delete bin; + return false; + } + + + // SuSE 9.0 ships with a patched cdrdao 1.1.7 which contains an updated libschily + // Gentoo ships with a patched cdrdao 1.1.7 which contains scglib support + if( bin->version > K3bVersion( 1, 1, 7 ) || + bin->version == K3bVersion( 1, 1, 7, "-gentoo" ) || + bin->version == K3bVersion( 1, 1, 7, "-suse" ) ) { + // bin->addFeature( "plain-atapi" ); + bin->addFeature( "hacked-atapi" ); + } + + if( bin->version >= K3bVersion( 1, 1, 8 ) ) + bin->addFeature( "plain-atapi" ); + + addBin(bin); + return true; +} + + +K3bTranscodeProgram::K3bTranscodeProgram( const QString& transcodeProgram ) + : K3bExternalProgram( transcodeProgram ), + m_transcodeProgram( transcodeProgram ) +{ +} + +bool K3bTranscodeProgram::scan( const QString& p ) +{ + if( p.isEmpty() ) + return false; + + QString path = p; + if( path[path.length()-1] != '/' ) + path.append("/"); + + QString appPath = path + m_transcodeProgram; + + if( !QFile::exists( appPath ) ) + return false; + + K3bExternalBin* bin = 0; + + // probe version + KProcess vp; + vp << appPath << "-v"; + K3bProcessOutputCollector out( &vp ); + if( vp.start( KProcess::Block, KProcess::AllOutput ) ) { + int pos = out.output().find( "transcode v" ); + if( pos < 0 ) + return false; + + pos += 11; + + int endPos = out.output().find( QRegExp("[\\s\\)]"), pos+1 ); + if( endPos < 0 ) + return false; + + bin = new K3bExternalBin( this ); + bin->path = appPath; + bin->version = out.output().mid( pos, endPos-pos ); + } + else { + kdDebug() << "(K3bTranscodeProgram) could not start " << appPath << endl; + return false; + } + + // + // Check features + // + QString modInfoBin = path + "tcmodinfo"; + KProcess modp; + modp << modInfoBin << "-p"; + out.setProcess( &modp ); + if( modp.start( KProcess::Block, KProcess::AllOutput ) ) { + QString modPath = out.output().stripWhiteSpace(); + QDir modDir( modPath ); + if( !modDir.entryList( "*export_xvid*", QDir::Files ).isEmpty() ) + bin->addFeature( "xvid" ); + if( !modDir.entryList( "*export_lame*", QDir::Files ).isEmpty() ) + bin->addFeature( "lame" ); + if( !modDir.entryList( "*export_ffmpeg*", QDir::Files ).isEmpty() ) + bin->addFeature( "ffmpeg" ); + if( !modDir.entryList( "*export_ac3*", QDir::Files ).isEmpty() ) + bin->addFeature( "ac3" ); + } + + addBin(bin); + return true; +} + + + +K3bVcdbuilderProgram::K3bVcdbuilderProgram( const QString& p ) + : K3bExternalProgram( p ), + m_vcdbuilderProgram( p ) +{ +} + +bool K3bVcdbuilderProgram::scan( const QString& p ) +{ + if( p.isEmpty() ) + return false; + + QString path = p; + QFileInfo fi( path ); + if( fi.isDir() ) { + if( path[path.length()-1] != '/' ) + path.append("/"); + path.append(m_vcdbuilderProgram); + } + + if( !QFile::exists( path ) ) + return false; + + K3bExternalBin* bin = 0; + + // probe version + KProcess vp; + vp << path << "-V"; + K3bProcessOutputCollector out( &vp ); + if( vp.start( KProcess::Block, KProcess::AllOutput ) ) { + int pos = out.output().find( "GNU VCDImager" ); + if( pos < 0 ) + return false; + + pos += 14; + + int endPos = out.output().find( QRegExp("[\\n\\)]"), pos+1 ); + if( endPos < 0 ) + return false; + + bin = new K3bExternalBin( this ); + bin->path = path; + bin->version = out.output().mid( pos, endPos-pos ).stripWhiteSpace(); + + pos = out.output().find( "Copyright" ) + 14; + endPos = out.output().find( "\n", pos ); + bin->copyright = out.output().mid( pos, endPos-pos ).stripWhiteSpace(); + } + else { + kdDebug() << "(K3bVcdbuilderProgram) could not start " << path << endl; + return false; + } + + addBin(bin); + return true; +} + + +K3bNormalizeProgram::K3bNormalizeProgram() + : K3bExternalProgram( "normalize-audio" ) +{ +} + + +bool K3bNormalizeProgram::scan( const QString& p ) +{ + if( p.isEmpty() ) + return false; + + QString path = p; + QFileInfo fi( path ); + if( fi.isDir() ) { + if( path[path.length()-1] != '/' ) + path.append("/"); + path.append("normalize-audio"); + } + + if( !QFile::exists( path ) ) + return false; + + K3bExternalBin* bin = 0; + + // probe version + KProcess vp; + K3bProcessOutputCollector out( &vp ); + + vp << path << "--version"; + if( vp.start( KProcess::Block, KProcess::AllOutput ) ) { + int pos = out.output().find( "normalize" ); + if( pos < 0 ) + return false; + + pos = out.output().find( QRegExp("\\d"), pos ); + if( pos < 0 ) + return false; + + int endPos = out.output().find( QRegExp("\\s"), pos+1 ); + if( endPos < 0 ) + return false; + + bin = new K3bExternalBin( this ); + bin->path = path; + bin->version = out.output().mid( pos, endPos-pos ); + + pos = out.output().find( "Copyright" )+14; + endPos = out.output().find( "\n", pos ); + bin->copyright = out.output().mid( pos, endPos-pos ).stripWhiteSpace(); + } + else { + kdDebug() << "(K3bCdrecordProgram) could not start " << path << endl; + return false; + } + + addBin( bin ); + return true; +} + + +K3bGrowisofsProgram::K3bGrowisofsProgram() + : K3bExternalProgram( "growisofs" ) +{ +} + +bool K3bGrowisofsProgram::scan( const QString& p ) +{ + if( p.isEmpty() ) + return false; + + QString path = p; + QFileInfo fi( path ); + if( fi.isDir() ) { + if( path[path.length()-1] != '/' ) + path.append("/"); + path.append("growisofs"); + } + + if( !QFile::exists( path ) ) + return false; + + K3bExternalBin* bin = 0; + + // probe version + KProcess vp; + K3bProcessOutputCollector out( &vp ); + + vp << path << "-version"; + if( vp.start( KProcess::Block, KProcess::AllOutput ) ) { + int pos = out.output().find( "growisofs" ); + if( pos < 0 ) + return false; + + pos = out.output().find( QRegExp("\\d"), pos ); + if( pos < 0 ) + return false; + + int endPos = out.output().find( ",", pos+1 ); + if( endPos < 0 ) + return false; + + bin = new K3bExternalBin( this ); + bin->path = path; + bin->version = out.output().mid( pos, endPos-pos ); + } + else { + kdDebug() << "(K3bGrowisofsProgram) could not start " << path << endl; + return false; + } + + // fixed Copyright: + bin->copyright = "Andy Polyakov "; + + // check if we run growisofs as root + struct stat s; + if( !::stat( QFile::encodeName(path), &s ) ) { + if( (s.st_mode & S_ISUID) && s.st_uid == 0 ) + bin->addFeature( "suidroot" ); + } + + addBin( bin ); + return true; +} + + +K3bDvdformatProgram::K3bDvdformatProgram() + : K3bExternalProgram( "dvd+rw-format" ) +{ +} + +bool K3bDvdformatProgram::scan( const QString& p ) +{ + if( p.isEmpty() ) + return false; + + QString path = p; + QFileInfo fi( path ); + if( fi.isDir() ) { + if( path[path.length()-1] != '/' ) + path.append("/"); + path.append("dvd+rw-format"); + } + + if( !QFile::exists( path ) ) + return false; + + K3bExternalBin* bin = 0; + + // probe version + KProcess vp; + K3bProcessOutputCollector out( &vp ); + + vp << path; + if( vp.start( KProcess::Block, KProcess::AllOutput ) ) { + // different locales make searching for the +- char difficult + // so we simply ignore it. + int pos = out.output().find( QRegExp("DVD.*RAM format utility") ); + if( pos < 0 ) + return false; + + pos = out.output().find( "version", pos ); + if( pos < 0 ) + return false; + + pos += 8; + + // the version ends in a dot. + int endPos = out.output().find( QRegExp("\\.\\D"), pos ); + if( endPos < 0 ) + return false; + + bin = new K3bExternalBin( this ); + bin->path = path; + bin->version = out.output().mid( pos, endPos-pos ); + } + else { + kdDebug() << "(K3bDvdformatProgram) could not start " << path << endl; + return false; + } + + // fixed Copyright: + bin->copyright = "Andy Polyakov "; + + // check if we run dvd+rw-format as root + struct stat s; + if( !::stat( QFile::encodeName(path), &s ) ) { + if( (s.st_mode & S_ISUID) && s.st_uid == 0 ) + bin->addFeature( "suidroot" ); + } + + addBin( bin ); + return true; +} + + +K3bDvdBooktypeProgram::K3bDvdBooktypeProgram() + : K3bExternalProgram( "dvd+rw-booktype" ) +{ +} + +bool K3bDvdBooktypeProgram::scan( const QString& p ) +{ + if( p.isEmpty() ) + return false; + + QString path = p; + QFileInfo fi( path ); + if( fi.isDir() ) { + if( path[path.length()-1] != '/' ) + path.append("/"); + path.append("dvd+rw-booktype"); + } + + if( !QFile::exists( path ) ) + return false; + + K3bExternalBin* bin = 0; + + // probe version + KProcess vp; + K3bProcessOutputCollector out( &vp ); + + vp << path; + if( vp.start( KProcess::Block, KProcess::AllOutput ) ) { + int pos = out.output().find( "dvd+rw-booktype" ); + if( pos < 0 ) + return false; + + bin = new K3bExternalBin( this ); + bin->path = path; + // No version information. Create dummy version + bin->version = K3bVersion( 1, 0, 0 ); + } + else { + kdDebug() << "(K3bDvdBooktypeProgram) could not start " << path << endl; + return false; + } + + addBin( bin ); + return true; +} + + + +K3bCdda2wavProgram::K3bCdda2wavProgram() + : K3bExternalProgram( "cdda2wav" ) +{ +} + +bool K3bCdda2wavProgram::scan( const QString& p ) +{ + if( p.isEmpty() ) + return false; + + QString path = p; + QFileInfo fi( path ); + if( fi.isDir() ) { + if( path[path.length()-1] != '/' ) + path.append("/"); + path.append("cdda2wav"); + } + + if( !QFile::exists( path ) ) + return false; + + K3bExternalBin* bin = 0; + + // probe version + KProcess vp; + K3bProcessOutputCollector out( &vp ); + + vp << path << "-h"; + if( vp.start( KProcess::Block, KProcess::AllOutput ) ) { + int pos = out.output().find( "cdda2wav" ); + if( pos < 0 ) + return false; + + pos = out.output().find( "Version", pos ); + if( pos < 0 ) + return false; + + pos += 8; + + // the version does not end in a space but the kernel info + int endPos = out.output().find( QRegExp("[^\\d\\.]"), pos ); + if( endPos < 0 ) + return false; + + bin = new K3bExternalBin( this ); + bin->path = path; + bin->version = out.output().mid( pos, endPos-pos ); + + // features (we do this since the cdda2wav help says that the short + // options will disappear soon) + if( out.output().find( "-info-only" ) ) + bin->addFeature( "info-only" ); // otherwise use the -J option + if( out.output().find( "-no-infofile" ) ) + bin->addFeature( "no-infofile" ); // otherwise use the -H option + if( out.output().find( "-gui" ) ) + bin->addFeature( "gui" ); // otherwise use the -g option + if( out.output().find( "-bulk" ) ) + bin->addFeature( "bulk" ); // otherwise use the -B option + if( out.output().find( "dev=" ) ) + bin->addFeature( "dev" ); // otherwise use the -B option + } + else { + kdDebug() << "(K3bCdda2wavProgram) could not start " << path << endl; + return false; + } + + // check if we run as root + struct stat s; + if( !::stat( QFile::encodeName(path), &s ) ) { + if( (s.st_mode & S_ISUID) && s.st_uid == 0 ) + bin->addFeature( "suidroot" ); + } + + addBin( bin ); + return true; +} + diff --git a/libk3b/core/k3bdefaultexternalprograms.h b/libk3b/core/k3bdefaultexternalprograms.h new file mode 100644 index 0000000..3212727 --- /dev/null +++ b/libk3b/core/k3bdefaultexternalprograms.h @@ -0,0 +1,143 @@ +/* + * + * $Id: k3bdefaultexternalprograms.h 623768 2007-01-15 13:33:55Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + + +#ifndef _K3B_DEFAULT_EXTERNAL_BIN_PROGRAMS_H_ +#define _K3B_DEFAULT_EXTERNAL_BIN_PROGRAMS_H_ + +#include "k3bexternalbinmanager.h" +#include "k3b_export.h" +class K3bExternalBinManager; + +namespace K3b +{ + LIBK3B_EXPORT void addDefaultPrograms( K3bExternalBinManager* ); + LIBK3B_EXPORT void addTranscodePrograms( K3bExternalBinManager* ); + LIBK3B_EXPORT void addVcdimagerPrograms( K3bExternalBinManager* ); +} + + +class LIBK3B_EXPORT K3bCdrecordProgram : public K3bExternalProgram +{ + public: + K3bCdrecordProgram( bool dvdPro ); + + bool scan( const QString& ); + + private: + bool m_dvdPro; +}; + + +class LIBK3B_EXPORT K3bMkisofsProgram : public K3bExternalProgram +{ + public: + K3bMkisofsProgram(); + + bool scan( const QString& ); +}; + + +class LIBK3B_EXPORT K3bReadcdProgram : public K3bExternalProgram +{ + public: + K3bReadcdProgram(); + + bool scan( const QString& ); +}; + + +class LIBK3B_EXPORT K3bCdrdaoProgram : public K3bExternalProgram +{ + public: + K3bCdrdaoProgram(); + + bool scan( const QString& ); +}; + + +class LIBK3B_EXPORT K3bTranscodeProgram : public K3bExternalProgram +{ + public: + K3bTranscodeProgram( const QString& transcodeProgram ); + + bool scan( const QString& ); + + // no user parameters (yet) + bool supportsUserParameters() const { return false; } + + private: + QString m_transcodeProgram; +}; + + +class LIBK3B_EXPORT K3bVcdbuilderProgram : public K3bExternalProgram +{ + public: + K3bVcdbuilderProgram( const QString& ); + + bool scan( const QString& ); + + private: + QString m_vcdbuilderProgram; +}; + + +class LIBK3B_EXPORT K3bNormalizeProgram : public K3bExternalProgram +{ + public: + K3bNormalizeProgram(); + + bool scan( const QString& ); +}; + + +class LIBK3B_EXPORT K3bGrowisofsProgram : public K3bExternalProgram +{ + public: + K3bGrowisofsProgram(); + + bool scan( const QString& ); +}; + + +class LIBK3B_EXPORT K3bDvdformatProgram : public K3bExternalProgram +{ + public: + K3bDvdformatProgram(); + + bool scan( const QString& ); +}; + + +class LIBK3B_EXPORT K3bDvdBooktypeProgram : public K3bExternalProgram +{ + public: + K3bDvdBooktypeProgram(); + + bool scan( const QString& ); +}; + + +class LIBK3B_EXPORT K3bCdda2wavProgram : public K3bExternalProgram +{ + public: + K3bCdda2wavProgram(); + + bool scan( const QString& ); +}; + +#endif diff --git a/libk3b/core/k3bexternalbinmanager.cpp b/libk3b/core/k3bexternalbinmanager.cpp new file mode 100644 index 0000000..2b21a85 --- /dev/null +++ b/libk3b/core/k3bexternalbinmanager.cpp @@ -0,0 +1,389 @@ +/* + * + * $Id: k3bexternalbinmanager.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bexternalbinmanager.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + + + +QString K3bExternalBinManager::m_noPath = ""; + + +// /////////////////////////////////////////////////////////// +// +// K3BEXTERNALBIN +// +// /////////////////////////////////////////////////////////// + +K3bExternalBin::K3bExternalBin( K3bExternalProgram* p ) + : m_program(p) +{ +} + + +bool K3bExternalBin::isEmpty() const +{ + return !version.isValid(); +} + + +const QString& K3bExternalBin::name() const +{ + return m_program->name(); +} + + +bool K3bExternalBin::hasFeature( const QString& f ) const +{ + return m_features.contains( f ); +} + + +void K3bExternalBin::addFeature( const QString& f ) +{ + m_features.append( f ); +} + + +const QStringList& K3bExternalBin::userParameters() const +{ + return m_program->userParameters(); +} + + + +// /////////////////////////////////////////////////////////// +// +// K3BEXTERNALPROGRAM +// +// /////////////////////////////////////////////////////////// + + +K3bExternalProgram::K3bExternalProgram( const QString& name ) + : m_name( name ) +{ + m_bins.setAutoDelete( true ); +} + + +K3bExternalProgram::~K3bExternalProgram() +{ +} + + +const K3bExternalBin* K3bExternalProgram::mostRecentBin() const +{ + QPtrListIterator it( m_bins ); + K3bExternalBin* bin = *it; + ++it; + while( *it ) { + if( it.current()->version > bin->version ) + bin = *it; + ++it; + } + return bin; +} + + +void K3bExternalProgram::addBin( K3bExternalBin* bin ) +{ + if( !m_bins.contains( bin ) ) { + // insertion sort + // the first bin in the list is always the one used + // so we default to using the newest one + K3bExternalBin* oldBin = m_bins.first(); + while( oldBin && oldBin->version > bin->version ) + oldBin = m_bins.next(); + + m_bins.insert( oldBin ? m_bins.at() : m_bins.count(), bin ); + } +} + +void K3bExternalProgram::setDefault( const K3bExternalBin* bin ) +{ + if( m_bins.contains( bin ) ) + m_bins.take( m_bins.find( bin ) ); + + // the first bin in the list is always the one used + m_bins.insert( 0, bin ); +} + + +void K3bExternalProgram::setDefault( const QString& path ) +{ + for( QPtrListIterator it( m_bins ); it.current(); ++it ) { + if( it.current()->path == path ) { + setDefault( it.current() ); + return; + } + } +} + + +void K3bExternalProgram::addUserParameter( const QString& p ) +{ + if( !m_userParameters.contains( p ) ) + m_userParameters.append(p); +} + + + +// /////////////////////////////////////////////////////////// +// +// K3BEXTERNALBINMANAGER +// +// /////////////////////////////////////////////////////////// + + +K3bExternalBinManager::K3bExternalBinManager( QObject* parent, const char* name ) + : QObject( parent, name ) +{ +} + + +K3bExternalBinManager::~K3bExternalBinManager() +{ + clear(); +} + + +bool K3bExternalBinManager::readConfig( KConfig* c ) +{ + loadDefaultSearchPath(); + + c->setGroup( "External Programs" ); + + if( c->hasKey( "search path" ) ) + setSearchPath( c->readPathListEntry( "search path" ) ); + + search(); + + for ( QMap::iterator it = m_programs.begin(); it != m_programs.end(); ++it ) { + K3bExternalProgram* p = it.data(); + if( c->hasKey( p->name() + " default" ) ) { + p->setDefault( c->readEntry( p->name() + " default" ) ); + } + if( c->hasKey( p->name() + " user parameters" ) ) { + QStringList list = c->readListEntry( p->name() + " user parameters" ); + for( QStringList::iterator strIt = list.begin(); strIt != list.end(); ++strIt ) + p->addUserParameter( *strIt ); + } + if( c->hasKey( p->name() + " last seen newest version" ) ) { + K3bVersion lastMax( c->readEntry( p->name() + " last seen newest version" ) ); + // now search for a newer version and use it (because it was installed after the last + // K3b run and most users would probably expect K3b to use a newly installed version) + const K3bExternalBin* newestBin = p->mostRecentBin(); + if( newestBin && newestBin->version > lastMax ) + p->setDefault( newestBin ); + } + } + + return true; +} + +bool K3bExternalBinManager::saveConfig( KConfig* c ) +{ + c->setGroup( "External Programs" ); + c->writePathEntry( "search path", m_searchPath ); + + for ( QMap::iterator it = m_programs.begin(); it != m_programs.end(); ++it ) { + K3bExternalProgram* p = it.data(); + if( p->defaultBin() ) + c->writeEntry( p->name() + " default", p->defaultBin()->path ); + + c->writeEntry( p->name() + " user parameters", p->userParameters() ); + + const K3bExternalBin* newestBin = p->mostRecentBin(); + if( newestBin ) + c->writeEntry( p->name() + " last seen newest version", newestBin->version ); + } + + return true; +} + + +bool K3bExternalBinManager::foundBin( const QString& name ) +{ + if( m_programs.find( name ) == m_programs.end() ) + return false; + else + return (m_programs[name]->defaultBin() != 0); +} + + +const QString& K3bExternalBinManager::binPath( const QString& name ) +{ + if( m_programs.find( name ) == m_programs.end() ) + return m_noPath; + + if( m_programs[name]->defaultBin() != 0 ) + return m_programs[name]->defaultBin()->path; + else + return m_noPath; +} + + +const K3bExternalBin* K3bExternalBinManager::binObject( const QString& name ) +{ + if( m_programs.find( name ) == m_programs.end() ) + return 0; + + return m_programs[name]->defaultBin(); +} + + +void K3bExternalBinManager::addProgram( K3bExternalProgram* p ) +{ + m_programs.insert( p->name(), p ); +} + + +void K3bExternalBinManager::clear() +{ + for( QMap::Iterator it = m_programs.begin(); it != m_programs.end(); ++it ) + delete it.data(); + m_programs.clear(); +} + + +void K3bExternalBinManager::search() +{ + if( m_searchPath.isEmpty() ) + loadDefaultSearchPath(); + + for( QMap::iterator it = m_programs.begin(); it != m_programs.end(); ++it ) { + it.data()->clear(); + } + + // do not search one path twice + QStringList paths; + for( QStringList::const_iterator it = m_searchPath.begin(); it != m_searchPath.end(); ++it ) { + QString p = *it; + if( p[p.length()-1] == '/' ) + p.truncate( p.length()-1 ); + if( !paths.contains( p ) && !paths.contains( p + "/" ) ) + paths.append(p); + } + + // get the environment path variable + char* env_path = ::getenv("PATH"); + if( env_path ) { + QStringList env_pathList = QStringList::split(":", QString::fromLocal8Bit(env_path)); + for( QStringList::const_iterator it = env_pathList.begin(); it != env_pathList.end(); ++it ) { + QString p = *it; + if( p[p.length()-1] == '/' ) + p.truncate( p.length()-1 ); + if( !paths.contains( p ) && !paths.contains( p + "/" ) ) + paths.append(p); + } + } + + + for( QStringList::const_iterator it = paths.begin(); it != paths.end(); ++it ) + for( QMap::iterator pit = m_programs.begin(); pit != m_programs.end(); ++pit ) + pit.data()->scan(*it); + + // TESTING + // ///////////////////////// + const K3bExternalBin* bin = program("cdrecord")->defaultBin(); + + if( !bin ) { + kdDebug() << "(K3bExternalBinManager) Probing cdrecord failed" << endl; + } + else { + kdDebug() << "(K3bExternalBinManager) Cdrecord " << bin->version << " features: " + << bin->features().join( ", " ) << endl; + + if( bin->version >= K3bVersion("1.11a02") ) + kdDebug() << "(K3bExternalBinManager) " + << bin->version.majorVersion() << " " << bin->version.minorVersion() << " " << bin->version.patchLevel() + << " " << bin->version.suffix() + << " seems to be cdrecord version >= 1.11a02, using burnfree instead of burnproof" << endl; + if( bin->version >= K3bVersion("1.11a31") ) + kdDebug() << "(K3bExternalBinManager) seems to be cdrecord version >= 1.11a31, support for Just Link via burnfree " + << "driveroption" << endl; + } +} + + +K3bExternalProgram* K3bExternalBinManager::program( const QString& name ) const +{ + if( m_programs.find( name ) == m_programs.end() ) + return 0; + else + return m_programs[name]; +} + + +void K3bExternalBinManager::loadDefaultSearchPath() +{ + static const char* defaultSearchPaths[] = { "/usr/bin/", + "/usr/local/bin/", + "/usr/sbin/", + "/usr/local/sbin/", + "/opt/schily/bin/", + "/sbin", + 0 }; + + m_searchPath.clear(); + for( int i = 0; defaultSearchPaths[i]; ++i ) { + m_searchPath.append( defaultSearchPaths[i] ); + } +} + + +void K3bExternalBinManager::setSearchPath( const QStringList& list ) +{ + loadDefaultSearchPath(); + + for( QStringList::const_iterator it = list.begin(); it != list.end(); ++it ) { + if( !m_searchPath.contains( *it ) ) + m_searchPath.append( *it ); + } +} + + +void K3bExternalBinManager::addSearchPath( const QString& path ) +{ + if( !m_searchPath.contains( path ) ) + m_searchPath.append( path ); +} + + + +const K3bExternalBin* K3bExternalBinManager::mostRecentBinObject( const QString& name ) +{ + if( K3bExternalProgram* p = program( name ) ) + return p->mostRecentBin(); + else + return 0; +} + +#include "k3bexternalbinmanager.moc" + diff --git a/libk3b/core/k3bexternalbinmanager.h b/libk3b/core/k3bexternalbinmanager.h new file mode 100644 index 0000000..e7fe601 --- /dev/null +++ b/libk3b/core/k3bexternalbinmanager.h @@ -0,0 +1,162 @@ +/* + * + * $Id: k3bexternalbinmanager.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef K3B_EXTERNAL_BIN_MANAGER_H +#define K3B_EXTERNAL_BIN_MANAGER_H + +#include +#include +#include +#include +#include +#include "k3b_export.h" +#include "k3bversion.h" + +class KConfig; +class KProcess; + + +class K3bExternalProgram; + + +/** + * A K3bExternalBin represents an installed version of a program. + * All K3bExternalBin objects are managed by K3bExternalPrograms. + * + * A bin may have certain features that are represented by a string. + */ +class LIBK3B_EXPORT K3bExternalBin +{ + public: + K3bExternalBin( K3bExternalProgram* ); + virtual ~K3bExternalBin() {} + + K3bVersion version; + QString path; + QString copyright; + + const QString& name() const; + bool isEmpty() const; + const QStringList& userParameters() const; + const QStringList& features() const { return m_features; } + + bool hasFeature( const QString& ) const; + void addFeature( const QString& ); + + K3bExternalProgram* program() const { return m_program; } + + private: + QStringList m_features; + K3bExternalProgram* m_program; +}; + + +/** + * This is the main class that represents a program + * It's scan method has to be reimplemented for every program + * It manages a list of K3bExternalBin-objects that each represent + * one installed version of the program. + */ +class LIBK3B_EXPORT K3bExternalProgram +{ + public: + K3bExternalProgram( const QString& name ); + virtual ~K3bExternalProgram(); + + const K3bExternalBin* defaultBin() const { return m_bins.getFirst(); } + const K3bExternalBin* mostRecentBin() const; + + void addUserParameter( const QString& ); + void setUserParameters( const QStringList& list ) { m_userParameters = list; } + + const QStringList& userParameters() const { return m_userParameters; } + const QString& name() const { return m_name; } + + void addBin( K3bExternalBin* ); + void clear() { m_bins.clear(); } + void setDefault( const K3bExternalBin* ); + void setDefault( const QString& path ); + + const QPtrList& bins() const { return m_bins; } + + /** + * this scans for the program in the given path, + * adds the found bin object to the list and returnes true. + * if nothing could be found false is returned. + */ + virtual bool scan( const QString& ) {return false;}//= 0; + + /** + * reimplement this if it does not make sense to have the user be able + * to specify additional parameters + */ + virtual bool supportsUserParameters() const { return true; } + + private: + QString m_name; + QStringList m_userParameters; + QPtrList m_bins; +}; + + +class LIBK3B_EXPORT K3bExternalBinManager : public QObject +{ + Q_OBJECT + + public: + K3bExternalBinManager( QObject* parent = 0, const char* name = 0 ); + ~K3bExternalBinManager(); + + void search(); + + /** + * read config and add changes to current map. + * Takes care of setting the config group + */ + bool readConfig( KConfig* ); + + /** + * Takes care of setting the config group + */ + bool saveConfig( KConfig* ); + + bool foundBin( const QString& name ); + const QString& binPath( const QString& name ); + const K3bExternalBin* binObject( const QString& name ); + const K3bExternalBin* mostRecentBinObject( const QString& name ); + + K3bExternalProgram* program( const QString& ) const; + const QMap& programs() const { return m_programs; } + + /** always extends the default searchpath */ + void setSearchPath( const QStringList& ); + void addSearchPath( const QString& ); + void loadDefaultSearchPath(); + + const QStringList& searchPath() const { return m_searchPath; } + + void addProgram( K3bExternalProgram* ); + void clear(); + + private: + QMap m_programs; + QStringList m_searchPath; + + static QString m_noPath; // used for binPath() to return const string + + QString m_gatheredOutput; +}; + +#endif diff --git a/libk3b/core/k3bglobals.cpp b/libk3b/core/k3bglobals.cpp new file mode 100644 index 0000000..fc5a4e1 --- /dev/null +++ b/libk3b/core/k3bglobals.cpp @@ -0,0 +1,634 @@ +/* + * + * $Id: k3bglobals.cpp 659634 2007-04-30 14:51:32Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include + + +#include "k3bglobals.h" +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#if defined(__FreeBSD__) || defined(__NetBSD__) +# include +# include +# include +# define bswap_16(x) bswap16(x) +# define bswap_32(x) bswap32(x) +# define bswap_64(x) bswap64(x) +#else +# include +#endif +#ifdef HAVE_SYS_STATVFS_H +# include +#endif +#ifdef HAVE_SYS_VFS_H +# include +#endif + + +/* +struct Sample { + unsigned char msbLeft; + unsigned char lsbLeft; + unsigned char msbRight; + unsigned char lsbRight; + + short left() const { + return ( msbLeft << 8 ) | lsbLeft; + } + short right() const { + return ( msbRight << 8 ) | lsbRight; + } + void left( short d ) { + msbLeft = d >> 8; + lsbLeft = d; + } + void right( short d ) { + msbRight = d >> 8; + lsbRight = d; + } +}; +*/ + +QString K3b::framesToString( int h, bool showFrames ) +{ + int m = h / 4500; + int s = (h % 4500) / 75; + int f = h % 75; + + QString str; + + if( showFrames ) { + // cdrdao needs the MSF format where 1 second has 75 frames! + str.sprintf( "%.2i:%.2i:%.2i", m, s, f ); + } + else + str.sprintf( "%.2i:%.2i", m, s ); + + return str; +} + +/*QString K3b::sizeToTime(long size) +{ + int h = size / sizeof(Sample) / 588; + return framesToString(h, false); +}*/ + + +Q_INT16 K3b::swapByteOrder( const Q_INT16& i ) +{ + return bswap_16( i ); + //((i << 8) & 0xff00) | ((i >> 8 ) & 0xff); +} + + +Q_INT32 K3b::swapByteOrder( const Q_INT32& i ) +{ + //return ((i << 24) & 0xff000000) | ((i << 8) & 0xff0000) | ((i >> 8) & 0xff00) | ((i >> 24) & 0xff ); + return bswap_32( i ); +} + + +Q_INT64 K3b::swapByteOrder( const Q_INT64& i ) +{ + return bswap_64( i ); +} + + +int K3b::round( double d ) +{ + return (int)( floor(d) + 0.5 <= d ? ceil(d) : floor(d) ); +} + + +QString K3b::findUniqueFilePrefix( const QString& _prefix, const QString& path ) +{ + QString url; + if( path.isEmpty() || !QFile::exists(path) ) + url = defaultTempPath(); + else + url = prepareDir( path ); + + QString prefix = _prefix; + if( prefix.isEmpty() ) + prefix = "k3b_"; + + // now create the unique prefix + QDir dir( url ); + QStringList entries = dir.entryList( QDir::DefaultFilter, QDir::Name ); + int i = 0; + for( QStringList::iterator it = entries.begin(); + it != entries.end(); ++it ) { + if( (*it).startsWith( prefix + QString::number(i) ) ) { + i++; + it = entries.begin(); + } + } + + return url + prefix + QString::number(i); +} + + +QString K3b::findTempFile( const QString& ending, const QString& d ) +{ + return findUniqueFilePrefix( "k3b_", d ) + ( ending.isEmpty() ? QString::null : (QString::fromLatin1(".") + ending) ); +} + + +QString K3b::defaultTempPath() +{ + QString oldGroup = kapp->config()->group(); + kapp->config()->setGroup( "General Options" ); + QString url = kapp->config()->readPathEntry( "Temp Dir", KGlobal::dirs()->resourceDirs( "tmp" ).first() ); + kapp->config()->setGroup( oldGroup ); + return prepareDir(url); +} + + +QString K3b::prepareDir( const QString& dir ) +{ + return (dir + (dir[dir.length()-1] != '/' ? "/" : "")); +} + + +QString K3b::parentDir( const QString& path ) +{ + QString parent = path; + if( path[path.length()-1] == '/' ) + parent.truncate( parent.length()-1 ); + + int pos = parent.findRev( '/' ); + if( pos >= 0 ) + parent.truncate( pos+1 ); + else // relative path, do anything... + parent = "/"; + + return parent; +} + + +QString K3b::fixupPath( const QString& path ) +{ + QString s; + bool lastWasSlash = false; + for( unsigned int i = 0; i < path.length(); ++i ) { + if( path[i] == '/' ) { + if( !lastWasSlash ) { + lastWasSlash = true; + s.append( "/" ); + } + } + else { + lastWasSlash = false; + s.append( path[i] ); + } + } + + return s; +} + + +K3bVersion K3b::kernelVersion() +{ + // initialize kernel version + K3bVersion v; + utsname unameinfo; + if( ::uname(&unameinfo) == 0 ) { + v = QString::fromLocal8Bit( unameinfo.release ); + kdDebug() << "kernel version: " << v << endl; + } + else + kdError() << "could not determine kernel version." << endl; + return v; +} + + +K3bVersion K3b::simpleKernelVersion() +{ + return kernelVersion().simplify(); +} + + +QString K3b::systemName() +{ + QString v; + utsname unameinfo; + if( ::uname(&unameinfo) == 0 ) { + v = QString::fromLocal8Bit( unameinfo.sysname ); + } + else + kdError() << "could not determine system name." << endl; + return v; +} + + +bool K3b::kbFreeOnFs( const QString& path, unsigned long& size, unsigned long& avail ) +{ + struct statvfs fs; + if( ::statvfs( QFile::encodeName(path), &fs ) == 0 ) { + unsigned long kBfak = fs.f_frsize/1024; + + size = fs.f_blocks*kBfak; + avail = fs.f_bavail*kBfak; + + return true; + } + else + return false; +} + + +KIO::filesize_t K3b::filesize( const KURL& url ) +{ + if( url.isLocalFile() ) { + k3b_struct_stat buf; + if ( !k3b_stat( QFile::encodeName( url.path() ), &buf ) ) { + return (KIO::filesize_t)buf.st_size; + } + } + + KIO::UDSEntry uds; + KIO::NetAccess::stat( url, uds, 0 ); + for( KIO::UDSEntry::const_iterator it = uds.begin(); it != uds.end(); ++it ) { + if( (*it).m_uds == KIO::UDS_SIZE ) { + return (*it).m_long; + } + } + + return ( KIO::filesize_t )0; +} + + +KIO::filesize_t K3b::imageFilesize( const KURL& url ) +{ + KIO::filesize_t size = K3b::filesize( url ); + int cnt = 0; + while( KIO::NetAccess::exists( KURL::fromPathOrURL( url.url() + '.' + QString::number(cnt).rightJustify( 3, '0' ) ), true ) ) + size += K3b::filesize( KURL::fromPathOrURL( url.url() + '.' + QString::number(cnt++).rightJustify( 3, '0' ) ) ); + return size; +} + + +QString K3b::cutFilename( const QString& name, unsigned int len ) +{ + if( name.length() > len ) { + QString ret = name; + + // determine extension (we think of an extension to be at most 5 chars in length) + int pos = name.find( '.', -6 ); + if( pos > 0 ) + len -= (name.length() - pos); + + ret.truncate( len ); + + if( pos > 0 ) + ret.append( name.mid( pos ) ); + + return ret; + } + else + return name; +} + + +QString K3b::removeFilenameExtension( const QString& name ) +{ + QString v = name; + int dotpos = v.findRev( '.' ); + if( dotpos > 0 ) + v.truncate( dotpos ); + return v; +} + + +QString K3b::appendNumberToFilename( const QString& name, int num, unsigned int maxlen ) +{ + // determine extension (we think of an extension to be at most 5 chars in length) + QString result = name; + QString ext; + int pos = name.find( '.', -6 ); + if( pos > 0 ) { + ext = name.mid(pos); + result.truncate( pos ); + } + + ext.prepend( QString::number(num) ); + result.truncate( maxlen - ext.length() ); + + return result + ext; +} + + +bool K3b::plainAtapiSupport() +{ + // FIXME: what about BSD? + return ( K3b::simpleKernelVersion() >= K3bVersion( 2, 5, 40 ) ); +} + + +bool K3b::hackedAtapiSupport() +{ + // IMPROVEME!!! + // FIXME: since when does the kernel support this? + return ( K3b::simpleKernelVersion() >= K3bVersion( 2, 4, 0 ) ); +} + + +QString K3b::externalBinDeviceParameter( K3bDevice::Device* dev, const K3bExternalBin* bin ) +{ +#ifdef Q_OS_LINUX + // + // experimental: always use block devices on 2.6 kernels + // + if( simpleKernelVersion() >= K3bVersion( 2, 6, 0 ) ) + return dev->blockDeviceName(); + else +#endif + if( dev->interfaceType() == K3bDevice::SCSI ) + return dev->busTargetLun(); + else if( (plainAtapiSupport() && bin->hasFeature("plain-atapi") ) ) + return dev->blockDeviceName(); + else + return QString("ATAPI:%1").arg(dev->blockDeviceName()); +} + + +int K3b::writingAppFromString( const QString& s ) +{ + if( s.lower() == "cdrdao" ) + return K3b::CDRDAO; + else if( s.lower() == "cdrecord" ) + return K3b::CDRECORD; + else if( s.lower() == "dvdrecord" ) + return K3b::DVDRECORD; + else if( s.lower() == "growisofs" ) + return K3b::GROWISOFS; + else if( s.lower() == "dvd+rw-format" ) + return K3b::DVD_RW_FORMAT; + else + return K3b::DEFAULT; +} + + +QString K3b::writingModeString( int mode ) +{ + if( mode == WRITING_MODE_AUTO ) + return i18n("Auto"); + else + return K3bDevice::writingModeString( mode ); +} + + +QString K3b::resolveLink( const QString& file ) +{ + QFileInfo f( file ); + QStringList steps( f.absFilePath() ); + while( f.isSymLink() ) { + QString p = f.readLink(); + if( !p.startsWith( "/" ) ) + p.prepend( f.dirPath(true) + "/" ); + f.setFile( p ); + if( steps.contains( f.absFilePath() ) ) { + kdDebug() << "(K3b) symlink loop detected." << endl; + break; + } + else + steps.append( f.absFilePath() ); + } + return f.absFilePath(); +} + + +K3bDevice::Device* K3b::urlToDevice( const KURL& deviceUrl ) +{ + if( deviceUrl.protocol() == "media" || deviceUrl.protocol() == "system" ) { + kdDebug() << "(K3b) Asking mediamanager for " << deviceUrl.fileName() << endl; + DCOPRef mediamanager("kded", "mediamanager"); + DCOPReply reply = mediamanager.call("properties(QString)", deviceUrl.fileName()); + QStringList properties = reply; + if( !reply.isValid() || properties.count() < 6 ) { + kdError() << "(K3b) Invalid reply from mediamanager" << endl; + return 0; + } + else { + kdDebug() << "(K3b) Reply from mediamanager " << properties[5] << endl; + return k3bcore->deviceManager()->findDevice( properties[5] ); + } + } + + return k3bcore->deviceManager()->findDevice( deviceUrl.path() ); +} + + +KURL K3b::convertToLocalUrl( const KURL& url ) +{ + if( !url.isLocalFile() ) { +#if KDE_IS_VERSION(3,4,91) + return KIO::NetAccess::mostLocalURL( url, 0 ); +#else +#ifndef UDS_LOCAL_PATH +#define UDS_LOCAL_PATH (72 | KIO::UDS_STRING) +#else + using namespace KIO; +#endif + KIO::UDSEntry e; + if( KIO::NetAccess::stat( url, e, 0 ) ) { + const KIO::UDSEntry::ConstIterator end = e.end(); + for( KIO::UDSEntry::ConstIterator it = e.begin(); it != end; ++it ) { + if( (*it).m_uds == UDS_LOCAL_PATH && !(*it).m_str.isEmpty() ) + return KURL::fromPathOrURL( (*it).m_str ); + } + } +#endif + } + + return url; +} + + +KURL::List K3b::convertToLocalUrls( const KURL::List& urls ) +{ + KURL::List r; + for( KURL::List::const_iterator it = urls.constBegin(); it != urls.constEnd(); ++it ) + r.append( convertToLocalUrl( *it ) ); + return r; +} + + +Q_INT16 K3b::fromLe16( char* data ) +{ +#ifdef WORDS_BIGENDIAN // __BYTE_ORDER == __BIG_ENDIAN + return swapByteOrder( *((Q_INT16*)data) ); +#else + return *((Q_INT16*)data); +#endif +} + + +Q_INT32 K3b::fromLe32( char* data ) +{ +#ifdef WORDS_BIGENDIAN // __BYTE_ORDER == __BIG_ENDIAN + return swapByteOrder( *((Q_INT32*)data) ); +#else + return *((Q_INT32*)data); +#endif +} + + +Q_INT64 K3b::fromLe64( char* data ) +{ +#ifdef WORDS_BIGENDIAN // __BYTE_ORDER == __BIG_ENDIAN + return swapByteOrder( *((Q_INT64*)data) ); +#else + return *((Q_INT64*)data); +#endif +} + + +QString K3b::findExe( const QString& name ) +{ + // first we search the path + QString bin = KStandardDirs::findExe( name ); + + // then go on with our own little list + if( bin.isEmpty() ) + bin = KStandardDirs::findExe( name, k3bcore->externalBinManager()->searchPath().join(":") ); + + return bin; +} + + +bool K3b::isMounted( K3bDevice::Device* dev ) +{ + if( !dev ) + return false; + + return !KIO::findDeviceMountPoint( dev->blockDeviceName() ).isEmpty(); +} + + +bool K3b::unmount( K3bDevice::Device* dev ) +{ + if( !dev ) + return false; + + QString mntDev = dev->blockDeviceName(); + +#if KDE_IS_VERSION(3,4,0) + // first try to unmount it the standard way + if( KIO::NetAccess::synchronousRun( KIO::unmount( mntDev, false ), 0 ) ) + return true; +#endif + + QString umountBin = K3b::findExe( "umount" ); + if( !umountBin.isEmpty() ) { + KProcess p; + p << umountBin; + p << "-l"; // lazy unmount + p << dev->blockDeviceName(); + p.start( KProcess::Block ); + if( !p.exitStatus() ) + return true; + } + + // now try pmount + QString pumountBin = K3b::findExe( "pumount" ); + if( !pumountBin.isEmpty() ) { + KProcess p; + p << pumountBin; + p << "-l"; // lazy unmount + p << dev->blockDeviceName(); + p.start( KProcess::Block ); + return !p.exitStatus(); + } + else { +#ifdef HAVE_HAL + return !K3bDevice::HalConnection::instance()->unmount( dev ); +#else + return false; +#endif + } +} + + +bool K3b::mount( K3bDevice::Device* dev ) +{ + if( !dev ) + return false; + + QString mntDev = dev->blockDeviceName(); + +#if KDE_IS_VERSION(3,4,0) + // first try to mount it the standard way + if( KIO::NetAccess::synchronousRun( KIO::mount( true, 0, mntDev, false ), 0 ) ) + return true; +#endif + +#ifdef HAVE_HAL + if( !K3bDevice::HalConnection::instance()->mount( dev ) ) + return true; +#endif + + // now try pmount + QString pmountBin = K3b::findExe( "pmount" ); + if( !pmountBin.isEmpty() ) { + KProcess p; + p << pmountBin; + p << mntDev; + p.start( KProcess::Block ); + return !p.exitStatus(); + } + return false; +} + + +bool K3b::eject( K3bDevice::Device* dev ) +{ +#ifdef HAVE_HAL + if( !K3bDevice::HalConnection::instance()->eject( dev ) ) + return true; +#endif + + if( K3b::isMounted( dev ) ) + K3b::unmount( dev ); + + return dev->eject(); +} diff --git a/libk3b/core/k3bglobals.h b/libk3b/core/k3bglobals.h new file mode 100644 index 0000000..2795630 --- /dev/null +++ b/libk3b/core/k3bglobals.h @@ -0,0 +1,257 @@ +/* + * + * $Id: k3bglobals.h 630384 2007-02-05 09:33:17Z mlaurent $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef K3BGLOBALS_H +#define K3BGLOBALS_H + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include "k3b_export.h" + +class KConfig; +class K3bVersion; +class K3bExternalBin; + + +#include + + +#ifdef HAVE_STAT64 +#define k3b_struct_stat struct stat64 +#define k3b_stat ::stat64 +#define k3b_lstat ::lstat64 +#else +#define k3b_struct_stat struct stat +#define k3b_stat ::stat +#define k3b_lstat ::lstat +#endif + + +namespace K3bDevice { + class Device; +} + +namespace K3b +{ + enum WritingApp { + DEFAULT = 1, + CDRECORD = 2, + CDRDAO = 4, + DVDRECORD = 8, + GROWISOFS = 16, + DVD_RW_FORMAT = 32 + }; + + LIBK3B_EXPORT int writingAppFromString( const QString& ); + + /** + * DATA_MODE_AUTO - let K3b determine the best mode + * MODE1 - refers to the default Yellow book mode1 + * MODE2 - refers to CDROM XA mode2 form1 + */ + enum DataMode { + DATA_MODE_AUTO, + MODE1, + MODE2 + }; + + /** + * The sector size denotes the number of bytes K3b provides per sector. + * This is based on the sizes cdrecord's -data, -xa, and -xamix parameters + * demand. + */ + enum SectorSize { + SECTORSIZE_AUDIO = 2352, + SECTORSIZE_DATA_2048 = 2048, + SECTORSIZE_DATA_2048_SUBHEADER = 2056, + SECTORSIZE_DATA_2324 = 2324, + SECTORSIZE_DATA_2324_SUBHEADER = 2332, + SECTORSIZE_RAW = 2448 + }; + + /** + * AUTO - let K3b determine the best mode + * TAO - Track at once + * DAO - Disk at once (or session at once) + * RAW - Raw mode + * + * may be or'ed together (except for WRITING_MODE_AUTO of course) + */ + enum WritingMode { + WRITING_MODE_AUTO = 0, + TAO = K3bDevice::WRITINGMODE_TAO, + DAO = K3bDevice::WRITINGMODE_SAO, + RAW = K3bDevice::WRITINGMODE_RAW, + WRITING_MODE_INCR_SEQ = K3bDevice::WRITINGMODE_INCR_SEQ, // Incremental Sequential + WRITING_MODE_RES_OVWR = K3bDevice::WRITINGMODE_RES_OVWR // Restricted Overwrite + }; + + LIBK3B_EXPORT QString writingModeString( int ); + + LIBK3B_EXPORT QString framesToString( int h, bool showFrames = true ); + /*LIBK3B_EXPORT QString sizeToTime( long size );*/ + + LIBK3B_EXPORT Q_INT16 swapByteOrder( const Q_INT16& i ); + LIBK3B_EXPORT Q_INT32 swapByteOrder( const Q_INT32& i ); + LIBK3B_EXPORT Q_INT64 swapByteOrder( const Q_INT64& i ); + + int round( double ); + + /** + * This checks the free space on the filesystem path is in. + * We use this since we encountered problems with the KDE version. + * @returns true on success. + */ + LIBK3B_EXPORT bool kbFreeOnFs( const QString& path, unsigned long& size, unsigned long& avail ); + + /** + * Cut a filename preserving the extension + */ + LIBK3B_EXPORT QString cutFilename( const QString& name, unsigned int len ); + + LIBK3B_EXPORT QString removeFilenameExtension( const QString& name ); + + /** + * Append a number to a filename preserving the extension. + * The resulting name's length will not exceed @p maxlen + */ + LIBK3B_EXPORT QString appendNumberToFilename( const QString& name, int num, unsigned int maxlen ); + + LIBK3B_EXPORT QString findUniqueFilePrefix( const QString& _prefix = QString::null, const QString& path = QString::null ); + + /** + * Find a unique filename in directory d (if d is empty the method uses the defaultTempPath) + */ + LIBK3B_EXPORT QString findTempFile( const QString& ending = QString::null, const QString& d = QString::null ); + + /** + * Wrapper around KStandardDirs::findExe which searches the PATH and some additional + * directories to find system tools which are normally only in root's PATH. + */ + LIBK3B_EXPORT QString findExe( const QString& name ); + + /** + * get the default K3b temp path to store image files + */ + LIBK3B_EXPORT QString defaultTempPath(); + + /** + * makes sure a path ends with a "/" + */ + LIBK3B_EXPORT QString prepareDir( const QString& dir ); + + /** + * returns the parent dir of a path. + * CAUTION: this does only work well with absolut paths. + * + * Example: /usr/share/doc -> /usr/share/ + */ + QString parentDir( const QString& path ); + + /** + * For now this just replaces multiple occurrences of / with a single / + */ + LIBK3B_EXPORT QString fixupPath( const QString& ); + + /** + * resolves a symlinks completely. Meaning it also handles links to links to links... + */ + LIBK3B_EXPORT QString resolveLink( const QString& ); + + LIBK3B_EXPORT K3bVersion kernelVersion(); + + /** + * Kernel version stripped of all suffixes + */ + LIBK3B_EXPORT K3bVersion simpleKernelVersion(); + + QString systemName(); + + LIBK3B_EXPORT KIO::filesize_t filesize( const KURL& ); + + /** + * Calculate the total size of an image file. This also includes + * images splitted by a K3bFileSplitter. + * + * \returns the total size of the image file at url + */ + LIBK3B_EXPORT KIO::filesize_t imageFilesize( const KURL& url ); + + /** + * true if the kernel supports ATAPI devices without SCSI emulation. + * use in combination with the K3bExternalProgram feature "plain-atapi" + */ + LIBK3B_EXPORT bool plainAtapiSupport(); + + /** + * true if the kernel supports ATAPI devices without SCSI emulation + * via the ATAPI: pseudo stuff + * use in combination with the K3bExternalProgram feature "hacked-atapi" + */ + LIBK3B_EXPORT bool hackedAtapiSupport(); + + /** + * Used to create a parameter for cdrecord, cdrdao or readcd. + * Takes care of SCSI and ATAPI. + */ + QString externalBinDeviceParameter( K3bDevice::Device* dev, const K3bExternalBin* ); + + /** + * Convert an url pointing to a local device to a K3bDevice. + * Supports media:// and system::// urls. + */ + LIBK3B_EXPORT K3bDevice::Device* urlToDevice( const KURL& deviceUrl ); + + /** + * Tries to convert urls from local protocols != "file" to file (for now supports media:/) + */ + LIBK3B_EXPORT KURL convertToLocalUrl( const KURL& url ); + LIBK3B_EXPORT KURL::List convertToLocalUrls( const KURL::List& l ); + + LIBK3B_EXPORT Q_INT16 fromLe16( char* ); + LIBK3B_EXPORT Q_INT32 fromLe32( char* ); + LIBK3B_EXPORT Q_INT64 fromLe64( char* ); + + LIBK3B_EXPORT bool isMounted( K3bDevice::Device* ); + + /** + * Tries to unmount the device ignoring its actual mounting state. + * This method uses both KIO::unmount and pumount if available. + */ + LIBK3B_EXPORT bool unmount( K3bDevice::Device* ); + + /** + * Tries to mount the medium. Since K3b does not gather any information + * about mount points the only methods used are pmount and HAL::mount + */ + LIBK3B_EXPORT bool mount( K3bDevice::Device* ); + + /** + * Ejects the medium in the device or simply opens the tray. + * This method improves over K3bDevice::Device::eject in that it + * unmounts before ejecting and introduces HAL support. + */ + LIBK3B_EXPORT bool eject( K3bDevice::Device* ); +} + +#endif diff --git a/libk3b/core/k3bglobalsettings.cpp b/libk3b/core/k3bglobalsettings.cpp new file mode 100644 index 0000000..6f58592 --- /dev/null +++ b/libk3b/core/k3bglobalsettings.cpp @@ -0,0 +1,61 @@ +/* + * + * $Id: k3bglobalsettings.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2005 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bglobalsettings.h" + +#include + + +K3bGlobalSettings::K3bGlobalSettings() + : m_eject(true), + m_burnfree(true), + m_overburn(false), + m_useManualBufferSize(false), + m_bufferSize(4), + m_force(false) +{ +} + + +void K3bGlobalSettings::readSettings( KConfig* c ) +{ + QString lastG = c->group(); + c->setGroup( "General Options" ); + + m_eject = !c->readBoolEntry( "No cd eject", false ); + m_burnfree = c->readBoolEntry( "burnfree", true ); + m_overburn = c->readBoolEntry( "Allow overburning", false ); + m_useManualBufferSize = c->readBoolEntry( "Manual buffer size", false ); + m_bufferSize = c->readNumEntry( "Fifo buffer", 4 ); + m_force = c->readBoolEntry( "Force unsafe operations", false ); + + c->setGroup( lastG ); +} + + +void K3bGlobalSettings::saveSettings( KConfig* c ) +{ + QString lastG = c->group(); + c->setGroup( "General Options" ); + + c->writeEntry( "No cd eject", !m_eject ); + c->writeEntry( "burnfree", m_burnfree ); + c->writeEntry( "Allow overburning", m_overburn ); + c->writeEntry( "Manual buffer size", m_useManualBufferSize ); + c->writeEntry( "Fifo buffer", m_bufferSize ); + c->writeEntry( "Force unsafe operations", m_force ); + + c->setGroup( lastG ); +} diff --git a/libk3b/core/k3bglobalsettings.h b/libk3b/core/k3bglobalsettings.h new file mode 100644 index 0000000..1194789 --- /dev/null +++ b/libk3b/core/k3bglobalsettings.h @@ -0,0 +1,70 @@ +/* + * + * $Id: k3bglobalsettings.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2005 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_GLOBAL_SETTINGS_H_ +#define _K3B_GLOBAL_SETTINGS_H_ +#include "k3b_export.h" +class KConfig; + +/** + * Some global settings used throughout K3b. + */ +class LIBK3B_EXPORT K3bGlobalSettings +{ + public: + K3bGlobalSettings(); + + /** + * This method takes care of settings the config group + */ + void readSettings( KConfig* ); + + /** + * This method takes care of settings the config group + */ + void saveSettings( KConfig* ); + + bool ejectMedia() const { return m_eject; } + bool burnfree() const { return m_burnfree; } + bool overburn() const { return m_overburn; } + bool useManualBufferSize() const { return m_useManualBufferSize; } + int bufferSize() const { return m_bufferSize; } + + /** + * If force is set to true K3b will continue in certain "unsafe" situations. + * The most common being a medium not suitable for the writer in terms of + * writing speed. + * Compare cdrecord's parameter -force + */ + bool force() const { return m_force; } + + void setEjectMedia( bool b ) { m_eject = b; } + void setBurnfree( bool b ) { m_burnfree = b; } + void setOverburn( bool b ) { m_overburn = b; } + void setUseManualBufferSize( bool b ) { m_useManualBufferSize = b; } + void setBufferSize( int size ) { m_bufferSize = size; } + void setForce( bool b ) { m_force = b; } + + private: + bool m_eject; + bool m_burnfree; + bool m_overburn; + bool m_useManualBufferSize; + int m_bufferSize; + bool m_force; +}; + + +#endif diff --git a/libk3b/core/k3bjob.cpp b/libk3b/core/k3bjob.cpp new file mode 100644 index 0000000..b545107 --- /dev/null +++ b/libk3b/core/k3bjob.cpp @@ -0,0 +1,253 @@ +/* + * + * $Id: k3bjob.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include "k3bjob.h" +#include +#include + +#include +#include + +#include +#include + + +class K3bJob::Private +{ +public: +}; + + +const char* K3bJob::DEFAULT_SIGNAL_CONNECTION = "K3bJobDefault"; + + +K3bJob::K3bJob( K3bJobHandler* handler, QObject* parent, const char* name ) + : QObject( parent, name ), + m_jobHandler( handler ), + m_canceled(false), + m_active(false) +{ + connect( this, SIGNAL(canceled()), + this, SLOT(slotCanceled()) ); +} + +K3bJob::~K3bJob() +{ + // + // Normally a job (or the user of a job should take care of this + // but we do this here for security reasons. + // + if( m_active ) + jobFinished( false ); +} + + +void K3bJob::setJobHandler( K3bJobHandler* jh ) +{ + m_jobHandler = jh; +} + + +void K3bJob::jobStarted() +{ + m_canceled = false; + m_active = true; + + if( jobHandler() && jobHandler()->isJob() ) + static_cast(jobHandler())->registerSubJob( this ); + else + k3bcore->registerJob( this ); + + emit started(); +} + + +void K3bJob::jobFinished( bool success ) +{ + m_active = false; + + if( jobHandler() && jobHandler()->isJob() ) + static_cast(jobHandler())->unregisterSubJob( this ); + else + k3bcore->unregisterJob( this ); + + emit finished( success ); +} + + +void K3bJob::slotCanceled() +{ + m_canceled = true; +} + + +int K3bJob::waitForMedia( K3bDevice::Device* device, + int mediaState, + int mediaType, + const QString& message ) +{ + // TODO: What about: emit newSubTask( i18n("Waiting for media") ); + return m_jobHandler->waitForMedia( device, mediaState, mediaType, message ); +} + + +bool K3bJob::questionYesNo( const QString& text, + const QString& caption, + const QString& yesText, + const QString& noText ) +{ + return m_jobHandler->questionYesNo( text, caption, yesText, noText ); +} + + +void K3bJob::blockingInformation( const QString& text, + const QString& caption ) +{ + return m_jobHandler->blockingInformation( text, caption ); +} + + +void K3bJob::connectSubJob( K3bJob* subJob, + const char* finishedSlot, + bool connectProgress, + const char* progressSlot, + const char* subProgressSlot, + const char* processedSizeSlot, + const char* processedSubSizeSlot ) +{ + connect( subJob, SIGNAL(newTask(const QString&)), this, SIGNAL(newSubTask(const QString&)) ); + connect( subJob, SIGNAL(newSubTask(const QString&)), this, SLOT(slotNewSubTask(const QString&)) ); + connect( subJob, SIGNAL(debuggingOutput(const QString&, const QString&)), + this, SIGNAL(debuggingOutput(const QString&, const QString&)) ); + connect( subJob, SIGNAL(infoMessage(const QString&, int)), + this, SIGNAL(infoMessage(const QString&, int)) ); + connect( subJob, SIGNAL(finished(bool)), this, finishedSlot ); + + if( connectProgress ) { + connect( subJob, SIGNAL(percent(int)), + this, progressSlot != 0 ? progressSlot : SIGNAL(subPercent(int)) ); + if( subProgressSlot ) + connect( subJob, SIGNAL(subPercent(int)), this, subProgressSlot ); + connect( subJob, SIGNAL(processedSize(int, int)), + this, processedSizeSlot != 0 ? processedSizeSlot : SIGNAL(processedSubSize(int, int)) ); + if( processedSubSizeSlot ) + connect( subJob, SIGNAL(processedSubSize(int, int)), this, processedSubSizeSlot ); + } +} + + +void K3bJob::connectSubJob( K3bJob* subJob, + const char* finishedSlot, + const char* newTaskSlot, + const char* newSubTaskSlot, + const char* progressSlot, + const char* subProgressSlot, + const char* processedSizeSlot, + const char* processedSubSizeSlot ) +{ + // standard connections + connect( subJob, SIGNAL(debuggingOutput(const QString&, const QString&)), + this, SIGNAL(debuggingOutput(const QString&, const QString&)) ); + connect( subJob, SIGNAL(infoMessage(const QString&, int)), + this, SIGNAL(infoMessage(const QString&, int)) ); + + // task connections + if( newTaskSlot == DEFAULT_SIGNAL_CONNECTION ) + connect( subJob, SIGNAL(newTask(const QString&)), this, SIGNAL(newSubTask(const QString&)) ); + else if( newTaskSlot ) + connect( subJob, SIGNAL(newTask(const QString&)), this, newTaskSlot ); + + if( newSubTaskSlot == DEFAULT_SIGNAL_CONNECTION ) + connect( subJob, SIGNAL(newSubTask(const QString&)), this, SLOT(slotNewSubTask(const QString&)) ); + else if( newSubTaskSlot ) + connect( subJob, SIGNAL(newSubTask(const QString&)), this, newSubTaskSlot ); + + if( finishedSlot && finishedSlot != DEFAULT_SIGNAL_CONNECTION ) + connect( subJob, SIGNAL(finished(bool)), this, finishedSlot ); + + // progress + if( progressSlot == DEFAULT_SIGNAL_CONNECTION ) + connect( subJob, SIGNAL(percent(int)), this, SIGNAL(subPercent(int)) ); + else if( progressSlot ) + connect( subJob, SIGNAL(percent(int)), this, progressSlot ); + + if( subProgressSlot && subProgressSlot != DEFAULT_SIGNAL_CONNECTION ) + connect( subJob, SIGNAL(subPercent(int)), this, subProgressSlot ); + + // processed size + if( processedSizeSlot == DEFAULT_SIGNAL_CONNECTION ) + connect( subJob, SIGNAL(processedSize(int, int)), this, SIGNAL(processedSubSize(int, int)) ); + else if( processedSizeSlot ) + connect( subJob, SIGNAL(processedSize(int, int)), this, processedSizeSlot ); + + if( processedSubSizeSlot && processedSubSizeSlot != DEFAULT_SIGNAL_CONNECTION ) + connect( subJob, SIGNAL(processedSubSize(int, int)), this, processedSubSizeSlot ); +} + + +unsigned int K3bJob::numRunningSubJobs() const +{ + return m_runningSubJobs.count(); +} + + +void K3bJob::slotNewSubTask( const QString& str ) +{ + emit infoMessage( str, INFO ); +} + + +void K3bJob::registerSubJob( K3bJob* job ) +{ + m_runningSubJobs.append( job ); +} + + +void K3bJob::unregisterSubJob( K3bJob* job ) +{ + m_runningSubJobs.removeRef( job ); +} + + + + +class K3bBurnJob::Private +{ +public: +}; + + + +K3bBurnJob::K3bBurnJob( K3bJobHandler* handler, QObject* parent, const char* name ) + : K3bJob( handler, parent, name ), + m_writeMethod( K3b::DEFAULT ) +{ + d = new Private; +} + + +K3bBurnJob::~K3bBurnJob() +{ + delete d; +} + + +int K3bBurnJob::supportedWritingApps() const +{ + return K3b::DEFAULT | K3b::CDRDAO | K3b::CDRECORD; +} + +#include "k3bjob.moc" diff --git a/libk3b/core/k3bjob.h b/libk3b/core/k3bjob.h new file mode 100644 index 0000000..59e1f9b --- /dev/null +++ b/libk3b/core/k3bjob.h @@ -0,0 +1,311 @@ +/* + * + * $Id: k3bjob.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef K3BJOB_H +#define K3BJOB_H + +#include +#include +#include "k3bjobhandler.h" +#include "k3b_export.h" + +class K3bDoc; +namespace K3bDevice { + class Device; +} + + +/** + * This is the baseclass for all the jobs in K3b which actually do the work like burning a cd! + * The K3bJob object takes care of registering with the k3bcore or with a parent K3bJob. + * + * Every job has a jobhandler which can be another job (in which case the job is handled as + * a subjob) or an arbitrary class implementing the K3bJobHandler interface. + * + * A Job should never create any widgets. User interaction should be done through the methods + * questionYesNo, waitForMedia. + * + * @author Sebastian Trueg + */ +class LIBK3B_EXPORT K3bJob : public QObject, public K3bJobHandler +{ + Q_OBJECT + + public: + virtual ~K3bJob(); + + /** + * \reimplemented from K3bJobHandler + */ + bool isJob() const { return true; } + + K3bJobHandler* jobHandler() const { return m_jobHandler; } + + /** + * Is the job active? + * The default implementation is based on the jobStarted() and jobFinished() + * methods and there is normally no need to reimplement this. + */ + virtual bool active() const { return m_active; } + + /** + * The default implementation is based on the canceled() signal. + * + * This means that one cannot count on this value being valid + * in a slot connected to the canceled() signal. It is, however, save + * to call this method from a slot connected to the finished() signal + * in case the job makes proper usage of the jobStarted/jobFinished + * methods. + */ + virtual bool hasBeenCanceled() const { return m_canceled; } + + virtual QString jobDescription() const { return "K3bJob"; } + virtual QString jobDetails() const { return QString::null; } + + /** + * @returns the number of running subjobs. + * this is useful for proper cancellation of jobs. + */ + unsigned int numRunningSubJobs() const; + + const QPtrList& runningSubJobs() const { return m_runningSubJobs; } + + /** + * \deprecated + */ + virtual void connectSubJob( K3bJob* subJob, + const char* finishedSlot = 0, + bool progress = false, + const char* progressSlot = 0, + const char* subProgressSot = 0, + const char* processedSizeSlot = 0, + const char* processedSubSizeSlot = 0 ); + + static const char* DEFAULT_SIGNAL_CONNECTION; + + /** + * \param newTaskSlot If DEFAULT_SIGNAL_CONNECTION the newTask signal from the subjob will + * be connected to the newSubTask signal + * \param newSubTaskSlot If DEFAULT_SIGNAL_CONNECTION the newSubTask signal from the subjob + * will create an infoMessage signal + * \param progressSlot If DEFAULT_SIGNAL_CONNECTION the percent signal of the subjob will be + * connected to the subPercent signal. + * debuggingOutput and infoMessage will always be direcctly connected. + * + * If a parameter is set to 0 it will not be connected at all + */ + virtual void connectSubJob( K3bJob* subJob, + const char* finishedSlot = DEFAULT_SIGNAL_CONNECTION, + const char* newTaskSlot = DEFAULT_SIGNAL_CONNECTION, + const char* newSubTaskSlot = DEFAULT_SIGNAL_CONNECTION, + const char* progressSlot = DEFAULT_SIGNAL_CONNECTION, + const char* subProgressSlot = DEFAULT_SIGNAL_CONNECTION, + const char* processedSizeSlot = DEFAULT_SIGNAL_CONNECTION, + const char* processedSubSizeSlot = DEFAULT_SIGNAL_CONNECTION ); + + /** + * Message types to be used in combination with the infoMessage signal. + * + * \see infoMessage() + */ + enum MessageType { + INFO, /**< Informational message. For example a message that informs the user about what is + currently going on */ + WARNING, /**< A warning message. Something did not go perfectly but the job may continue. */ + ERROR, /**< An error. Only use this message type if the job will actually fail afterwards + with a call to jobFinished( false ) */ + SUCCESS /**< This message type may be used to inform the user that a sub job has + been successfully finished. */ + }; + + /** + * reimplemented from K3bJobHandler + */ + int waitForMedia( K3bDevice::Device*, + int mediaState = K3bDevice::STATE_EMPTY, + int mediaType = K3bDevice::MEDIA_WRITABLE_CD, + const QString& message = QString::null ); + + /** + * reimplemented from K3bJobHandler + */ + bool questionYesNo( const QString& text, + const QString& caption = QString::null, + const QString& yesText = QString::null, + const QString& noText = QString::null ); + + /** + * reimplemented from K3bJobHandler + */ + void blockingInformation( const QString& text, + const QString& caption = QString::null ); + + public slots: + /** + * This is the slot that starts the job. The first call should always + * be jobStarted(). + * + * Once the job has finished it has to call jobFinished() with the result as + * a parameter. + * + * \see jobStarted() + * \see jobFinished() + */ + virtual void start() = 0; + + /** + * This slot should cancel the job. The job has to emit the canceled() signal and make a call + * to jobFinished(). + * It is not important to do any of those two directly in this slot though. + */ + virtual void cancel() = 0; + + void setJobHandler( K3bJobHandler* ); + + signals: + void infoMessage( const QString& msg, int type ); + void percent( int p ); + void subPercent( int p ); + void processedSize( int processed, int size ); + void processedSubSize( int processed, int size ); + void newTask( const QString& job ); + void newSubTask( const QString& job ); + void debuggingOutput(const QString&, const QString&); + void data( const char* data, int len ); + void nextTrack( int track, int numTracks ); + + void canceled(); + + /** + * Emitted once the job has been started. Never emit this signal directly. + * Use jobStarted() instead, otherwise the job will not be properly registered + */ + void started(); + + /** + * Emitted once the job has been finshed. Never emit this signal directly. + * Use jobFinished() instead, otherwise the job will not be properly deregistered + */ + void finished( bool success ); + + protected: + /** + * \param hdl the handler of the job. This allows for some user interaction without + * specifying any details (like the GUI). + * The job handler can also be another job. In that case this job is a sub job + * and will be part of the parents running sub jobs. + * + * \see runningSubJobs() + * \see numRunningSubJobs() + */ + K3bJob( K3bJobHandler* hdl, QObject* parent = 0, const char* name = 0 ); + + /** + * Call this in start() to properly register the job and emit the started() signal. + * Do never emit the started() signal manually. + * + * Always call K3bJob::jobStarted in reimplementations. + */ + virtual void jobStarted(); + + /** + * Call this at the end of the job to properly deregister the job and emit the finished() signal. + * Do never emit the started() signal manually. + * + * Always call K3bJob::jobFinished in reimplementations. + */ + virtual void jobFinished( bool success ); + + private slots: + void slotCanceled(); + void slotNewSubTask( const QString& str ); + + private: + void registerSubJob( K3bJob* ); + void unregisterSubJob( K3bJob* ); + + K3bJobHandler* m_jobHandler; + QPtrList m_runningSubJobs; + + bool m_canceled; + bool m_active; + + class Private; + Private* d; +}; + + +/** + * Every job used to actually burn a medium is derived from K3bBurnJob. + * This class implements additional signals like buffer status or writing speed + * as well as a handling of the used writing application. + */ +class LIBK3B_EXPORT K3bBurnJob : public K3bJob +{ + Q_OBJECT + + public: + K3bBurnJob( K3bJobHandler* hdl, QObject* parent = 0, const char* name = 0 ); + virtual ~K3bBurnJob(); + + /** + * The writing device used by this job. + */ + virtual K3bDevice::Device* writer() const { return 0; } + + /** + * use K3b::WritingApp + */ + int writingApp() const { return m_writeMethod; } + + /** + * K3b::WritingApp "ored" together + */ + virtual int supportedWritingApps() const; + + public slots: + /** + * use K3b::WritingApp + */ + void setWritingApp( int w ) { m_writeMethod = w; } + + signals: + void bufferStatus( int ); + + void deviceBuffer( int ); + + /** + * @param speed current writing speed in Kb + * @param multiplicator use 150 for CDs and 1380 for DVDs + * FIXME: maybe one should be able to ask the burnjob if it burns a CD or a DVD and remove the + * multiplicator parameter) + */ + void writeSpeed( int speed, int multiplicator ); + + /** + * This signal may be used to inform when the burning starts or ends + * The BurningProgressDialog for example uses it to enable and disable + * the buffer and writing speed displays. + */ + void burning(bool); + + private: + int m_writeMethod; + + class Private; + Private* d; +}; +#endif diff --git a/libk3b/core/k3bjobhandler.h b/libk3b/core/k3bjobhandler.h new file mode 100644 index 0000000..1262e0e --- /dev/null +++ b/libk3b/core/k3bjobhandler.h @@ -0,0 +1,64 @@ +/* + * + * $Id: k3bjobhandler.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2004 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_JOB_HANDLER_H_ +#define _K3B_JOB_HANDLER_H_ + + +#include +#include + + +/** + * See @p K3bJobProgressDialog as an example for the usage of + * the K3bJobHandler interface. + */ +class K3bJobHandler +{ + public: + K3bJobHandler() {} + virtual ~K3bJobHandler() {} + + /** + * \return true if the handler itself is also a job + */ + virtual bool isJob() const { return false; } + + /** + * @return K3bDevice::MediaType on success, + * 0 if forced (no media info available), + * and -1 on error (canceled) + */ + virtual int waitForMedia( K3bDevice::Device*, + int mediaState = K3bDevice::STATE_EMPTY, + int mediaType = K3bDevice::MEDIA_WRITABLE_CD, + const QString& message = QString::null ) = 0; + + // FIXME: use KGuiItem + virtual bool questionYesNo( const QString& text, + const QString& caption = QString::null, + const QString& yesText = QString::null, + const QString& noText = QString::null ) = 0; + + /** + * Use this if you need the user to do something before the job is able to continue. + * In all other cases an infoMessage should be used. + */ + virtual void blockingInformation( const QString& text, + const QString& caption = QString::null ) = 0; + +}; + +#endif diff --git a/libk3b/core/k3bprocess.cpp b/libk3b/core/k3bprocess.cpp new file mode 100644 index 0000000..35ddff4 --- /dev/null +++ b/libk3b/core/k3bprocess.cpp @@ -0,0 +1,452 @@ +/* + * + * $Id: k3bprocess.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + + +#include "k3bprocess.h" +#include "k3bexternalbinmanager.h" + +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + + +class K3bProcess::Data +{ +public: + QString unfinishedStdoutLine; + QString unfinishedStderrLine; + + int dupStdoutFd; + int dupStdinFd; + + bool rawStdin; + bool rawStdout; + + int in[2]; + int out[2]; + + bool suppressEmptyLines; +}; + + +K3bProcess::K3bProcess() + : KProcess(), + m_bSplitStdout(false) +{ + d = new Data(); + d->dupStdinFd = d->dupStdoutFd = -1; + d->rawStdout = d->rawStdin = false; + d->in[0] = d->in[1] = -1; + d->out[0] = d->out[1] = -1; + d->suppressEmptyLines = true; +} + +K3bProcess::~K3bProcess() +{ + delete d; +} + + +K3bProcess& K3bProcess::operator<<( const K3bExternalBin* bin ) +{ + return this->operator<<( bin->path ); +} + +K3bProcess& K3bProcess::operator<<( const QString& arg ) +{ + static_cast(this)->operator<<( arg ); + return *this; +} + +K3bProcess& K3bProcess::operator<<( const char* arg ) +{ + static_cast(this)->operator<<( arg ); + return *this; +} + +K3bProcess& K3bProcess::operator<<( const QCString& arg ) +{ + static_cast(this)->operator<<( arg ); + return *this; +} + +K3bProcess& K3bProcess::operator<<( const QStringList& args ) +{ + static_cast(this)->operator<<( args ); + return *this; +} + + +bool K3bProcess::start( RunMode run, Communication com ) +{ + if( com & Stderr ) { + connect( this, SIGNAL(receivedStderr(KProcess*, char*, int)), + this, SLOT(slotSplitStderr(KProcess*, char*, int)) ); + } + if( com & Stdout ) { + connect( this, SIGNAL(receivedStdout(KProcess*, char*, int)), + this, SLOT(slotSplitStdout(KProcess*, char*, int)) ); + } + + return KProcess::start( run, com ); +} + + +void K3bProcess::slotSplitStdout( KProcess*, char* data, int len ) +{ + if( m_bSplitStdout ) { + QStringList lines = splitOutput( data, len, d->unfinishedStdoutLine, d->suppressEmptyLines ); + + for( QStringList::iterator it = lines.begin(); it != lines.end(); ++it ) { + QString& str = *it; + + // just to be sure since something in splitOutput does not do this right + if( d->suppressEmptyLines && str.isEmpty() ) + continue; + + emit stdoutLine( str ); + } + } +} + + +void K3bProcess::slotSplitStderr( KProcess*, char* data, int len ) +{ + QStringList lines = splitOutput( data, len, d->unfinishedStderrLine, d->suppressEmptyLines ); + + for( QStringList::iterator it = lines.begin(); it != lines.end(); ++it ) { + QString& str = *it; + + // just to be sure since something in splitOutput does not do this right + if( d->suppressEmptyLines && str.isEmpty() ) + continue; + + emit stderrLine( str ); + } +} + + +QStringList K3bProcess::splitOutput( char* data, int len, + QString& unfinishedLine, bool suppressEmptyLines ) +{ + // + // The stderr splitting is mainly used for parsing of messages + // That's why we simplify the data before proceeding + // + + QString buffer; + for( int i = 0; i < len; i++ ) { + if( data[i] == '\b' ) { + while( data[i] == '\b' ) // we replace multiple backspaces with a single line feed + i++; + buffer += '\n'; + } + if( data[i] == '\r' ) + buffer += '\n'; + else if( data[i] == '\t' ) // replace tabs with a single space + buffer += " "; + else + buffer += data[i]; + } + + QStringList lines = QStringList::split( '\n', buffer, !suppressEmptyLines ); + + // in case we suppress empty lines we need to handle the following separately + // to make sure we join unfinished lines correctly + if( suppressEmptyLines && buffer[0] == '\n' ) + lines.prepend( QString::null ); + + if( !unfinishedLine.isEmpty() ) { + lines.first().prepend( unfinishedLine ); + unfinishedLine.truncate(0); + + kdDebug() << "(K3bProcess) joined line: '" << (lines.first()) << "'" << endl; + } + + QStringList::iterator it; + + // check if line ends with a newline + // if not save the last line because it is not finished + QChar c = buffer.right(1).at(0); + bool hasUnfinishedLine = ( c != '\n' && c != '\r' && c != QChar(46) ); // What is unicode 46?? It is printed as a point + if( hasUnfinishedLine ) { + kdDebug() << "(K3bProcess) found unfinished line: '" << lines.last() << "'" << endl; + kdDebug() << "(K3bProcess) last char: '" << buffer.right(1) << "'" << endl; + unfinishedLine = lines.last(); + it = lines.end(); + --it; + lines.remove(it); + } + + return lines; +} + + +int K3bProcess::setupCommunication( Communication comm ) +{ + if( KProcess::setupCommunication( comm ) ) { + + // + // Setup our own socketpair + // + + if( d->rawStdin ) { + if( socketpair(AF_UNIX, SOCK_STREAM, 0, d->in) == 0 ) { + fcntl(d->in[0], F_SETFD, FD_CLOEXEC); + fcntl(d->in[1], F_SETFD, FD_CLOEXEC); + } + else + return 0; + } + + if( d->rawStdout ) { + if( socketpair(AF_UNIX, SOCK_STREAM, 0, d->out) == 0 ) { + fcntl(d->out[0], F_SETFD, FD_CLOEXEC); + fcntl(d->out[1], F_SETFD, FD_CLOEXEC); + } + else { + if( d->rawStdin || d->dupStdinFd ) { + close(d->in[0]); + close(d->in[1]); + } + return 0; + } + } + + return 1; + } + else + return 0; +} + + +void K3bProcess::commClose() +{ + if( d->rawStdin ) { + close(d->in[1]); + d->in[1] = -1; + } + if( d->rawStdout ) { + close(d->out[0]); + d->out[0] = -1; + } + + KProcess::commClose(); +} + + +int K3bProcess::commSetupDoneP() +{ + int ok = KProcess::commSetupDoneP(); + + if( d->rawStdin ) + close(d->in[0]); + if( d->rawStdout ) + close(d->out[1]); + + d->in[0] = d->out[1] = -1; + + return ok; +} + + +int K3bProcess::commSetupDoneC() +{ + int ok = KProcess::commSetupDoneC(); + + if( d->dupStdoutFd != -1 ) { + // + // make STDOUT_FILENO a duplicate of d->dupStdoutFd such that writes to STDOUT_FILENO are "redirected" + // to d->dupStdoutFd + // + if( ::dup2( d->dupStdoutFd, STDOUT_FILENO ) < 0 ) { + kdDebug() << "(K3bProcess) Error while dup( " << d->dupStdoutFd << ", " << STDOUT_FILENO << endl; + ok = 0; + } + } + else if( d->rawStdout ) { + if( ::dup2( d->out[1], STDOUT_FILENO ) < 0 ) { + kdDebug() << "(K3bProcess) Error while dup( " << d->out[1] << ", " << STDOUT_FILENO << endl; + ok = 0; + } + } + + if( d->dupStdinFd != -1 ) { + if( ::dup2( d->dupStdinFd, STDIN_FILENO ) < 0 ) { + kdDebug() << "(K3bProcess) Error while dup( " << d->dupStdinFd << ", " << STDIN_FILENO << endl; + ok = 0; + } + } + else if( d->rawStdin ) { + if( ::dup2( d->in[0], STDIN_FILENO ) < 0 ) { + kdDebug() << "(K3bProcess) Error while dup( " << d->in[0] << ", " << STDIN_FILENO << endl; + ok = 0; + } + } + + return ok; +} + + + +int K3bProcess::stdinFd() const +{ + if( d->rawStdin ) + return d->in[1]; + else if( d->dupStdinFd != -1 ) + return d->dupStdinFd; + else + return -1; +} + +int K3bProcess::stdoutFd() const +{ + if( d->rawStdout ) + return d->out[0]; + else if( d->dupStdoutFd != -1 ) + return d->dupStdoutFd; + else + return -1; +} + + +void K3bProcess::dupStdout( int fd ) +{ + writeToFd( fd ); +} + +void K3bProcess::dupStdin( int fd ) +{ + readFromFd( fd ); +} + + +void K3bProcess::writeToFd( int fd ) +{ + d->dupStdoutFd = fd; + if( fd != -1 ) + d->rawStdout = false; +} + +void K3bProcess::readFromFd( int fd ) +{ + d->dupStdinFd = fd; + if( fd != -1 ) + d->rawStdin = false; +} + + +void K3bProcess::setRawStdin(bool b) +{ + if( b ) { + d->rawStdin = true; + d->dupStdinFd = -1; + } + else + d->rawStdin = false; +} + + +void K3bProcess::setRawStdout(bool b) +{ + if( b ) { + d->rawStdout = true; + d->dupStdoutFd = -1; + } + else + d->rawStdout = false; +} + + +void K3bProcess::setSuppressEmptyLines( bool b ) +{ + d->suppressEmptyLines = b; +} + + +bool K3bProcess::closeStdin() +{ + if( d->rawStdin ) { + close(d->in[1]); + d->in[1] = -1; + return true; + } + else + return KProcess::closeStdin(); +} + + +bool K3bProcess::closeStdout() +{ + if( d->rawStdout ) { + close(d->out[0]); + d->out[0] = -1; + return true; + } + else + return KProcess::closeStdout(); +} + + +K3bProcessOutputCollector::K3bProcessOutputCollector( KProcess* p ) + : m_process(0) +{ + setProcess( p ); +} + +void K3bProcessOutputCollector::setProcess( KProcess* p ) +{ + if( m_process ) + m_process->disconnect( this ); + + m_process = p; + if( p ) { + connect( p, SIGNAL(receivedStdout(KProcess*, char*, int)), + this, SLOT(slotGatherStdout(KProcess*, char*, int)) ); + connect( p, SIGNAL(receivedStderr(KProcess*, char*, int)), + this, SLOT(slotGatherStderr(KProcess*, char*, int)) ); + } + + m_gatheredOutput.truncate( 0 ); + m_stderrOutput.truncate( 0 ); + m_stdoutOutput.truncate( 0 ); +} + +void K3bProcessOutputCollector::slotGatherStderr( KProcess*, char* data, int len ) +{ + m_gatheredOutput.append( QString::fromLocal8Bit( data, len ) ); + m_stderrOutput.append( QString::fromLocal8Bit( data, len ) ); +} + +void K3bProcessOutputCollector::slotGatherStdout( KProcess*, char* data, int len ) +{ + m_gatheredOutput.append( QString::fromLocal8Bit( data, len ) ); + m_stdoutOutput.append( QString::fromLocal8Bit( data, len ) ); +} + + +#include "k3bprocess.moc" diff --git a/libk3b/core/k3bprocess.h b/libk3b/core/k3bprocess.h new file mode 100644 index 0000000..959bda1 --- /dev/null +++ b/libk3b/core/k3bprocess.h @@ -0,0 +1,204 @@ +/* + * + * $Id: k3bprocess.h 621644 2007-01-09 12:53:09Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef K3B_PROCESS_H +#define K3B_PROCESS_H + + +#include +#include +#include "k3b_export.h" + +class K3bExternalBin; + + +/** + * This is an enhanced KProcess. + * It splits the stderr output to lines making sure the client gets every line as it + * was written by the process. + * Aditionally one may set raw stdout and stdin handling using the stdin() and stdout() methods + * to get the process' file descriptors. + * Last but not least K3bProcess is able to duplicate stdout making it possible to connect two + * K3bProcesses like used in K3bDataJob to duplicate mkisofs' stdout to the stdin of the writer + * (cdrecord or cdrdao) + */ +class LIBK3B_EXPORT K3bProcess : public KProcess +{ + Q_OBJECT + + public: + class OutputCollector; + + public: + K3bProcess(); + ~K3bProcess(); + + /** + * In the future this might also set the nice value + */ + K3bProcess& operator<<( const K3bExternalBin* ); + + K3bProcess& operator<<( const QString& arg ); + K3bProcess& operator<<( const char* arg ); + K3bProcess& operator<<( const QCString& arg ); + K3bProcess& operator<<( const QStringList& args ); + + bool start( RunMode run = NotifyOnExit, Communication com = NoCommunication ); + + /** + * get stdin file descriptor + * Only makes sense while process is running. + * + * Only use with setRawStdin + */ + int stdinFd() const; + + /** + * get stdout file descriptor + * Only makes sense while process is running. + * + * Only use with setRawStdout + */ + int stdoutFd() const; + + /** + * @deprecated use writeToFd + */ + void dupStdout( int fd ); + + /** + * @deprecated use readFromFd + */ + void dupStdin( int fd ); + + /** + * Make the process write to @fd instead of Stdout. + * This means you won't get any stdoutReady() or receivedStdout() + * signals anymore. + * + * Only use this before starting the process. + */ + void writeToFd( int fd ); + + /** + * Make the process read from @fd instead of Stdin. + * This means you won't get any wroteStdin() + * signals anymore. + * + * Only use this before starting the process. + */ + void readFromFd( int fd ); + + /** + * If set true the process' stdin fd will be available + * through @stdinFd. + * Be aware that you will not get any wroteStdin signals + * anymore. + * + * Only use this before starting the process. + */ + void setRawStdin(bool b); + + /** + * If set true the process' stdout fd will be available + * through @stdoutFd. + * Be aware that you will not get any stdoutReady or receivedStdout + * signals anymore. + * + * Only use this before starting the process. + */ + void setRawStdout(bool b); + + public slots: + void setSplitStdout( bool b ) { m_bSplitStdout = b; } + + /** + * default is true + */ + void setSuppressEmptyLines( bool b ); + + bool closeStdin(); + bool closeStdout(); + + private slots: + void slotSplitStderr( KProcess*, char*, int ); + void slotSplitStdout( KProcess*, char*, int ); + + signals: + void stderrLine( const QString& line ); + void stdoutLine( const QString& line ); + + /** + * Gets emitted if raw stdout mode has been requested + * The data has to be read from @p fd. + */ + void stdoutReady( int fd ); + + protected: + /** + * reimplemeted from KProcess + */ + int commSetupDoneP(); + + /** + * reimplemeted from KProcess + */ + int commSetupDoneC(); + + /** + * reimplemeted from KProcess + */ + int setupCommunication( Communication comm ); + + /** + * reimplemeted from KProcess + */ + void commClose(); + + private: + static QStringList splitOutput( char*, int, QString&, bool ); + + class Data; + Data* d; + + bool m_bSplitStdout; +}; + +class LIBK3B_EXPORT K3bProcessOutputCollector: public QObject +{ + Q_OBJECT + + public: + K3bProcessOutputCollector( KProcess* ); + void setProcess( KProcess* ); + + const QString& output() const { return m_gatheredOutput; } + const QString& stderrOutput() const { return m_stderrOutput; } + const QString& stdoutOutput() const { return m_stdoutOutput; } + + private slots: + void slotGatherStderr( KProcess*, char*, int ); + void slotGatherStdout( KProcess*, char*, int ); + + private: + QString m_gatheredOutput; + QString m_stderrOutput; + QString m_stdoutOutput; + KProcess* m_process; +}; + + +#endif diff --git a/libk3b/core/k3bprogressinfoevent.h b/libk3b/core/k3bprogressinfoevent.h new file mode 100644 index 0000000..0e77718 --- /dev/null +++ b/libk3b/core/k3bprogressinfoevent.h @@ -0,0 +1,85 @@ +/* + * + * $Id: k3bprogressinfoevent.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef K3B_PROGRESS_INFO_EVENT_H +#define K3B_PROGRESS_INFO_EVENT_H + +#include +#include + + +/** + * Custom event class for posting events corresponding to the + * K3bJob signals. This is useful for a threaded job since + * in that case it's not possible to emit signals that directly + * change the GUI (see QThread docu). + */ +class K3bProgressInfoEvent : public QCustomEvent +{ + public: + K3bProgressInfoEvent( int type ) + : QCustomEvent( type ), + m_type(type) + {} + + K3bProgressInfoEvent( int type, const QString& v1, const QString& v2 = QString::null, + int value1 = 0, int value2 = 0 ) + : QCustomEvent( type ), + m_type( type), + m_firstValue(value1), + m_secondValue(value2), + m_firstString(v1), + m_secondString(v2) + {} + + K3bProgressInfoEvent( int type, int value1, int value2 = 0 ) + : QCustomEvent( type ), + m_type( type), + m_firstValue(value1), + m_secondValue(value2) + {} + + int type() const { return m_type; } + const QString& firstString() const { return m_firstString; } + const QString& secondString() const { return m_secondString; } + int firstValue() const { return m_firstValue; } + int secondValue() const { return m_secondValue; } + + enum K3bProgressInfoEventType { + Progress = QEvent::User + 1, + SubProgress, + ProcessedSize, + ProcessedSubSize, + InfoMessage, + Started, + Canceled, + Finished, + NewTask, + NewSubTask, + DebuggingOutput, + BufferStatus, + WriteSpeed, + NextTrack + }; + + private: + int m_type; + int m_firstValue; + int m_secondValue; + QString m_firstString; + QString m_secondString; +}; + +#endif diff --git a/libk3b/core/k3bsimplejobhandler.cpp b/libk3b/core/k3bsimplejobhandler.cpp new file mode 100644 index 0000000..eaf7cd6 --- /dev/null +++ b/libk3b/core/k3bsimplejobhandler.cpp @@ -0,0 +1,62 @@ +/* + * + * $Id: sourceheader 511311 2006-02-19 14:51:05Z trueg $ + * Copyright (C) 2006 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bsimplejobhandler.h" + + +K3bSimpleJobHandler::K3bSimpleJobHandler( QObject* parent ) + : QObject( parent ), + K3bJobHandler() +{ +} + +K3bSimpleJobHandler::~K3bSimpleJobHandler() +{ +} + +int K3bSimpleJobHandler::waitForMedia( K3bDevice::Device* dev, + int mediaState, + int mediaType, + const QString& message ) +{ + Q_UNUSED( dev ); + Q_UNUSED( mediaState ); + Q_UNUSED( mediaType ); + Q_UNUSED( message ); + + return 0; +} + +bool K3bSimpleJobHandler::questionYesNo( const QString& text, + const QString& caption, + const QString& yesText, + const QString& noText ) +{ + Q_UNUSED( text ); + Q_UNUSED( caption ); + Q_UNUSED( yesText ); + Q_UNUSED( noText ); + + return true; +} + +void K3bSimpleJobHandler::blockingInformation( const QString& text, + const QString& caption ) +{ + Q_UNUSED( text ); + Q_UNUSED( caption ); +} + +#include "k3bsimplejobhandler.moc" diff --git a/libk3b/core/k3bsimplejobhandler.h b/libk3b/core/k3bsimplejobhandler.h new file mode 100644 index 0000000..f84064e --- /dev/null +++ b/libk3b/core/k3bsimplejobhandler.h @@ -0,0 +1,61 @@ +/* + * + * $Id: sourceheader 511311 2006-02-19 14:51:05Z trueg $ + * Copyright (C) 2006 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_SIMPLE_JOB_HANDLER_H_ +#define _K3B_SIMPLE_JOB_HANDLER_H_ + +#include + +#include +#include + + +/** + * This is a simplified job handler which just consumes the + * job handler calls without doing anything. + * Use it for very simple jobs that don't need the job handler + * methods. + */ +class LIBK3B_EXPORT K3bSimpleJobHandler : public QObject, public K3bJobHandler +{ + Q_OBJECT + + public: + K3bSimpleJobHandler( QObject* parent = 0 ); + ~K3bSimpleJobHandler(); + + /* + * \return 0 + */ + int waitForMedia( K3bDevice::Device*, + int mediaState = K3bDevice::STATE_EMPTY, + int mediaType = K3bDevice::MEDIA_WRITABLE_CD, + const QString& message = QString::null ); + /** + * \return true + */ + bool questionYesNo( const QString& text, + const QString& caption = QString::null, + const QString& yesText = QString::null, + const QString& noText = QString::null ); + + /** + * Does nothing + */ + void blockingInformation( const QString& text, + const QString& caption = QString::null ); +}; + +#endif diff --git a/libk3b/core/k3bthread.cpp b/libk3b/core/k3bthread.cpp new file mode 100644 index 0000000..07414ad --- /dev/null +++ b/libk3b/core/k3bthread.cpp @@ -0,0 +1,221 @@ +/* + * + * $Id: k3bthread.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include "k3bthread.h" +#include "k3bprogressinfoevent.h" +#include "k3bdataevent.h" + +#include + +#include + + +static QPtrList s_threads; + + +void K3bThread::waitUntilFinished() +{ + QPtrListIterator it( s_threads ); + while( it.current() ) { + kdDebug() << "Waiting for thread " << it.current() << endl; + it.current()->wait(); + ++it; + } + + kdDebug() << "Thread waiting done." << endl; +} + + +class K3bThread::Private +{ +public: + Private() + : eventHandler( 0 ) { + } + + QObject* eventHandler; +}; + + +K3bThread::K3bThread( QObject* eventHandler ) + : QThread() +{ + d = new Private; + d->eventHandler = eventHandler; + + s_threads.append(this); +} + + +K3bThread::K3bThread( unsigned int stackSize, QObject* eventHandler ) + : QThread( stackSize ) +{ + d = new Private; + d->eventHandler = eventHandler; + + s_threads.append(this); +} + + +K3bThread::~K3bThread() +{ + s_threads.removeRef(this); + delete d; +} + + +void K3bThread::setProgressInfoEventHandler( QObject* eventHandler ) +{ + d->eventHandler = eventHandler; +} + +QString K3bThread::jobDescription() const +{ + return QString::null; +} + + +QString K3bThread::jobDetails() const +{ + return QString::null; +} + + +void K3bThread::init() +{ + // do nothing... +} + + +void K3bThread::cancel() +{ + if( running() ) { + terminate(); + if( d->eventHandler ) { + emitCanceled(); + emitFinished(false); + } + } +} + + +void K3bThread::emitInfoMessage( const QString& msg, int type ) +{ + if( d->eventHandler ) + QApplication::postEvent( d->eventHandler, + new K3bProgressInfoEvent( K3bProgressInfoEvent::InfoMessage, msg, QString::null, type ) ); + else + kdWarning() << "(K3bThread) call to emitInfoMessage() without eventHandler." << endl; +} + +void K3bThread::emitPercent( int p ) +{ + if( d->eventHandler ) + QApplication::postEvent( d->eventHandler, + new K3bProgressInfoEvent( K3bProgressInfoEvent::Progress, p ) ); + else + kdWarning() << "(K3bThread) call to emitPercent() without eventHandler." << endl; +} + +void K3bThread::emitSubPercent( int p ) +{ + if( d->eventHandler ) + QApplication::postEvent( d->eventHandler, + new K3bProgressInfoEvent( K3bProgressInfoEvent::SubProgress, p ) ); + else + kdWarning() << "(K3bThread) call to emitSubPercent() without eventHandler." << endl; +} + +void K3bThread::emitStarted() +{ + if( d->eventHandler ) + QApplication::postEvent( d->eventHandler, new K3bProgressInfoEvent( K3bProgressInfoEvent::Started ) ); + else + kdWarning() << "(K3bThread) call to emitStarted() without eventHandler." << endl; +} + +void K3bThread::emitCanceled() +{ + if( d->eventHandler ) + QApplication::postEvent( d->eventHandler, new K3bProgressInfoEvent( K3bProgressInfoEvent::Canceled ) ); + else + kdWarning() << "(K3bThread) call to emitCanceled() without eventHandler." << endl; +} + +void K3bThread::emitFinished( bool success ) +{ + if( d->eventHandler ) + QApplication::postEvent( d->eventHandler, new K3bProgressInfoEvent( K3bProgressInfoEvent::Finished, success ) ); + else + kdWarning() << "(K3bThread) call to emitFinished() without eventHandler." << endl; +} + +void K3bThread::emitProcessedSize( int p, int size ) +{ + if( d->eventHandler ) + QApplication::postEvent( d->eventHandler, new K3bProgressInfoEvent( K3bProgressInfoEvent::ProcessedSize, p, size ) ); + else + kdWarning() << "(K3bThread) call to emitProcessedSize() without eventHandler." << endl; +} + +void K3bThread::emitProcessedSubSize( int p, int size ) +{ + if( d->eventHandler ) + QApplication::postEvent( d->eventHandler, new K3bProgressInfoEvent( K3bProgressInfoEvent::ProcessedSubSize, p, size ) ); + else + kdWarning() << "(K3bThread) call to emitProcessedSubSize() without eventHandler." << endl; +} + +void K3bThread::emitNewTask( const QString& job ) +{ + if( d->eventHandler ) + QApplication::postEvent( d->eventHandler, new K3bProgressInfoEvent( K3bProgressInfoEvent::NewTask, job ) ); + else + kdWarning() << "(K3bThread) call to emitNewTask() without eventHandler." << endl; +} + +void K3bThread::emitNewSubTask( const QString& job ) +{ + if( d->eventHandler ) + QApplication::postEvent( d->eventHandler, new K3bProgressInfoEvent( K3bProgressInfoEvent::NewSubTask, job ) ); + else + kdWarning() << "(K3bThread) call to emitNewSubTask() without eventHandler." << endl; +} + +void K3bThread::emitDebuggingOutput(const QString& group, const QString& text) +{ + if( d->eventHandler ) + QApplication::postEvent( d->eventHandler, new K3bProgressInfoEvent( K3bProgressInfoEvent::DebuggingOutput, group, text ) ); + else + kdWarning() << "(K3bThread) call to emitDebuggingOutput() without eventHandler." << endl; +} + +void K3bThread::emitData( const char* data, int len ) +{ + if( d->eventHandler ) + QApplication::postEvent( d->eventHandler, new K3bDataEvent( data, len ) ); + else + kdWarning() << "(K3bThread) call to emitData() without eventHandler." << endl; +} + +void K3bThread::emitNextTrack( int t, int n ) +{ + if( d->eventHandler ) + QApplication::postEvent( d->eventHandler, new K3bProgressInfoEvent( K3bProgressInfoEvent::NextTrack, t, n ) ); + else + kdWarning() << "(K3bThread) call to emitNextTrack() without eventHandler." << endl; +} + diff --git a/libk3b/core/k3bthread.h b/libk3b/core/k3bthread.h new file mode 100644 index 0000000..f7e68fc --- /dev/null +++ b/libk3b/core/k3bthread.h @@ -0,0 +1,95 @@ +/* + * + * $Id: k3bthread.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef _K3B_THREAD_H_ +#define _K3B_THREAD_H_ + +#include +#include "k3b_export.h" + +class QObject; + +/** + * The threaded couterpart to K3bJob + * instead of emitting the information signals + * one has to use the emitXXX methods which will post + * K3bProgressInfoEvents to the eventhandler. + * + * K3bThreadJob can be used to automatically wrap the thread in a K3bJob. + * + * As in K3bJob it is important to call emitStarted and emitFinished. + * + * See K3bThreadJob for more information. + */ +class LIBK3B_EXPORT K3bThread : public QThread +{ + public: + K3bThread( QObject* eventHandler = 0 ); + K3bThread( unsigned int stackSize, QObject* eventHandler = 0 ); + virtual ~K3bThread(); + + void setProgressInfoEventHandler( QObject* eventHandler ); + + /** + * Initialize the thread before starting it in the GUi thread. + * K3bThreadJob automatically calls this. + * + * The default implementation does nothing. + */ + virtual void init(); + + /** + * to provide the same api like K3bJob + * the default implementation calls terminate and + * emitCancled() and emitFinished(false) + */ + virtual void cancel(); + + virtual QString jobDescription() const; + virtual QString jobDetails() const; + + /** + * waits until all running K3bThread have finished. + * This is used by K3bApplication. + */ + static void waitUntilFinished(); + + protected: + virtual void run() = 0; + + /** + * uses the K3bJob::MessageType enum + */ + void emitInfoMessage( const QString& msg, int type ); + void emitPercent( int p ); + void emitSubPercent( int p ); + void emitStarted(); + void emitCanceled(); + void emitFinished( bool success ); + void emitProcessedSize( int processed, int size ); + void emitProcessedSubSize( int processed, int size ); + void emitNewTask( const QString& job ); + void emitNewSubTask( const QString& job ); + void emitDebuggingOutput(const QString&, const QString&); + void emitData( const char* data, int len ); + void emitNextTrack( int track, int trackNum ); + + private: + class Private; + Private* d; +}; + +#endif diff --git a/libk3b/core/k3bthreadjob.cpp b/libk3b/core/k3bthreadjob.cpp new file mode 100644 index 0000000..a13f10a --- /dev/null +++ b/libk3b/core/k3bthreadjob.cpp @@ -0,0 +1,161 @@ +/* + * + * $Id: k3bthreadjob.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bthreadjob.h" +#include "k3bthread.h" +#include "k3bprogressinfoevent.h" +#include "k3bdataevent.h" + +#include +#include + + + +K3bThreadJob::K3bThreadJob( K3bJobHandler* jh, QObject* parent, const char* name ) + : K3bJob( jh, parent, name ), + m_running(false) +{ +} + + +K3bThreadJob::K3bThreadJob( K3bThread* thread, K3bJobHandler* jh, QObject* parent, const char* name ) + : K3bJob( jh, parent, name ), + m_running(false) +{ + setThread(thread); +} + + +K3bThreadJob::~K3bThreadJob() +{ +} + + +QString K3bThreadJob::jobDescription() const +{ + if( m_thread ) + return m_thread->jobDescription(); + else + return QString::null; +} + + +QString K3bThreadJob::jobDetails() const +{ + if( m_thread ) + return m_thread->jobDetails(); + else + return QString::null; +} + + +void K3bThreadJob::setThread( K3bThread* t ) +{ + m_thread = t; + m_thread->setProgressInfoEventHandler(this); +} + + +void K3bThreadJob::start() +{ + if( m_thread ) { + if( !m_running ) { + m_thread->setProgressInfoEventHandler(this); + m_running = true; + m_thread->init(); + m_thread->start(); + } + else + kdDebug() << "(K3bThreadJob) thread not finished yet." << endl; + } + else { + kdError() << "(K3bThreadJob) no job set." << endl; + jobFinished(false); + } +} + + +void K3bThreadJob::cancel() +{ + m_thread->cancel(); + // wait for the thread to finish + // m_thread->wait(); +} + + +void K3bThreadJob::cleanupJob( bool success ) +{ + Q_UNUSED( success ); +} + + +void K3bThreadJob::customEvent( QCustomEvent* e ) +{ + if( K3bDataEvent* de = dynamic_cast(e) ) { + emit data( de->data(), de->length() ); + } + else { + K3bProgressInfoEvent* be = static_cast(e); + switch( be->type() ) { + case K3bProgressInfoEvent::Progress: + emit percent( be->firstValue() ); + break; + case K3bProgressInfoEvent::SubProgress: + emit subPercent( be->firstValue() ); + break; + case K3bProgressInfoEvent::ProcessedSize: + emit processedSize( be->firstValue(), be->secondValue() ); + break; + case K3bProgressInfoEvent::ProcessedSubSize: + emit processedSubSize( be->firstValue(), be->secondValue() ); + break; + case K3bProgressInfoEvent::InfoMessage: + emit infoMessage( be->firstString(), be->firstValue() ); + break; + case K3bProgressInfoEvent::Started: + jobStarted(); + break; + case K3bProgressInfoEvent::Canceled: + emit canceled(); + break; + case K3bProgressInfoEvent::Finished: + // we wait until the thred really finished + // although this may be dangerous if some thread + // emits the finished signal although it has not finished yet + // but makes a lot stuff easier. + kdDebug() << "(K3bThreadJob) waiting for the thread to finish." << endl; + m_thread->wait(); + kdDebug() << "(K3bThreadJob) thread finished." << endl; + cleanupJob( be->firstValue() ); + m_running = false; + jobFinished( be->firstValue() ); + break; + case K3bProgressInfoEvent::NewTask: + emit newTask( be->firstString() ); + break; + case K3bProgressInfoEvent::NewSubTask: + emit newSubTask( be->firstString() ); + break; + case K3bProgressInfoEvent::DebuggingOutput: + emit debuggingOutput( be->firstString(), be->secondString() ); + break; + case K3bProgressInfoEvent::NextTrack: + emit nextTrack( be->firstValue(), be->secondValue() ); + break; + } + } +} + +#include "k3bthreadjob.moc" diff --git a/libk3b/core/k3bthreadjob.h b/libk3b/core/k3bthreadjob.h new file mode 100644 index 0000000..25919f1 --- /dev/null +++ b/libk3b/core/k3bthreadjob.h @@ -0,0 +1,89 @@ +/* + * + * $Id: k3bthreadjob.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef _K3B_THREAD_JOB_H_ +#define _K3B_THREAD_JOB_H_ + +#include "k3bjob.h" +#include "k3b_export.h" +class QCustomEvent; +class K3bThread; + + +/** + * A Wrapper to use a K3bThread just like a K3bJob. + * Usage: + *
+ *   K3bThread* thread = new MySuperThread(...);
+ *   K3bThreadJob* job = new K3bThreadJob( thread, ... );
+ *   K3bBurnProgressDialog d;
+ *   d.setJob(job);
+ *   job->start();
+ *   d.exec();
+ *   delete job;
+ * 
+ * Be aware that K3bThreadJob'd destructor does NOT delete the thread. + */ +class LIBK3B_EXPORT K3bThreadJob : public K3bJob +{ + Q_OBJECT + + public: + K3bThreadJob( K3bJobHandler*, QObject* parent = 0, const char* name = 0 ); + K3bThreadJob( K3bThread*, K3bJobHandler*, QObject* parent = 0, const char* name = 0 ); + virtual ~K3bThreadJob(); + + void setThread( K3bThread* t ); + K3bThread* thread() const { return m_thread; } + + /** + * \reimplemented from K3bJob + * + * \return true if the job has been started and has not yet + * emitted the finished signal + */ + virtual bool active() const { return m_running; } + + virtual QString jobDescription() const; + virtual QString jobDetails() const; + + public slots: + virtual void start(); + virtual void cancel(); + + protected: + /** + * converts K3bThread events to K3bJob signals + */ + virtual void customEvent( QCustomEvent* ); + + /** + * Reimplement this method to do some housekeeping once + * the thread has finished. + * + * The default implementation does nothing. + * + * \param success True if the thread finished successfully + */ + virtual void cleanupJob( bool success ); + + private: + K3bThread* m_thread; + bool m_running; +}; + +#endif + diff --git a/libk3b/core/k3bversion.cpp b/libk3b/core/k3bversion.cpp new file mode 100644 index 0000000..f7af248 --- /dev/null +++ b/libk3b/core/k3bversion.cpp @@ -0,0 +1,318 @@ +/* + * + * $Id: k3bversion.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bversion.h" + +#include +#include + + +K3bVersion::K3bVersion() + : m_majorVersion( -1 ), + m_minorVersion( -1 ), + m_patchLevel( -1 ) +{ +} + +K3bVersion::K3bVersion( const K3bVersion& v ) + : m_versionString( v.versionString() ), + m_majorVersion( v.majorVersion() ), + m_minorVersion( v.minorVersion() ), + m_patchLevel( v.patchLevel() ), + m_suffix( v.suffix() ) +{ +} + +K3bVersion::K3bVersion( const QString& version ) +{ + setVersion( version ); +} + +K3bVersion::K3bVersion( int majorVersion, + int minorVersion, + int patchlevel, + const QString& suffix ) +{ + setVersion( majorVersion, minorVersion, patchlevel, suffix ); +} + +void K3bVersion::setVersion( const QString& v ) +{ + QString suffix; + splitVersionString( v.stripWhiteSpace(), m_majorVersion, suffix ); + if( m_majorVersion >= 0 ) { + if( suffix.startsWith(".") ) { + suffix = suffix.mid( 1 ); + splitVersionString( suffix, m_minorVersion, suffix ); + if( m_minorVersion < 0 ) { + kdDebug() << "(K3bVersion) suffix must not start with a dot!" << endl; + m_majorVersion = -1; + m_minorVersion = -1; + m_patchLevel = -1; + m_suffix = ""; + } + else { + if( suffix.startsWith(".") ) { + suffix = suffix.mid( 1 ); + splitVersionString( suffix, m_patchLevel, suffix ); + if( m_patchLevel < 0 ) { + kdDebug() << "(K3bVersion) suffix must not start with a dot!" << endl; + m_majorVersion = -1; + m_minorVersion = -1; + m_patchLevel = -1; + m_suffix = ""; + } + else { + m_suffix = suffix; + } + } + else { + m_patchLevel = -1; + m_suffix = suffix; + } + } + } + else { + m_minorVersion = -1; + m_patchLevel = -1; + m_suffix = suffix; + } + } + + m_versionString = createVersionString( m_majorVersion, m_minorVersion, m_patchLevel, m_suffix ); +} + + +// splits the leading number from s and puts it in num +// the dot is removed and the rest put in suffix +// if s does not start with a digit or the first non-digit char is not a dot +// suffix = s and num = -1 is returned +void K3bVersion::splitVersionString( const QString& s, int& num, QString& suffix ) +{ + int pos = s.find( QRegExp("\\D") ); + if( pos < 0 ) { + num = s.toInt(); + suffix = ""; + } + else if( pos == 0 ) { + num = -1; + suffix = s; + } + else { + num = s.left( pos ).toInt(); + suffix = s.mid( pos ); + } +} + + +bool K3bVersion::isValid() const +{ + return (m_majorVersion >= 0); +} + + +void K3bVersion::setVersion( int majorVersion, + int minorVersion, + int patchlevel, + const QString& suffix ) +{ + m_majorVersion = majorVersion; + m_minorVersion = minorVersion; + m_patchLevel = patchlevel; + m_suffix = suffix; + m_versionString = createVersionString( majorVersion, minorVersion, patchlevel, suffix ); +} + +K3bVersion& K3bVersion::operator=( const QString& v ) +{ + setVersion( v ); + return *this; +} + +K3bVersion K3bVersion::simplify() const +{ + K3bVersion v( *this ); + v.m_suffix.truncate(0); + return v; +} + +QString K3bVersion::createVersionString( int majorVersion, + int minorVersion, + int patchlevel, + const QString& suffix ) +{ + if( majorVersion >= 0 ) { + QString s = QString::number(majorVersion); + + if( minorVersion > -1 ) { + s.append( QString(".%1").arg(minorVersion) ); + if( patchlevel > -1 ) + s.append( QString(".%1").arg(patchlevel) ); + } + + if( !suffix.isNull() ) + s.append( suffix ); + + return s; + } + else + return ""; +} + + +int K3bVersion::compareSuffix( const QString& suffix1, const QString& suffix2 ) +{ + static QRegExp rcRx( "rc(\\d+)" ); + static QRegExp preRx( "pre(\\d+)" ); + static QRegExp betaRx( "beta(\\d+)" ); + static QRegExp alphaRx( "a(?:lpha)?(\\d+)" ); + + // first we check if one of the suffixes (or both are empty) becasue that case if simple + if( suffix1.isEmpty() ) { + if( suffix2.isEmpty() ) + return 0; + else + return 1; // empty greater than the non-empty (should we treat something like 1.0a as greater than 1.0?) + } + else if( suffix2.isEmpty() ) + return -1; + + // now search for our special suffixes + if( rcRx.exactMatch( suffix1 ) ) { + int v1 = rcRx.cap(1).toInt(); + + if( rcRx.exactMatch( suffix2 ) ) { + int v2 = rcRx.cap(1).toInt(); + return ( v1 == v2 ? 0 : ( v1 < v2 ? -1 : 1 ) ); + } + else if( preRx.exactMatch( suffix2 ) || + betaRx.exactMatch( suffix2 ) || + alphaRx.exactMatch( suffix2 ) ) + return 1; // rc > than all the others + else + return QString::compare( suffix1, suffix2 ); + } + + else if( preRx.exactMatch( suffix1 ) ) { + int v1 = preRx.cap(1).toInt(); + + if( rcRx.exactMatch( suffix2 ) ) { + return -1; // pre is less than rc + } + else if( preRx.exactMatch( suffix2 ) ) { + int v2 = preRx.cap(1).toInt(); + return ( v1 == v2 ? 0 : ( v1 < v2 ? -1 : 1 ) ); + } + else if( betaRx.exactMatch( suffix2 ) || + alphaRx.exactMatch( suffix2 ) ) + return 1; // pre is greater than beta or alpha + else + return QString::compare( suffix1, suffix2 ); + } + + else if( betaRx.exactMatch( suffix1 ) ) { + int v1 = betaRx.cap(1).toInt(); + + if( rcRx.exactMatch( suffix2 ) || + preRx.exactMatch( suffix2 ) ) + return -1; // beta is less than rc or pre + else if( betaRx.exactMatch( suffix2 ) ) { + int v2 = betaRx.cap(1).toInt(); + return ( v1 == v2 ? 0 : ( v1 < v2 ? -1 : 1 ) ); + } + else if( alphaRx.exactMatch( suffix2 ) ) + return 1; // beta is greater then alpha + else + return QString::compare( suffix1, suffix2 ); + } + + else if( alphaRx.exactMatch( suffix1 ) ) { + int v1 = alphaRx.cap(1).toInt(); + + if( rcRx.exactMatch( suffix2 ) || + preRx.exactMatch( suffix2 ) || + betaRx.exactMatch( suffix2 ) ) + return -1; // alpha is less than all the others + else if( alphaRx.exactMatch( suffix2 ) ) { + int v2 = alphaRx.cap(1).toInt(); + return ( v1 == v2 ? 0 : ( v1 < v2 ? -1 : 1 ) ); + } + else + return QString::compare( suffix1, suffix2 ); + } + + else + return QString::compare( suffix1, suffix2 ); +} + + +bool operator<( const K3bVersion& v1, const K3bVersion& v2 ) +{ + // both version objects need to be valid + + if( v1.majorVersion() == v2.majorVersion() ) { + + // 1 == 1.0 + if( ( v1.minorVersion() == v2.minorVersion() ) + || + ( v1.minorVersion() == -1 && v2.minorVersion() == 0 ) + || + ( v2.minorVersion() == -1 && v1.minorVersion() == 0 ) + ) + { + // 1.0 == 1.0.0 + if( ( v1.patchLevel() == v2.patchLevel() ) + || + ( v1.patchLevel() == -1 && v2.patchLevel() == 0 ) + || + ( v2.patchLevel() == -1 && v1.patchLevel() == 0 ) + ) + { + return K3bVersion::compareSuffix( v1.suffix(), v2.suffix() ) < 0; + } + else + return ( v1.patchLevel() < v2.patchLevel() ); + } + else + return ( v1.minorVersion() < v2.minorVersion() ); + } + else + return ( v1.majorVersion() < v2.majorVersion() ); +} + +bool operator>( const K3bVersion& v1, const K3bVersion& v2 ) +{ + return operator<( v2, v1 ); +} + + +bool operator==( const K3bVersion& v1, const K3bVersion& v2 ) +{ + return ( v1.majorVersion() == v2.majorVersion() && + v1.minorVersion() == v2.minorVersion() && + v1.patchLevel() == v2.patchLevel() && + K3bVersion::compareSuffix( v1.suffix(), v2.suffix() ) == 0 ); +} + + +bool operator<=( const K3bVersion& v1, const K3bVersion& v2 ) +{ + return ( operator<( v1, v2 ) || operator==( v1, v2 ) ); +} + +bool operator>=( const K3bVersion& v1, const K3bVersion& v2 ) +{ + return ( operator>( v1, v2 ) || operator==( v1, v2 ) ); +} diff --git a/libk3b/core/k3bversion.h b/libk3b/core/k3bversion.h new file mode 100644 index 0000000..a6e3aee --- /dev/null +++ b/libk3b/core/k3bversion.h @@ -0,0 +1,141 @@ +/* + * + * $Id: k3bversion.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef _K3B_VERSION_H_ +#define _K3B_VERSION_H_ + +#include +#include "k3b_export.h" +/** + * \brief Representation of a version. + * + * K3bVersion represents a version consisting of a major version (accessible via majorVersion()), + * a minor version (accessible via minorVersion()), a patchLevel (accessible via patchLevel()), + * and a suffix (accessible via suffix()). + * + * The major version is mandatory while all other fields are optional (in case of the minor version + * and the patchlevel -1 means that the field is undefined). + * + * K3bVersion tries to treat version suffixes in an "intelligent" way to properly compare versions + * (see compareSuffix() for more details). + * + * K3bVersion may also be used everywhere a QString is needed as it automatically converts to a + * string representation using createVersionString(). + */ +class LIBK3B_EXPORT K3bVersion +{ + public: + /** + * construct an empty version object + * which is invalid + * @ see isValid() + */ + K3bVersion(); + + /** + * copy constructor + */ + K3bVersion( const K3bVersion& ); + + /** + * this constructor tries to parse the given version string + */ + K3bVersion( const QString& version ); + + /** + * sets the version and generates a version string from it + */ + K3bVersion( int majorVersion, int minorVersion, int pachlevel = -1, const QString& suffix = QString::null ); + + /** + * tries to parse the version string + * used by the constructor + */ + void setVersion( const QString& ); + + bool isValid() const; + + /** + * sets the version and generates a version string from it + * used by the constructor + * + * If minorVersion or pachlevel are -1 they will not be used when generating the version string. + */ + void setVersion( int majorVersion, int minorVersion = -1, int patchlevel = -1, const QString& suffix = QString::null ); + + const QString& versionString() const { return m_versionString; } + int majorVersion() const { return m_majorVersion; } + int minorVersion() const { return m_minorVersion; } + int patchLevel() const { return m_patchLevel; } + const QString& suffix() const { return m_suffix; } + + /** + * just to make it possible to use as a QString + */ + operator const QString& () const { return m_versionString; } + K3bVersion& operator=( const QString& v ); + + /** + * \return A new K3bVersion object which equals this one except that the suffix is empty. + */ + K3bVersion simplify() const; + + /** + * If minorVersion or pachlevel are -1 they will not be used when generating the version string. + * If minorVersion is -1 patchlevel will be ignored. + */ + static QString createVersionString( int majorVersion, + int minorVersion = -1, + int patchlevel = -1, + const QString& suffix = QString::null ); + + /** + * "Intelligent" comparison of two version suffixes. + * + * This method checks for the following types of suffixes and treats them in the + * following order: + * + * [empty prefix] > rcX > preX > betaX > alphaX = aX (where X is a number) + * + * Every other suffixes are compared alphanumerical. + * An empty prefix is always considered newer than an unknown non-emtpy suffix (e.g. not one of the above.) + * + * @return \li -1 if suffix1 is less than suffix2 + * \li 0 if suffix1 equals suffix2 (be aware that this is not the same as comparing to strings as + * alphaX equals aX in this case.) + * \li 1 if suffix1 is greater than suffix2 + */ + static int compareSuffix( const QString& suffix1, const QString& suffix2 ); + + private: + static void splitVersionString( const QString& s, int& num, QString& suffix ); + + QString m_versionString; + int m_majorVersion; + int m_minorVersion; + int m_patchLevel; + QString m_suffix; +}; + + +LIBK3B_EXPORT bool operator<( const K3bVersion& v1, const K3bVersion& v2 ); +LIBK3B_EXPORT bool operator>( const K3bVersion& v1, const K3bVersion& v2 ); +LIBK3B_EXPORT bool operator==( const K3bVersion& v1, const K3bVersion& v2 ); +LIBK3B_EXPORT bool operator<=( const K3bVersion& v1, const K3bVersion& v2 ); +LIBK3B_EXPORT bool operator>=( const K3bVersion& v1, const K3bVersion& v2 ); + + +#endif diff --git a/libk3b/dummy.cpp b/libk3b/dummy.cpp new file mode 100644 index 0000000..9f6c7b2 --- /dev/null +++ b/libk3b/dummy.cpp @@ -0,0 +1 @@ +/* dummy file to have anything around.*/ diff --git a/libk3b/jobs/Makefile.am b/libk3b/jobs/Makefile.am new file mode 100644 index 0000000..72a9eac --- /dev/null +++ b/libk3b/jobs/Makefile.am @@ -0,0 +1,43 @@ +AM_CPPFLAGS = -I$(srcdir)/../core \ + -I$(srcdir)/../../libk3bdevice \ + -I$(srcdir)/../../src \ + -I$(srcdir)/../tools \ + -I$(srcdir)/../cddb \ + -I$(srcdir)/../plugin \ + -I$(srcdir)/../projects \ + -I$(srcdir)/../videodvd \ + -I$(srcdir)/../projects/audiocd \ + $(all_includes) + +METASOURCES = AUTO + +noinst_LTLIBRARIES = libjobs.la + +if include_videodvdrip +libjobs_la_SOURCES = k3bdatatrackreader.cpp k3breadcdreader.cpp \ + k3bcdcopyjob.cpp k3bclonejob.cpp k3baudiosessionreadingjob.cpp \ + k3bdvdcopyjob.cpp k3bvideodvdtitletranscodingjob.cpp k3bvideodvdtitledetectclippingjob.cpp \ + k3baudiocuefilewritingjob.cpp k3bbinimagewritingjob.cpp \ + k3biso9660imagewritingjob.cpp \ + k3bdvdformattingjob.cpp k3bblankingjob.cpp k3bclonetocreader.cpp \ + k3bverificationjob.cpp + +include_HEADERS = k3bcdcopyjob.h k3bdvdcopyjob.h k3bclonejob.h \ + k3baudiocuefilewritingjob.h k3bbinimagewritingjob.h \ + k3biso9660imagewritingjob.h k3bdvdformattingjob.h \ + k3bblankingjob.h k3bvideodvdtitletranscodingjob.h k3bvideodvdtitledetectclippingjob.h \ + k3bverificationjob.h +else +libjobs_la_SOURCES = k3bdatatrackreader.cpp k3breadcdreader.cpp \ + k3bcdcopyjob.cpp k3bclonejob.cpp k3baudiosessionreadingjob.cpp \ + k3bdvdcopyjob.cpp \ + k3baudiocuefilewritingjob.cpp k3bbinimagewritingjob.cpp \ + k3biso9660imagewritingjob.cpp \ + k3bdvdformattingjob.cpp k3bblankingjob.cpp k3bclonetocreader.cpp \ + k3bverificationjob.cpp + +include_HEADERS = k3bcdcopyjob.h k3bdvdcopyjob.h k3bclonejob.h \ + k3baudiocuefilewritingjob.h k3bbinimagewritingjob.h \ + k3biso9660imagewritingjob.h k3bdvdformattingjob.h \ + k3bblankingjob.h k3bverificationjob.h +endif diff --git a/libk3b/jobs/k3baudiocuefilewritingjob.cpp b/libk3b/jobs/k3baudiocuefilewritingjob.cpp new file mode 100644 index 0000000..0c5cd9a --- /dev/null +++ b/libk3b/jobs/k3baudiocuefilewritingjob.cpp @@ -0,0 +1,272 @@ +/* + * + * $Id: k3baudiocuefilewritingjob.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2005 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3baudiocuefilewritingjob.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + + +class K3bAudioCueFileWritingJob::AnalyserThread : public K3bThread +{ +public: + AnalyserThread() + : K3bThread() { + } + + void setDecoder( K3bAudioDecoder* dec ) { m_decoder = dec; } + +protected: + void run() { + emitStarted(); + m_decoder->analyseFile(); + emitFinished(true); + } + +private: + K3bAudioDecoder* m_decoder; +}; + + +K3bAudioCueFileWritingJob::K3bAudioCueFileWritingJob( K3bJobHandler* jh, QObject* parent, const char* name ) + : K3bBurnJob( jh, parent, name ), + m_decoder(0) +{ + m_analyserThread = new AnalyserThread(); + m_analyserJob = new K3bThreadJob( m_analyserThread, this, this ); + connect( m_analyserJob, SIGNAL(finished(bool)), this, SLOT(slotAnalyserThreadFinished(bool)) ); + + m_audioDoc = new K3bAudioDoc( this ); + m_audioDoc->newDocument(); + m_audioJob = new K3bAudioJob( m_audioDoc, this, this ); + + // just loop all through + connect( m_audioJob, SIGNAL(newTask(const QString&)), this, SIGNAL(newTask(const QString&)) ); + connect( m_audioJob, SIGNAL(newSubTask(const QString&)), this, SIGNAL(newSubTask(const QString&)) ); + connect( m_audioJob, SIGNAL(debuggingOutput(const QString&, const QString&)), + this, SIGNAL(debuggingOutput(const QString&, const QString&)) ); + connect( m_audioJob, SIGNAL(infoMessage(const QString&, int)), + this, SIGNAL(infoMessage(const QString&, int)) ); + connect( m_audioJob, SIGNAL(finished(bool)), this, SIGNAL(finished(bool)) ); + connect( m_audioJob, SIGNAL(canceled()), this, SIGNAL(canceled()) ); + connect( m_audioJob, SIGNAL(percent(int)), this, SIGNAL(percent(int)) ); + connect( m_audioJob, SIGNAL(subPercent(int)), this, SIGNAL(subPercent(int)) ); + connect( m_audioJob, SIGNAL(processedSize(int, int)), this, SIGNAL(processedSubSize(int, int)) ); + connect( m_audioJob, SIGNAL(processedSubSize(int, int)), this, SIGNAL(processedSubSize(int, int)) ); + connect( m_audioJob, SIGNAL(burning(bool)), this, SIGNAL(burning(bool)) ); + connect( m_audioJob, SIGNAL(bufferStatus(int)), this, SIGNAL(bufferStatus(int)) ); + connect( m_audioJob, SIGNAL(deviceBuffer(int)), this, SIGNAL(deviceBuffer(int)) ); + connect( m_audioJob, SIGNAL(writeSpeed(int, int)), this, SIGNAL(writeSpeed(int, int)) ); + + m_canceled = false; + m_audioJobRunning = false; +} + + +K3bAudioCueFileWritingJob::~K3bAudioCueFileWritingJob() +{ + // the threadjob does not delete the thread + delete m_analyserThread; +} + + +K3bDevice::Device* K3bAudioCueFileWritingJob::writer() const +{ + return m_audioDoc->burner(); +} + + +QString K3bAudioCueFileWritingJob::jobDescription() const +{ + return i18n("Writing Audio Cue File"); +} + + +QString K3bAudioCueFileWritingJob::jobDetails() const +{ + return m_cueFile.section( '/', -1 ); +} + + +void K3bAudioCueFileWritingJob::start() +{ + // FIXME: here we trust that a job won't be started twice :( + jobStarted(); + m_canceled = false; + m_audioJobRunning = false; + importCueInProject(); +} + + +void K3bAudioCueFileWritingJob::cancel() +{ + m_canceled = true; + + // the AudioJob cancel method is very stupid. It emits the canceled signal even if it was never running :( + if( m_audioJobRunning ) + m_audioJob->cancel(); + m_analyserJob->cancel(); +} + + +void K3bAudioCueFileWritingJob::setCueFile( const QString& s ) +{ + m_cueFile = s; +} + + +void K3bAudioCueFileWritingJob::setOnTheFly( bool b ) +{ + m_audioDoc->setOnTheFly( b ); +} + + +void K3bAudioCueFileWritingJob::setSpeed( int s ) +{ + m_audioDoc->setSpeed( s ); +} + + +void K3bAudioCueFileWritingJob::setBurnDevice( K3bDevice::Device* dev ) +{ + m_audioDoc->setBurner( dev ); +} + + +void K3bAudioCueFileWritingJob::setWritingMode( int mode ) +{ + m_audioDoc->setWritingMode( mode ); +} + + +void K3bAudioCueFileWritingJob::setSimulate( bool b ) +{ + m_audioDoc->setDummy( b ); +} + + +void K3bAudioCueFileWritingJob::setCopies( int c ) +{ + m_audioDoc->setCopies( c ); +} + + +void K3bAudioCueFileWritingJob::setTempDir( const QString& s ) +{ + m_audioDoc->setTempDir( s ); +} + + +void K3bAudioCueFileWritingJob::slotAnalyserThreadFinished( bool ) +{ + if( !m_canceled ) { + if( m_audioDoc->lastTrack()->length() == 0 ) { + emit infoMessage( i18n("Analysing the audio file failed. Corrupt file?"), ERROR ); + jobFinished(false); + } + else { + // FIXME: m_audioJobRunning is never reset + m_audioJobRunning = true; + m_audioJob->start(); // from here on the audio job takes over completely + } + } + else { + emit canceled(); + jobFinished(false); + } +} + + +void K3bAudioCueFileWritingJob::importCueInProject() +{ + // cleanup the project (this wil also delete the decoder) + // we do not use newDocument as that would overwrite the settings already made + while( m_audioDoc->firstTrack() ) + delete m_audioDoc->firstTrack()->take(); + + m_decoder = 0; + + K3bCueFileParser parser( m_cueFile ); + if( parser.isValid() && parser.toc().contentType() == K3bDevice::AUDIO ) { + + kdDebug() << "(K3bAudioCueFileWritingJob::importCueFile) parsed with image: " << parser.imageFilename() << endl; + + // global cd-text + m_audioDoc->setTitle( parser.cdText().title() ); + m_audioDoc->setPerformer( parser.cdText().performer() ); + m_audioDoc->writeCdText( !parser.cdText().title().isEmpty() ); + + m_decoder = K3bAudioDecoderFactory::createDecoder( parser.imageFilename() ); + if( m_decoder ) { + m_decoder->setFilename( parser.imageFilename() ); + + K3bAudioTrack* after = 0; + K3bAudioFile* newFile = 0; + unsigned int i = 0; + for( K3bDevice::Toc::const_iterator it = parser.toc().begin(); + it != parser.toc().end(); ++it ) { + const K3bDevice::Track& track = *it; + + newFile = new K3bAudioFile( m_decoder, m_audioDoc ); + newFile->setStartOffset( track.firstSector() ); + newFile->setEndOffset( track.lastSector()+1 ); + + K3bAudioTrack* newTrack = new K3bAudioTrack( m_audioDoc ); + newTrack->addSource( newFile ); + newTrack->moveAfter( after ); + + // cd-text + newTrack->setTitle( parser.cdText()[i].title() ); + newTrack->setPerformer( parser.cdText()[i].performer() ); + + // add the next track after this one + after = newTrack; + ++i; + } + + // let the last source use the data up to the end of the file + if( newFile ) + newFile->setEndOffset(0); + + // now analyze the source + emit newTask( i18n("Analysing the audio file") ); + emit newSubTask( i18n("Analysing %1").arg( parser.imageFilename() ) ); + + // start the analyser thread + m_analyserThread->setDecoder( m_decoder ); + m_analyserJob->start(); + } + else { + emit infoMessage( i18n("Unable to handle '%1' due to an unsupported format.").arg( m_cueFile ), ERROR ); + jobFinished(false); + } + } + else { + emit infoMessage( i18n("No valid audio cue file: '%1'").arg( m_cueFile ), ERROR ); + jobFinished(false); + } +} + +#include "k3baudiocuefilewritingjob.moc" diff --git a/libk3b/jobs/k3baudiocuefilewritingjob.h b/libk3b/jobs/k3baudiocuefilewritingjob.h new file mode 100644 index 0000000..6e0a3c2 --- /dev/null +++ b/libk3b/jobs/k3baudiocuefilewritingjob.h @@ -0,0 +1,79 @@ +/* + * + * $Id: k3baudiocuefilewritingjob.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2005 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_AUDIO_CUE_FILEWRITING_JOB_H_ +#define _K3B_AUDIO_CUE_FILEWRITING_JOB_H_ + +#include +#include "k3b_export.h" +class K3bAudioDoc; +class K3bAudioJob; +class K3bAudioDecoder; +class K3bThreadJob; +namespace K3bDevice { + class Device; +} + + +class LIBK3B_EXPORT K3bAudioCueFileWritingJob : public K3bBurnJob +{ + Q_OBJECT + + public: + K3bAudioCueFileWritingJob( K3bJobHandler*, QObject* parent = 0, const char* name = 0 ); + ~K3bAudioCueFileWritingJob(); + + K3bDevice::Device* writer() const; + + QString jobDescription() const; + QString jobDetails() const; + + const QString& cueFile() const { return m_cueFile; } + + public slots: + void start(); + void cancel(); + + void setCueFile( const QString& ); + void setSpeed( int s ); + void setBurnDevice( K3bDevice::Device* dev ); + void setWritingMode( int mode ); + void setSimulate( bool b ); + void setCopies( int c ); + void setOnTheFly( bool b ); + void setTempDir( const QString& ); + + private slots: + void slotAnalyserThreadFinished(bool); + + private: + void importCueInProject(); + + K3bDevice::Device* m_device; + + QString m_cueFile; + K3bAudioDoc* m_audioDoc; + K3bAudioJob* m_audioJob; + K3bAudioDecoder* m_decoder; + + bool m_canceled; + bool m_audioJobRunning; + + class AnalyserThread; + AnalyserThread* m_analyserThread; + K3bThreadJob* m_analyserJob; +}; + +#endif diff --git a/libk3b/jobs/k3baudiosessionreadingjob.cpp b/libk3b/jobs/k3baudiosessionreadingjob.cpp new file mode 100644 index 0000000..f4ac550 --- /dev/null +++ b/libk3b/jobs/k3baudiosessionreadingjob.cpp @@ -0,0 +1,278 @@ +/* + * + * $Id: k3baudiosessionreadingjob.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3baudiosessionreadingjob.h" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + + +class K3bAudioSessionReadingJob::WorkThread : public K3bThread +{ +public: + WorkThread(); + ~WorkThread(); + + void init(); + void run(); + void cancel(); + + bool canceled; + + int fd; + K3bCdparanoiaLib* paranoia; + K3bDevice::Device* device; + K3bDevice::Toc toc; + K3bWaveFileWriter* waveFileWriter; + QStringList filenames; + int paranoiaMode; + int retries; + bool neverSkip; +}; + + +K3bAudioSessionReadingJob::WorkThread::WorkThread() + : K3bThread(), + fd(-1), + paranoia(0), + waveFileWriter(0), + paranoiaMode(0), + retries(50), + neverSkip(false) +{ +} + + +K3bAudioSessionReadingJob::WorkThread::~WorkThread() +{ + delete waveFileWriter; + delete paranoia; +} + + +void K3bAudioSessionReadingJob::WorkThread::init() +{ + canceled = false; +} + + +void K3bAudioSessionReadingJob::WorkThread::run() +{ + if( !paranoia ) + paranoia = K3bCdparanoiaLib::create(); + + if( !paranoia ) { + emitInfoMessage( i18n("Could not load libcdparanoia."), K3bJob::ERROR ); + emitFinished(false); + return; + } + + if( toc.isEmpty() ) + toc = device->readToc(); + + if( !paranoia->initParanoia( device, toc ) ) { + emitInfoMessage( i18n("Could not open device %1").arg(device->blockDeviceName()), + K3bJob::ERROR ); + emitFinished(false); + return; + } + + if( !paranoia->initReading() ) { + emitInfoMessage( i18n("Error while initializing audio ripping."), K3bJob::ERROR ); + emitFinished(false); + return; + } + + device->block( true ); + + // init settings + paranoia->setMaxRetries( retries ); + paranoia->setParanoiaMode( paranoiaMode ); + paranoia->setNeverSkip( neverSkip ); + + bool writeError = false; + unsigned int trackNum = 1; + unsigned int currentTrack = 0; + unsigned long trackRead = 0; + unsigned long totalRead = 0; + unsigned int lastTrackPercent = 0; + unsigned int lastTotalPercent = 0; + bool newTrack = true; + int status = 0; + char* buffer = 0; + while( !canceled && (buffer = paranoia->read( &status, &trackNum, fd == -1 /*when writing to a wav be want little endian */ )) ) { + + if( currentTrack != trackNum ) { + emitNextTrack( trackNum, paranoia->toc().count() ); + trackRead = 0; + lastTrackPercent = 0; + + currentTrack = trackNum; + newTrack = true; + } + + if( fd > 0 ) { + if( ::write( fd, buffer, CD_FRAMESIZE_RAW ) != CD_FRAMESIZE_RAW ) { + kdDebug() << "(K3bAudioSessionCopyJob::WorkThread) error while writing to fd " << fd << endl; + writeError = true; + break; + } + } + else { + if( newTrack ) { + newTrack = false; + + if( !waveFileWriter ) + waveFileWriter = new K3bWaveFileWriter(); + + if( filenames.count() < currentTrack ) { + kdDebug() << "(K3bAudioSessionCopyJob) not enough image filenames given: " << currentTrack << endl; + writeError = true; + break; + } + + if( !waveFileWriter->open( filenames[currentTrack-1] ) ) { + emitInfoMessage( i18n("Unable to open '%1' for writing.").arg(filenames[currentTrack-1]), K3bJob::ERROR ); + writeError = true; + break; + } + } + + waveFileWriter->write( buffer, + CD_FRAMESIZE_RAW, + K3bWaveFileWriter::LittleEndian ); + } + + trackRead++; + totalRead++; + + unsigned int trackPercent = 100 * trackRead / toc[currentTrack-1].length().lba(); + if( trackPercent > lastTrackPercent ) { + lastTrackPercent = trackPercent; + emitSubPercent( lastTrackPercent ); + } + unsigned int totalPercent = 100 * totalRead / paranoia->rippedDataLength(); + if( totalPercent > lastTotalPercent ) { + lastTotalPercent = totalPercent; + emitPercent( lastTotalPercent ); + } + } + + if( waveFileWriter ) + waveFileWriter->close(); + + paranoia->close(); + + device->block( false ); + + if( status != K3bCdparanoiaLib::S_OK ) { + emitInfoMessage( i18n("Unrecoverable error while ripping track %1.").arg(trackNum), K3bJob::ERROR ); + emitFinished(false); + return; + } + + emitFinished( !writeError & !canceled ); +} + + +void K3bAudioSessionReadingJob::WorkThread::cancel() +{ + canceled = true; + // FIXME: add backup killing like in the audio ripping and make sure to close paranoia +} + + + + +K3bAudioSessionReadingJob::K3bAudioSessionReadingJob( K3bJobHandler* jh, QObject* parent, const char* name ) + : K3bThreadJob( jh, parent, name ) +{ + m_thread = new WorkThread(); + setThread( m_thread ); +} + + +K3bAudioSessionReadingJob::~K3bAudioSessionReadingJob() +{ + delete m_thread; +} + + +void K3bAudioSessionReadingJob::setDevice( K3bDevice::Device* dev ) +{ + m_thread->device = dev; + m_thread->toc = K3bDevice::Toc(); +} + + +void K3bAudioSessionReadingJob::setToc( const K3bDevice::Toc& toc ) +{ + m_thread->toc = toc; +} + + +void K3bAudioSessionReadingJob::writeToFd( int fd ) +{ + m_thread->fd = fd; +} + +void K3bAudioSessionReadingJob::setImageNames( const QStringList& l ) +{ + m_thread->filenames = l; + m_thread->fd = -1; +} + + +void K3bAudioSessionReadingJob::setParanoiaMode( int m ) +{ + m_thread->paranoiaMode = m; +} + + +void K3bAudioSessionReadingJob::setReadRetries( int r ) +{ + m_thread->retries = r; +} + +void K3bAudioSessionReadingJob::setNeverSkip( bool b ) +{ + m_thread->neverSkip = b; +} + + +void K3bAudioSessionReadingJob::start() +{ + k3bcore->blockDevice( m_thread->device ); + K3bThreadJob::start(); +} + + +void K3bAudioSessionReadingJob::cleanupJob( bool success ) +{ + Q_UNUSED( success ); + k3bcore->unblockDevice( m_thread->device ); +} + +#include "k3baudiosessionreadingjob.moc" diff --git a/libk3b/jobs/k3baudiosessionreadingjob.h b/libk3b/jobs/k3baudiosessionreadingjob.h new file mode 100644 index 0000000..21f3d50 --- /dev/null +++ b/libk3b/jobs/k3baudiosessionreadingjob.h @@ -0,0 +1,75 @@ +/* + * + * $Id: k3baudiosessionreadingjob.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_AUDIOSESSION_READING_JOB_H_ +#define _K3B_AUDIOSESSION_READING_JOB_H_ + +#include + +#include + + +namespace K3bDevice { + class Device; + class Toc; +} + + +class K3bAudioSessionReadingJob : public K3bThreadJob +{ + Q_OBJECT + + public: + K3bAudioSessionReadingJob( K3bJobHandler*, QObject* parent = 0, const char* name = 0 ); + ~K3bAudioSessionReadingJob(); + + /** + * For now this simply reads all the audio tracks at the beginning + * since we only support CD-Extra mixed mode cds. + */ + void setDevice( K3bDevice::Device* ); + + /** + * Use for faster initialization + */ + void setToc( const K3bDevice::Toc& toc ); + + /** + * the data gets written directly into fd instead of imagefiles. + * To disable just set fd to -1 (the default) + */ + void writeToFd( int fd ); + + /** + * Used if fd == -1 + */ + void setImageNames( const QStringList& l ); + + void setParanoiaMode( int m ); + void setReadRetries( int ); + void setNeverSkip( bool b ); + + public slots: + void start(); + + protected: + void cleanupJob( bool success ); + + private: + class WorkThread; + WorkThread* m_thread; +}; + +#endif diff --git a/libk3b/jobs/k3bbinimagewritingjob.cpp b/libk3b/jobs/k3bbinimagewritingjob.cpp new file mode 100644 index 0000000..de76e3f --- /dev/null +++ b/libk3b/jobs/k3bbinimagewritingjob.cpp @@ -0,0 +1,234 @@ +/* + * + * $Id: k3bbinimagewritingjob.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Klaus-Dieter Krannich + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include "k3bbinimagewritingjob.h" +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + + + +K3bBinImageWritingJob::K3bBinImageWritingJob( K3bJobHandler* hdl, QObject* parent ) + : K3bBurnJob( hdl, parent ), + m_device(0), + m_simulate(false), + m_force(false), + m_noFix(false), + m_tocFile(0), + m_speed(2), + m_copies(1), + m_writer(0) +{ +} + +K3bBinImageWritingJob::~K3bBinImageWritingJob() +{ +} + +void K3bBinImageWritingJob::start() +{ + m_canceled = false; + + if( m_copies < 1 ) + m_copies = 1; + m_finishedCopies = 0; + + jobStarted(); + emit newTask( i18n("Write Binary Image") ); + + if( prepareWriter() ) + writerStart(); + else + cancel(); + +} + +void K3bBinImageWritingJob::cancel() +{ + m_canceled = true; + m_writer->cancel(); + emit canceled(); + jobFinished( false ); +} + +bool K3bBinImageWritingJob::prepareWriter() +{ + if( m_writer ) + delete m_writer; + + int usedWritingApp = writingApp(); + const K3bExternalBin* cdrecordBin = k3bcore->externalBinManager()->binObject("cdrecord"); + if( usedWritingApp == K3b::CDRECORD || + ( usedWritingApp == K3b::DEFAULT && cdrecordBin && cdrecordBin->hasFeature("cuefile") && m_device->dao() ) ) { + usedWritingApp = K3b::CDRECORD; + + // IMPROVEME: check if it's a cdrdao toc-file + if( m_tocFile.right(4) == ".toc" ) { + kdDebug() << "(K3bBinImageWritingJob) imagefile has ending toc." << endl; + usedWritingApp = K3b::CDRDAO; + } + else { + // TODO: put this into K3bCueFileParser + // TODO: check K3bCueFileParser::imageFilenameInCue() + // let's see if cdrecord can handle the cue file + QFile f( m_tocFile ); + if( f.open( IO_ReadOnly ) ) { + QTextStream fStr( &f ); + if( fStr.read().contains( "MODE1/2352" ) ) { + kdDebug() << "(K3bBinImageWritingJob) cuefile contains MODE1/2352 track. using cdrdao." << endl; + usedWritingApp = K3b::CDRDAO; + } + f.close(); + } + else + kdDebug() << "(K3bBinImageWritingJob) could not open file " << m_tocFile << endl; + } + } + else + usedWritingApp = K3b::CDRDAO; + + if( usedWritingApp == K3b::CDRECORD ) { + // create cdrecord job + K3bCdrecordWriter* writer = new K3bCdrecordWriter( m_device, this ); + + writer->setDao( true ); + writer->setSimulate( m_simulate ); + writer->setBurnSpeed( m_speed ); + writer->setCueFile ( m_tocFile ); + + if( m_noFix ) { + writer->addArgument("-multi"); + } + + if( m_force ) { + writer->addArgument("-force"); + } + + m_writer = writer; + } + else { + // create cdrdao job + K3bCdrdaoWriter* writer = new K3bCdrdaoWriter( m_device, this ); + writer->setCommand( K3bCdrdaoWriter::WRITE ); + writer->setSimulate( m_simulate ); + writer->setBurnSpeed( m_speed ); + writer->setForce( m_force ); + + // multisession + writer->setMulti( m_noFix ); + + writer->setTocFile( m_tocFile ); + + m_writer = writer; + } + + connect( m_writer, SIGNAL(infoMessage(const QString&, int)), this, SIGNAL(infoMessage(const QString&, int)) ); + connect( m_writer, SIGNAL(percent(int)), this, SLOT(copyPercent(int)) ); + connect( m_writer, SIGNAL(subPercent(int)), this, SLOT(copySubPercent(int)) ); + connect( m_writer, SIGNAL(processedSize(int, int)), this, SIGNAL(processedSize(int, int)) ); + connect( m_writer, SIGNAL(buffer(int)), this, SIGNAL(bufferStatus(int)) ); + connect( m_writer, SIGNAL(deviceBuffer(int)), this, SIGNAL(deviceBuffer(int)) ); + connect( m_writer, SIGNAL(writeSpeed(int, int)), this, SIGNAL(writeSpeed(int, int)) ); + connect( m_writer, SIGNAL(finished(bool)), this, SLOT(writerFinished(bool)) ); + connect( m_writer, SIGNAL(newTask(const QString&)), this, SIGNAL(newTask(const QString&)) ); + connect( m_writer, SIGNAL(newSubTask(const QString&)), this, SIGNAL(newSubTask(const QString&)) ); + connect( m_writer, SIGNAL(nextTrack(int, int)), this, SLOT(slotNextTrack(int, int)) ); + connect( m_writer, SIGNAL(debuggingOutput(const QString&, const QString&)), this, SIGNAL(debuggingOutput(const QString&, const QString&)) ); + + return true; +} + + +void K3bBinImageWritingJob::writerStart() +{ + + if( waitForMedia( m_device ) < 0 ) { + cancel(); + } + // just to be sure we did not get canceled during the async discWaiting + else if( !m_canceled ) { + emit burning(true); + m_writer->start(); + } +} + +void K3bBinImageWritingJob::copyPercent(int p) +{ + emit percent( (100*m_finishedCopies + p)/m_copies ); +} + +void K3bBinImageWritingJob::copySubPercent(int p) +{ + emit subPercent(p); +} + +void K3bBinImageWritingJob::writerFinished(bool ok) +{ + if( m_canceled ) + return; + + if (ok) { + m_finishedCopies++; + if ( m_finishedCopies == m_copies ) { + emit infoMessage( i18n("%n copy successfully created", "%n copies successfully created", m_copies),K3bJob::INFO ); + jobFinished( true ); + } + else { + writerStart(); + } + } + else { + jobFinished(false); + } +} + + +void K3bBinImageWritingJob::slotNextTrack( int t, int tt ) +{ + emit newSubTask( i18n("Writing track %1 of %2").arg(t).arg(tt) ); +} + + +QString K3bBinImageWritingJob::jobDescription() const +{ + return ( i18n("Writing cue/bin Image") + + ( m_copies > 1 + ? i18n(" - %n Copy", " - %n Copies", m_copies) + : QString::null ) ); +} + + +QString K3bBinImageWritingJob::jobDetails() const +{ + return m_tocFile.section("/", -1); +} + + +void K3bBinImageWritingJob::setTocFile(const QString& s) +{ + m_tocFile = s; +} + +#include "k3bbinimagewritingjob.moc" diff --git a/libk3b/jobs/k3bbinimagewritingjob.h b/libk3b/jobs/k3bbinimagewritingjob.h new file mode 100644 index 0000000..3666793 --- /dev/null +++ b/libk3b/jobs/k3bbinimagewritingjob.h @@ -0,0 +1,79 @@ +/* + * + * $Id$ + * Copyright (C) 2003 Klaus-Dieter Krannich + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef K3BBINIMAGEWRITINGJOB_H +#define K3BBINIMAGEWRITINGJOB_H + +#include +#include "k3b_export.h" +class K3bAbstractWriter; +namespace K3bDevice { + class Device; +} + +/** + *@author Klaus-Dieter Krannich + */ +class LIBK3B_EXPORT K3bBinImageWritingJob : public K3bBurnJob +{ + Q_OBJECT + + public: + K3bBinImageWritingJob( K3bJobHandler*, QObject* parent = 0 ); + ~K3bBinImageWritingJob(); + + K3bDevice::Device* writer() const { return m_device; }; + + QString jobDescription() const; + QString jobDetails() const; + + public slots: + void start(); + void cancel(); + + void setWriter( K3bDevice::Device* dev ) { m_device = dev; } + void setSimulate( bool b ) { m_simulate = b; } + void setForce(bool b) { m_force = b; } + void setMulti( bool b ) { m_noFix = b; } + void setTocFile( const QString& s); + void setCopies(int c) { m_copies = c; } + void setSpeed( int s ) { m_speed = s; } + + private slots: + void writerFinished(bool); + void copyPercent(int p); + void copySubPercent(int p); + void slotNextTrack( int, int ); + + private: + void writerStart(); + bool prepareWriter(); + + K3bDevice::Device* m_device; + bool m_simulate; + bool m_force; + bool m_noFix; + QString m_tocFile; + int m_speed; + int m_copies; + int m_finishedCopies; + + bool m_canceled; + + K3bAbstractWriter* m_writer; +}; + +#endif diff --git a/libk3b/jobs/k3bblankingjob.cpp b/libk3b/jobs/k3bblankingjob.cpp new file mode 100644 index 0000000..c11f4b4 --- /dev/null +++ b/libk3b/jobs/k3bblankingjob.cpp @@ -0,0 +1,176 @@ +/* + * + * $Id: k3bblankingjob.cpp 630823 2007-02-06 14:07:10Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bblankingjob.h" +#include "k3bcdrecordwriter.h" +#include "k3bcdrdaowriter.h" + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + + + +K3bBlankingJob::K3bBlankingJob( K3bJobHandler* hdl, QObject* parent ) + : K3bBurnJob( hdl, parent ), + m_writerJob(0), + m_force(true), + m_device(0), + m_speed(0), + m_mode(Fast), + m_writingApp(K3b::DEFAULT), + m_canceled(false), + m_forceNoEject(false) +{ +} + + +K3bBlankingJob::~K3bBlankingJob() +{ + delete m_writerJob; +} + + +K3bDevice::Device* K3bBlankingJob::writer() const +{ + return m_device; +} + + +void K3bBlankingJob::setDevice( K3bDevice::Device* dev ) +{ + m_device = dev; +} + + +void K3bBlankingJob::start() +{ + if( m_device == 0 ) + return; + + jobStarted(); + + slotStartErasing(); +} + +void K3bBlankingJob::slotStartErasing() +{ + m_canceled = false; + + if( m_writerJob ) + delete m_writerJob; + + if( m_writingApp == K3b::CDRDAO ) { + K3bCdrdaoWriter* writer = new K3bCdrdaoWriter( m_device, this ); + m_writerJob = writer; + + writer->setCommand(K3bCdrdaoWriter::BLANK); + writer->setBlankMode( m_mode == Fast ? K3bCdrdaoWriter::MINIMAL : K3bCdrdaoWriter::FULL ); + writer->setForce(m_force); + writer->setBurnSpeed(m_speed); + writer->setForceNoEject( m_forceNoEject ); + } + else { + K3bCdrecordWriter* writer = new K3bCdrecordWriter( m_device, this ); + m_writerJob = writer; + + QString mode; + switch( m_mode ) { + case Fast: + mode = "fast"; + break; + case Complete: + mode = "all"; + break; + case Track: + mode = "track"; + break; + case Unclose: + mode = "unclose"; + break; + case Session: + mode = "session"; + break; + } + + writer->addArgument("blank="+ mode); + + if (m_force) + writer->addArgument("-force"); + writer->setBurnSpeed(m_speed); + writer->setForceNoEject( m_forceNoEject ); + } + + connect(m_writerJob, SIGNAL(finished(bool)), this, SLOT(slotFinished(bool))); + connect(m_writerJob, SIGNAL(infoMessage( const QString&, int)), + this,SIGNAL(infoMessage( const QString&, int))); + connect( m_writerJob, SIGNAL(debuggingOutput(const QString&, const QString&)), + this, SIGNAL(debuggingOutput(const QString&, const QString&)) ); + + if( waitForMedia( m_device, + K3bDevice::STATE_COMPLETE|K3bDevice::STATE_INCOMPLETE, + K3bDevice::MEDIA_CD_RW, + i18n("Please insert a rewritable CD medium into drive

%1 %2 (%3).") + .arg(m_device->vendor()) + .arg(m_device->description()) + .arg(m_device->devicename()) ) < 0 ) { + emit canceled(); + jobFinished(false); + return; + } + + m_writerJob->start(); +} + + +void K3bBlankingJob::cancel() +{ + m_canceled = true; + + if( m_writerJob ) + m_writerJob->cancel(); +} + + +void K3bBlankingJob::slotFinished(bool success) +{ + if( success ) { + emit infoMessage( i18n("Process completed successfully"), K3bJob::SUCCESS ); + jobFinished( true ); + } + else { + if( m_canceled ) { + emit infoMessage( i18n("Canceled."), ERROR ); + emit canceled(); + } + else { + emit infoMessage( i18n("Blanking error "), K3bJob::ERROR ); + emit infoMessage( i18n("Sorry, no error handling yet."), K3bJob::ERROR ); + } + jobFinished( false ); + } +} + + + +#include "k3bblankingjob.moc" diff --git a/libk3b/jobs/k3bblankingjob.h b/libk3b/jobs/k3bblankingjob.h new file mode 100644 index 0000000..8cfe0a1 --- /dev/null +++ b/libk3b/jobs/k3bblankingjob.h @@ -0,0 +1,71 @@ +/* + * + * $Id: k3bblankingjob.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef K3B_BLANKING_JOB_H +#define K3B_BLANKING_JOB_H + +#include +#include "k3b_export.h" +class KProcess; +class QString; +class K3bDevice::Device; +class K3bAbstractWriter; + + +class LIBK3B_EXPORT K3bBlankingJob : public K3bBurnJob +{ + Q_OBJECT + + public: + K3bBlankingJob( K3bJobHandler*, QObject* parent = 0 ); + ~K3bBlankingJob(); + + K3bDevice::Device* writer() const; + + bool hasBeenCanceled() const { return m_canceled; } + + enum blank_mode { Fast, Complete, Track, Unclose, Session }; + + public slots: + void start(); + void cancel(); + void setForce( bool f ) { m_force = f; } + void setDevice( K3bDevice::Device* d ); + void setSpeed( int s ) { m_speed = s; } + void setMode( int m ) { m_mode = m; } + void setWritingApp (int app) { m_writingApp = app; } + + /** + * If set true the job ignores the global K3b setting + * and does not eject the CD-RW after finishing + */ + void setForceNoEject( bool b ) { m_forceNoEject = b; } + + private slots: + void slotFinished(bool); + void slotStartErasing(); + + private: + K3bAbstractWriter* m_writerJob; + bool m_force; + K3bDevice::Device* m_device; + int m_speed; + int m_mode; + int m_writingApp; + bool m_canceled; + bool m_forceNoEject; +}; + +#endif diff --git a/libk3b/jobs/k3bcdcopyjob.cpp b/libk3b/jobs/k3bcdcopyjob.cpp new file mode 100644 index 0000000..ff8f35d --- /dev/null +++ b/libk3b/jobs/k3bcdcopyjob.cpp @@ -0,0 +1,1213 @@ +/* + * + * $Id.cpp,v 1.82 2005/02/04 09:27:19 trueg Exp $ + * Copyright (C) 2003-2007 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include "k3bcdcopyjob.h" +#include "k3baudiosessionreadingjob.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +class K3bCdCopyJob::Private +{ +public: + Private() + : canceled(false), + running(false), + readcdReader(0), + dataTrackReader(0), + audioSessionReader(0), + cdrecordWriter(0), + infFileWriter(0), + cddb(0) { + } + + bool canceled; + bool error; + bool readingSuccessful; + bool running; + + unsigned int numSessions; + bool doNotCloseLastSession; + + unsigned int doneCopies; + unsigned int currentReadSession; + unsigned int currentWrittenSession; + + K3bDevice::Toc toc; + QByteArray cdTextRaw; + + K3bReadcdReader* readcdReader; + K3bDataTrackReader* dataTrackReader; + K3bAudioSessionReadingJob* audioSessionReader; + K3bCdrecordWriter* cdrecordWriter; + K3bInfFileWriter* infFileWriter; + + bool audioReaderRunning; + bool dataReaderRunning; + bool writerRunning; + + // image filenames, one for every track + QStringList imageNames; + + // inf-filenames for writing audio tracks + QStringList infNames; + + // indicates if we created a dir or not + bool deleteTempDir; + + K3bCddb* cddb; + K3bCddbResultEntry cddbInfo; + + bool haveCddb; + bool haveCdText; + + QValueVector dataSessionProbablyTAORecorded; + + // used to determine progress + QValueVector sessionSizes; + long overallSize; +}; + + +K3bCdCopyJob::K3bCdCopyJob( K3bJobHandler* hdl, QObject* parent ) + : K3bBurnJob( hdl, parent ), + m_simulate(false), + m_copies(1), + m_onlyCreateImages(false), + m_onTheFly(true), + m_ignoreDataReadErrors(false), + m_ignoreAudioReadErrors(true), + m_noCorrection(false), + m_dataReadRetries(128), + m_audioReadRetries(5), + m_preferCdText(false), + m_copyCdText(true), + m_writingMode( K3b::WRITING_MODE_AUTO ) +{ + d = new Private(); +} + + +K3bCdCopyJob::~K3bCdCopyJob() +{ + delete d->infFileWriter; + delete d; +} + + +void K3bCdCopyJob::start() +{ + d->running = true; + d->canceled = false; + d->error = false; + d->readingSuccessful = false; + d->audioReaderRunning = d->dataReaderRunning = d->writerRunning = false; + d->sessionSizes.clear(); + d->dataSessionProbablyTAORecorded.clear(); + d->deleteTempDir = false; + d->haveCdText = false; + d->haveCddb = false; + + jobStarted(); + + emit newTask( i18n("Checking Source Medium") ); + + emit burning(false); + emit newSubTask( i18n("Waiting for source medium") ); + + // wait for a source disk + if( waitForMedia( m_readerDevice, + K3bDevice::STATE_COMPLETE|K3bDevice::STATE_INCOMPLETE, + K3bDevice::MEDIA_WRITABLE_CD|K3bDevice::MEDIA_CD_ROM ) < 0 ) { + finishJob( true, false ); + return; + } + + emit newSubTask( i18n("Checking source medium") ); + + // FIXME: read ISRCs and MCN + + connect( K3bDevice::diskInfo( m_readerDevice ), SIGNAL(finished(K3bDevice::DeviceHandler*)), + this, SLOT(slotDiskInfoReady(K3bDevice::DeviceHandler*)) ); +} + + +void K3bCdCopyJob::slotDiskInfoReady( K3bDevice::DeviceHandler* dh ) +{ + if( dh->success() ) { + d->toc = dh->toc(); + + // + // for now we copy audio, pure data (aka 1 data track), cd-extra (2 session, audio and data), + // and data multisession which one track per session. + // Everything else will be rejected + // + bool canCopy = true; + bool audio = false; + d->numSessions = dh->diskInfo().numSessions(); + d->doNotCloseLastSession = (dh->diskInfo().diskState() == K3bDevice::STATE_INCOMPLETE); + switch( dh->toc().contentType() ) { + case K3bDevice::DATA: + // check if every track is in it's own session + // only then we copy the cd + if( (int)dh->toc().count() != dh->diskInfo().numSessions() ) { + emit infoMessage( i18n("K3b does not copy CDs containing multiple data tracks."), ERROR ); + canCopy = false; + } + else if( dh->diskInfo().numSessions() > 1 ) + emit infoMessage( i18n("Copying Multisession Data CD."), INFO ); + else + emit infoMessage( i18n("Copying Data CD."), INFO ); + break; + + case K3bDevice::MIXED: + audio = true; + if( dh->diskInfo().numSessions() != 2 || d->toc[0].type() != K3bDevice::Track::AUDIO ) { + emit infoMessage( i18n("K3b can only copy CD-Extra mixed mode CDs."), ERROR ); + canCopy = false; + } + else + emit infoMessage( i18n("Copying Enhanced Audio CD (CD-Extra)."), INFO ); + break; + + case K3bDevice::AUDIO: + audio = true; + emit infoMessage( i18n("Copying Audio CD."), INFO ); + break; + + case K3bDevice::NONE: + default: + emit infoMessage( i18n("The source disk is empty."), ERROR ); + canCopy = false; + break; + } + + // + // A data track recorded in TAO mode has two run-out blocks which cannot be read and contain + // zero data anyway. The problem is that I do not know of a valid method to determine if a track + // was written in TAO (the control nibble does definitely not work, I never saw one which did not + // equal 4). + // So the solution for now is to simply try to read the last sector of a data track. If this is not + // possible we assume it was written in TAO mode and reduce the length by 2 sectors + // + unsigned char buffer[2048]; + int i = 1; + for( K3bDevice::Toc::iterator it = d->toc.begin(); it != d->toc.end(); ++it ) { + if( (*it).type() == K3bDevice::Track::DATA ) { + // we try twice just to be sure + if( m_readerDevice->read10( buffer, 2048, (*it).lastSector().lba(), 1 ) || + m_readerDevice->read10( buffer, 2048, (*it).lastSector().lba(), 1 ) ) { + d->dataSessionProbablyTAORecorded.append(false); + kdDebug() << "(K3bCdCopyJob) track " << i << " probably DAO recorded." << endl; + } + else { + d->dataSessionProbablyTAORecorded.append(true); + kdDebug() << "(K3bCdCopyJob) track " << i << " probably TAO recorded." << endl; + } + } + + ++i; + } + + + // + // To copy mode2 data tracks we need cdrecord >= 2.01a12 which introduced the -xa1 and -xamix options + // + if( k3bcore->externalBinManager()->binObject("cdrecord") && + !k3bcore->externalBinManager()->binObject("cdrecord")->hasFeature( "xamix" ) ) { + for( K3bDevice::Toc::const_iterator it = d->toc.begin(); it != d->toc.end(); ++it ) { + if( (*it).type() == K3bDevice::Track::DATA && + ( (*it).mode() == K3bDevice::Track::XA_FORM1 || + (*it).mode() == K3bDevice::Track::XA_FORM2 ) ) { + emit infoMessage( i18n("K3b needs cdrecord 2.01a12 or newer to copy Mode2 data tracks."), ERROR ); + finishJob( true, false ); + return; + } + } + } + + + // + // It is not possible to create multisession cds in raw writing mode + // + if( d->numSessions > 1 && m_writingMode == K3b::RAW ) { + if( !questionYesNo( i18n("You will only be able to copy the first session in raw writing mode. " + "Continue anyway?"), + i18n("Multisession CD") ) ) { + finishJob( true, false ); + return; + } + else { + emit infoMessage( i18n("Only copying first session."), WARNING ); + // TODO: remove the second session from the progress stuff + } + } + + + // + // We already create the temp filenames here since we need them to check the free space + // + if( !m_onTheFly || m_onlyCreateImages ) { + if( !prepareImageFiles() ) { + finishJob( false, true ); + return; + } + + // + // check free temp space + // + KIO::filesize_t imageSpaceNeeded = 0; + for( K3bDevice::Toc::const_iterator it = d->toc.begin(); it != d->toc.end(); ++it ) { + if( (*it).type() == K3bDevice::Track::AUDIO ) + imageSpaceNeeded += (*it).length().audioBytes() + 44; + else + imageSpaceNeeded += (*it).length().mode1Bytes(); + } + + unsigned long avail, size; + QString pathToTest = m_tempPath.left( m_tempPath.findRev( '/' ) ); + if( !K3b::kbFreeOnFs( pathToTest, size, avail ) ) { + emit infoMessage( i18n("Unable to determine free space in temporary directory '%1'.").arg(pathToTest), ERROR ); + d->error = true; + canCopy = false; + } + else { + if( avail < imageSpaceNeeded/1024 ) { + emit infoMessage( i18n("Not enough space left in temporary directory."), ERROR ); + d->error = true; + canCopy = false; + } + } + } + + if( canCopy ) { + if( K3b::isMounted( m_readerDevice ) ) { + emit infoMessage( i18n("Unmounting source medium"), INFO ); + K3b::unmount( m_readerDevice ); + } + + d->overallSize = 0; + + // now create some progress helper values + for( K3bDevice::Toc::const_iterator it = d->toc.begin(); it != d->toc.end(); ++it ) { + d->overallSize += (*it).length().lba(); + if( d->sessionSizes.isEmpty() || (*it).type() == K3bDevice::Track::DATA ) + d->sessionSizes.append( (*it).length().lba() ); + else + d->sessionSizes[0] += (*it).length().lba(); + } + + if( audio && !m_onlyCreateImages ) { + if( m_copyCdText ) + searchCdText(); + else + queryCddb(); + } + else + startCopy(); + } + else { + finishJob( false, true ); + } + } + else { + emit infoMessage( i18n("Unable to read TOC"), ERROR ); + finishJob( false, true ); + } +} + + +void K3bCdCopyJob::searchCdText() +{ + emit newSubTask( i18n("Searching CD-TEXT") ); + + connect( K3bDevice::sendCommand( K3bDevice::DeviceHandler::CD_TEXT_RAW, m_readerDevice ), + SIGNAL(finished(K3bDevice::DeviceHandler*)), + this, + SLOT(slotCdTextReady(K3bDevice::DeviceHandler*)) ); +} + + +void K3bCdCopyJob::slotCdTextReady( K3bDevice::DeviceHandler* dh ) +{ + if( dh->success() ) { + if( K3bDevice::CdText::checkCrc( dh->cdTextRaw() ) ) { + K3bDevice::CdText cdt( dh->cdTextRaw() ); + emit infoMessage( i18n("Found CD-TEXT (%1 - %2).").arg(cdt.performer()).arg(cdt.title()), SUCCESS ); + d->haveCdText = true; + d->cdTextRaw = dh->cdTextRaw(); + } + else { + emit infoMessage( i18n("Found corrupted CD-TEXT. Ignoring it."), WARNING ); + d->haveCdText = false; + } + + if( d->haveCdText && m_preferCdText ) + startCopy(); + else + queryCddb(); + } + else { + emit infoMessage( i18n("No CD-TEXT found."), INFO ); + + d->haveCdText = false; + + queryCddb(); + } +} + + +void K3bCdCopyJob::queryCddb() +{ + emit newSubTask( i18n("Querying Cddb") ); + + d->haveCddb = false; + + if( !d->cddb ) { + d->cddb = new K3bCddb( this ); + connect( d->cddb, SIGNAL(queryFinished(int)), + this, SLOT(slotCddbQueryFinished(int)) ); + } + + KConfig* c = k3bcore->config(); + c->setGroup("Cddb"); + + d->cddb->readConfig( c ); + d->cddb->query( d->toc ); +} + + +void K3bCdCopyJob::slotCddbQueryFinished( int error ) +{ + if( error == K3bCddbQuery::SUCCESS ) { + d->cddbInfo = d->cddb->result(); + d->haveCddb = true; + + emit infoMessage( i18n("Found Cddb entry (%1 - %2).").arg(d->cddbInfo.cdArtist).arg(d->cddbInfo.cdTitle), SUCCESS ); + + // save the entry locally + KConfig* c = k3bcore->config(); + c->setGroup( "Cddb" ); + if( c->readBoolEntry( "save cddb entries locally", true ) ) + d->cddb->saveEntry( d->cddbInfo ); + } + else if( error == K3bCddbQuery::NO_ENTRY_FOUND ) { + emit infoMessage( i18n("No Cddb entry found."), WARNING ); + } + else { + emit infoMessage( i18n("Cddb error (%1).").arg(d->cddb->errorString()), ERROR ); + } + + startCopy(); +} + + +void K3bCdCopyJob::startCopy() +{ + d->currentWrittenSession = d->currentReadSession = 1; + d->doneCopies = 0; + + if( m_onTheFly ) { + emit newSubTask( i18n("Preparing write process...") ); + + if( writeNextSession() ) + readNextSession(); + else { + finishJob( d->canceled, d->error ); + } + } + else + readNextSession(); +} + + +void K3bCdCopyJob::cancel() +{ + d->canceled = true; + + if( d->writerRunning ) { + // + // we will handle cleanup in slotWriterFinished() + // if we are writing onthefly the reader won't be able to write + // anymore and will finish unsuccessfully, too + // + d->cdrecordWriter->cancel(); + } + else if( d->audioReaderRunning ) + d->audioSessionReader->cancel(); + else if( d->dataReaderRunning ) + // d->readcdReader->cancel(); + d->dataTrackReader->cancel(); +} + + +bool K3bCdCopyJob::prepareImageFiles() +{ + kdDebug() << "(K3bCdCopyJob) prepareImageFiles()" << endl; + + d->imageNames.clear(); + d->infNames.clear(); + d->deleteTempDir = false; + + QFileInfo fi( m_tempPath ); + + if( d->toc.count() > 1 || d->toc.contentType() == K3bDevice::AUDIO ) { + // create a directory which contains all the images and inf and stuff + // and save it in some cool structure + + bool tempDirReady = false; + if( !fi.isDir() ) { + if( QFileInfo( m_tempPath.section( '/', 0, -2 ) ).isDir() ) { + if( !QFile::exists( m_tempPath ) ) { + QDir dir( m_tempPath.section( '/', 0, -2 ) ); + dir.mkdir( m_tempPath.section( '/', -1 ) ); + tempDirReady = true; + } + else + m_tempPath = m_tempPath.section( '/', 0, -2 ); + } + else { + emit infoMessage( i18n("Specified an unusable temporary path. Using default."), WARNING ); + m_tempPath = K3b::defaultTempPath(); + } + } + + // create temp dir + if( !tempDirReady ) { + QDir dir( m_tempPath ); + m_tempPath = K3b::findUniqueFilePrefix( "k3bCdCopy", m_tempPath ); + kdDebug() << "(K3bCdCopyJob) creating temp dir: " << m_tempPath << endl; + if( !dir.mkdir( m_tempPath, true ) ) { + emit infoMessage( i18n("Unable to create temporary directory '%1'.").arg(m_tempPath), ERROR ); + return false; + } + d->deleteTempDir = true; + } + + m_tempPath = K3b::prepareDir( m_tempPath ); + emit infoMessage( i18n("Using temporary directory %1.").arg(m_tempPath), INFO ); + + // create temp filenames + int i = 1; + for( K3bDevice::Toc::const_iterator it = d->toc.begin(); it != d->toc.end(); ++it ) { + if( (*it).type() == K3bDevice::Track::AUDIO ) { + d->imageNames.append( m_tempPath + QString("Track%1.wav").arg(QString::number(i).rightJustify(2, '0')) ); + d->infNames.append( m_tempPath + QString("Track%1.inf").arg(QString::number(i).rightJustify(2, '0')) ); + } + else + d->imageNames.append( m_tempPath + QString("Track%1.iso").arg(QString::number(i).rightJustify(2, '0')) ); + ++i; + } + + kdDebug() << "(K3bCdCopyJob) created image filenames:" << endl; + for( unsigned int i = 0; i < d->imageNames.count(); ++i ) + kdDebug() << "(K3bCdCopyJob) " << d->imageNames[i] << endl; + + return true; + } + else { + // we only need a single image file + if( !fi.isFile() || + questionYesNo( i18n("Do you want to overwrite %1?").arg(m_tempPath), + i18n("File Exists") ) ) { + if( fi.isDir() ) + m_tempPath = K3b::findTempFile( "iso", m_tempPath ); + else if( !QFileInfo( m_tempPath.section( '/', 0, -2 ) ).isDir() ) { + emit infoMessage( i18n("Specified an unusable temporary path. Using default."), WARNING ); + m_tempPath = K3b::findTempFile( "iso" ); + } + // else the user specified a file in an existing dir + + emit infoMessage( i18n("Writing image file to %1.").arg(m_tempPath), INFO ); + } + else + return false; + + d->imageNames.append( m_tempPath ); + + return true; + } +} + + +void K3bCdCopyJob::readNextSession() +{ + if( !m_onTheFly || m_onlyCreateImages ) { + if( d->numSessions > 1 ) + emit newTask( i18n("Reading Session %1").arg(d->currentReadSession) ); + else + emit newTask( i18n("Reading Source Medium") ); + + if( d->currentReadSession == 1 ) + emit newSubTask( i18n("Reading track %1 of %2").arg(1).arg(d->toc.count()) ); + } + + // there is only one situation where we need the audiosessionreader: + // if the first session is an audio session. That means the first track + // is an audio track + if( d->currentReadSession == 1 && d->toc[0].type() == K3bDevice::Track::AUDIO ) { + if( !d->audioSessionReader ) { + d->audioSessionReader = new K3bAudioSessionReadingJob( this, this ); + connect( d->audioSessionReader, SIGNAL(nextTrack(int, int)), + this, SLOT(slotReadingNextTrack(int, int)) ); + connectSubJob( d->audioSessionReader, + SLOT(slotSessionReaderFinished(bool)), + true, + SLOT(slotReaderProgress(int)), + SLOT(slotReaderSubProgress(int)) ); + } + + d->audioSessionReader->setDevice( m_readerDevice ); + d->audioSessionReader->setToc( d->toc ); + d->audioSessionReader->setParanoiaMode( m_paranoiaMode ); + d->audioSessionReader->setReadRetries( m_audioReadRetries ); + d->audioSessionReader->setNeverSkip( !m_ignoreAudioReadErrors ); + if( m_onTheFly ) + d->audioSessionReader->writeToFd( d->cdrecordWriter->fd() ); + else + d->audioSessionReader->setImageNames( d->imageNames ); // the audio tracks are always the first tracks + + d->audioReaderRunning = true; + d->audioSessionReader->start(); + } + else { + if( !d->dataTrackReader ) { + d->dataTrackReader = new K3bDataTrackReader( this, this ); + connect( d->dataTrackReader, SIGNAL(percent(int)), this, SLOT(slotReaderProgress(int)) ); + connect( d->dataTrackReader, SIGNAL(processedSize(int, int)), this, SLOT(slotReaderProcessedSize(int, int)) ); + connect( d->dataTrackReader, SIGNAL(finished(bool)), this, SLOT(slotSessionReaderFinished(bool)) ); + connect( d->dataTrackReader, SIGNAL(infoMessage(const QString&, int)), this, SIGNAL(infoMessage(const QString&, int)) ); + connect( d->dataTrackReader, SIGNAL(debuggingOutput(const QString&, const QString&)), + this, SIGNAL(debuggingOutput(const QString&, const QString&)) ); + } + + d->dataTrackReader->setDevice( m_readerDevice ); + d->dataTrackReader->setIgnoreErrors( m_ignoreDataReadErrors ); + d->dataTrackReader->setNoCorrection( m_noCorrection ); + d->dataTrackReader->setRetries( m_dataReadRetries ); + if( m_onlyCreateImages ) + d->dataTrackReader->setSectorSize( K3bDataTrackReader::MODE1 ); + else + d->dataTrackReader->setSectorSize( K3bDataTrackReader::AUTO ); + + K3bTrack* track = 0; + unsigned int dataTrackIndex = 0; + if( d->toc.contentType() == K3bDevice::MIXED ) { + track = &d->toc[d->toc.count()-1]; + dataTrackIndex = 0; + } + else { + track = &d->toc[d->currentReadSession-1]; // only one track per session + dataTrackIndex = d->currentReadSession-1; + } + + // HACK: if the track is TAO recorded cut the two run-out sectors + if( d->dataSessionProbablyTAORecorded.count() > dataTrackIndex && + d->dataSessionProbablyTAORecorded[dataTrackIndex] ) + d->dataTrackReader->setSectorRange( track->firstSector(), track->lastSector() - 2 ); + else + d->dataTrackReader->setSectorRange( track->firstSector(), track->lastSector() ); + + int trackNum = d->currentReadSession; + if( d->toc.contentType() == K3bDevice::MIXED ) + trackNum = d->toc.count(); + + if( m_onTheFly ) + d->dataTrackReader->writeToFd( d->cdrecordWriter->fd() ); + else + d->dataTrackReader->setImagePath( d->imageNames[trackNum-1] ); + + d->dataReaderRunning = true; + if( !m_onTheFly || m_onlyCreateImages ) + slotReadingNextTrack( 1, 1 ); + + d->dataTrackReader->start(); + } +} + + +bool K3bCdCopyJob::writeNextSession() +{ + // we emit our own task since the cdrecord task is way too simple + if( d->numSessions > 1 ) { + if( m_simulate ) + emit newTask( i18n("Simulating Session %1").arg(d->currentWrittenSession) ); + else if( m_copies > 1 ) + emit newTask( i18n("Writing Copy %1 (Session %2)").arg(d->doneCopies+1).arg(d->currentWrittenSession) ); + else + emit newTask( i18n("Writing Copy (Session %2)").arg(d->currentWrittenSession) ); + } + else { + if( m_simulate ) + emit newTask( i18n("Simulating") ); + else if( m_copies > 1 ) + emit newTask( i18n("Writing Copy %1").arg(d->doneCopies+1) ); + else + emit newTask( i18n("Writing Copy") ); + } + + emit newSubTask( i18n("Waiting for media") ); + + // if session > 1 we wait for an appendable CD + if( waitForMedia( m_writerDevice, + d->currentWrittenSession > 1 && !m_simulate + ? K3bDevice::STATE_INCOMPLETE + : K3bDevice::STATE_EMPTY, + K3bDevice::MEDIA_WRITABLE_CD ) < 0 ) { + + finishJob( true, false ); + return false; + } + + if( !d->cdrecordWriter ) { + d->cdrecordWriter = new K3bCdrecordWriter( m_writerDevice, this, this ); + connect( d->cdrecordWriter, SIGNAL(infoMessage(const QString&, int)), this, SIGNAL(infoMessage(const QString&, int)) ); + connect( d->cdrecordWriter, SIGNAL(percent(int)), this, SLOT(slotWriterProgress(int)) ); + connect( d->cdrecordWriter, SIGNAL(processedSize(int, int)), this, SIGNAL(processedSize(int, int)) ); + connect( d->cdrecordWriter, SIGNAL(subPercent(int)), this, SIGNAL(subPercent(int)) ); + connect( d->cdrecordWriter, SIGNAL(processedSubSize(int, int)), this, SIGNAL(processedSubSize(int, int)) ); + connect( d->cdrecordWriter, SIGNAL(nextTrack(int, int)), this, SLOT(slotWritingNextTrack(int, int)) ); + connect( d->cdrecordWriter, SIGNAL(buffer(int)), this, SIGNAL(bufferStatus(int)) ); + connect( d->cdrecordWriter, SIGNAL(deviceBuffer(int)), this, SIGNAL(deviceBuffer(int)) ); + connect( d->cdrecordWriter, SIGNAL(writeSpeed(int, int)), this, SIGNAL(writeSpeed(int, int)) ); + connect( d->cdrecordWriter, SIGNAL(finished(bool)), this, SLOT(slotWriterFinished(bool)) ); + // connect( d->cdrecordWriter, SIGNAL(newTask(const QString&)), this, SIGNAL(newTask(const QString&)) ); + connect( d->cdrecordWriter, SIGNAL(newSubTask(const QString&)), this, SIGNAL(newSubTask(const QString&)) ); + connect( d->cdrecordWriter, SIGNAL(debuggingOutput(const QString&, const QString&)), + this, SIGNAL(debuggingOutput(const QString&, const QString&)) ); + } + + d->cdrecordWriter->setBurnDevice( m_writerDevice ); + d->cdrecordWriter->clearArguments(); + d->cdrecordWriter->setSimulate( m_simulate ); + d->cdrecordWriter->setBurnSpeed( m_speed ); + + + // create the cdrecord arguments + if( d->currentWrittenSession == 1 && d->toc[0].type() == K3bDevice::Track::AUDIO ) { + // + // Audio session + // + + + if( !d->infFileWriter ) + d->infFileWriter = new K3bInfFileWriter(); + + // + // create the inf files if not already done + // + if( d->infNames.isEmpty() || !QFile::exists( d->infNames[0] ) ) { + + unsigned int trackNumber = 1; + + for( K3bDevice::Toc::const_iterator it = d->toc.begin(); it != d->toc.end(); ++it ) { + const K3bDevice::Track& track = *it; + + if( track.type() == K3bDevice::Track::DATA ) + break; + + d->infFileWriter->setTrack( track ); + d->infFileWriter->setTrackNumber( trackNumber ); + + if( d->haveCddb ) { + d->infFileWriter->setTrackTitle( d->cddbInfo.titles[trackNumber-1] ); + d->infFileWriter->setTrackPerformer( d->cddbInfo.artists[trackNumber-1] ); + d->infFileWriter->setTrackMessage( d->cddbInfo.extInfos[trackNumber-1] ); + + d->infFileWriter->setAlbumTitle( d->cddbInfo.cdTitle ); + d->infFileWriter->setAlbumPerformer( d->cddbInfo.cdArtist ); + } + + if( m_onTheFly ) { + + d->infFileWriter->setBigEndian( true ); + + // we let KTempFile choose a temp file but delete it on our own + // the same way we delete them when writing with images + // It is important that the files have the ending inf because + // cdrecord only checks this + + KTempFile tmp( QString::null, ".inf" ); + d->infNames.append( tmp.name() ); + bool success = d->infFileWriter->save( *tmp.textStream() ); + tmp.close(); + if( !success ) + return false; + } + else { + d->infFileWriter->setBigEndian( false ); + + if( !d->infFileWriter->save( d->infNames[trackNumber-1] ) ) + return false; + } + + ++trackNumber; + } + } + + // + // the inf files are ready and named correctly when writing with images + // + int usedWritingMode = m_writingMode; + if( usedWritingMode == K3b::WRITING_MODE_AUTO ) { + // + // there are a lot of writers out there which produce coasters + // in dao mode if the CD contains pregaps of length 0 (or maybe already != 2 secs?) + // + bool zeroPregap = false; + if( d->numSessions == 1 ) { + for( K3bDevice::Toc::const_iterator it = d->toc.begin(); it != d->toc.end(); ++it ) { + const K3bDevice::Track& track = *it; + if( track.index0() == 0 ) { + ++it; + if( it != d->toc.end() ) + zeroPregap = true; + --it; + } + } + } + + if( zeroPregap && m_writerDevice->supportsRawWriting() ) { + if( d->numSessions == 1 ) + usedWritingMode = K3b::RAW; + else + usedWritingMode = K3b::TAO; + } + else if( m_writerDevice->dao() ) + usedWritingMode = K3b::DAO; + else if( m_writerDevice->supportsRawWriting() ) + usedWritingMode = K3b::RAW; + else + usedWritingMode = K3b::TAO; + } + d->cdrecordWriter->setWritingMode( usedWritingMode ); + + if( d->numSessions > 1 ) + d->cdrecordWriter->addArgument( "-multi" ); + + if( d->haveCddb || d->haveCdText ) { + if( usedWritingMode == K3b::TAO ) { + emit infoMessage( i18n("It is not possible to write CD-Text in TAO mode."), WARNING ); + } + else if( d->haveCdText && ( !d->haveCddb || m_preferCdText ) ) { + // use the raw CDTEXT data + d->cdrecordWriter->setRawCdText( d->cdTextRaw ); + } + else { + // make sure the writer job does not create raw cdtext + d->cdrecordWriter->setRawCdText( QByteArray() ); + // cdrecord will use the cdtext data in the inf files + d->cdrecordWriter->addArgument( "-text" ); + } + } + + d->cdrecordWriter->addArgument( "-useinfo" ); + + // + // add all the audio tracks + // + d->cdrecordWriter->addArgument( "-audio" )->addArgument( "-shorttrack" ); + + for( unsigned int i = 0; i < d->infNames.count(); ++i ) { + if( m_onTheFly ) + d->cdrecordWriter->addArgument( d->infNames[i] ); + else + d->cdrecordWriter->addArgument( d->imageNames[i] ); + } + } + else { + // + // Data Session + // + K3bTrack* track = 0; + unsigned int dataTrackIndex = 0; + if( d->toc.contentType() == K3bDevice::MIXED ) { + track = &d->toc[d->toc.count()-1]; + dataTrackIndex = 0; + } + else { + track = &d->toc[d->currentWrittenSession-1]; + dataTrackIndex = d->currentWrittenSession-1; + } + + bool multi = d->doNotCloseLastSession || (d->numSessions > 1 && d->currentWrittenSession < d->toc.count()); + int usedWritingMode = m_writingMode; + if( usedWritingMode == K3b::WRITING_MODE_AUTO ) { + // at least the NEC3540a does write 2056 byte sectors only in tao mode. Same for LG4040b + // since writing data tracks in TAO mode is no loss let's default to TAO in the case of 2056 byte + // sectors (which is when writing xa form1 sectors here) + if( m_writerDevice->dao() && + d->toc.count() == 1 && + !multi && + track->mode() == K3bDevice::Track::MODE1 ) + usedWritingMode = K3b::DAO; + else + usedWritingMode = K3b::TAO; + } + d->cdrecordWriter->setWritingMode( usedWritingMode ); + + // + // all but the last session of a multisession disk are written in multi mode + // and every data track has it's own session which we forced above + // + if( multi ) + d->cdrecordWriter->addArgument( "-multi" ); + + // just to let the reader init + if( m_onTheFly ) + d->cdrecordWriter->addArgument( "-waiti" ); + + if( track->mode() == K3bDevice::Track::MODE1 ) + d->cdrecordWriter->addArgument( "-data" ); + else if( track->mode() == K3bDevice::Track::XA_FORM1 ) + d->cdrecordWriter->addArgument( "-xa1" ); + else + d->cdrecordWriter->addArgument( "-xamix" ); + + if( m_onTheFly ) { + // HACK: if the track is TAO recorded cut the two run-out sectors + unsigned long trackLen = track->length().lba(); + if( d->dataSessionProbablyTAORecorded.count() > dataTrackIndex && + d->dataSessionProbablyTAORecorded[dataTrackIndex] ) + trackLen -= 2; + + if( track->mode() == K3bDevice::Track::MODE1 ) + trackLen = trackLen * 2048; + else if( track->mode() == K3bDevice::Track::XA_FORM1 ) + trackLen = trackLen * 2056; // see k3bdatatrackreader.h + else + trackLen = trackLen * 2332; // see k3bdatatrackreader.h + d->cdrecordWriter->addArgument( QString("-tsize=%1").arg(trackLen) )->addArgument("-"); + } + else if( d->toc.contentType() == K3bDevice::MIXED ) + d->cdrecordWriter->addArgument( d->imageNames[d->toc.count()-1] ); + else + d->cdrecordWriter->addArgument( d->imageNames[d->currentWrittenSession-1] ); + + // clear cd text from previous sessions + d->cdrecordWriter->setRawCdText( QByteArray() ); + } + + + // + // Finally start the writer + // + emit burning(true); + d->writerRunning = true; + d->cdrecordWriter->start(); + + return true; +} + + +// both the readcdreader and the audiosessionreader are connected to this slot +void K3bCdCopyJob::slotSessionReaderFinished( bool success ) +{ + d->audioReaderRunning = d->dataReaderRunning = false; + + if( success ) { + if( d->numSessions > 1 ) + emit infoMessage( i18n("Successfully read session %1.").arg(d->currentReadSession), SUCCESS ); + else + emit infoMessage( i18n("Successfully read source disk."), SUCCESS ); + + if( !m_onTheFly ) { + if( d->numSessions > d->currentReadSession ) { + d->currentReadSession++; + readNextSession(); + } + else { + d->readingSuccessful = true; + if( !m_onlyCreateImages ) { + if( m_readerDevice == m_writerDevice ) { + // eject the media (we do this blocking to know if it worked + // becasue if it did not it might happen that k3b overwrites a CD-RW + // source) + if( !m_readerDevice->eject() ) { + blockingInformation( i18n("K3b was unable to eject the source disk. Please do so manually.") ); + } + } + + if( !writeNextSession() ) { + // nothing is running here... + finishJob( d->canceled, d->error ); + } + } + else { + finishJob( false, false ); + } + } + } + } + else { + if( !d->canceled ) { + emit infoMessage( i18n("Error while reading session %1.").arg(d->currentReadSession), ERROR ); + if( m_onTheFly ) + d->cdrecordWriter->setSourceUnreadable(true); + } + + finishJob( d->canceled, !d->canceled ); + } +} + + +void K3bCdCopyJob::slotWriterFinished( bool success ) +{ + emit burning(false); + + d->writerRunning = false; + + if( success ) { + // + // if this was the last written session we need to reset d->currentWrittenSession + // and start a new writing if more copies are wanted + // + + if( d->currentWrittenSession < d->numSessions ) { + d->currentWrittenSession++; + d->currentReadSession++; + + // reload the media + emit newSubTask( i18n("Reloading the medium") ); + connect( K3bDevice::reload( m_writerDevice ), SIGNAL(finished(K3bDevice::DeviceHandler*)), + this, SLOT(slotMediaReloadedForNextSession(K3bDevice::DeviceHandler*)) ); + } + else { + d->doneCopies++; + + if( !m_simulate && d->doneCopies < m_copies ) { + // start next copy + K3bDevice::eject( m_writerDevice ); + + d->currentWrittenSession = 1; + d->currentReadSession = 1; + if( writeNextSession() ) { + if( m_onTheFly ) + readNextSession(); + } + else { + // nothing running here... + finishJob( d->canceled, d->error ); + } + } + else { + finishJob( false, false ); + } + } + } + else { + // + // If we are writing on the fly the reader will also stop when it is not able to write anymore + // The error handling will be done only here in that case + // + + // the K3bCdrecordWriter emitted an error message + + finishJob( d->canceled, !d->canceled ); + } +} + + +void K3bCdCopyJob::slotMediaReloadedForNextSession( K3bDevice::DeviceHandler* dh ) +{ + if( !dh->success() ) + blockingInformation( i18n("Please reload the medium and press 'ok'"), + i18n("Unable to close the tray") ); + + if( !writeNextSession() ) { + // nothing is running here... + finishJob( d->canceled, d->error ); + } + else if( m_onTheFly ) + readNextSession(); +} + + +void K3bCdCopyJob::cleanup() +{ + if( m_onTheFly || !m_keepImage || ((d->canceled || d->error) && !d->readingSuccessful) ) { + emit infoMessage( i18n("Removing temporary files."), INFO ); + for( QStringList::iterator it = d->infNames.begin(); it != d->infNames.end(); ++it ) + QFile::remove( *it ); + } + + if( !m_onTheFly && (!m_keepImage || ((d->canceled || d->error) && !d->readingSuccessful)) ) { + emit infoMessage( i18n("Removing image files."), INFO ); + for( QStringList::iterator it = d->imageNames.begin(); it != d->imageNames.end(); ++it ) + QFile::remove( *it ); + + // remove the tempdir created in prepareImageFiles() + if( d->deleteTempDir ) { + KIO::NetAccess::del( KURL::fromPathOrURL(m_tempPath), 0 ); + d->deleteTempDir = false; + } + } +} + + +void K3bCdCopyJob::slotReaderProgress( int p ) +{ + if( !m_onTheFly || m_onlyCreateImages ) { + int bigParts = ( m_onlyCreateImages ? 1 : (m_simulate ? 2 : m_copies + 1 ) ); + double done = (double)p * (double)d->sessionSizes[d->currentReadSession-1] / 100.0; + for( unsigned int i = 0; i < d->currentReadSession-1; ++i ) + done += (double)d->sessionSizes[i]; + emit percent( (int)(100.0*done/(double)d->overallSize/(double)bigParts) ); + + if( d->dataReaderRunning ) + emit subPercent(p); + } +} + + +void K3bCdCopyJob::slotReaderSubProgress( int p ) +{ + // only if reading an audiosession + if( !m_onTheFly || m_onlyCreateImages ) { + emit subPercent( p ); + } +} + + +void K3bCdCopyJob::slotReaderProcessedSize( int p, int pp ) +{ + if( !m_onTheFly ) + emit processedSubSize( p, pp ); +} + + +void K3bCdCopyJob::slotWriterProgress( int p ) +{ + int bigParts = ( m_simulate ? 1 : m_copies ) + ( m_onTheFly ? 0 : 1 ); + long done = ( m_onTheFly ? d->doneCopies : d->doneCopies+1 ) * d->overallSize + + (p * d->sessionSizes[d->currentWrittenSession-1] / 100); + for( unsigned int i = 0; i < d->currentWrittenSession-1; ++i ) + done += d->sessionSizes[i]; + emit percent( 100*done/d->overallSize/bigParts ); +} + + +void K3bCdCopyJob::slotWritingNextTrack( int t, int tt ) +{ + if( d->toc.contentType() == K3bDevice::MIXED ) { + if( d->currentWrittenSession == 1 ) + emit newSubTask( i18n("Writing track %1 of %2").arg(t).arg(d->toc.count()) ); + else + emit newSubTask( i18n("Writing track %1 of %2").arg(d->toc.count()).arg(d->toc.count()) ); + } + else if( d->numSessions > 1 ) + emit newSubTask( i18n("Writing track %1 of %2").arg(d->currentWrittenSession).arg(d->toc.count()) ); + else + emit newSubTask( i18n("Writing track %1 of %2").arg(t).arg(tt) ); +} + + +void K3bCdCopyJob::slotReadingNextTrack( int t, int ) +{ + if( !m_onTheFly || m_onlyCreateImages ) { + int track = t; + if( d->audioReaderRunning ) + track = t; + else if( d->toc.contentType() == K3bDevice::MIXED ) + track = d->toc.count(); + else + track = d->currentReadSession; + + emit newSubTask( i18n("Reading track %1 of %2").arg(track).arg(d->toc.count()) ); + } +} + + +QString K3bCdCopyJob::jobDescription() const +{ + if( m_onlyCreateImages ) { + return i18n("Creating CD Image"); + } + else if( m_simulate ) { + if( m_onTheFly ) + return i18n("Simulating CD Copy On-The-Fly"); + else + return i18n("Simulating CD Copy"); + } + else { + if( m_onTheFly ) + return i18n("Copying CD On-The-Fly"); + else + return i18n("Copying CD"); + } +} + + +QString K3bCdCopyJob::jobDetails() const +{ + return i18n("Creating 1 copy", + "Creating %n copies", + (m_simulate||m_onlyCreateImages) ? 1 : m_copies ); +} + + +void K3bCdCopyJob::finishJob( bool c, bool e ) +{ + if( d->running ) { + if( c ) { + d->canceled = true; + emit canceled(); + } + if( e ) + d->error = true; + + cleanup(); + + d->running = false; + + jobFinished( !(c||e) ); + } +} + +#include "k3bcdcopyjob.moc" diff --git a/libk3b/jobs/k3bcdcopyjob.h b/libk3b/jobs/k3bcdcopyjob.h new file mode 100644 index 0000000..3ab77e8 --- /dev/null +++ b/libk3b/jobs/k3bcdcopyjob.h @@ -0,0 +1,117 @@ +/* + * + * $Id: k3bcdcopyjob.h 690187 2007-07-20 09:18:03Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef _K3BCDCOPYJOB_H_ +#define _K3BCDCOPYJOB_H_ + +#include +#include "k3b_export.h" + +namespace K3bDevice { + class Device; + class DeviceHandler; +} + + +/** + *@author Sebastian Trueg + */ +class LIBK3B_EXPORT K3bCdCopyJob : public K3bBurnJob +{ + Q_OBJECT + + public: + K3bCdCopyJob( K3bJobHandler* hdl, QObject* parent = 0 ); + ~K3bCdCopyJob(); + + K3bDevice::Device* writer() const { return m_onlyCreateImages ? 0 : m_writerDevice; } + K3bDevice::Device* reader() const { return m_readerDevice; } + + QString jobDescription() const; + QString jobDetails() const; + + public slots: + void start(); + void cancel(); + + public: + void setWriterDevice( K3bDevice::Device* dev ) { m_writerDevice = dev; } + void setReaderDevice( K3bDevice::Device* dev ) { m_readerDevice = dev; } + void setWritingMode( int m ) { m_writingMode = m; } + void setSpeed( int s ) { m_speed = s; } + void setOnTheFly( bool b ) { m_onTheFly = b; } + void setKeepImage( bool b ) { m_keepImage = b; } + void setOnlyCreateImage( bool b ) { m_onlyCreateImages = b; } + void setSimulate( bool b ) { m_simulate = b; } + void setTempPath( const QString& path ) { m_tempPath= path; } + void setCopies( unsigned int c ) { m_copies = c; } + void setParanoiaMode( int i ) { m_paranoiaMode = i; } + void setIgnoreDataReadErrors( bool b ) { m_ignoreDataReadErrors = b; } + void setDataReadRetries( int i ) { m_dataReadRetries = i; } + void setIgnoreAudioReadErrors( bool b ) { m_ignoreAudioReadErrors = b; } + void setAudioReadRetries( int i ) { m_audioReadRetries = i; } + void setPreferCdText( bool b ) { m_preferCdText = b; } + void setCopyCdText( bool b ) { m_copyCdText = b; } + void setNoCorrection( bool b ) { m_noCorrection = b; } + + private slots: + void slotDiskInfoReady( K3bDevice::DeviceHandler* ); + void slotCdTextReady( K3bDevice::DeviceHandler* ); + void slotMediaReloadedForNextSession( K3bDevice::DeviceHandler* dh ); + void slotCddbQueryFinished(int); + void slotWritingNextTrack( int t, int tt ); + void slotReadingNextTrack( int t, int tt ); + void slotSessionReaderFinished( bool success ); + void slotWriterFinished( bool success ); + void slotReaderProgress( int p ); + void slotReaderSubProgress( int p ); + void slotWriterProgress( int p ); + void slotReaderProcessedSize( int p, int pp ); + + private: + void startCopy(); + void searchCdText(); + void queryCddb(); + bool writeNextSession(); + void readNextSession(); + bool prepareImageFiles(); + void cleanup(); + void finishJob( bool canceled, bool error ); + + K3bDevice::Device* m_writerDevice; + K3bDevice::Device* m_readerDevice; + bool m_simulate; + int m_speed; + int m_paranoiaMode; + unsigned int m_copies; + bool m_keepImage; + bool m_onlyCreateImages; + bool m_onTheFly; + bool m_ignoreDataReadErrors; + bool m_ignoreAudioReadErrors; + bool m_noCorrection; + int m_dataReadRetries; + int m_audioReadRetries; + bool m_preferCdText; + bool m_copyCdText; + QString m_tempPath; + int m_writingMode; + + class Private; + Private* d; +}; + +#endif diff --git a/libk3b/jobs/k3bcdda2wavreader.cpp b/libk3b/jobs/k3bcdda2wavreader.cpp new file mode 100644 index 0000000..3df87d3 --- /dev/null +++ b/libk3b/jobs/k3bcdda2wavreader.cpp @@ -0,0 +1,254 @@ +/* + * + * $Id: k3bcdda2wavreader.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bcdda2wavreader.h" + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + + +class K3bCdda2wavReader::Private +{ +public: + Private() + : cdda2wavBin(0), + process(0), + cancaled(false), + running(false), + fdToWriteTo(-1) { + } + + const K3bExternalBin* cdda2wavBin; + K3bProcess* process; + + bool cancaled; + bool running; + + int fdToWriteTo; + + int currentTrack; + QValueVector trackOffsets; +}; + + +K3bCdda2wavReader::K3bCdda2wavReader( QObject* parent, const char* name ) + : K3bJob( parent, name ) +{ + d = new Private(); +} + + +K3bCdda2wavReader::~K3bCdda2wavReader() +{ + delete d->process; + delete d; +} + + +bool K3bCdda2wavReader::active() const +{ + return d->running; +} + + +void K3bCdda2wavReader::writeToFd( int fd ) +{ + d->fdToWriteTo = fd; +} + + +void K3bCdda2wavReader::start() +{ + start( false ); +} + + +void K3bCdda2wavReader::start( bool onlyInfo ) +{ + d->running = true; + d->cancaled = false; + d->currentTrack = 1; + d->trackOffsets.clear(); + + jobStarted(); + + d->cdda2wavBin = k3bcore->externalBinManager()->binObject( "cdda2wav" ); + if( !d->cdda2wavBin ) { + emit infoMessage( i18n("Could not find %1 executable.").arg("cdda2wav"), ERROR ); + jobFinished(false); + d->running = false; + return; + } + + // prepare the process + delete d->process; + d->process = new K3bProcess(); + d->process->setSplitStdout(true); + d->process->setSuppressEmptyLines(true); + d->process->setWorkingDirectory( m_imagePath ); + connect( d->process, SIGNAL(stdoutLine(const QString&)), this, SLOT(slotProcessLine(const QString&)) ); + connect( d->process, SIGNAL(stderrLine(const QString&)), this, SLOT(slotProcessLine(const QString&)) ); + connect( d->process, SIGNAL(processExited(KProcess*)), this, SLOT(slotProcessExited(KProcess*)) ); + + // create the command line + *d->process << d->cdda2wavBin->path; + *d->process << "-vall" << ( d->cdda2wavBin->hasFeature( "gui" ) ? "-gui" : "-g" ); + if( d->cdda2wavBin->hasFeature( "dev" ) ) + *d->process << QString("dev=%1").arg(K3bDevice::externalBinDeviceParameter(m_device, d->cdda2wavBin)); + else + *d->process << "-D" << K3bDevice::externalBinDeviceParameter(m_device, d->cdda2wavBin); + *d->process << ( d->cdda2wavBin->hasFeature( "bulk" ) ? "-bulk" : "-B" ); + if( onlyInfo ) + *d->process << ( d->cdda2wavBin->hasFeature( "info-only" ) ? "-info-only" : "-J" ); + else if( d->fdToWriteTo != -1 ) + *d->process << ( d->cdda2wavBin->hasFeature( "no-infofile" ) ? "-no-infofile" : "-H" ); + + // additional user parameters from config + const QStringList& params = d->cdda2wavBin->userParameters(); + for( QStringList::const_iterator it = params.begin(); it != params.end(); ++it ) + *d->process << *it; + + // start the thing + if( !d->process->start( KProcess::NotifyOnExit, KProcess::All ) ) { + // something went wrong when starting the program + // it "should" be the executable + kdDebug() << "(K3bCdda2wavReader) could not start cdda2wav" << endl; + emit infoMessage( i18n("Could not start %1.").arg("cdda2wav"), K3bJob::ERROR ); + d->running = false; + jobFinished(false); + } +} + + +void K3bCdda2wavReader::cancel() +{ + if( d->running ) { + d->cancaled = true; + if( d->process ) + if( d->process->isRunning() ) + d->process->kill(); + } +} + + +void K3bCdda2wavReader::slotProcessLine( const QString& line ) +{ + // Tracks:11 44:37.30 + // CDINDEX discid: ZvzBXv614ACgzn1bWWy107cs0nA- + // CDDB discid: 0x8a0a730b + // CD-Text: not detected + // CD-Extra: not detected + // Album title: '' from '' + // T01: 0 3:39.70 audio linear copydenied stereo title '' from '' + // T02: 16495 3:10.47 audio linear copydenied stereo title '' from '' + // T03: 30792 3:30.00 audio linear copydenied stereo title '' from '' + // T04: 46542 4:05.05 audio linear copydenied stereo title '' from '' + // T05: 64922 3:44.35 audio linear copydenied stereo title '' from '' + // T06: 81757 4:36.45 audio linear copydenied stereo title '' from '' + // T07: 102502 3:59.30 audio linear copydenied stereo title '' from '' + // T08: 120457 5:24.30 audio linear copydenied stereo title '' from '' + // T09: 144787 3:26.28 audio linear copydenied stereo title '' from '' + // T10: 160265 4:07.20 audio linear copydenied stereo title '' from '' + // T11: 178810 4:51.20 audio linear copydenied stereo title '' from '' + + // percent_done: + // 100% track 1 successfully recorded + // 100% track 2 successfully recorded + // 100% track 3 successfully recorded + + + + static QRegExp rx( "T\\d\\d:" ); + if( rx.exactMatch( line.left(4) ) || line.startsWith( "Leadout" ) ) { + int pos = line.find( " " ); + int endpos = line.find( QRegExp( "\\d" ), pos ); + endpos = line.find( " ", endpos ); + bool ok; + int offset = line.mid( pos, endpos-pos ).toInt(&ok); + if( ok ) + d->trackOffsets.append( offset ); + else + kdDebug() << "(K3bCdda2wavReader) track offset parsing error: '" << line.mid( pos, endpos-pos ) << "'" << endl; + } + + else if( line.startsWith( "percent_done" ) ) { + // the reading starts + d->currentTrack = 1; + emit nextTrack( d->currentTrack, d->trackOffsets.count() ); + } + + else if( line.contains("successfully recorded") ) { + d->currentTrack++; + emit nextTrack( d->currentTrack, d->trackOffsets.count() ); + } + + else if( line.contains("%") ) { + // parse progress + bool ok; + int p = line.left(3).toInt(&ok); + if( ok ) { + emit subPercent( p ); + + int overall = d->trackOffsets[d->currentTrack-1]; + int tSize = d->trackOffsets[d->currentTrack] - d->trackOffsets[d->currentTrack-1]; + overall += (tSize*p/100); + + emit percent( overall*100/d->trackOffsets[d->trackOffsets.count()-1] ); + } + else + kdDebug() << "(K3bCdda2wavReader) track progress parsing error: '" << line.left(3) << "'" << endl; + } +} + + +void K3bCdda2wavReader::slotProcessExited( KProcess* p ) +{ + d->running = false; + + if( d->cancaled ) { + emit canceled(); + jobFinished(false); + return; + } + + if( p->normalExit() ) { + // TODO: improve this + + if( p->exitStatus() == 0 ) { + jobFinished( true ); + } + else { + emit infoMessage( i18n("%1 returned an unknown error (code %2).") + .arg("Cdda2wav").arg(p->exitStatus()), ERROR ); + jobFinished( false ); + } + } + else { + emit infoMessage( i18n("%1 did not exit cleanly.").arg("Cdda2wav"), + ERROR ); + jobFinished( false ); + } +} + +#include "k3bcdda2wavreader.moc" diff --git a/libk3b/jobs/k3bcdda2wavreader.h b/libk3b/jobs/k3bcdda2wavreader.h new file mode 100644 index 0000000..edde65c --- /dev/null +++ b/libk3b/jobs/k3bcdda2wavreader.h @@ -0,0 +1,70 @@ +/* + * + * $Id: k3bcdda2wavreader.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_CDDA2WAV_READER_H_ +#define _K3B_CDDA2WAV_READER_H_ + +#include + +class KProcess; +namespace K3bDevice { + class Device; +}; + + +/** + * An Audio CD reader completely based on cdda2wav. + * It does not use K3bDevice::Device but parses the track offsets + * from the cdda2wav output. + */ +class K3bCdda2wavReader : public K3bJob +{ + Q_OBJECT + + public: + K3bCdda2wavReader( QObject* parent = 0, const char* name = 0 ); + ~K3bCdda2wavReader(); + + bool active() const; + + public slots: + void start(); + void start( bool onlyReadInfo ); + void cancel(); + + void setReadDevice( K3bDevice::Device* dev ) { m_device = dev; } + void setImagePath( const QString& p ) { m_imagePath = p; } + + /** + * the data gets written directly into fd instead of the imagefile. + * Be aware that this only makes sense before starting the job. + * To disable just set fd to -1 + */ + void writeToFd( int fd ); + + private slots: + void slotProcessLine( const QString& ); + void slotProcessExited( KProcess* ); + + private: + K3bDevice::Device* m_device; + + QString m_imagePath; + + class Private; + Private* d; +}; + +#endif diff --git a/libk3b/jobs/k3bclonejob.cpp b/libk3b/jobs/k3bclonejob.cpp new file mode 100644 index 0000000..9fb61ab --- /dev/null +++ b/libk3b/jobs/k3bclonejob.cpp @@ -0,0 +1,375 @@ +/* + * + * $Id: k3bclonejob.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bclonejob.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + + + +class K3bCloneJob::Private +{ +public: + Private() + : doneCopies(0) { + } + + int doneCopies; +}; + + +K3bCloneJob::K3bCloneJob( K3bJobHandler* hdl, QObject* parent, const char* name ) + : K3bBurnJob( hdl, parent, name ), + m_writerDevice(0), + m_readerDevice(0), + m_writerJob(0), + m_readcdReader(0), + m_removeImageFiles(false), + m_canceled(false), + m_running(false), + m_simulate(false), + m_speed(1), + m_copies(1), + m_onlyCreateImage(false), + m_onlyBurnExistingImage(false), + m_readRetries(128) +{ + d = new Private; +} + + +K3bCloneJob::~K3bCloneJob() +{ + delete d; +} + + +void K3bCloneJob::start() +{ + jobStarted(); + + m_canceled = false; + m_running = true; + + + // TODO: check the cd size and warn the user if not enough space + + // + // We first check if cdrecord has clone support + // The readcdReader will check the same for readcd + // + const K3bExternalBin* cdrecordBin = k3bcore->externalBinManager()->binObject( "cdrecord" ); + if( !cdrecordBin ) { + emit infoMessage( i18n("Could not find %1 executable.").arg("cdrecord"), ERROR ); + jobFinished(false); + m_running = false; + return; + } + else if( !cdrecordBin->hasFeature( "clone" ) ) { + emit infoMessage( i18n("Cdrecord version %1 does not have cloning support.").arg(cdrecordBin->version), ERROR ); + jobFinished(false); + m_running = false; + return; + } + + if( (!m_onlyCreateImage && !writer()) || + (!m_onlyBurnExistingImage && !readingDevice()) ) { + emit infoMessage( i18n("No device set."), ERROR ); + jobFinished(false); + m_running = false; + return; + } + + if( !m_onlyCreateImage ) { + if( !writer()->supportsWritingMode( K3bDevice::RAW_R96R ) && + !writer()->supportsWritingMode( K3bDevice::RAW_R16 ) ) { + emit infoMessage( i18n("CD writer %1 does not support cloning.") + .arg(writer()->vendor()) + .arg(writer()->description()), ERROR ); + m_running = false; + jobFinished(false); + return; + } + } + + if( m_imagePath.isEmpty() ) { + m_imagePath = K3b::findTempFile( "img" ); + } + else if( QFileInfo(m_imagePath).isDir() ) { + m_imagePath = K3b::findTempFile( "img", m_imagePath ); + } + + if( m_onlyBurnExistingImage ) { + startWriting(); + } + else { + emit burning( false ); + + prepareReader(); + + if( waitForMedia( readingDevice(), + K3bDevice::STATE_COMPLETE, + K3bDevice::MEDIA_WRITABLE_CD|K3bDevice::MEDIA_CD_ROM ) < 0 ) { + m_running = false; + emit canceled(); + jobFinished(false); + return; + } + + emit newTask( i18n("Reading clone image") ); + + m_readcdReader->start(); + } +} + + +void K3bCloneJob::prepareReader() +{ + if( !m_readcdReader ) { + m_readcdReader = new K3bReadcdReader( this, this ); + connect( m_readcdReader, SIGNAL(percent(int)), this, SLOT(slotReadingPercent(int)) ); + connect( m_readcdReader, SIGNAL(percent(int)), this, SIGNAL(subPercent(int)) ); + connect( m_readcdReader, SIGNAL(processedSize(int, int)), this, SIGNAL(processedSubSize(int, int)) ); + connect( m_readcdReader, SIGNAL(finished(bool)), this, SLOT(slotReadingFinished(bool)) ); + connect( m_readcdReader, SIGNAL(infoMessage(const QString&, int)), this, SIGNAL(infoMessage(const QString&, int)) ); + connect( m_readcdReader, SIGNAL(newTask(const QString&)), this, SIGNAL(newSubTask(const QString&)) ); + connect( m_readcdReader, SIGNAL(debuggingOutput(const QString&, const QString&)), + this, SIGNAL(debuggingOutput(const QString&, const QString&)) ); + } + + m_readcdReader->setReadDevice( readingDevice() ); + m_readcdReader->setReadSpeed( 0 ); // MAX + m_readcdReader->setDisableCorrection( m_noCorrection ); + m_readcdReader->setImagePath( m_imagePath ); + m_readcdReader->setClone( true ); + m_readcdReader->setRetries( m_readRetries ); +} + + +void K3bCloneJob::prepareWriter() +{ + if( !m_writerJob ) { + m_writerJob = new K3bCdrecordWriter( writer(), this, this ); + connect( m_writerJob, SIGNAL(infoMessage(const QString&, int)), this, SIGNAL(infoMessage(const QString&, int)) ); + connect( m_writerJob, SIGNAL(percent(int)), this, SLOT(slotWriterPercent(int)) ); + connect( m_writerJob, SIGNAL(percent(int)), this, SIGNAL(subPercent(int)) ); + connect( m_writerJob, SIGNAL(nextTrack(int, int)), this, SLOT(slotWriterNextTrack(int, int)) ); + connect( m_writerJob, SIGNAL(processedSize(int, int)), this, SIGNAL(processedSubSize(int, int)) ); + connect( m_writerJob, SIGNAL(buffer(int)), this, SIGNAL(bufferStatus(int)) ); + connect( m_writerJob, SIGNAL(deviceBuffer(int)), this, SIGNAL(deviceBuffer(int)) ); + connect( m_writerJob, SIGNAL(writeSpeed(int, int)), this, SIGNAL(writeSpeed(int, int)) ); + connect( m_writerJob, SIGNAL(finished(bool)), this, SLOT(slotWriterFinished(bool)) ); + // connect( m_writerJob, SIGNAL(newTask(const QString&)), this, SIGNAL(newTask(const QString&)) ); + connect( m_writerJob, SIGNAL(newSubTask(const QString&)), this, SIGNAL(newSubTask(const QString&)) ); + connect( m_writerJob, SIGNAL(debuggingOutput(const QString&, const QString&)), + this, SIGNAL(debuggingOutput(const QString&, const QString&)) ); + } + + m_writerJob->clearArguments(); + m_writerJob->setWritingMode( K3b::RAW ); + m_writerJob->setClone( true ); + m_writerJob->setSimulate( m_simulate ); + m_writerJob->setBurnSpeed( m_speed ); + m_writerJob->addArgument( m_imagePath ); +} + + +void K3bCloneJob::cancel() +{ + if( m_running ) { + m_canceled = true; + if( m_readcdReader ) + m_readcdReader->cancel(); + if( m_writerJob ) + m_writerJob->cancel(); + } +} + + +void K3bCloneJob::slotWriterPercent( int p ) +{ + if( m_onlyBurnExistingImage ) + emit percent( (int)((double)(d->doneCopies)*100.0/(double)(m_copies) + (double)p/(double)(m_copies)) ); + else + emit percent( (int)((double)(1+d->doneCopies)*100.0/(double)(1+m_copies) + (double)p/(double)(1+m_copies)) ); +} + + +void K3bCloneJob::slotWriterNextTrack( int t, int tt ) +{ + emit newSubTask( i18n("Writing Track %1 of %2").arg(t).arg(tt) ); +} + + +void K3bCloneJob::slotWriterFinished( bool success ) +{ + if( m_canceled ) { + removeImageFiles(); + m_running = false; + emit canceled(); + jobFinished(false); + return; + } + + if( success ) { + d->doneCopies++; + + emit infoMessage( i18n("Successfully written clone copy %1.").arg(d->doneCopies), INFO ); + + if( d->doneCopies < m_copies ) { + K3bDevice::eject( writer() ); + startWriting(); + } + else { + if( m_removeImageFiles ) + removeImageFiles(); + m_running = false; + jobFinished(true); + } + } + else { + removeImageFiles(); + m_running = false; + jobFinished(false); + } +} + + +void K3bCloneJob::slotReadingPercent( int p ) +{ + emit percent( m_onlyCreateImage ? p : (int)((double)p/(double)(1+m_copies)) ); +} + + +void K3bCloneJob::slotReadingFinished( bool success ) +{ + if( m_canceled ) { + removeImageFiles(); + m_running = false; + emit canceled(); + jobFinished(false); + return; + } + + if( success ) { + // + // Make a quick test if the image is really valid. + // Readcd does not seem to have proper exit codes + // + K3bCloneTocReader ctr( m_imagePath ); + if( ctr.isValid() ) { + emit infoMessage( i18n("Successfully read disk."), INFO ); + if( m_onlyCreateImage ) { + m_running = false; + jobFinished(true); + } + else { + if( writer() == readingDevice() ) + K3bDevice::eject( writer() ); + startWriting(); + } + } + else { + emit infoMessage( i18n("Failed to read disk completely in clone mode."), ERROR ); + removeImageFiles(); + m_running = false; + jobFinished(false); + } + } + else { + emit infoMessage( i18n("Error while reading disk."), ERROR ); + removeImageFiles(); + m_running = false; + jobFinished(false); + } +} + + +void K3bCloneJob::startWriting() +{ + emit burning( true ); + + // start writing + prepareWriter(); + + if( waitForMedia( writer(), + K3bDevice::STATE_EMPTY, + K3bDevice::MEDIA_WRITABLE_CD ) < 0 ) { + removeImageFiles(); + m_running = false; + emit canceled(); + jobFinished(false); + return; + } + + if( m_simulate ) + emit newTask( i18n("Simulating clone copy") ); + else + emit newTask( i18n("Writing clone copy %1").arg(d->doneCopies+1) ); + + m_writerJob->start(); +} + + +void K3bCloneJob::removeImageFiles() +{ + if( !m_onlyBurnExistingImage ) { + emit infoMessage( i18n("Removing image files."), INFO ); + if( QFile::exists( m_imagePath ) ) + QFile::remove( m_imagePath ); + if( QFile::exists( m_imagePath + ".toc" ) ) + QFile::remove( m_imagePath + ".toc" ); + } +} + + +QString K3bCloneJob::jobDescription() const +{ + if( m_onlyCreateImage ) + return i18n("Creating Clone Image"); + else if( m_onlyBurnExistingImage ) { + if( m_simulate ) + return i18n("Simulating Clone Image"); + else + return i18n("Burning Clone Image"); + } + else if( m_simulate ) + return i18n("Simulating CD Cloning"); + else + return i18n("Cloning CD"); +} + + +QString K3bCloneJob::jobDetails() const +{ + return i18n("Creating 1 clone copy", + "Creating %n clone copies", + (m_simulate||m_onlyCreateImage) ? 1 : m_copies ); +} + +#include "k3bclonejob.moc" diff --git a/libk3b/jobs/k3bclonejob.h b/libk3b/jobs/k3bclonejob.h new file mode 100644 index 0000000..80c8ea9 --- /dev/null +++ b/libk3b/jobs/k3bclonejob.h @@ -0,0 +1,99 @@ +/* + * + * $Id: k3bclonejob.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_CLONE_JOB_H_ +#define _K3B_CLONE_JOB_H_ + +#include +#include "k3b_export.h" +#include + + +namespace K3bDevice { + class Device; +} +class K3bCdrecordWriter; +class K3bReadcdReader; + + +class LIBK3B_EXPORT K3bCloneJob : public K3bBurnJob +{ + Q_OBJECT + + public: + K3bCloneJob( K3bJobHandler*, QObject* parent = 0, const char* name = 0 ); + ~K3bCloneJob(); + + K3bDevice::Device* writer() const { return m_writerDevice; } + K3bDevice::Device* readingDevice() const { return m_readerDevice; } + + QString jobDescription() const; + QString jobDetails() const; + + public slots: + void start(); + void cancel(); + + void setWriterDevice( K3bDevice::Device* w ) { m_writerDevice = w; } + void setReaderDevice( K3bDevice::Device* w ) { m_readerDevice = w; } + void setImagePath( const QString& p ) { m_imagePath = p; } + void setNoCorrection( bool b ) { m_noCorrection = b; } + void setRemoveImageFiles( bool b ) { m_removeImageFiles = b; } + void setOnlyCreateImage( bool b ) { m_onlyCreateImage = b; } + void setOnlyBurnExistingImage( bool b ) { m_onlyBurnExistingImage = b; } + void setSimulate( bool b ) { m_simulate = b; } + void setWriteSpeed( int s ) { m_speed = s; } + void setCopies( int c ) { m_copies = c; } + void setReadRetries( int i ) { m_readRetries = i; } + + private slots: + void slotWriterPercent( int ); + void slotWriterFinished( bool ); + void slotWriterNextTrack( int, int ); + void slotReadingPercent( int ); + void slotReadingFinished( bool ); + + private: + void removeImageFiles(); + void prepareReader(); + void prepareWriter(); + void startWriting(); + + K3bDevice::Device* m_writerDevice; + K3bDevice::Device* m_readerDevice; + QString m_imagePath; + + K3bCdrecordWriter* m_writerJob; + K3bReadcdReader* m_readcdReader; + + bool m_noCorrection; + bool m_removeImageFiles; + + bool m_canceled; + bool m_running; + + bool m_simulate; + int m_speed; + int m_copies; + bool m_onlyCreateImage; + bool m_onlyBurnExistingImage; + int m_readRetries; + + class Private; + Private* d; +}; + + +#endif diff --git a/libk3b/jobs/k3bclonetocreader.cpp b/libk3b/jobs/k3bclonetocreader.cpp new file mode 100644 index 0000000..5dd8b8b --- /dev/null +++ b/libk3b/jobs/k3bclonetocreader.cpp @@ -0,0 +1,235 @@ +/* + * + * $Id: k3bclonetocreader.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include + + +#include "k3bclonetocreader.h" + +#include +#include + +#include +#include + +#include + + +class K3bCloneTocReader::Private +{ +public: + Private() + : size(0) { + } + + K3b::Msf size; + QString tocFile; +}; + + + +K3bCloneTocReader::K3bCloneTocReader( const QString& filename ) + : K3bImageFileReader() +{ + d = new Private; + openFile( filename ); +} + + +K3bCloneTocReader::~K3bCloneTocReader() +{ + delete d; +} + + +const K3b::Msf& K3bCloneTocReader::imageSize() const +{ + return d->size; +} + + +void K3bCloneTocReader::readFile() +{ + // first of all we check if we find the image file which contains the data for this toc + // cdrecord always uses this strange file naming: + // somedata + // somedata.toc + + // filename should always be the toc file + if( filename().right( 4 ) == ".toc" ) + d->tocFile = filename(); + else + d->tocFile = filename() + ".toc"; + + // now get rid of the ".toc" extension + QString imageFileName = d->tocFile.left( d->tocFile.length()-4 ); + if( !QFile::exists( imageFileName ) ) { + kdDebug() << "(K3bCloneTocReader) could not find image file " << imageFileName << endl; + return; + } + + setImageFilename( imageFileName ); + + d->size = 0; + + QFile f( d->tocFile ); + if( f.open( IO_ReadOnly ) ) { + // + // Inspired by clone.c from the cdrecord sources + // + char buffer[2048]; + int read = f.readBlock( buffer, 2048 ); + f.close(); + + if( read == 2048 ) { + kdDebug() << "(K3bCloneTocReader) TOC too large." << endl; + return; + } + + // the toc starts with a tocheader + struct tocheader { + unsigned char len[2]; + unsigned char first; // first session + unsigned char last; // last session + }; + + struct tocheader* th = (struct tocheader*)buffer; + int dataLen = K3bDevice::from2Byte( th->len ) + 2; // the len field does not include it's own length + + if( th->first != 1 ) { + kdDebug() << "(K3bCloneTocReader) first session != 1" << endl; + return; + } + + // the following bytes are multiple instances of + struct ftrackdesc { + unsigned char sess_number; +#ifdef WORDS_BIGENDIAN // __BYTE_ORDER == __BIG_ENDIAN + unsigned char adr : 4; + unsigned char control : 4; +#else + unsigned char control : 4; + unsigned char adr : 4; +#endif + unsigned char track; + unsigned char point; + unsigned char amin; + unsigned char asec; + unsigned char aframe; + unsigned char res7; + unsigned char pmin; + unsigned char psec; + unsigned char pframe; + }; + + for( int i = 4; i < dataLen; i += 11) { + struct ftrackdesc* ft = (struct ftrackdesc*)&buffer[i]; + + if( ft->sess_number != 1 ) { + kdDebug() << "(K3bCloneTocReader} session number != 1" << endl; + return; + } + + // now we check some of the values + if( ft->point >= 0x1 && ft->point <= 0x63 ) { + if( ft->adr == 1 ) { + // check track starttime + if( ft->psec > 60 || ft->pframe > 75 ) { + kdDebug() << "(K3bCloneTocReader) invalid track start: " + << (int)ft->pmin << "." + << (int)ft->psec << "." + << (int)ft->pframe << endl; + return; + } + } + } + else { + switch( ft->point ) { + case 0xa0: + if( ft->adr != 1 ) { + kdDebug() << "(K3bCloneTocReader) adr != 1" << endl; + return; + } + + // disk type in psec + if( ft->psec != 0x00 && ft->psec != 0x10 && ft->psec != 0x20 ) { + kdDebug() << "(K3bCloneTocReader) invalid disktype: " << ft->psec << endl; + return; + } + + if( ft->pmin != 1 ) { + kdDebug() << "(K3bCloneTocReader) first track number != 1 " << endl; + return; + } + + if( ft->pframe != 0x0 ) { + kdDebug() << "(K3bCloneTocReader) found data when there should be 0x0" << endl; + return; + } + break; + + case 0xa1: + if( ft->adr != 1 ) { + kdDebug() << "(K3bCloneTocReader) adr != 1" << endl; + return; + } + + if( !(ft->pmin >= 1) ) { + kdDebug() << "(K3bCloneTocReader) last track number needs to be >= 1." << endl; + return; + } + if( ft->psec != 0x0 || ft->pframe != 0x0 ) { + kdDebug() << "(K3bCloneTocReader) found data when there should be 0x0" << endl; + return; + } + break; + + case 0xa2: + if( ft->adr != 1 ) { + kdDebug() << "(K3bCloneTocReader) adr != 1" << endl; + return; + } + + // start of the leadout = size of the image + // substract 2 seconds since in cdrecord other than in K3b lba 0 = msf 2:00 + // (the cdrecord way is actually more accurate but we use k3b::Msf for many + // things and it is simpler this way.) + d->size = K3b::Msf( ft->pmin, ft->psec, ft->pframe ) - K3b::Msf( 0, 2, 0 ); + + // leadout... no check so far... + break; + + default: + if( ft->adr != 5 ) { + kdDebug() << "(K3bCloneTocReader) adr != 5" << endl; + return; + } + break; + } + } + } + + if( d->size.rawBytes() != K3b::filesize( imageFileName ) ) { + kdDebug() << "(K3bCloneTocReader) image file size invalid." << endl; + return; + } + + // ok, could be a cdrecord toc file + setValid(true); + } + else { + kdDebug() << "(K3bCloneTocReader) could not open file " << d->tocFile << endl; + } +} diff --git a/libk3b/jobs/k3bclonetocreader.h b/libk3b/jobs/k3bclonetocreader.h new file mode 100644 index 0000000..17e80d7 --- /dev/null +++ b/libk3b/jobs/k3bclonetocreader.h @@ -0,0 +1,45 @@ +/* + * + * $Id: k3bclonetocreader.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_CLONETOC_FILE_PARSER_H_ +#define _K3B_CLONETOC_FILE_PARSER_H_ + +#include "k3bimagefilereader.h" + +#include + +#include "k3b_export.h" + + +/** + * Reads a cdrecord clone toc file and searches for the + * corresponding image file. + */ +class LIBK3B_EXPORT K3bCloneTocReader : public K3bImageFileReader +{ + public: + K3bCloneTocReader( const QString& filename = QString::null ); + ~K3bCloneTocReader(); + + const K3b::Msf& imageSize() const; + + protected: + void readFile(); + + class Private; + Private* d; +}; + +#endif diff --git a/libk3b/jobs/k3bdatatrackreader.cpp b/libk3b/jobs/k3bdatatrackreader.cpp new file mode 100644 index 0000000..8300ada --- /dev/null +++ b/libk3b/jobs/k3bdatatrackreader.cpp @@ -0,0 +1,515 @@ +/* + * + * $Id: k3bdatatrackreader.cpp 690529 2007-07-21 10:51:47Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bdatatrackreader.h" + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include + + + +// FIXME: determine max DMA buffer size +static int s_bufferSizeSectors = 10; + + +class K3bDataTrackReader::WorkThread : public K3bThread +{ +public: + WorkThread(); + ~WorkThread(); + + void init(); + void run(); + int read( unsigned char* buffer, unsigned long sector, unsigned int len ); + bool retryRead( unsigned char* buffer, unsigned long startSector, unsigned int len ); + bool setErrorRecovery( K3bDevice::Device* dev, int code ); + void cancel(); + + bool m_canceled; + bool m_ignoreReadErrors; + bool m_noCorrection; + int m_retries; + K3bDevice::Device* m_device; + K3b::Msf m_firstSector; + K3b::Msf m_lastSector; + K3b::Msf m_nextReadSector; + int m_fd; + QString m_imagePath; + int m_sectorSize; + bool m_useLibdvdcss; + K3bLibDvdCss* m_libcss; + + int m_oldErrorRecoveryMode; + + int m_errorSectorCount; + +private: + int m_usedSectorSize; +}; + + +K3bDataTrackReader::K3bDataTrackReader( K3bJobHandler* jh, QObject* parent, const char* name ) + : K3bThreadJob( jh, parent, name ) +{ + m_thread = new WorkThread(); + setThread( m_thread ); +} + + +K3bDataTrackReader::WorkThread::WorkThread() + : K3bThread(), + m_canceled(false), + m_ignoreReadErrors(false), + m_noCorrection(false), + m_retries(10), + m_device(0), + m_fd(-1), + m_libcss(0) +{ +} + + +K3bDataTrackReader::WorkThread::~WorkThread() +{ + delete m_libcss; +} + + +void K3bDataTrackReader::WorkThread::init() +{ + m_canceled = false; +} + + +void K3bDataTrackReader::WorkThread::run() +{ + emitStarted(); + + if( !m_device->open() ) { + emitInfoMessage( i18n("Could not open device %1").arg(m_device->blockDeviceName()), K3bJob::ERROR ); + emitFinished(false); + return; + } + + // 1. determine sector size by checking the first sectors mode + // if impossible or MODE2 (mode2 formless) finish(false) + + m_useLibdvdcss = false; + m_usedSectorSize = m_sectorSize; + if( m_device->isDVD() ) { + m_usedSectorSize = MODE1; + + // + // In case of an encrypted VideoDVD we read with libdvdcss which takes care of decrypting the vobs + // + if( m_device->copyrightProtectionSystemType() == 1 ) { + + // close the device for libdvdcss + m_device->close(); + + kdDebug() << "(K3bDataTrackReader::WorkThread) found encrypted dvd. using libdvdcss." << endl; + + // open the libdvdcss stuff + if( !m_libcss ) + m_libcss = K3bLibDvdCss::create(); + if( !m_libcss ) { + emitInfoMessage( i18n("Unable to open libdvdcss."), K3bJob::ERROR ); + emitFinished(false); + return; + } + + if( !m_libcss->open(m_device) ) { + emitInfoMessage( i18n("Could not open device %1").arg(m_device->blockDeviceName()), K3bJob::ERROR ); + emitFinished(false); + return; + } + + emitInfoMessage( i18n("Retrieving all CSS keys. This might take a while."), K3bJob::INFO ); + if( !m_libcss->crackAllKeys() ) { + m_libcss->close(); + emitInfoMessage( i18n("Failed to retrieve all CSS keys."), K3bJob::ERROR ); + emitInfoMessage( i18n("Video DVD decryption failed."), K3bJob::ERROR ); + emitFinished(false); + return; + } + + m_useLibdvdcss = true; + } + } + else { + if( m_usedSectorSize == AUTO ) { + switch( m_device->getDataMode( m_firstSector ) ) { + case K3bDevice::Track::MODE1: + case K3bDevice::Track::DVD: + m_usedSectorSize = MODE1; + break; + case K3bDevice::Track::XA_FORM1: + m_usedSectorSize = MODE2FORM1; + break; + case K3bDevice::Track::XA_FORM2: + m_usedSectorSize = MODE2FORM2; + break; + case K3bDevice::Track::MODE2: + emitInfoMessage( i18n("No support for reading formless Mode2 sectors."), K3bJob::ERROR ); + default: + emitInfoMessage( i18n("Unsupported sector type."), K3bJob::ERROR ); + m_device->close(); + emitFinished(false); + return; + } + } + } + + emitInfoMessage( i18n("Reading with sector size %1.").arg(m_usedSectorSize), K3bJob::INFO ); + emitDebuggingOutput( "K3bDataTrackReader", + QString("reading sectors %1 to %2 with sector size %3. Length: %4 sectors, %5 bytes.") + .arg( m_firstSector.lba() ) + .arg( m_lastSector.lba() ) + .arg( m_usedSectorSize ) + .arg( m_lastSector.lba() - m_firstSector.lba() + 1 ) + .arg( Q_UINT64(m_usedSectorSize) * (Q_UINT64)(m_lastSector.lba() - m_firstSector.lba() + 1) ) ); + + QFile file; + if( m_fd == -1 ) { + file.setName( m_imagePath ); + if( !file.open( IO_WriteOnly ) ) { + m_device->close(); + if( m_useLibdvdcss ) + m_libcss->close(); + emitInfoMessage( i18n("Unable to open '%1' for writing.").arg(m_imagePath), K3bJob::ERROR ); + emitFinished( false ); + return; + } + } + + k3bcore->blockDevice( m_device ); + m_device->block( true ); + + // + // set the error recovery mode to 0x21 or 0x20 depending on m_ignoreReadErrors + // TODO: should we also set RC=1 in m_ignoreReadErrors mode (0x11 because TB is ignored) + // + setErrorRecovery( m_device, m_noCorrection ? 0x21 : 0x20 ); + + // + // Let the drive determine the optimal reading speed + // + m_device->setSpeed( 0xffff, 0xffff ); + + s_bufferSizeSectors = 128; + unsigned char* buffer = new unsigned char[m_usedSectorSize*s_bufferSizeSectors]; + while( s_bufferSizeSectors > 0 && read( buffer, m_firstSector.lba(), s_bufferSizeSectors ) < 0 ) { + kdDebug() << "(K3bDataTrackReader) determine max read sectors: " + << s_bufferSizeSectors << " too high." << endl; + s_bufferSizeSectors--; + } + kdDebug() << "(K3bDataTrackReader) determine max read sectors: " + << s_bufferSizeSectors << " is max." << endl; + + // s_bufferSizeSectors = K3bDevice::determineMaxReadingBufferSize( m_device, m_firstSector ); + if( s_bufferSizeSectors <= 0 ) { + emitInfoMessage( i18n("Error while reading sector %1.").arg(m_firstSector.lba()), K3bJob::ERROR ); + emitFinished(false); + m_device->block( false ); + k3bcore->unblockDevice( m_device ); + return; + } + + kdDebug() << "(K3bDataTrackReader) using buffer size of " << s_bufferSizeSectors << " blocks." << endl; + emitDebuggingOutput( "K3bDataTrackReader", QString("using buffer size of %1 blocks.").arg( s_bufferSizeSectors ) ); + + // 2. get it on + K3b::Msf currentSector = m_firstSector; + K3b::Msf totalReadSectors; + m_nextReadSector = 0; + m_errorSectorCount = 0; + bool writeError = false; + bool readError = false; + int lastPercent = 0; + unsigned long lastReadMb = 0; + int bufferLen = s_bufferSizeSectors*m_usedSectorSize; + while( !m_canceled && currentSector <= m_lastSector ) { + + int maxReadSectors = QMIN( bufferLen/m_usedSectorSize, m_lastSector.lba()-currentSector.lba()+1 ); + + int readSectors = read( buffer, + currentSector.lba(), + maxReadSectors ); + if( readSectors < 0 ) { + if( !retryRead( buffer, + currentSector.lba(), + maxReadSectors ) ) { + readError = true; + break; + } + else + readSectors = maxReadSectors; + } + + totalReadSectors += readSectors; + + int readBytes = readSectors * m_usedSectorSize; + + if( m_fd != -1 ) { + if( ::write( m_fd, reinterpret_cast(buffer), readBytes ) != readBytes ) { + kdDebug() << "(K3bDataTrackReader::WorkThread) error while writing to fd " << m_fd + << " current sector: " << (currentSector.lba()-m_firstSector.lba()) << endl; + emitDebuggingOutput( "K3bDataTrackReader", + QString("Error while writing to fd %1. Current sector is %2.") + .arg(m_fd).arg(currentSector.lba()-m_firstSector.lba()) ); + writeError = true; + break; + } + } + else { + if( file.writeBlock( reinterpret_cast(buffer), readBytes ) != readBytes ) { + kdDebug() << "(K3bDataTrackReader::WorkThread) error while writing to file " << m_imagePath + << " current sector: " << (currentSector.lba()-m_firstSector.lba()) << endl; + emitDebuggingOutput( "K3bDataTrackReader", + QString("Error while writing to file %1. Current sector is %2.") + .arg(m_imagePath).arg(currentSector.lba()-m_firstSector.lba()) ); + writeError = true; + break; + } + } + + currentSector += readSectors; + + int percent = 100 * (currentSector.lba() - m_firstSector.lba() + 1 ) / + (m_lastSector.lba() - m_firstSector.lba() + 1 ); + + if( percent > lastPercent ) { + lastPercent = percent; + emitPercent( percent ); + } + + unsigned long readMb = (currentSector.lba() - m_firstSector.lba() + 1) / 512; + if( readMb > lastReadMb ) { + lastReadMb = readMb; + emitProcessedSize( readMb, ( m_lastSector.lba() - m_firstSector.lba() + 1 ) / 512 ); + } + } + + if( m_errorSectorCount > 0 ) + emitInfoMessage( i18n("Ignored %n erroneous sector.", "Ignored a total of %n erroneous sectors.", m_errorSectorCount ), + K3bJob::ERROR ); + + // reset the error recovery mode + setErrorRecovery( m_device, m_oldErrorRecoveryMode ); + + m_device->block( false ); + k3bcore->unblockDevice( m_device ); + + // cleanup + if( m_useLibdvdcss ) + m_libcss->close(); + m_device->close(); + delete [] buffer; + + emitDebuggingOutput( "K3bDataTrackReader", + QString("Read a total of %1 sectors (%2 bytes)") + .arg(totalReadSectors.lba()) + .arg((Q_UINT64)totalReadSectors.lba()*(Q_UINT64)m_usedSectorSize) ); + + if( m_canceled ) + emitCanceled(); + + emitFinished( !m_canceled && !writeError && !readError ); +} + + +int K3bDataTrackReader::WorkThread::read( unsigned char* buffer, unsigned long sector, unsigned int len ) +{ + + // + // Encrypted DVD reading with libdvdcss + // + if( m_useLibdvdcss ) { + return m_libcss->readWrapped( reinterpret_cast(buffer), sector, len ); + } + + // + // Standard reading + // + else { + bool success = false; + // setErrorRecovery( m_device, m_ignoreReadErrors ? 0x21 : 0x20 ); + if( m_usedSectorSize == 2048 ) + success = m_device->read10( buffer, len*2048, sector, len ); + else + success = m_device->readCd( buffer, + len*m_usedSectorSize, + 0, // all sector types + false, // no dap + sector, + len, + false, // no sync + false, // no header + m_usedSectorSize != MODE1, // subheader + true, // user data + false, // no edc/ecc + 0, // no c2 error info... FIXME: should we check this?? + 0 // no subchannel data + ); + + if( success ) + return len; + else + return -1; + } +} + + +// here we read every single sector for itself to find the troubleing ones +bool K3bDataTrackReader::WorkThread::retryRead( unsigned char* buffer, unsigned long startSector, unsigned int len ) +{ + emitDebuggingOutput( "K3bDataTrackReader", QString( "Problem while reading. Retrying from sector %1.").arg(startSector) ); + emitInfoMessage( i18n("Problem while reading. Retrying from sector %1.").arg(startSector), K3bJob::WARNING ); + + int sectorsRead = -1; + bool success = true; + for( unsigned long sector = startSector; sector < startSector+len; ++sector ) { + int retry = m_retries; + while( !m_canceled && retry && (sectorsRead = read( &buffer[( sector - startSector ) * m_usedSectorSize], sector, 1 )) < 0 ) + --retry; + + success = ( sectorsRead > 0 ); + + if( m_canceled ) + return false; + + if( !success ) { + if( m_ignoreReadErrors ) { + emitInfoMessage( i18n("Ignoring read error in sector %1.").arg(sector), K3bJob::ERROR ); + emitDebuggingOutput( "K3bDataTrackReader", QString( "Ignoring read error in sector %1.").arg(sector) ); + + ++m_errorSectorCount; + // ::memset( &buffer[i], 0, 1 ); + success = true; + } + else { + emitInfoMessage( i18n("Error while reading sector %1.").arg(sector), K3bJob::ERROR ); + emitDebuggingOutput( "K3bDataTrackReader", QString( "Read error in sector %1.").arg(sector) ); + break; + } + } + } + + return success; +} + + +bool K3bDataTrackReader::WorkThread::setErrorRecovery( K3bDevice::Device* dev, int code ) +{ + unsigned char* data = 0; + unsigned int dataLen = 0; + if( !dev->modeSense( &data, dataLen, 0x01 ) ) + return false; + + // in MMC1 the page has 8 bytes (12 in MMC4 but we only need the first 3 anyway) + if( dataLen < 8+8 ) { + kdDebug() << "(K3bDataTrackReader) modepage 0x01 data too small: " << dataLen << endl; + delete [] data; + return false; + } + + m_oldErrorRecoveryMode = data[8+2]; + data[8+2] = code; + + if( m_oldErrorRecoveryMode != code ) + kdDebug() << "(K3bDataTrackReader) changing data recovery mode from " << m_oldErrorRecoveryMode << " to " << code << endl; + + bool success = dev->modeSelect( data, dataLen, true, false ); + + delete [] data; + + return success; +} + + +void K3bDataTrackReader::WorkThread::cancel() +{ + m_canceled = true; +} + + + + + +K3bDataTrackReader::~K3bDataTrackReader() +{ + delete m_thread; +} + + +void K3bDataTrackReader::setDevice( K3bDevice::Device* dev ) +{ + m_thread->m_device = dev; +} + + +void K3bDataTrackReader::setSectorRange( const K3b::Msf& start, const K3b::Msf& end ) +{ + m_thread->m_firstSector = start; + m_thread->m_lastSector = end; +} + + +void K3bDataTrackReader::setRetries( int r ) +{ + m_thread->m_retries = r; +} + + +void K3bDataTrackReader::setIgnoreErrors( bool b ) +{ + m_thread->m_ignoreReadErrors = b; +} + + +void K3bDataTrackReader::setNoCorrection( bool b ) +{ + m_thread->m_noCorrection = b; +} + + +void K3bDataTrackReader::writeToFd( int fd ) +{ + m_thread->m_fd = fd; +} + + +void K3bDataTrackReader::setImagePath( const QString& p ) +{ + m_thread->m_imagePath = p; + m_thread->m_fd = -1; +} + + +void K3bDataTrackReader::setSectorSize( SectorSize size ) +{ + m_thread->m_sectorSize = size; +} diff --git a/libk3b/jobs/k3bdatatrackreader.h b/libk3b/jobs/k3bdatatrackreader.h new file mode 100644 index 0000000..814c01c --- /dev/null +++ b/libk3b/jobs/k3bdatatrackreader.h @@ -0,0 +1,87 @@ +/* + * + * $Id: k3bdatatrackreader.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_DATATRACK_READER_H_ +#define _K3B_DATATRACK_READER_H_ + + +#include +#include +#include + +namespace K3bDevice { + class Device; +} + + +/** + * This is a replacement for readcd. We need this since + * it is not possible to influence the sector size used + * by readcd and readcd is not very good to handle anyway. + * + * The sector size read is the following: + * @li Mode1: 2048 bytes (only user data) + * @li Mode2 Form1: 2056 bytes containing the subheader and the user data + * @li Mode2 Form2: 2332 bytes containing the subheader and the user data + * + * Formless Mode2 sectors will not be read. + */ +class K3bDataTrackReader : public K3bThreadJob +{ + public: + K3bDataTrackReader( K3bJobHandler*, QObject* parent = 0, const char* name = 0 ); + ~K3bDataTrackReader(); + + enum SectorSize { + AUTO = 0, + MODE1 = K3b::SECTORSIZE_DATA_2048, + MODE2FORM1 = K3b::SECTORSIZE_DATA_2048_SUBHEADER, + MODE2FORM2 = K3b::SECTORSIZE_DATA_2324_SUBHEADER + }; + + void setSectorSize( SectorSize size ); + + void setDevice( K3bDevice::Device* ); + + /** + * @param start the first sector to be read + * @end the last sector to be read + */ + void setSectorRange( const K3b::Msf& start, const K3b::Msf& end ); + void setRetries( int ); + + /** + * If true unreadable sectors will be replaced by zero data to always + * maintain the track length. + */ + void setIgnoreErrors( bool b ); + + void setNoCorrection( bool b ); + + /** + * the data gets written directly into fd instead of the imagefile. + * Be aware that this only makes sense before starting the job. + * To disable just set fd to -1 + */ + void writeToFd( int fd ); + + void setImagePath( const QString& p ); + + private: + class WorkThread; + WorkThread* m_thread; +}; + +#endif diff --git a/libk3b/jobs/k3bdvdcopyjob.cpp b/libk3b/jobs/k3bdvdcopyjob.cpp new file mode 100644 index 0000000..96d727c --- /dev/null +++ b/libk3b/jobs/k3bdvdcopyjob.cpp @@ -0,0 +1,894 @@ +/* + * + * $Id: k3bdvdcopyjob.cpp 690529 2007-07-21 10:51:47Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bdvdcopyjob.h" +#include "k3blibdvdcss.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + + +class K3bDvdCopyJob::Private +{ +public: + Private() + : doneCopies(0), + running(false), + canceled(false), + writerJob(0), + readcdReader(0), + dataTrackReader(0), + verificationJob(0), + usedWritingMode(0), + verifyData(false) { + outPipe.readFromIODevice( &imageFile ); + } + + int doneCopies; + + bool running; + bool readerRunning; + bool writerRunning; + bool canceled; + + K3bGrowisofsWriter* writerJob; + K3bReadcdReader* readcdReader; + K3bDataTrackReader* dataTrackReader; + K3bVerificationJob* verificationJob; + + K3bDevice::DiskInfo sourceDiskInfo; + + K3b::Msf lastSector; + + int usedWritingMode; + + K3bFileSplitter imageFile; + K3bChecksumPipe inPipe; + K3bActivePipe outPipe; + + bool verifyData; +}; + + +K3bDvdCopyJob::K3bDvdCopyJob( K3bJobHandler* hdl, QObject* parent, const char* name ) + : K3bBurnJob( hdl, parent, name ), + m_writerDevice(0), + m_readerDevice(0), + m_onTheFly(false), + m_removeImageFiles(false), + m_simulate(false), + m_speed(1), + m_copies(1), + m_onlyCreateImage(false), + m_ignoreReadErrors(false), + m_readRetries(128), + m_writingMode( K3b::WRITING_MODE_AUTO ) +{ + d = new Private(); +} + + +K3bDvdCopyJob::~K3bDvdCopyJob() +{ + delete d; +} + + +void K3bDvdCopyJob::start() +{ + jobStarted(); + emit burning(false); + + d->canceled = false; + d->running = true; + d->readerRunning = d->writerRunning = false; + + emit newTask( i18n("Checking Source Medium") ); + + if( m_onTheFly && + k3bcore->externalBinManager()->binObject( "growisofs" )->version < K3bVersion( 5, 12 ) ) { + m_onTheFly = false; + emit infoMessage( i18n("K3b does not support writing on-the-fly with growisofs %1.") + .arg(k3bcore->externalBinManager()->binObject( "growisofs" )->version), ERROR ); + emit infoMessage( i18n("Disabling on-the-fly writing."), INFO ); + } + + emit newSubTask( i18n("Waiting for source medium") ); + + // wait for a source disk + if( waitForMedia( m_readerDevice, + K3bDevice::STATE_COMPLETE|K3bDevice::STATE_INCOMPLETE, + K3bDevice::MEDIA_WRITABLE_DVD|K3bDevice::MEDIA_DVD_ROM ) < 0 ) { + emit canceled(); + d->running = false; + jobFinished( false ); + return; + } + + emit newSubTask( i18n("Checking source medium") ); + + connect( K3bDevice::sendCommand( K3bDevice::DeviceHandler::DISKINFO, m_readerDevice ), + SIGNAL(finished(K3bDevice::DeviceHandler*)), + this, + SLOT(slotDiskInfoReady(K3bDevice::DeviceHandler*)) ); +} + + +void K3bDvdCopyJob::slotDiskInfoReady( K3bDevice::DeviceHandler* dh ) +{ + if( d->canceled ) { + emit canceled(); + jobFinished(false); + d->running = false; + } + + d->sourceDiskInfo = dh->diskInfo(); + + if( dh->diskInfo().empty() || dh->diskInfo().diskState() == K3bDevice::STATE_NO_MEDIA ) { + emit infoMessage( i18n("No source medium found."), ERROR ); + jobFinished(false); + d->running = false; + } + else { + if( m_readerDevice->copyrightProtectionSystemType() == 1 ) { + emit infoMessage( i18n("Found encrypted DVD."), WARNING ); + // check for libdvdcss + bool haveLibdvdcss = false; + kdDebug() << "(K3bDvdCopyJob) trying to open libdvdcss." << endl; + if( K3bLibDvdCss* libcss = K3bLibDvdCss::create() ) { + kdDebug() << "(K3bDvdCopyJob) succeeded." << endl; + kdDebug() << "(K3bDvdCopyJob) dvdcss_open(" << m_readerDevice->blockDeviceName() << ") = " + << libcss->open(m_readerDevice) << endl; + haveLibdvdcss = true; + + delete libcss; + } + else + kdDebug() << "(K3bDvdCopyJob) failed." << endl; + + if( !haveLibdvdcss ) { + emit infoMessage( i18n("Cannot copy encrypted DVDs."), ERROR ); + d->running = false; + jobFinished( false ); + return; + } + } + + + // + // We cannot rely on the kernel to determine the size of the DVD for some reason + // On the other hand it is not always a good idea to rely on the size from the ISO9660 + // header since that may be wrong due to some buggy encoder or some boot code appended + // after creating the image. + // That is why we try our best to determine the size of the DVD. For DVD-ROM this is very + // easy since it has only one track. The same goes for single session DVD-R(W) and DVD+R. + // Multisession DVDs we will simply not copy. ;) + // For DVD+RW and DVD-RW in restricted overwrite mode we are left with no other choice but + // to use the ISO9660 header. + // + // On the other hand: in on-the-fly mode growisofs determines the size of the data to be written + // by looking at the ISO9660 header when writing in DAO mode. So in this case + // it would be best for us to do the same.... + // + // With growisofs 5.15 we have the option to specify the size of the image to be written in DAO mode. + // + + switch( dh->diskInfo().mediaType() ) { + case K3bDevice::MEDIA_DVD_ROM: + case K3bDevice::MEDIA_DVD_PLUS_R_DL: + case K3bDevice::MEDIA_DVD_R_DL: + case K3bDevice::MEDIA_DVD_R_DL_SEQ: + case K3bDevice::MEDIA_DVD_R_DL_JUMP: + if( !m_onlyCreateImage ) { + if( dh->diskInfo().numLayers() > 1 && + dh->diskInfo().size().mode1Bytes() > 4700372992LL ) { + if( !(m_writerDevice->type() & (K3bDevice::DEVICE_DVD_R_DL|K3bDevice::DEVICE_DVD_PLUS_R_DL)) ) { + emit infoMessage( i18n("The writer does not support writing Double Layer DVD."), ERROR ); + d->running = false; + jobFinished(false); + return; + } + // FIXME: check for growisofs 5.22 (or whatever version is needed) for DVD-R DL + else if( k3bcore->externalBinManager()->binObject( "growisofs" ) && + k3bcore->externalBinManager()->binObject( "growisofs" )->version < K3bVersion( 5, 20 ) ) { + emit infoMessage( i18n("Growisofs >= 5.20 is needed to write Double Layer DVD+R."), ERROR ); + d->running = false; + jobFinished(false); + return; + } + } + } + case K3bDevice::MEDIA_DVD_R: + case K3bDevice::MEDIA_DVD_R_SEQ: + case K3bDevice::MEDIA_DVD_RW: + case K3bDevice::MEDIA_DVD_RW_SEQ: + case K3bDevice::MEDIA_DVD_PLUS_R: + + if( dh->diskInfo().numSessions() > 1 ) { + emit infoMessage( i18n("K3b does not support copying multi-session DVDs."), ERROR ); + d->running = false; + jobFinished(false); + return; + } + + // growisofs only uses the size from the PVD for reserving + // writable space in DAO mode + // with version >= 5.15 growisofs supports specifying the size of the track + if( m_writingMode != K3b::DAO || !m_onTheFly || m_onlyCreateImage || + ( k3bcore->externalBinManager()->binObject( "growisofs" ) && + k3bcore->externalBinManager()->binObject( "growisofs" )->version >= K3bVersion( 5, 15, -1 ) ) ) { + d->lastSector = dh->toc().lastSector(); + break; + } + + // fallthrough + + case K3bDevice::MEDIA_DVD_PLUS_RW: + case K3bDevice::MEDIA_DVD_RW_OVWR: + { + emit infoMessage( i18n("K3b relies on the size saved in the ISO9660 header."), WARNING ); + emit infoMessage( i18n("This might result in a corrupt copy if the source was mastered with buggy software."), WARNING ); + + K3bIso9660 isoF( m_readerDevice, 0 ); + if( isoF.open() ) { + d->lastSector = ((long long)isoF.primaryDescriptor().logicalBlockSize*isoF.primaryDescriptor().volumeSpaceSize)/2048LL - 1; + } + else { + emit infoMessage( i18n("Unable to determine the ISO9660 filesystem size."), ERROR ); + jobFinished(false); + d->running = false; + return; + } + } + break; + + case K3bDevice::MEDIA_DVD_RAM: + emit infoMessage( i18n("K3b does not support copying DVD-RAM."), ERROR ); + jobFinished(false); + d->running = false; + return; + + default: + emit infoMessage( i18n("Unable to determine DVD media type."), ERROR ); + jobFinished(false); + d->running = false; + return; + } + + + if( !m_onTheFly ) { + // + // Check the image path + // + QFileInfo fi( m_imagePath ); + if( !fi.isFile() || + questionYesNo( i18n("Do you want to overwrite %1?").arg(m_imagePath), + i18n("File Exists") ) ) { + if( fi.isDir() ) + m_imagePath = K3b::findTempFile( "iso", m_imagePath ); + else if( !QFileInfo( m_imagePath.section( '/', 0, -2 ) ).isDir() ) { + emit infoMessage( i18n("Specified an unusable temporary path. Using default."), WARNING ); + m_imagePath = K3b::findTempFile( "iso" ); + } + // else the user specified a file in an existing dir + + emit infoMessage( i18n("Writing image file to %1.").arg(m_imagePath), INFO ); + emit newSubTask( i18n("Reading source medium.") ); + } + + // + // check free temp space + // + KIO::filesize_t imageSpaceNeeded = (KIO::filesize_t)(d->lastSector.lba()+1)*2048; + unsigned long avail, size; + QString pathToTest = m_imagePath.left( m_imagePath.findRev( '/' ) ); + if( !K3b::kbFreeOnFs( pathToTest, size, avail ) ) { + emit infoMessage( i18n("Unable to determine free space in temporary directory '%1'.").arg(pathToTest), ERROR ); + jobFinished(false); + d->running = false; + return; + } + else { + if( avail < imageSpaceNeeded/1024 ) { + emit infoMessage( i18n("Not enough space left in temporary directory."), ERROR ); + jobFinished(false); + d->running = false; + return; + } + } + + d->imageFile.setName( m_imagePath ); + if( !d->imageFile.open( IO_WriteOnly ) ) { + emit infoMessage( i18n("Unable to open '%1' for writing.").arg(m_imagePath), ERROR ); + jobFinished( false ); + d->running = false; + return; + } + } + + if( K3b::isMounted( m_readerDevice ) ) { + emit infoMessage( i18n("Unmounting source medium"), INFO ); + K3b::unmount( m_readerDevice ); + } + + if( m_onlyCreateImage || !m_onTheFly ) { + emit newTask( i18n("Creating DVD image") ); + } + else if( m_onTheFly && !m_onlyCreateImage ) { + if( waitForDvd() ) { + prepareWriter(); + if( m_simulate ) + emit newTask( i18n("Simulating DVD copy") ); + else if( m_copies > 1 ) + emit newTask( i18n("Writing DVD copy %1").arg(d->doneCopies+1) ); + else + emit newTask( i18n("Writing DVD copy") ); + + emit burning(true); + d->writerRunning = true; + d->writerJob->start(); + } + else { + if( d->canceled ) + emit canceled(); + jobFinished(false); + d->running = false; + return; + } + } + + prepareReader(); + d->readerRunning = true; + d->dataTrackReader->start(); + } +} + + +void K3bDvdCopyJob::cancel() +{ + if( d->running ) { + d->canceled = true; + if( d->readerRunning ) + d->dataTrackReader->cancel(); + if( d->writerRunning ) + d->writerJob->cancel(); + d->inPipe.close(); + d->outPipe.close(); + d->imageFile.close(); + } + else { + kdDebug() << "(K3bDvdCopyJob) not running." << endl; + } +} + + +void K3bDvdCopyJob::prepareReader() +{ + if( !d->dataTrackReader ) { + d->dataTrackReader = new K3bDataTrackReader( this ); + connect( d->dataTrackReader, SIGNAL(percent(int)), this, SLOT(slotReaderProgress(int)) ); + connect( d->dataTrackReader, SIGNAL(processedSize(int, int)), this, SLOT(slotReaderProcessedSize(int, int)) ); + connect( d->dataTrackReader, SIGNAL(finished(bool)), this, SLOT(slotReaderFinished(bool)) ); + connect( d->dataTrackReader, SIGNAL(infoMessage(const QString&, int)), this, SIGNAL(infoMessage(const QString&, int)) ); + connect( d->dataTrackReader, SIGNAL(newTask(const QString&)), this, SIGNAL(newSubTask(const QString&)) ); + connect( d->dataTrackReader, SIGNAL(debuggingOutput(const QString&, const QString&)), + this, SIGNAL(debuggingOutput(const QString&, const QString&)) ); + } + + d->dataTrackReader->setDevice( m_readerDevice ); + d->dataTrackReader->setIgnoreErrors( m_ignoreReadErrors ); + d->dataTrackReader->setRetries( m_readRetries ); + d->dataTrackReader->setSectorRange( 0, d->lastSector ); + + if( m_onTheFly && !m_onlyCreateImage ) + d->inPipe.writeToFd( d->writerJob->fd(), true ); + else + d->inPipe.writeToIODevice( &d->imageFile ); + + d->inPipe.open( true ); + d->dataTrackReader->writeToFd( d->inPipe.in() ); +} + + +// ALWAYS CALL WAITFORDVD BEFORE PREPAREWRITER! +void K3bDvdCopyJob::prepareWriter() +{ + delete d->writerJob; + + d->writerJob = new K3bGrowisofsWriter( m_writerDevice, this ); + + connect( d->writerJob, SIGNAL(infoMessage(const QString&, int)), this, SIGNAL(infoMessage(const QString&, int)) ); + connect( d->writerJob, SIGNAL(percent(int)), this, SLOT(slotWriterProgress(int)) ); + connect( d->writerJob, SIGNAL(processedSize(int, int)), this, SIGNAL(processedSize(int, int)) ); + connect( d->writerJob, SIGNAL(processedSubSize(int, int)), this, SIGNAL(processedSubSize(int, int)) ); + connect( d->writerJob, SIGNAL(buffer(int)), this, SIGNAL(bufferStatus(int)) ); + connect( d->writerJob, SIGNAL(deviceBuffer(int)), this, SIGNAL(deviceBuffer(int)) ); + connect( d->writerJob, SIGNAL(writeSpeed(int, int)), this, SIGNAL(writeSpeed(int, int)) ); + connect( d->writerJob, SIGNAL(finished(bool)), this, SLOT(slotWriterFinished(bool)) ); + // connect( d->writerJob, SIGNAL(newTask(const QString&)), this, SIGNAL(newTask(const QString&)) ); + connect( d->writerJob, SIGNAL(newSubTask(const QString&)), this, SIGNAL(newSubTask(const QString&)) ); + connect( d->writerJob, SIGNAL(debuggingOutput(const QString&, const QString&)), + this, SIGNAL(debuggingOutput(const QString&, const QString&)) ); + + // these do only make sense with DVD-R(W) + d->writerJob->setSimulate( m_simulate ); + d->writerJob->setBurnSpeed( m_speed ); + d->writerJob->setWritingMode( d->usedWritingMode ); + d->writerJob->setCloseDvd( true ); + + // + // In case the first layer size is not known let the + // split be determined by growisofs + // + if( d->sourceDiskInfo.numLayers() > 1 && + d->sourceDiskInfo.firstLayerSize() > 0 ) { + d->writerJob->setLayerBreak( d->sourceDiskInfo.firstLayerSize().lba() ); + } + else { + // this is only used in DAO mode with growisofs >= 5.15 + d->writerJob->setTrackSize( d->lastSector.lba()+1 ); + } + + d->writerJob->setImageToWrite( QString::null ); // write to stdin +} + + +void K3bDvdCopyJob::slotReaderProgress( int p ) +{ + if( !m_onTheFly || m_onlyCreateImage ) { + emit subPercent( p ); + + int bigParts = ( m_onlyCreateImage ? 1 : (m_simulate ? 2 : ( d->verifyData ? m_copies*2 : m_copies ) + 1 ) ); + emit percent( p/bigParts ); + } +} + + +void K3bDvdCopyJob::slotReaderProcessedSize( int p, int c ) +{ + if( !m_onTheFly || m_onlyCreateImage ) + emit processedSubSize( p, c ); + + if( m_onlyCreateImage ) + emit processedSize( p, c ); +} + + +void K3bDvdCopyJob::slotWriterProgress( int p ) +{ + int bigParts = ( m_simulate ? 1 : ( d->verifyData ? m_copies*2 : m_copies ) ) + ( m_onTheFly ? 0 : 1 ); + int doneParts = ( m_simulate ? 0 : ( d->verifyData ? d->doneCopies*2 : d->doneCopies ) ) + ( m_onTheFly ? 0 : 1 ); + emit percent( 100*doneParts/bigParts + p/bigParts ); + + emit subPercent( p ); +} + + +void K3bDvdCopyJob::slotVerificationProgress( int p ) +{ + int bigParts = ( m_simulate ? 1 : ( d->verifyData ? m_copies*2 : m_copies ) ) + ( m_onTheFly ? 0 : 1 ); + int doneParts = ( m_simulate ? 0 : ( d->verifyData ? d->doneCopies*2 : d->doneCopies ) ) + ( m_onTheFly ? 0 : 1 ) + 1; + emit percent( 100*doneParts/bigParts + p/bigParts ); +} + + +void K3bDvdCopyJob::slotReaderFinished( bool success ) +{ + d->readerRunning = false; + + d->inPipe.close(); + + // close the socket + // otherwise growisofs will never quit. + // FIXME: is it posiible to do this in a generic manner? + if( d->writerJob ) + d->writerJob->closeFd(); + + // already finished? + if( !d->running ) + return; + + if( d->canceled ) { + removeImageFiles(); + emit canceled(); + jobFinished(false); + d->running = false; + } + + if( success ) { + emit infoMessage( i18n("Successfully read source DVD."), SUCCESS ); + if( m_onlyCreateImage ) { + jobFinished(true); + d->running = false; + } + else { + if( m_writerDevice == m_readerDevice ) { + // eject the media (we do this blocking to know if it worked + // because if it did not it might happen that k3b overwrites a CD-RW + // source) + if( !m_readerDevice->eject() ) { + blockingInformation( i18n("K3b was unable to eject the source disk. Please do so manually.") ); + } + } + + if( !m_onTheFly ) { + if( waitForDvd() ) { + prepareWriter(); + if( m_copies > 1 ) + emit newTask( i18n("Writing DVD copy %1").arg(d->doneCopies+1) ); + else + emit newTask( i18n("Writing DVD copy") ); + + emit burning(true); + + d->writerRunning = true; + d->writerJob->start(); + d->outPipe.writeToFd( d->writerJob->fd(), true ); + d->outPipe.open( true ); + } + else { + if( m_removeImageFiles ) + removeImageFiles(); + if( d->canceled ) + emit canceled(); + jobFinished(false); + d->running = false; + } + } + } + } + else { + removeImageFiles(); + jobFinished(false); + d->running = false; + } +} + + +void K3bDvdCopyJob::slotWriterFinished( bool success ) +{ + d->writerRunning = false; + + d->outPipe.close(); + + // already finished? + if( !d->running ) + return; + + if( d->canceled ) { + if( m_removeImageFiles ) + removeImageFiles(); + emit canceled(); + jobFinished(false); + d->running = false; + } + + if( success ) { + emit infoMessage( i18n("Successfully written DVD copy %1.").arg(d->doneCopies+1), INFO ); + + if( d->verifyData && !m_simulate ) { + if( !d->verificationJob ) { + d->verificationJob = new K3bVerificationJob( this, this ); + connect( d->verificationJob, SIGNAL(infoMessage(const QString&, int)), + this, SIGNAL(infoMessage(const QString&, int)) ); + connect( d->verificationJob, SIGNAL(newTask(const QString&)), + this, SIGNAL(newSubTask(const QString&)) ); + connect( d->verificationJob, SIGNAL(percent(int)), + this, SLOT(slotVerificationProgress(int)) ); + connect( d->verificationJob, SIGNAL(percent(int)), + this, SIGNAL(subPercent(int)) ); + connect( d->verificationJob, SIGNAL(finished(bool)), + this, SLOT(slotVerificationFinished(bool)) ); + connect( d->verificationJob, SIGNAL(debuggingOutput(const QString&, const QString&)), + this, SIGNAL(debuggingOutput(const QString&, const QString&)) ); + + } + d->verificationJob->setDevice( m_writerDevice ); + d->verificationJob->addTrack( 1, d->inPipe.checksum(), d->lastSector+1 ); + + if( m_copies > 1 ) + emit newTask( i18n("Verifying DVD copy %1").arg(d->doneCopies+1) ); + else + emit newTask( i18n("Verifying DVD copy") ); + + emit burning( false ); + + d->verificationJob->start(); + } + + else if( ++d->doneCopies < m_copies ) { + + if ( !m_writerDevice->eject() ) { + blockingInformation( i18n("K3b was unable to eject the written disk. Please do so manually.") ); + } + + if( waitForDvd() ) { + prepareWriter(); + emit newTask( i18n("Writing DVD copy %1").arg(d->doneCopies+1) ); + + emit burning(true); + + d->writerRunning = true; + d->writerJob->start(); + } + else { + if( d->canceled ) + emit canceled(); + jobFinished(false); + d->running = false; + return; + } + + if( m_onTheFly ) { + prepareReader(); + d->readerRunning = true; + d->dataTrackReader->start(); + } + else { + d->outPipe.writeToFd( d->writerJob->fd(), true ); + d->outPipe.open( true ); + } + } + else { + if( m_removeImageFiles ) + removeImageFiles(); + d->running = false; + jobFinished(true); + } + } + else { + if( m_removeImageFiles ) + removeImageFiles(); + d->running = false; + jobFinished(false); + } +} + + +void K3bDvdCopyJob::slotVerificationFinished( bool success ) +{ + // we simply ignore the results from the verification, the verification + // job already emits a message + if( ++d->doneCopies < m_copies ) { + + if( waitForDvd() ) { + prepareWriter(); + emit newTask( i18n("Writing DVD copy %1").arg(d->doneCopies+1) ); + + emit burning(true); + + d->writerRunning = true; + d->writerJob->start(); + } + else { + if( d->canceled ) + emit canceled(); + jobFinished(false); + d->running = false; + return; + } + + if( m_onTheFly ) { + prepareReader(); + d->readerRunning = true; + d->dataTrackReader->start(); + } + else { + d->outPipe.writeToFd( d->writerJob->fd(), true ); + d->outPipe.open( true ); + } + } + else { + if( m_removeImageFiles ) + removeImageFiles(); + d->running = false; + jobFinished( success ); + } +} + + +// this is basically the same code as in K3bDvdJob... :( +// perhaps this should be moved to some K3bGrowisofsHandler which also parses the growisofs output? +bool K3bDvdCopyJob::waitForDvd() +{ + int mt = 0; + if( m_writingMode == K3b::WRITING_MODE_RES_OVWR ) // we treat DVD+R(W) as restricted overwrite media + mt = K3bDevice::MEDIA_DVD_RW_OVWR|K3bDevice::MEDIA_DVD_PLUS_RW|K3bDevice::MEDIA_DVD_PLUS_R; + else + mt = K3bDevice::MEDIA_WRITABLE_DVD_SL; + + // + // in case the source is a double layer DVD we made sure above that the writer + // is capable of writing DVD+R-DL or DVD-R DL and here we wait for a DL DVD + // + if( d->sourceDiskInfo.numLayers() > 1 && + d->sourceDiskInfo.size().mode1Bytes() > 4700372992LL ) { + mt = K3bDevice::MEDIA_WRITABLE_DVD_DL; + } + + int m = waitForMedia( m_writerDevice, K3bDevice::STATE_EMPTY, mt ); + + if( m < 0 ) { + cancel(); + return false; + } + + if( m == 0 ) { + emit infoMessage( i18n("Forced by user. Growisofs will be called without further tests."), INFO ); + } + + else { + // ------------------------------- + // DVD Plus + // ------------------------------- + if( m & K3bDevice::MEDIA_DVD_PLUS_ALL ) { + + d->usedWritingMode = K3b::WRITING_MODE_RES_OVWR; + + if( m_simulate ) { + if( !questionYesNo( i18n("K3b does not support simulation with DVD+R(W) media. " + "Do you really want to continue? The media will actually be " + "written to."), + i18n("No Simulation with DVD+R(W)") ) ) { + cancel(); + return false; + } + +// m_simulate = false; + emit newTask( i18n("Writing DVD copy") ); + } + + if( m_writingMode != K3b::WRITING_MODE_AUTO && m_writingMode != K3b::WRITING_MODE_RES_OVWR ) + emit infoMessage( i18n("Writing mode ignored when writing DVD+R(W) media."), INFO ); + + if( m & K3bDevice::MEDIA_DVD_PLUS_RW ) + emit infoMessage( i18n("Writing DVD+RW."), INFO ); + else if( m & K3bDevice::MEDIA_DVD_PLUS_R_DL ) + emit infoMessage( i18n("Writing Double Layer DVD+R."), INFO ); + else + emit infoMessage( i18n("Writing DVD+R."), INFO ); + } + + // ------------------------------- + // DVD Minus + // ------------------------------- + else { + if( m_simulate && !m_writerDevice->dvdMinusTestwrite() ) { + if( !questionYesNo( i18n("Your writer (%1 %2) does not support simulation with DVD-R(W) media. " + "Do you really want to continue? The media will be written " + "for real.") + .arg(m_writerDevice->vendor()) + .arg(m_writerDevice->description()), + i18n("No Simulation with DVD-R(W)") ) ) { + cancel(); + return false; + } + +// m_simulate = false; + } + + // + // We do not default to DAO in onthefly mode since otherwise growisofs would + // use the size from the PVD to reserve space on the DVD and that can be bad + // if this size is wrong + // With growisofs 5.15 we have the option to specify the size of the image to be written in DAO mode. + // +// bool sizeWithDao = ( k3bcore->externalBinManager()->binObject( "growisofs" ) && +// k3bcore->externalBinManager()->binObject( "growisofs" )->version >= K3bVersion( 5, 15, -1 ) ); + + + // TODO: check for feature 0x21 + + if( m & K3bDevice::MEDIA_DVD_RW_OVWR ) { + emit infoMessage( i18n("Writing DVD-RW in restricted overwrite mode."), INFO ); + d->usedWritingMode = K3b::WRITING_MODE_RES_OVWR; + } + else if( m & (K3bDevice::MEDIA_DVD_RW_SEQ| + K3bDevice::MEDIA_DVD_RW) ) { + if( m_writingMode == K3b::DAO ) { +// ( m_writingMode == K3b::WRITING_MODE_AUTO && +// ( sizeWithDao || !m_onTheFly ) ) ) { + emit infoMessage( i18n("Writing DVD-RW in DAO mode."), INFO ); + d->usedWritingMode = K3b::DAO; + } + else { + emit infoMessage( i18n("Writing DVD-RW in incremental mode."), INFO ); + d->usedWritingMode = K3b::WRITING_MODE_INCR_SEQ; + } + } + else { + + // FIXME: DVD-R DL jump and stuff + + if( m_writingMode == K3b::WRITING_MODE_RES_OVWR ) + emit infoMessage( i18n("Restricted Overwrite is not possible with DVD-R media."), INFO ); + + if( m_writingMode == K3b::DAO ) { +// ( m_writingMode == K3b::WRITING_MODE_AUTO && +// ( sizeWithDao || !m_onTheFly ) ) ) { + emit infoMessage( i18n("Writing %1 in DAO mode.").arg( K3bDevice::mediaTypeString(m, true) ), INFO ); + d->usedWritingMode = K3b::DAO; + } + else { + emit infoMessage( i18n("Writing %1 in incremental mode.").arg( K3bDevice::mediaTypeString(m, true) ), INFO ); + d->usedWritingMode = K3b::WRITING_MODE_INCR_SEQ; + } + } + } + } + + return true; +} + + + +void K3bDvdCopyJob::removeImageFiles() +{ + if( QFile::exists( m_imagePath ) ) { + d->imageFile.remove(); + emit infoMessage( i18n("Removed image file %1").arg(m_imagePath), K3bJob::SUCCESS ); + } +} + + +QString K3bDvdCopyJob::jobDescription() const +{ + if( m_onlyCreateImage ) { + return i18n("Creating DVD Image"); + } + else { + if( m_onTheFly ) + return i18n("Copying DVD On-The-Fly"); + else + return i18n("Copying DVD"); + } +} + + +QString K3bDvdCopyJob::jobDetails() const +{ + return i18n("Creating 1 copy", + "Creating %n copies", + (m_simulate||m_onlyCreateImage) ? 1 : m_copies ); +} + + +void K3bDvdCopyJob::setVerifyData( bool b ) +{ + d->verifyData = b; +} + +#include "k3bdvdcopyjob.moc" diff --git a/libk3b/jobs/k3bdvdcopyjob.h b/libk3b/jobs/k3bdvdcopyjob.h new file mode 100644 index 0000000..91da4e9 --- /dev/null +++ b/libk3b/jobs/k3bdvdcopyjob.h @@ -0,0 +1,99 @@ +/* + * + * $Id: k3bdvdcopyjob.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_DVD_COPY_JOB_H_ +#define _K3B_DVD_COPY_JOB_H_ + +#include +#include "k3b_export.h" +#include + + +namespace K3bDevice { + class Device; + class DeviceHandler; +} + + +class LIBK3B_EXPORT K3bDvdCopyJob : public K3bBurnJob +{ + Q_OBJECT + + public: + K3bDvdCopyJob( K3bJobHandler* hdl, QObject* parent = 0, const char* name = 0 ); + ~K3bDvdCopyJob(); + + K3bDevice::Device* writer() const { return m_onlyCreateImage ? 0 : m_writerDevice; } + K3bDevice::Device* readingDevice() const { return m_readerDevice; } + + QString jobDescription() const; + QString jobDetails() const; + + public slots: + void start(); + void cancel(); + + void setWriterDevice( K3bDevice::Device* w ) { m_writerDevice = w; } + void setReaderDevice( K3bDevice::Device* w ) { m_readerDevice = w; } + void setImagePath( const QString& p ) { m_imagePath = p; } + void setRemoveImageFiles( bool b ) { m_removeImageFiles = b; } + void setOnlyCreateImage( bool b ) { m_onlyCreateImage = b; } + void setSimulate( bool b ) { m_simulate = b; } + void setOnTheFly( bool b ) { m_onTheFly = b; } + void setWriteSpeed( int s ) { m_speed = s; } + void setCopies( int c ) { m_copies = c; } + void setWritingMode( int w ) { m_writingMode = w; } + void setIgnoreReadErrors( bool b ) { m_ignoreReadErrors = b; } + void setReadRetries( int i ) { m_readRetries = i; } + void setVerifyData( bool b ); + + private slots: + void slotDiskInfoReady( K3bDevice::DeviceHandler* ); + void slotReaderProgress( int ); + void slotReaderProcessedSize( int, int ); + void slotWriterProgress( int ); + void slotReaderFinished( bool ); + void slotWriterFinished( bool ); + void slotVerificationFinished( bool ); + void slotVerificationProgress( int p ); + + private: + bool waitForDvd(); + void prepareReader(); + void prepareWriter(); + void removeImageFiles(); + + K3bDevice::Device* m_writerDevice; + K3bDevice::Device* m_readerDevice; + QString m_imagePath; + + bool m_onTheFly; + bool m_removeImageFiles; + + bool m_simulate; + int m_speed; + int m_copies; + bool m_onlyCreateImage; + bool m_ignoreReadErrors; + int m_readRetries; + + int m_writingMode; + + class Private; + Private* d; +}; + + +#endif diff --git a/libk3b/jobs/k3bdvdformattingjob.cpp b/libk3b/jobs/k3bdvdformattingjob.cpp new file mode 100644 index 0000000..732e404 --- /dev/null +++ b/libk3b/jobs/k3bdvdformattingjob.cpp @@ -0,0 +1,536 @@ +/* + * + * $Id: k3bdvdformattingjob.cpp 696897 2007-08-06 07:14:14Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bdvdformattingjob.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include +#include + + +class K3bDvdFormattingJob::Private +{ +public: + Private() + : quick(false), + force(false), + mode(K3b::WRITING_MODE_AUTO), + device(0), + process(0), + dvdFormatBin(0), + lastProgressValue(0), + running(false), + forceNoEject(false) { + } + + bool quick; + bool force; + int mode; + + K3bDevice::Device* device; + K3bProcess* process; + const K3bExternalBin* dvdFormatBin; + + int lastProgressValue; + + bool success; + bool canceled; + bool running; + + bool forceNoEject; + + bool error; +}; + + +K3bDvdFormattingJob::K3bDvdFormattingJob( K3bJobHandler* jh, QObject* parent, const char* name ) + : K3bBurnJob( jh, parent, name ) +{ + d = new Private; +} + + +K3bDvdFormattingJob::~K3bDvdFormattingJob() +{ + delete d->process; + delete d; +} + + +K3bDevice::Device* K3bDvdFormattingJob::writer() const +{ + return d->device; +} + + +void K3bDvdFormattingJob::setForceNoEject( bool b ) +{ + d->forceNoEject = b; +} + + +QString K3bDvdFormattingJob::jobDescription() const +{ + return i18n("Formatting DVD"); // Formatting DVD±RW +} + + +QString K3bDvdFormattingJob::jobDetails() const +{ + if( d->quick ) + return i18n("Quick Format"); + else + return QString::null; +} + + +void K3bDvdFormattingJob::start() +{ + d->canceled = false; + d->running = true; + d->error = false; + + jobStarted(); + + if( !d->device ) { + emit infoMessage( i18n("No device set"), ERROR ); + d->running = false; + jobFinished(false); + return; + } + + // FIXME: check the return value + if( K3b::isMounted( d->device ) ) { + emit infoMessage( i18n("Unmounting medium"), INFO ); + K3b::unmount( d->device ); + } + + // + // first wait for a dvd+rw or dvd-rw + // Be aware that an empty DVD-RW might be reformatted to another writing mode + // so we also wait for empty dvds + // + if( waitForMedia( d->device, + K3bDevice::STATE_COMPLETE|K3bDevice::STATE_INCOMPLETE|K3bDevice::STATE_EMPTY, + K3bDevice::MEDIA_WRITABLE_DVD, + i18n("Please insert a rewritable DVD medium into drive

%1 %2 (%3).") + .arg(d->device->vendor()).arg(d->device->description()).arg(d->device->devicename()) ) == -1 ) { + emit canceled(); + d->running = false; + jobFinished(false); + return; + } + + emit infoMessage( i18n("Checking media..."), INFO ); + emit newTask( i18n("Checking media") ); + + connect( K3bDevice::sendCommand( K3bDevice::DeviceHandler::NG_DISKINFO, d->device ), + SIGNAL(finished(K3bDevice::DeviceHandler*)), + this, + SLOT(slotDeviceHandlerFinished(K3bDevice::DeviceHandler*)) ); +} + + +void K3bDvdFormattingJob::start( const K3bDevice::DiskInfo& di ) +{ + d->canceled = false; + d->running = true; + + jobStarted(); + + startFormatting( di ); +} + + +void K3bDvdFormattingJob::cancel() +{ + if( d->running ) { + d->canceled = true; + if( d->process ) + d->process->kill(); + } + else { + kdDebug() << "(K3bDvdFormattingJob) not running." << endl; + } +} + + +void K3bDvdFormattingJob::setDevice( K3bDevice::Device* dev ) +{ + d->device = dev; +} + + +void K3bDvdFormattingJob::setMode( int m ) +{ + d->mode = m; +} + + +void K3bDvdFormattingJob::setQuickFormat( bool b ) +{ + d->quick = b; +} + + +void K3bDvdFormattingJob::setForce( bool b ) +{ + d->force = b; +} + + +void K3bDvdFormattingJob::slotStderrLine( const QString& line ) +{ +// * DVD±RW format utility by , version 4.4. +// * 4.7GB DVD-RW media in Sequential mode detected. +// * blanking 100.0| + +// * formatting 100.0| + + emit debuggingOutput( "dvd+rw-format", line ); + + // parsing for the -gui mode (since dvd+rw-format 4.6) + int pos = line.find( "blanking" ); + if( pos < 0 ) + pos = line.find( "formatting" ); + if( pos >= 0 ) { + pos = line.find( QRegExp( "\\d" ), pos ); + } + // parsing for \b\b... stuff + else if( !line.startsWith("*") ) { + pos = line.find( QRegExp( "\\d" ) ); + } + else if( line.startsWith( ":-(" ) ) { + if( line.startsWith( ":-( unable to proceed with format" ) ) { + d->error = true; + } + } + + if( pos >= 0 ) { + int endPos = line.find( QRegExp("[^\\d\\.]"), pos ) - 1; + bool ok; + int progress = (int)(line.mid( pos, endPos - pos ).toDouble(&ok)); + if( ok ) { + d->lastProgressValue = progress; + emit percent( progress ); + } + else { + kdDebug() << "(K3bDvdFormattingJob) parsing error: '" << line.mid( pos, endPos - pos ) << "'" << endl; + } + } +} + + +void K3bDvdFormattingJob::slotProcessFinished( KProcess* p ) +{ + if( d->canceled ) { + emit canceled(); + d->success = false; + } + else if( p->normalExit() ) { + if( !d->error && p->exitStatus() == 0 ) { + emit infoMessage( i18n("Formatting successfully completed"), K3bJob::SUCCESS ); + + if( d->lastProgressValue < 100 ) { + emit infoMessage( i18n("Do not be concerned with the progress stopping before 100%."), INFO ); + emit infoMessage( i18n("The formatting will continue in the background while writing."), INFO ); + } + + d->success = true; + } + else { + emit infoMessage( i18n("%1 returned an unknown error (code %2).").arg(d->dvdFormatBin->name()).arg(p->exitStatus()), + K3bJob::ERROR ); + emit infoMessage( i18n("Please send me an email with the last output."), K3bJob::ERROR ); + + d->success = false; + } + } + else { + emit infoMessage( i18n("%1 did not exit cleanly.").arg(d->dvdFormatBin->name()), + ERROR ); + d->success = false; + } + + if( d->forceNoEject || + !k3bcore->globalSettings()->ejectMedia() ) { + d->running = false; + jobFinished(d->success); + } + else { + emit infoMessage( i18n("Ejecting DVD..."), INFO ); + connect( K3bDevice::eject( d->device ), + SIGNAL(finished(K3bDevice::DeviceHandler*)), + this, + SLOT(slotEjectingFinished(K3bDevice::DeviceHandler*)) ); + } +} + + +void K3bDvdFormattingJob::slotEjectingFinished( K3bDevice::DeviceHandler* dh ) +{ + if( !dh->success() ) + emit infoMessage( i18n("Unable to eject media."), ERROR ); + + d->running = false; + jobFinished(d->success); +} + + +void K3bDvdFormattingJob::slotDeviceHandlerFinished( K3bDevice::DeviceHandler* dh ) +{ + if( d->canceled ) { + emit canceled(); + jobFinished(false); + d->running = false; + } + + if( dh->success() ) { + startFormatting( dh->diskInfo() ); + } + else { + emit infoMessage( i18n("Unable to determine media state."), ERROR ); + d->running = false; + jobFinished(false); + } +} + + +void K3bDvdFormattingJob::startFormatting( const K3bDevice::DiskInfo& diskInfo ) +{ + // + // Now check the media type: + // if DVD-RW: use d->mode + // emit warning if formatting is full and stuff + // + // in overwrite mode: emit info that progress might stop before 100% since formatting will continue + // in the background once the media gets rewritten (only DVD+RW?) + // + + // emit info about what kind of media has been found + + if( !(diskInfo.mediaType() & (K3bDevice::MEDIA_DVD_RW| + K3bDevice::MEDIA_DVD_RW_SEQ| + K3bDevice::MEDIA_DVD_RW_OVWR| + K3bDevice::MEDIA_DVD_PLUS_RW)) ) { + emit infoMessage( i18n("No rewritable DVD media found. Unable to format."), ERROR ); + d->running = false; + jobFinished(false); + return; + } + + + bool format = true; // do we need to format + bool blank = false; // blank is for DVD-RW sequential incremental + // DVD-RW restricted overwrite and DVD+RW uses the force option (or no option at all) + + + + // + // DVD+RW is quite easy to handle. There is only one possible mode and it is always recommended to not + // format it more than once but to overwrite it once it is formatted + // Once the initial formatting has been done it's always "appendable" (or "complete"???) + // + + + if( diskInfo.mediaType() == K3bDevice::MEDIA_DVD_PLUS_RW ) { + emit infoMessage( i18n("Found %1 media.").arg(K3bDevice::mediaTypeString(K3bDevice::MEDIA_DVD_PLUS_RW)), + INFO ); + + // mode is ignored + + if( diskInfo.empty() ) { + // + // The DVD+RW is blank and needs to be initially formatted + // + blank = false; + } + else { + emit infoMessage( i18n("No need to format %1 media more than once.") + .arg(K3bDevice::mediaTypeString(K3bDevice::MEDIA_DVD_PLUS_RW)), INFO ); + emit infoMessage( i18n("It may simply be overwritten."), INFO ); + + if( d->force ) { + emit infoMessage( i18n("Forcing formatting anyway."), INFO ); + emit infoMessage( i18n("It is not recommended to force formatting of DVD+RW media."), INFO ); + emit infoMessage( i18n("Already after 10-20 reformats the media might be unusable."), INFO ); + blank = false; + } + else { + format = false; + } + } + + if( format ) + emit newSubTask( i18n("Formatting DVD+RW") ); + } + + + + // + // DVD-RW has two modes: incremental sequential (the default which is also needed for DAO writing) + // and restricted overwrite which compares to the DVD+RW mode. + // + + else { // MEDIA_DVD_RW + emit infoMessage( i18n("Found %1 media.").arg(K3bDevice::mediaTypeString(K3bDevice::MEDIA_DVD_RW)), + INFO ); + + if( diskInfo.currentProfile() != K3bDevice::MEDIA_UNKNOWN ) { + emit infoMessage( i18n("Formatted in %1 mode.").arg(K3bDevice::mediaTypeString(diskInfo.currentProfile())), INFO ); + + + // + // Is it possible to have an empty DVD-RW in restricted overwrite mode???? I don't think so. + // + + if( diskInfo.empty() && + (d->mode == K3b::WRITING_MODE_AUTO || + (d->mode == K3b::WRITING_MODE_INCR_SEQ && + diskInfo.currentProfile() == K3bDevice::MEDIA_DVD_RW_SEQ) || + (d->mode == K3b::WRITING_MODE_RES_OVWR && + diskInfo.currentProfile() == K3bDevice::MEDIA_DVD_RW_OVWR) ) + ) { + emit infoMessage( i18n("Media is already empty."), INFO ); + if( d->force ) + emit infoMessage( i18n("Forcing formatting anyway."), INFO ); + else + format = false; + } + else if( diskInfo.currentProfile() == K3bDevice::MEDIA_DVD_RW_OVWR && + d->mode != K3b::WRITING_MODE_INCR_SEQ ) { + emit infoMessage( i18n("No need to format %1 media more than once.") + .arg(K3bDevice::mediaTypeString(diskInfo.currentProfile())), INFO ); + emit infoMessage( i18n("It may simply be overwritten."), INFO ); + + if( d->force ) + emit infoMessage( i18n("Forcing formatting anyway."), INFO ); + else + format = false; + } + + + if( format ) { + if( d->mode == K3b::WRITING_MODE_AUTO ) { + // just format in the same mode as the media is currently formatted + blank = (diskInfo.currentProfile() == K3bDevice::MEDIA_DVD_RW_SEQ); + } + else { + blank = (d->mode == K3b::WRITING_MODE_INCR_SEQ); + } + + emit newSubTask( i18n("Formatting" + " DVD-RW in %1 mode.").arg(K3bDevice::mediaTypeString( blank ? + K3bDevice::MEDIA_DVD_RW_SEQ : + K3bDevice::MEDIA_DVD_RW_OVWR )) ); + } + } + else { + emit infoMessage( i18n("Unable to determine the current formatting state of the DVD-RW media."), ERROR ); + d->running = false; + jobFinished(false); + return; + } + } + + + if( format ) { + delete d->process; + d->process = new K3bProcess(); + d->process->setRunPrivileged(true); + // d->process->setSuppressEmptyLines(false); + connect( d->process, SIGNAL(stderrLine(const QString&)), this, SLOT(slotStderrLine(const QString&)) ); + connect( d->process, SIGNAL(processExited(KProcess*)), this, SLOT(slotProcessFinished(KProcess*)) ); + + d->dvdFormatBin = k3bcore->externalBinManager()->binObject( "dvd+rw-format" ); + if( !d->dvdFormatBin ) { + emit infoMessage( i18n("Could not find %1 executable.").arg("dvd+rw-format"), ERROR ); + d->running = false; + jobFinished(false); + return; + } + + if( !d->dvdFormatBin->copyright.isEmpty() ) + emit infoMessage( i18n("Using %1 %2 - Copyright (C) %3").arg(d->dvdFormatBin->name()).arg(d->dvdFormatBin->version).arg(d->dvdFormatBin->copyright), INFO ); + + + *d->process << d->dvdFormatBin; + + if( d->dvdFormatBin->version >= K3bVersion( 4, 6 ) ) + *d->process << "-gui"; + + QString p; + if( blank ) + p = "-blank"; + else + p = "-force"; + if( !d->quick ) + p += "=full"; + + *d->process << p; + + *d->process << d->device->blockDeviceName(); + + // additional user parameters from config + const QStringList& params = d->dvdFormatBin->userParameters(); + for( QStringList::const_iterator it = params.begin(); it != params.end(); ++it ) + *d->process << *it; + + kdDebug() << "***** dvd+rw-format parameters:\n"; + const QValueList& args = d->process->args(); + QString s; + for( QValueList::const_iterator it = args.begin(); it != args.end(); ++it ) { + s += *it + " "; + } + kdDebug() << s << endl << flush; + emit debuggingOutput( "dvd+rw-format command:", s ); + + if( !d->process->start( KProcess::NotifyOnExit, KProcess::All ) ) { + // something went wrong when starting the program + // it "should" be the executable + kdDebug() << "(K3bDvdFormattingJob) could not start " << d->dvdFormatBin->path << endl; + emit infoMessage( i18n("Could not start %1.").arg(d->dvdFormatBin->name()), K3bJob::ERROR ); + d->running = false; + jobFinished(false); + } + else { + emit newTask( i18n("Formatting") ); + } + } + else { + // already formatted :) + d->running = false; + jobFinished(true); + } +} + + +#include "k3bdvdformattingjob.moc" diff --git a/libk3b/jobs/k3bdvdformattingjob.h b/libk3b/jobs/k3bdvdformattingjob.h new file mode 100644 index 0000000..10672cb --- /dev/null +++ b/libk3b/jobs/k3bdvdformattingjob.h @@ -0,0 +1,91 @@ +/* + * + * $Id: k3bdvdformattingjob.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_DVD_FORMATTING_JOB_H_ +#define _K3B_DVD_FORMATTING_JOB_H_ + + +#include +#include "k3b_export.h" + +class KProcess; +namespace K3bDevice { + class Device; + class DeviceHandler; +} + + +class LIBK3B_EXPORT K3bDvdFormattingJob : public K3bBurnJob +{ + Q_OBJECT + + public: + K3bDvdFormattingJob( K3bJobHandler*, QObject* parent = 0, const char* name = 0 ); + ~K3bDvdFormattingJob(); + + QString jobDescription() const; + QString jobDetails() const; + + K3bDevice::Device* writer() const; + + public slots: + void start(); + + /** + * Use this to force the start of the formatting without checking for a usable medium. + */ + void start( const K3bDevice::DiskInfo& ); + + void cancel(); + + void setDevice( K3bDevice::Device* ); + + /** + * One of: WRITING_MODE_INCR_SEQ, WRITING_MODE_RES_OVWR + * Ignored for DVD+RW + */ + void setMode( int ); + + /** + * Not all writers support this + */ + void setQuickFormat( bool ); + + /** + * @param b If true empty DVDs will also be formatted + */ + void setForce( bool b ); + + /** + * If set true the job ignores the global K3b setting + * and does not eject the CD-RW after finishing + */ + void setForceNoEject( bool ); + + private slots: + void slotStderrLine( const QString& ); + void slotProcessFinished( KProcess* ); + void slotDeviceHandlerFinished( K3bDevice::DeviceHandler* ); + void slotEjectingFinished( K3bDevice::DeviceHandler* ); + + private: + void startFormatting( const K3bDevice::DiskInfo& ); + + class Private; + Private* d; +}; + + +#endif diff --git a/libk3b/jobs/k3biso9660imagewritingjob.cpp b/libk3b/jobs/k3biso9660imagewritingjob.cpp new file mode 100644 index 0000000..1fb3871 --- /dev/null +++ b/libk3b/jobs/k3biso9660imagewritingjob.cpp @@ -0,0 +1,458 @@ +/* + * + * $Id: k3biso9660imagewritingjob.cpp 690187 2007-07-20 09:18:03Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include "k3biso9660imagewritingjob.h" +#include "k3bverificationjob.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + + +class K3bIso9660ImageWritingJob::Private +{ +public: + K3bChecksumPipe checksumPipe; + K3bFileSplitter imageFile; +}; + + +K3bIso9660ImageWritingJob::K3bIso9660ImageWritingJob( K3bJobHandler* hdl ) + : K3bBurnJob( hdl ), + m_writingMode(K3b::WRITING_MODE_AUTO), + m_simulate(false), + m_device(0), + m_noFix(false), + m_speed(2), + m_dataMode(K3b::DATA_MODE_AUTO), + m_writer(0), + m_tocFile(0), + m_copies(1), + m_verifyJob(0) +{ + d = new Private; +} + +K3bIso9660ImageWritingJob::~K3bIso9660ImageWritingJob() +{ + delete m_tocFile; + delete d; +} + + +void K3bIso9660ImageWritingJob::start() +{ + m_canceled = m_finished = false; + m_currentCopy = 1; + + jobStarted(); + + if( m_simulate ) + m_verifyData = false; + + emit newTask( i18n("Preparing data") ); + + if( !QFile::exists( m_imagePath ) ) { + emit infoMessage( i18n("Could not find image %1").arg(m_imagePath), K3bJob::ERROR ); + jobFinished( false ); + return; + } + + unsigned long gb = K3b::imageFilesize( m_imagePath )/1024/1024; + + // very rough test but since most dvd images are 4,x or 8,x GB it should be enough + m_dvd = ( gb > 900 ); + + startWriting(); +} + + +void K3bIso9660ImageWritingJob::slotWriterJobFinished( bool success ) +{ + if( m_canceled ) { + m_finished = true; + emit canceled(); + jobFinished(false); + return; + } + + d->checksumPipe.close(); + + if( success ) { + if( !m_simulate && m_verifyData ) { + emit burning(false); + + // allright + // the writerJob should have emited the "simulation/writing successful" signal + + if( !m_verifyJob ) { + m_verifyJob = new K3bVerificationJob( this ); + connectSubJob( m_verifyJob, + SLOT(slotVerificationFinished(bool)), + true, + SLOT(slotVerificationProgress(int)), + SIGNAL(subPercent(int)) ); + } + m_verifyJob->setDevice( m_device ); + m_verifyJob->clear(); + m_verifyJob->addTrack( 1, d->checksumPipe.checksum(), K3b::imageFilesize( m_imagePath )/2048 ); + + if( m_copies == 1 ) + emit newTask( i18n("Verifying written data") ); + else + emit newTask( i18n("Verifying written copy %1 of %2").arg(m_currentCopy).arg(m_copies) ); + + m_verifyJob->start(); + } + else if( m_currentCopy >= m_copies ) { + m_finished = true; + jobFinished(true); + } + else { + m_currentCopy++; + startWriting(); + } + } + else { + m_finished = true; + jobFinished(false); + } +} + + +void K3bIso9660ImageWritingJob::slotVerificationFinished( bool success ) +{ + if( m_canceled ) { + m_finished = true; + emit canceled(); + jobFinished(false); + return; + } + + if( success && m_currentCopy < m_copies ) { + m_currentCopy++; + connect( K3bDevice::eject( m_device ), SIGNAL(finished(bool)), + this, SLOT(startWriting()) ); + return; + } + + k3bcore->config()->setGroup("General Options"); + if( !k3bcore->config()->readBoolEntry( "No cd eject", false ) ) + K3bDevice::eject( m_device ); + + m_finished = true; + jobFinished( success ); +} + + +void K3bIso9660ImageWritingJob::slotVerificationProgress( int p ) +{ + emit percent( (int)(100.0 / (double)m_copies * ( (double)(m_currentCopy-1) + 0.5 + (double)p/200.0 )) ); +} + + +void K3bIso9660ImageWritingJob::slotWriterPercent( int p ) +{ + emit subPercent( p ); + + if( m_verifyData ) + emit percent( (int)(100.0 / (double)m_copies * ( (double)(m_currentCopy-1) + ((double)p/200.0) )) ); + else + emit percent( (int)(100.0 / (double)m_copies * ( (double)(m_currentCopy-1) + ((double)p/100.0) )) ); +} + + +void K3bIso9660ImageWritingJob::slotNextTrack( int, int ) +{ + if( m_copies == 1 ) + emit newSubTask( i18n("Writing image") ); + else + emit newSubTask( i18n("Writing copy %1 of %2").arg(m_currentCopy).arg(m_copies) ); +} + + +void K3bIso9660ImageWritingJob::cancel() +{ + if( !m_finished ) { + m_canceled = true; + + if( m_writer ) + m_writer->cancel(); + if( m_verifyData && m_verifyJob ) + m_verifyJob->cancel(); + } +} + + +void K3bIso9660ImageWritingJob::startWriting() +{ + emit newSubTask( i18n("Waiting for medium") ); + + // we wait for the following: + // 1. if writing mode auto and writing app auto: all writable media types + // 2. if writing mode auto and writing app not growisofs: all writable cd types + // 3. if writing mode auto and writing app growisofs: all writable dvd types + // 4. if writing mode TAO or RAW: all writable cd types + // 5. if writing mode DAO and writing app auto: all writable cd types and DVD-R(W) + // 6. if writing mode DAO and writing app GROWISOFS: DVD-R(W) + // 7. if writing mode DAO and writing app CDRDAO or CDRECORD: all writable cd types + // 8. if writing mode WRITING_MODE_INCR_SEQ: DVD-R(W) + // 9. if writing mode WRITING_MODE_RES_OVWR: DVD-RW or DVD+RW + + int mt = 0; + if( m_writingMode == K3b::WRITING_MODE_AUTO ) { + if( writingApp() == K3b::DEFAULT ) { + if( m_dvd ) + mt = K3bDevice::MEDIA_WRITABLE_DVD; + else + mt = K3bDevice::MEDIA_WRITABLE_CD; + } + else if( writingApp() != K3b::GROWISOFS ) + mt = K3bDevice::MEDIA_WRITABLE_CD; + else + mt = K3bDevice::MEDIA_WRITABLE_DVD; + } + else if( m_writingMode == K3b::TAO || m_writingMode == K3b::RAW ) + mt = K3bDevice::MEDIA_WRITABLE_CD; + else if( m_writingMode == K3b::DAO ) { + if( writingApp() == K3b::DEFAULT ) { + if( m_dvd ) + mt = K3bDevice::MEDIA_WRITABLE_DVD; + else + mt = K3bDevice::MEDIA_WRITABLE_CD; + } + else if( writingApp() == K3b::GROWISOFS ) + mt = K3bDevice::MEDIA_WRITABLE_DVD; + else + mt = K3bDevice::MEDIA_WRITABLE_CD; + } + else if( m_writingMode == K3b::WRITING_MODE_RES_OVWR ) + mt = K3bDevice::MEDIA_DVD_PLUS_R|K3bDevice::MEDIA_DVD_PLUS_R_DL|K3bDevice::MEDIA_DVD_PLUS_RW|K3bDevice::MEDIA_DVD_RW_OVWR; + else + mt = K3bDevice::MEDIA_WRITABLE_DVD; + + + // wait for the media + int media = waitForMedia( m_device, K3bDevice::STATE_EMPTY, mt ); + if( media < 0 ) { + m_finished = true; + emit canceled(); + jobFinished(false); + return; + } + + // we simply always calculate the checksum, thus making the code simpler + d->imageFile.close(); + d->imageFile.setName( m_imagePath ); + d->imageFile.open( IO_ReadOnly ); + d->checksumPipe.close(); + d->checksumPipe.readFromIODevice( &d->imageFile ); + + if( prepareWriter( media ) ) { + emit burning(true); + m_writer->start(); + d->checksumPipe.writeToFd( m_writer->fd(), true ); + d->checksumPipe.open( K3bChecksumPipe::MD5, true ); + } + else { + m_finished = true; + jobFinished(false); + } +} + + +bool K3bIso9660ImageWritingJob::prepareWriter( int mediaType ) +{ + if( mediaType == 0 ) { // media forced + // just to get it going... + if( writingApp() != K3b::GROWISOFS && !m_dvd ) + mediaType = K3bDevice::MEDIA_CD_R; + else + mediaType = K3bDevice::MEDIA_DVD_R; + } + + delete m_writer; + + if( mediaType == K3bDevice::MEDIA_CD_R || mediaType == K3bDevice::MEDIA_CD_RW ) { + int usedWritingMode = m_writingMode; + if( usedWritingMode == K3b::WRITING_MODE_AUTO ) { + // cdrecord seems to have problems when writing in mode2 in dao mode + // so with cdrecord we use TAO + if( m_noFix || m_dataMode == K3b::MODE2 || !m_device->dao() ) + usedWritingMode = K3b::TAO; + else + usedWritingMode = K3b::DAO; + } + + int usedApp = writingApp(); + if( usedApp == K3b::DEFAULT ) { + if( usedWritingMode == K3b::DAO && + ( m_dataMode == K3b::MODE2 || m_noFix ) ) + usedApp = K3b::CDRDAO; + else + usedApp = K3b::CDRECORD; + } + + + if( usedApp == K3b::CDRECORD ) { + K3bCdrecordWriter* writer = new K3bCdrecordWriter( m_device, this ); + + writer->setWritingMode( usedWritingMode ); + writer->setSimulate( m_simulate ); + writer->setBurnSpeed( m_speed ); + + if( m_noFix ) { + writer->addArgument("-multi"); + } + + if( (m_dataMode == K3b::DATA_MODE_AUTO && m_noFix) || + m_dataMode == K3b::MODE2 ) { + if( k3bcore->externalBinManager()->binObject("cdrecord") && + k3bcore->externalBinManager()->binObject("cdrecord")->hasFeature( "xamix" ) ) + writer->addArgument( "-xa" ); + else + writer->addArgument( "-xa1" ); + } + else + writer->addArgument("-data"); + + // read from stdin + writer->addArgument( QString("-tsize=%1s").arg( K3b::imageFilesize( m_imagePath )/2048 ) )->addArgument( "-" ); + + m_writer = writer; + } + else { + // create cdrdao job + K3bCdrdaoWriter* writer = new K3bCdrdaoWriter( m_device, this ); + writer->setCommand( K3bCdrdaoWriter::WRITE ); + writer->setSimulate( m_simulate ); + writer->setBurnSpeed( m_speed ); + // multisession + writer->setMulti( m_noFix ); + + // now write the tocfile + delete m_tocFile; + m_tocFile = new KTempFile( QString::null, "toc" ); + m_tocFile->setAutoDelete(true); + + if( QTextStream* s = m_tocFile->textStream() ) { + if( (m_dataMode == K3b::DATA_MODE_AUTO && m_noFix) || + m_dataMode == K3b::MODE2 ) { + *s << "CD_ROM_XA" << "\n"; + *s << "\n"; + *s << "TRACK MODE2_FORM1" << "\n"; + } + else { + *s << "CD_ROM" << "\n"; + *s << "\n"; + *s << "TRACK MODE1" << "\n"; + } + *s << "DATAFILE \"-\" " << QString::number( K3b::imageFilesize( m_imagePath ) ) << "\n"; + + m_tocFile->close(); + } + else { + kdDebug() << "(K3bDataJob) could not write tocfile." << endl; + emit infoMessage( i18n("IO Error"), ERROR ); + return false; + } + + writer->setTocFile( m_tocFile->name() ); + + m_writer = writer; + } + } + else { // DVD + if( mediaType & K3bDevice::MEDIA_DVD_PLUS_ALL ) { + if( m_simulate ) { + if( questionYesNo( i18n("K3b does not support simulation with DVD+R(W) media. " + "Do you really want to continue? The media will be written " + "for real."), + i18n("No Simulation with DVD+R(W)") ) ) { + return false; + } + } + + m_simulate = false; + } + + K3bGrowisofsWriter* writer = new K3bGrowisofsWriter( m_device, this ); + writer->setSimulate( m_simulate ); + writer->setBurnSpeed( m_speed ); + writer->setWritingMode( m_writingMode == K3b::DAO ? K3b::DAO : 0 ); + writer->setImageToWrite( QString::null ); // read from stdin + writer->setCloseDvd( !m_noFix ); + writer->setTrackSize( K3b::imageFilesize( m_imagePath )/2048 ); + + m_writer = writer; + } + + connect( m_writer, SIGNAL(infoMessage(const QString&, int)), this, SIGNAL(infoMessage(const QString&, int)) ); + connect( m_writer, SIGNAL(nextTrack(int, int)), this, SLOT(slotNextTrack(int, int)) ); + connect( m_writer, SIGNAL(percent(int)), this, SLOT(slotWriterPercent(int)) ); + connect( m_writer, SIGNAL(processedSize(int, int)), this, SIGNAL(processedSize(int, int)) ); + connect( m_writer, SIGNAL(buffer(int)), this, SIGNAL(bufferStatus(int)) ); + connect( m_writer, SIGNAL(deviceBuffer(int)), this, SIGNAL(deviceBuffer(int)) ); + connect( m_writer, SIGNAL(writeSpeed(int, int)), this, SIGNAL(writeSpeed(int, int)) ); + connect( m_writer, SIGNAL(finished(bool)), this, SLOT(slotWriterJobFinished(bool)) ); + connect( m_writer, SIGNAL(newTask(const QString&)), this, SIGNAL(newTask(const QString&)) ); + connect( m_writer, SIGNAL(newSubTask(const QString&)), this, SIGNAL(newSubTask(const QString&)) ); + connect( m_writer, SIGNAL(debuggingOutput(const QString&, const QString&)), + this, SIGNAL(debuggingOutput(const QString&, const QString&)) ); + + return true; +} + + +QString K3bIso9660ImageWritingJob::jobDescription() const +{ + if( m_simulate ) + return i18n("Simulating ISO9660 Image"); + else + return ( i18n("Burning ISO9660 Image") + + ( m_copies > 1 + ? i18n(" - %n Copy", " - %n Copies", m_copies) + : QString::null ) ); +} + + +QString K3bIso9660ImageWritingJob::jobDetails() const +{ + return m_imagePath.section("/", -1) + QString( " (%1)" ).arg(KIO::convertSize(K3b::filesize(KURL::fromPathOrURL(m_imagePath)))); +} + + +#include "k3biso9660imagewritingjob.moc" diff --git a/libk3b/jobs/k3biso9660imagewritingjob.h b/libk3b/jobs/k3biso9660imagewritingjob.h new file mode 100644 index 0000000..eceb6dc --- /dev/null +++ b/libk3b/jobs/k3biso9660imagewritingjob.h @@ -0,0 +1,98 @@ +/* + * + * $Id$ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef K3BISO9660_IMAGE_WRITING_JOB_H +#define K3BISO9660_IMAGE_WRITING_JOB_H + +#include +#include "k3b_export.h" +class QString; +class K3bAbstractWriter; +class KTempFile; +namespace K3bDevice { + class Device; +} +class K3bVerificationJob; + + +/** + *@author Sebastian Trueg + */ +class LIBK3B_EXPORT K3bIso9660ImageWritingJob : public K3bBurnJob +{ + Q_OBJECT + + public: + K3bIso9660ImageWritingJob( K3bJobHandler* ); + ~K3bIso9660ImageWritingJob(); + + K3bDevice::Device* writer() const { return m_device; }; + + QString jobDescription() const; + QString jobDetails() const; + + public slots: + void cancel(); + void start(); + + void setImagePath( const QString& path ) { m_imagePath = path; } + void setSpeed( int s ) { m_speed = s; } + void setBurnDevice( K3bDevice::Device* dev ) { m_device = dev; } + void setWritingMode( int mode ) { m_writingMode = mode; } + void setSimulate( bool b ) { m_simulate = b; } + void setNoFix( bool b ) { m_noFix = b; } + void setDataMode( int m ) { m_dataMode = m; } + void setVerifyData( bool b ) { m_verifyData = b; } + void setCopies( int c ) { m_copies = c; } + + protected slots: + void slotWriterJobFinished( bool ); + void slotVerificationFinished( bool ); + void slotVerificationProgress( int ); + void slotWriterPercent( int ); + void slotNextTrack( int, int ); + void startWriting(); + + private: + bool prepareWriter( int mediaType ); + + int m_writingMode; + bool m_simulate; + K3bDevice::Device* m_device; + bool m_noFix; + int m_speed; + int m_dataMode; + bool m_verifyData; + bool m_dvd; + + QString m_imagePath; + + K3bAbstractWriter* m_writer; + KTempFile* m_tocFile; + + bool m_canceled; + bool m_finished; + + int m_copies; + int m_currentCopy; + + K3bVerificationJob* m_verifyJob; + + class Private; + Private* d; +}; + +#endif diff --git a/libk3b/jobs/k3breadcdreader.cpp b/libk3b/jobs/k3breadcdreader.cpp new file mode 100644 index 0000000..d75eb63 --- /dev/null +++ b/libk3b/jobs/k3breadcdreader.cpp @@ -0,0 +1,335 @@ +/* + * + * $Id: k3breadcdreader.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include "k3breadcdreader.h" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + + + +class K3bReadcdReader::Private +{ +public: + Private() + : process(0), + fdToWriteTo(-1), + canceled(false) { + } + + K3b::Msf firstSector, lastSector; + + K3bProcess* process; + const K3bExternalBin* readcdBinObject; + + int fdToWriteTo; + bool canceled; + + long blocksToRead; + int unreadableBlocks; + + int lastProgress; + int lastProcessedSize; +}; + + + +K3bReadcdReader::K3bReadcdReader( K3bJobHandler* jh, QObject* parent, const char* name ) + : K3bJob( jh, parent, name ), + m_noCorr(false), + m_clone(false), + m_noError(false), + m_c2Scan(false), + m_speed(0), + m_retries(128) +{ + d = new Private(); +} + + +K3bReadcdReader::~K3bReadcdReader() +{ + delete d->process; + delete d; +} + + +bool K3bReadcdReader::active() const +{ + return (d->process ? d->process->isRunning() : false); +} + + +void K3bReadcdReader::writeToFd( int fd ) +{ + d->fdToWriteTo = fd; +} + + +void K3bReadcdReader::start() +{ + jobStarted(); + + d->blocksToRead = 1; + d->unreadableBlocks = 0; + d->lastProgress = 0; + d->lastProcessedSize = 0; + + // the first thing to do is to check for readcd + d->readcdBinObject = k3bcore->externalBinManager()->binObject( "readcd" ); + if( !d->readcdBinObject ) { + emit infoMessage( i18n("Could not find %1 executable.").arg("readcd"), ERROR ); + jobFinished(false); + return; + } + + // check if we have clone support if we need it + if( m_clone ) { + bool foundCloneSupport = false; + + if( !d->readcdBinObject->hasFeature( "clone" ) ) { + // search all readcd installations + K3bExternalProgram* readcdProgram = k3bcore->externalBinManager()->program( "readcd" ); + const QPtrList& readcdBins = readcdProgram->bins(); + for( QPtrListIterator it( readcdBins ); it.current(); ++it ) { + if( it.current()->hasFeature( "clone" ) ) { + d->readcdBinObject = it.current(); + emit infoMessage( i18n("Using readcd %1 instead of default version for clone support.").arg(d->readcdBinObject->version), INFO ); + foundCloneSupport = true; + break; + } + } + + if( !foundCloneSupport ) { + emit infoMessage( i18n("Could not find readcd executable with cloning support."), ERROR ); + jobFinished(false); + return; + } + } + } + + + // create the commandline + delete d->process; + d->process = new K3bProcess(); + connect( d->process, SIGNAL(stderrLine(const QString&)), this, SLOT(slotStdLine(const QString&)) ); + connect( d->process, SIGNAL(processExited(KProcess*)), this, SLOT(slotProcessExited(KProcess*)) ); + + + *d->process << d->readcdBinObject; + + // display progress + *d->process << "-v"; + + // Again we assume the device to be set! + *d->process << QString("dev=%1").arg(K3b::externalBinDeviceParameter(m_readDevice, + d->readcdBinObject)); + if( m_speed > 0 ) + *d->process << QString("speed=%1").arg(m_speed); + + + // output + if( d->fdToWriteTo != -1 ) { + *d->process << "f=-"; + d->process->dupStdout( d->fdToWriteTo ); + } + else { + emit newTask( i18n("Writing image to %1.").arg(m_imagePath) ); + emit infoMessage( i18n("Writing image to %1.").arg(m_imagePath), INFO ); + *d->process << "f=" + m_imagePath; + } + + + if( m_noError ) + *d->process << "-noerror"; + if( m_clone ) { + *d->process << "-clone"; + // noCorr can only be used with cloning + if( m_noCorr ) + *d->process << "-nocorr"; + } + if( m_c2Scan ) + *d->process << "-c2scan"; + + *d->process << QString("retries=%1").arg(m_retries); + + // readcd does not read the last sector specified + if( d->firstSector < d->lastSector ) + *d->process << QString("sectors=%1-%2").arg(d->firstSector.lba()).arg(d->lastSector.lba()+1); + + // Joerg sais it is a Linux kernel bug, anyway, with the default value it does not work + *d->process << "ts=128k"; + + // additional user parameters from config + const QStringList& params = d->readcdBinObject->userParameters(); + for( QStringList::const_iterator it = params.begin(); it != params.end(); ++it ) + *d->process << *it; + + + kdDebug() << "***** readcd parameters:\n"; + const QValueList& args = d->process->args(); + QString s; + for( QValueList::const_iterator it = args.begin(); it != args.end(); ++it ) { + s += *it + " "; + } + kdDebug() << s << endl << flush; + + emit debuggingOutput("readcd command:", s); + + d->canceled = false; + + if( !d->process->start( KProcess::NotifyOnExit, KProcess::AllOutput) ) { + // something went wrong when starting the program + // it "should" be the executable + kdError() << "(K3bReadcdReader) could not start readcd" << endl; + emit infoMessage( i18n("Could not start readcd."), K3bJob::ERROR ); + jobFinished( false ); + } +} + + +void K3bReadcdReader::cancel() +{ + if( d->process ) { + if( d->process->isRunning() ) { + d->canceled = true; + d->process->kill(); + } + } +} + + +void K3bReadcdReader::slotStdLine( const QString& line ) +{ + emit debuggingOutput( "readcd", line ); + + int pos = -1; + + if( line.startsWith( "end:" ) ) { + bool ok; + d->blocksToRead = line.mid(4).toInt(&ok); + if( d->firstSector < d->lastSector ) + d->blocksToRead -= d->firstSector.lba(); + if( !ok ) + kdError() << "(K3bReadcdReader) blocksToRead parsing error in line: " + << line.mid(4) << endl; + } + + else if( line.startsWith( "addr:" ) ) { + bool ok; + long currentReadBlock = line.mid( 6, line.find("cnt")-7 ).toInt(&ok); + if( d->firstSector < d->lastSector ) + currentReadBlock -= d->firstSector.lba(); + if( ok ) { + int p = (int)(100.0 * (double)currentReadBlock / (double)d->blocksToRead); + if( p > d->lastProgress ) { + emit percent( p ); + d->lastProgress = p; + } + int ps = currentReadBlock*2/1024; + if( ps > d->lastProcessedSize ) { + emit processedSize( ps, d->blocksToRead*2/1024 ); + d->lastProcessedSize = ps; + } + } + else + kdError() << "(K3bReadcdReader) currentReadBlock parsing error in line: " + << line.mid( 6, line.find("cnt")-7 ) << endl; + } + + else if( line.contains("Cannot read source disk") ) { + emit infoMessage( i18n("Cannot read source disk."), ERROR ); + } + + else if( (pos = line.find("Retrying from sector")) >= 0 ) { + // parse the sector + pos += 21; + bool ok; + int problemSector = line.mid( pos, line.find( QRegExp("\\D"), pos )-pos ).toInt(&ok); + if( !ok ) { + kdError() << "(K3bReadcdReader) problemSector parsing error in line: " + << line.mid( pos, line.find( QRegExp("\\D"), pos )-pos ) << endl; + } + emit infoMessage( i18n("Retrying from sector %1.").arg(problemSector), INFO ); + } + + else if( (pos = line.find("Error on sector")) >= 0 ) { + d->unreadableBlocks++; + + pos += 16; + bool ok; + int problemSector = line.mid( pos, line.find( QRegExp("\\D"), pos )-pos ).toInt(&ok); + if( !ok ) { + kdError() << "(K3bReadcdReader) problemSector parsing error in line: " + << line.mid( pos, line.find( QRegExp("\\D"), pos )-pos ) << endl; + } + + if( line.contains( "not corrected") ) { + emit infoMessage( i18n("Uncorrected error in sector %1").arg(problemSector), ERROR ); + } + else { + emit infoMessage( i18n("Corrected error in sector %1").arg(problemSector), ERROR ); + } + } + + else { + kdDebug() << "(readcd) " << line << endl; + } +} + +void K3bReadcdReader::slotProcessExited( KProcess* p ) +{ + if( d->canceled ) { + emit canceled(); + jobFinished(false); + } + else if( p->normalExit() ) { + if( p->exitStatus() == 0 ) { + jobFinished( true ); + } + else { + emit infoMessage( i18n("%1 returned error: %2").arg("Readcd").arg(p->exitStatus()), ERROR ); + jobFinished( false ); + } + } + else { + emit infoMessage( i18n("Readcd exited abnormally."), ERROR ); + jobFinished( false ); + } +} + + +void K3bReadcdReader::setSectorRange( const K3b::Msf& first, const K3b::Msf& last ) +{ + d->firstSector = first; + d->lastSector = last; +} + +#include "k3breadcdreader.moc" + diff --git a/libk3b/jobs/k3breadcdreader.h b/libk3b/jobs/k3breadcdreader.h new file mode 100644 index 0000000..93ebce0 --- /dev/null +++ b/libk3b/jobs/k3breadcdreader.h @@ -0,0 +1,91 @@ +/* + * + * $Id: k3breadcdreader.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef _K3B_READCD_READER_H_ +#define _K3B_READCD_READER_H_ + +#include + + +class K3bProcess; +class KProcess; +class K3bExternalBin; +namespace K3bDevice { + class Device; +} +namespace K3b { + class Msf; +} + + +class K3bReadcdReader : public K3bJob +{ + Q_OBJECT + + public: + K3bReadcdReader( K3bJobHandler*, QObject* parent = 0, const char* name = 0 ); + ~K3bReadcdReader(); + + bool active() const; + + public slots: + void start(); + void cancel(); + + void setReadDevice( K3bDevice::Device* dev ) { m_readDevice = dev; } + + /** 0 means MAX */ + void setReadSpeed( int s ) { m_speed = s; } + void setDisableCorrection( bool b ) { m_noCorr = b; } + + /** default: true */ + void setAbortOnError( bool b ) { m_noError = !b; } + void setC2Scan( bool b ) { m_c2Scan = b; } + void setClone( bool b ) { m_clone = b; } + void setRetries( int i ) { m_retries = i; } + + void setSectorRange( const K3b::Msf&, const K3b::Msf& ); + + void setImagePath( const QString& p ) { m_imagePath = p; } + + /** + * the data gets written directly into fd instead of the imagefile. + * Be aware that this only makes sense before starting the job. + * To disable just set fd to -1 + */ + void writeToFd( int fd ); + + private slots: + void slotStdLine( const QString& line ); + void slotProcessExited(KProcess*); + + private: + bool m_noCorr; + bool m_clone; + bool m_noError; + bool m_c2Scan; + int m_speed; + int m_retries; + + K3bDevice::Device* m_readDevice; + + QString m_imagePath; + + class Private; + Private* d; +}; + +#endif diff --git a/libk3b/jobs/k3bverificationjob.cpp b/libk3b/jobs/k3bverificationjob.cpp new file mode 100644 index 0000000..e73530e --- /dev/null +++ b/libk3b/jobs/k3bverificationjob.cpp @@ -0,0 +1,384 @@ +/* + * + * $Id: k3bisoimageverificationjob.cpp 597651 2006-10-21 08:04:01Z trueg $ + * Copyright (C) 2003-2007 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bverificationjob.h" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + + +class K3bVerificationJobTrackEntry +{ +public: + K3bVerificationJobTrackEntry() + : trackNumber(0) { + } + + K3bVerificationJobTrackEntry( int tn, const QCString& cs, const K3b::Msf& msf ) + : trackNumber(tn), + checksum(cs), + length(msf) { + } + + int trackNumber; + QCString checksum; + K3b::Msf length; +}; + + +class K3bVerificationJob::Private +{ +public: + Private() + : md5Job(0), + device(0), + dataTrackReader(0) { + } + + bool canceled; + K3bMd5Job* md5Job; + K3bDevice::Device* device; + + K3b::Msf grownSessionSize; + + QValueList tracks; + int currentTrackIndex; + + K3bDevice::DiskInfo diskInfo; + K3bDevice::Toc toc; + + K3bDataTrackReader* dataTrackReader; + + K3b::Msf currentTrackSize; + K3b::Msf totalSectors; + K3b::Msf alreadyReadSectors; + + K3bPipe pipe; + + bool readSuccessful; + + bool mediumHasBeenReloaded; +}; + + +K3bVerificationJob::K3bVerificationJob( K3bJobHandler* hdl, QObject* parent, const char* name ) + : K3bJob( hdl, parent, name ) +{ + d = new Private(); + + d->md5Job = new K3bMd5Job( this ); + connect( d->md5Job, SIGNAL(infoMessage(const QString&, int)), this, SIGNAL(infoMessage(const QString&, int)) ); + connect( d->md5Job, SIGNAL(finished(bool)), this, SLOT(slotMd5JobFinished(bool)) ); + connect( d->md5Job, SIGNAL(debuggingOutput(const QString&, const QString&)), + this, SIGNAL(debuggingOutput(const QString&, const QString&)) ); +} + + +K3bVerificationJob::~K3bVerificationJob() +{ + delete d; +} + + +void K3bVerificationJob::cancel() +{ + d->canceled = true; + if( d->md5Job && d->md5Job->active() ) + d->md5Job->cancel(); + if( d->dataTrackReader && d->dataTrackReader->active() ) + d->dataTrackReader->cancel(); +} + + +void K3bVerificationJob::addTrack( int trackNum, const QCString& checksum, const K3b::Msf& length ) +{ + d->tracks.append( K3bVerificationJobTrackEntry( trackNum, checksum, length ) ); +} + + +void K3bVerificationJob::clear() +{ + d->tracks.clear(); + d->grownSessionSize = 0; +} + + +void K3bVerificationJob::setDevice( K3bDevice::Device* dev ) +{ + d->device = dev; +} + + +void K3bVerificationJob::setGrownSessionSize( const K3b::Msf& s ) +{ + d->grownSessionSize = s; +} + + +void K3bVerificationJob::start() +{ + jobStarted(); + + d->canceled = false; + d->currentTrackIndex = 0; + d->alreadyReadSectors = 0; + + emit newTask( i18n("Checking medium") ); + + d->mediumHasBeenReloaded = false; + connect( K3bDevice::sendCommand( K3bDevice::DeviceHandler::DISKINFO, d->device ), + SIGNAL(finished(K3bDevice::DeviceHandler*)), + this, + SLOT(slotDiskInfoReady(K3bDevice::DeviceHandler*)) ); +} + + +void K3bVerificationJob::slotMediaReloaded( bool /*success*/ ) +{ + // we always need to wait for the medium. Otherwise the diskinfo below + // may run before the drive is ready! + waitForMedia( d->device, + K3bDevice::STATE_COMPLETE|K3bDevice::STATE_INCOMPLETE, + K3bDevice::MEDIA_WRITABLE ); + + d->mediumHasBeenReloaded = true; + + emit newTask( i18n("Checking medium") ); + + connect( K3bDevice::sendCommand( K3bDevice::DeviceHandler::DISKINFO, d->device ), + SIGNAL(finished(K3bDevice::DeviceHandler*)), + this, + SLOT(slotDiskInfoReady(K3bDevice::DeviceHandler*)) ); +} + + +void K3bVerificationJob::slotDiskInfoReady( K3bDevice::DeviceHandler* dh ) +{ + if( d->canceled ) { + emit canceled(); + jobFinished(false); + } + + d->diskInfo = dh->diskInfo(); + d->toc = dh->toc(); + d->totalSectors = 0; + + // just to be sure check if we actually have all the tracks + int i = 0; + for( QValueList::iterator it = d->tracks.begin(); + it != d->tracks.end(); ++i, ++it ) { + + // 0 means "last track" + if( (*it).trackNumber == 0 ) + (*it).trackNumber = d->toc.count(); + + if( (int)d->toc.count() < (*it).trackNumber ) { + if ( d->mediumHasBeenReloaded ) { + emit infoMessage( i18n("Internal Error: Verification job improperly initialized (%1)") + .arg( "Specified track number not found on medium" ), ERROR ); + jobFinished( false ); + return; + } + else { + // many drives need to reload the medium to return to a proper state + emit newTask( i18n("Reloading the medium") ); + connect( K3bDevice::reload( d->device ), + SIGNAL(finished(bool)), + this, + SLOT(slotMediaReloaded(bool)) ); + return; + } + } + + d->totalSectors += trackLength( i ); + } + + readTrack( 0 ); +} + + +void K3bVerificationJob::readTrack( int trackIndex ) +{ + d->currentTrackIndex = trackIndex; + d->readSuccessful = true; + + d->currentTrackSize = trackLength( trackIndex ); + if( d->currentTrackSize == 0 ) { + jobFinished(false); + return; + } + + emit newTask( i18n("Verifying track %1").arg( d->tracks[trackIndex].trackNumber ) ); + + d->pipe.open(); + + if( d->toc[d->tracks[trackIndex].trackNumber-1].type() == K3bDevice::Track::DATA ) { + if( !d->dataTrackReader ) { + d->dataTrackReader = new K3bDataTrackReader( this ); + connect( d->dataTrackReader, SIGNAL(percent(int)), this, SLOT(slotReaderProgress(int)) ); + // connect( d->dataTrackReader, SIGNAL(processedSize(int, int)), this, SLOT(slotReaderProcessedSize(int, int)) ); + connect( d->dataTrackReader, SIGNAL(finished(bool)), this, SLOT(slotReaderFinished(bool)) ); + connect( d->dataTrackReader, SIGNAL(infoMessage(const QString&, int)), this, SIGNAL(infoMessage(const QString&, int)) ); + connect( d->dataTrackReader, SIGNAL(newTask(const QString&)), this, SIGNAL(newSubTask(const QString&)) ); + connect( d->dataTrackReader, SIGNAL(debuggingOutput(const QString&, const QString&)), + this, SIGNAL(debuggingOutput(const QString&, const QString&)) ); + } + + d->dataTrackReader->setDevice( d->device ); + d->dataTrackReader->setIgnoreErrors( false ); + d->dataTrackReader->setSectorSize( K3bDataTrackReader::MODE1 ); + + // in case a session was grown the track size does not say anything about the verification data size + if( d->diskInfo.mediaType() & (K3bDevice::MEDIA_DVD_PLUS_RW|K3bDevice::MEDIA_DVD_RW_OVWR) && + d->grownSessionSize > 0 ) { + K3bIso9660 isoF( d->device ); + if( isoF.open() ) { + int firstSector = isoF.primaryDescriptor().volumeSpaceSize - d->grownSessionSize.lba(); + d->dataTrackReader->setSectorRange( firstSector, + isoF.primaryDescriptor().volumeSpaceSize -1 ); + } + else { + emit infoMessage( i18n("Unable to determine the ISO9660 filesystem size."), ERROR ); + jobFinished( false ); + return; + } + } + else + d->dataTrackReader->setSectorRange( d->toc[d->tracks[trackIndex].trackNumber-1].firstSector(), + d->toc[d->tracks[trackIndex].trackNumber-1].firstSector() + d->currentTrackSize -1 ); + + d->md5Job->setMaxReadSize( d->currentTrackSize.mode1Bytes() ); + + d->dataTrackReader->writeToFd( d->pipe.in() ); + d->dataTrackReader->start(); + } + else { + // FIXME: handle audio tracks + } + + d->md5Job->setFd( d->pipe.out() ); + d->md5Job->start(); +} + + +void K3bVerificationJob::slotReaderProgress( int p ) +{ + emit subPercent( p ); + + emit percent( 100 * ( d->alreadyReadSectors.lba() + ( p*d->currentTrackSize.lba()/100 ) ) / d->totalSectors.lba() ); +} + + +void K3bVerificationJob::slotMd5JobFinished( bool success ) +{ + d->pipe.close(); + + if( success && !d->canceled && d->readSuccessful ) { + // compare the two sums + if( d->tracks[d->currentTrackIndex].checksum != d->md5Job->hexDigest() ) { + emit infoMessage( i18n("Written data in track %1 differs from original.").arg(d->tracks[d->currentTrackIndex].trackNumber), ERROR ); + jobFinished(false); + } + else { + emit infoMessage( i18n("Written data verified."), SUCCESS ); + ++d->currentTrackIndex; + if( d->currentTrackIndex < (int)d->tracks.count() ) + readTrack( d->currentTrackIndex ); + else + jobFinished(true); + } + } + else { + // The md5job emitted an error message. So there is no need to do this again + jobFinished(false); + } +} + + +void K3bVerificationJob::slotReaderFinished( bool success ) +{ + d->readSuccessful = success; + if( !d->readSuccessful ) + d->md5Job->cancel(); + else { + d->alreadyReadSectors += trackLength( d->currentTrackIndex ); + + // close the pipe and let the md5 job finish gracefully + d->pipe.closeIn(); + // d->md5Job->stop(); + } +} + + +K3b::Msf K3bVerificationJob::trackLength( int trackIndex ) +{ + K3b::Msf& trackSize = d->tracks[trackIndex].length; + const int& trackNum = d->tracks[trackIndex].trackNumber; + + if( trackSize == 0 ) { + trackSize = d->toc[trackNum-1].length(); + + if( d->diskInfo.mediaType() & (K3bDevice::MEDIA_DVD_PLUS_RW|K3bDevice::MEDIA_DVD_RW_OVWR) ) { + K3bIso9660 isoF( d->device, d->toc[trackNum-1].firstSector().lba() ); + if( isoF.open() ) { + trackSize = isoF.primaryDescriptor().volumeSpaceSize; + } + else { + emit infoMessage( i18n("Unable to determine the ISO9660 filesystem size."), ERROR ); + return 0; + } + } + + // + // A data track recorded in TAO mode has two run-out blocks which cannot be read and contain + // zero data anyway. The problem is that I do not know of a valid method to determine if a track + // was written in TAO (the control nibble does definitely not work, I never saw one which did not + // equal 4). + // So the solution for now is to simply try to read the last sector of a data track. If this is not + // possible we assume it was written in TAO mode and reduce the length by 2 sectors + // + if( d->toc[trackNum-1].type() == K3bDevice::Track::DATA && + d->diskInfo.mediaType() & K3bDevice::MEDIA_CD_ALL ) { + // we try twice just to be sure + unsigned char buffer[2048]; + if( !d->device->read10( buffer, 2048, d->toc[trackNum-1].lastSector().lba(), 1 ) && + !d->device->read10( buffer, 2048, d->toc[trackNum-1].lastSector().lba(), 1 ) ) { + trackSize -= 2; + kdDebug() << "(K3bCdCopyJob) track " << trackNum << " probably TAO recorded." << endl; + } + } + } + + return trackSize; +} + + +#include "k3bverificationjob.moc" diff --git a/libk3b/jobs/k3bverificationjob.h b/libk3b/jobs/k3bverificationjob.h new file mode 100644 index 0000000..ad750ee --- /dev/null +++ b/libk3b/jobs/k3bverificationjob.h @@ -0,0 +1,92 @@ +/* + * + * $Id: k3bisoimageverificationjob.h 597651 2006-10-21 08:04:01Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_VERIFICATION_JOB_H_ +#define _K3B_VERIFICATION_JOB_H_ + +#include + +namespace K3bDevice { + class Device; + class DeviceHandler; +} + + +/** + * Generic verification job. Add tracks to be verified via addTrack. + * The job will then verifiy the tracks set against the set checksums. + * + * The different track types are handled as follows: + * \li Data/DVD tracks: Read the track with a 2048 bytes sector size. + * Tracks length on DVD+RW media will be read from the iso9660 + * descriptor. + * \li Audio tracks: Rip the track with a 2352 bytes sector size. + * In the case of audio tracks the job will not fail if the checksums + * differ becasue audio CD tracks do not contain error correction data. + * In this case only a warning will be emitted. + * + * Other sector sizes than 2048 bytes for data tracks are not supported yet, + * i.e. Video CDs cannot be verified. + * + * TAO written tracks have two run-out sectors that are not read. + * + * The VerificationJob will also reload the medium before starting. + */ +class K3bVerificationJob : public K3bJob +{ + Q_OBJECT + + public: + K3bVerificationJob( K3bJobHandler*, QObject* parent = 0, const char* name = 0 ); + ~K3bVerificationJob(); + + public slots: + void start(); + void cancel(); + void setDevice( K3bDevice::Device* dev ); + + void clear(); + + /** + * Add a track to be verified. + * \param tracknum The number of the track. If \a tracknum is 0 + * the last track will be verified. + * \param length Set to override the track length from the TOC. This may be + * useful when writing to DVD+RW media and the iso descriptor does not + * contain the exact image size (as true for many commercial Video DVDs) + */ + void addTrack( int tracknum, const QCString& checksum, const K3b::Msf& length = K3b::Msf() ); + + /** + * Handle the special case of iso session growing + */ + void setGrownSessionSize( const K3b::Msf& ); + + private slots: + void slotMediaReloaded( bool success ); + void slotDiskInfoReady( K3bDevice::DeviceHandler* dh ); + void readTrack( int trackIndex ); + void slotMd5JobFinished( bool success ); + void slotReaderProgress( int p ); + void slotReaderFinished( bool success ); + + private: + K3b::Msf trackLength( int trackNum ); + + class Private; + Private* d; +}; + +#endif diff --git a/libk3b/jobs/k3bvideodvdtitledetectclippingjob.cpp b/libk3b/jobs/k3bvideodvdtitledetectclippingjob.cpp new file mode 100644 index 0000000..fdcc3a4 --- /dev/null +++ b/libk3b/jobs/k3bvideodvdtitledetectclippingjob.cpp @@ -0,0 +1,291 @@ +/* + * + * $Id: sourceheader 511311 2006-02-19 14:51:05Z trueg $ + * Copyright (C) 2006 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bvideodvdtitledetectclippingjob.h" + +#include +#include +#include +#include + +#include +#include + + +static const int s_unrealisticHighClippingValue = 100000; + + +class K3bVideoDVDTitleDetectClippingJob::Private +{ +public: + const K3bExternalBin* usedTranscodeBin; + + K3bProcess* process; + + bool canceled; + + unsigned int currentChapter; + unsigned int currentFrames; + unsigned int totalChapters; + + int lastProgress; + int lastSubProgress; +}; + + + +K3bVideoDVDTitleDetectClippingJob::K3bVideoDVDTitleDetectClippingJob( K3bJobHandler* hdl, QObject* parent ) + : K3bJob( hdl, parent ), + m_clippingTop( 0 ), + m_clippingBottom( 0 ), + m_clippingLeft( 0 ), + m_clippingRight( 0 ), + m_lowPriority( true ) +{ + d = new Private; + d->process = 0; +} + + +K3bVideoDVDTitleDetectClippingJob::~K3bVideoDVDTitleDetectClippingJob() +{ + delete d->process; + delete d; +} + + +void K3bVideoDVDTitleDetectClippingJob::start() +{ + jobStarted(); + + d->canceled = false; + d->lastProgress = 0; + + // + // It seems as if the last chapter is often way too short + // + d->totalChapters = m_dvd[m_titleNumber-1].numPTTs(); + if( d->totalChapters > 1 && m_dvd[m_titleNumber-1][d->totalChapters-1].playbackTime().totalFrames() < 200 ) + d->totalChapters--; + + // initial values (some way to big value) + m_clippingTop = s_unrealisticHighClippingValue; + m_clippingBottom = s_unrealisticHighClippingValue; + m_clippingLeft = s_unrealisticHighClippingValue; + m_clippingRight = s_unrealisticHighClippingValue; + + d->usedTranscodeBin = k3bcore->externalBinManager()->binObject("transcode"); + if( !d->usedTranscodeBin ) { + emit infoMessage( i18n("%1 executable could not be found.").arg("transcode"), ERROR ); + jobFinished( false ); + return; + } + + if( d->usedTranscodeBin->version < K3bVersion( 1, 0, 0 ) ){ + emit infoMessage( i18n("%1 version %2 is too old.") + .arg("transcode") + .arg(d->usedTranscodeBin->version), ERROR ); + jobFinished( false ); + return; + } + + emit debuggingOutput( "Used versions", "transcode: " + d->usedTranscodeBin->version ); + + if( !d->usedTranscodeBin->copyright.isEmpty() ) + emit infoMessage( i18n("Using %1 %2 - Copyright (C) %3") + .arg(d->usedTranscodeBin->name()) + .arg(d->usedTranscodeBin->version) + .arg(d->usedTranscodeBin->copyright), INFO ); + + emit newTask( i18n("Analysing Title %1 of Video DVD %2").arg(m_titleNumber).arg(m_dvd.volumeIdentifier()) ); + + startTranscode( 1 ); +} + + +void K3bVideoDVDTitleDetectClippingJob::startTranscode( int chapter ) +{ + d->currentChapter = chapter; + d->lastSubProgress = 0; + + // + // If we have only one chapter and it is not longer than 2 minutes (value guessed based on some test DVD) + // use the whole chapter + // + if( d->totalChapters == 1 ) + d->currentFrames = QMIN( 3000, QMAX( 1, m_dvd[m_titleNumber-1][d->currentChapter-1].playbackTime().totalFrames() ) ); + else + d->currentFrames = QMIN( 200, QMAX( 1, m_dvd[m_titleNumber-1][d->currentChapter-1].playbackTime().totalFrames() ) ); + + // + // prepare the process + // + delete d->process; + d->process = new K3bProcess(); + d->process->setSuppressEmptyLines(true); + d->process->setSplitStdout(true); + // connect( d->process, SIGNAL(stderrLine(const QString&)), this, SLOT(slotTranscodeStderr(const QString&)) ); + connect( d->process, SIGNAL(stdoutLine(const QString&)), this, SLOT(slotTranscodeStderr(const QString&)) ); + connect( d->process, SIGNAL(processExited(KProcess*)), this, SLOT(slotTranscodeExited(KProcess*)) ); + + // the executable + *d->process << d->usedTranscodeBin; + + // low priority + if( m_lowPriority ) + *d->process << "--nice" << "19"; + + // the input + *d->process << "-i" << m_dvd.device()->blockDeviceName(); + + // select the title number and chapter + *d->process << "-T" << QString("%1,%2").arg(m_titleNumber).arg(chapter); + + // null output + *d->process << "-y" << "null,null" << "-o" << "/dev/null"; + + // analyze the first 200 frames + *d->process << "-J" << QString("detectclipping=range=0-%1/5").arg(d->currentFrames); + + // also only decode the first 200 frames + *d->process << "-c" << QString("0-%1").arg(d->currentFrames+1); + + // additional user parameters from config + const QStringList& params = d->usedTranscodeBin->userParameters(); + for( QStringList::const_iterator it = params.begin(); it != params.end(); ++it ) + *d->process << *it; + + // produce some debugging output + kdDebug() << "***** transcode parameters:\n"; + const QValueList& args = d->process->args(); + QString s; + for( QValueList::const_iterator it = args.begin(); it != args.end(); ++it ) { + s += *it + " "; + } + kdDebug() << s << flush << endl; + emit debuggingOutput( d->usedTranscodeBin->name() + " command:", s); + + // start the process + if( !d->process->start( KProcess::NotifyOnExit, KProcess::All ) ) { + // something went wrong when starting the program + // it "should" be the executable + emit infoMessage( i18n("Could not start %1.").arg(d->usedTranscodeBin->name()), K3bJob::ERROR ); + jobFinished(false); + } + else { + emit newSubTask( i18n("Analysing Chapter %1 of %2").arg(chapter).arg(m_dvd[m_titleNumber-1].numPTTs()) ); + emit subPercent( 0 ); + } +} + + +void K3bVideoDVDTitleDetectClippingJob::cancel() +{ + d->canceled = true; + if( d->process && d->process->isRunning() ) + d->process->kill(); +} + + +void K3bVideoDVDTitleDetectClippingJob::slotTranscodeStderr( const QString& line ) +{ + emit debuggingOutput( "transcode", line ); + + // parse progress + // encoding frame [185], 24.02 fps, 93.0%, ETA: 0:00:00, ( 0| 0| 0) + if( line.startsWith( "encoding frame" ) ) { + int pos1 = line.find( '[', 15 ); + int pos2 = line.find( ']', pos1+1 ); + if( pos1 > 0 && pos2 > 0 ) { + bool ok; + int encodedFrames = line.mid( pos1+1, pos2-pos1-1 ).toInt( &ok ); + if( ok ) { + int progress = 100 * encodedFrames / d->currentFrames; + + if( progress > d->lastSubProgress ) { + d->lastSubProgress = progress; + emit subPercent( progress ); + } + + double part = 100.0 / (double)d->totalChapters; + + progress = (int)( ( (double)(d->currentChapter-1) * part ) + + ( (double)progress / (double)d->totalChapters ) + + 0.5 ); + + if( progress > d->lastProgress ) { + d->lastProgress = progress; + emit percent( progress ); + } + } + } + } + + // [detectclipping#0] valid area: X: 5..719 Y: 72..507 -> -j 72,6,68,0 + else if( line.startsWith( "[detectclipping" ) ) { + int pos = line.find( "-j" ); + if( pos > 0 ) { + QStringList values = QStringList::split( ',', line.mid( pos+3 ) ); + m_clippingTop = QMIN( m_clippingTop, values[0].toInt() ); + m_clippingLeft = QMIN( m_clippingLeft, values[1].toInt() ); + m_clippingBottom = QMIN( m_clippingBottom, values[2].toInt() ); + m_clippingRight = QMIN( m_clippingRight, values[3].toInt() ); + } + else + kdDebug() << "(K3bVideoDVDTitleDetectClippingJob) failed to parse line: " << line << endl; + } +} + + +void K3bVideoDVDTitleDetectClippingJob::slotTranscodeExited( KProcess* p ) +{ + switch( p->exitStatus() ) { + case 0: + d->currentChapter++; + if( d->currentChapter > d->totalChapters ) { + // + // check if we did set any values at all + // + if( m_clippingTop == s_unrealisticHighClippingValue ) + m_clippingTop = m_clippingLeft = m_clippingBottom = m_clippingRight = 0; + + if( d->totalChapters < m_dvd[m_titleNumber-1].numPTTs() ) + emit infoMessage( i18n("Ignoring last chapter due to its short playback time."), INFO ); + + jobFinished( true ); + } + else { + startTranscode( d->currentChapter ); + } + break; + + default: + // FIXME: error handling + + if( d->canceled ) { + emit canceled(); + } + else { + emit infoMessage( i18n("%1 returned an unknown error (code %2).") + .arg(d->usedTranscodeBin->name()).arg(p->exitStatus()), + K3bJob::ERROR ); + emit infoMessage( i18n("Please send me an email with the last output."), K3bJob::ERROR ); + } + + jobFinished( false ); + } +} + +#include "k3bvideodvdtitledetectclippingjob.moc" diff --git a/libk3b/jobs/k3bvideodvdtitledetectclippingjob.h b/libk3b/jobs/k3bvideodvdtitledetectclippingjob.h new file mode 100644 index 0000000..b13bbf8 --- /dev/null +++ b/libk3b/jobs/k3bvideodvdtitledetectclippingjob.h @@ -0,0 +1,106 @@ +/* + * + * $Id: sourceheader 511311 2006-02-19 14:51:05Z trueg $ + * Copyright (C) 2006 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_VIDEODVD_TITLE_DETECTCLIPPING_JOB_H_ +#define _K3B_VIDEODVD_TITLE_DETECTCLIPPING_JOB_H_ + +#include +#include +#include + +class KProcess; + +/** + * Job to detect the clipping values for a Video DVD title. + */ +class LIBK3B_EXPORT K3bVideoDVDTitleDetectClippingJob : public K3bJob +{ + Q_OBJECT + + public: + K3bVideoDVDTitleDetectClippingJob( K3bJobHandler* hdl, QObject* parent ); + ~K3bVideoDVDTitleDetectClippingJob(); + + const K3bVideoDVD::VideoDVD& videoDVD() const { return m_dvd; } + int title() const { return m_titleNumber; } + bool lowPriority() const { return m_lowPriority; } + + /** + * Only valid after a successful completion of the job. + */ + int clippingTop() const { return m_clippingTop; } + + /** + * Only valid after a successful completion of the job. + */ + int clippingLeft() const { return m_clippingLeft; } + + /** + * Only valid after a successful completion of the job. + */ + int clippingBottom() const { return m_clippingBottom; } + + /** + * Only valid after a successful completion of the job. + */ + int clippingRight() const { return m_clippingRight; } + + public slots: + void start(); + void cancel(); + + /** + * The device containing the Video DVD + */ + void setVideoDVD( const K3bVideoDVD::VideoDVD& dvd ) { m_dvd = dvd; } + + /** + * Set the title number to be analysed + * + * The default value is 1, denoting the first title. + */ + void setTitle( int t ) { m_titleNumber = t; } + + /** + * If true the transcode processes will be run with a very low scheduling + * priority. + * + * The default is true. + */ + void setLowPriority( bool b ) { m_lowPriority = b; } + + private slots: + void slotTranscodeStderr( const QString& ); + void slotTranscodeExited( KProcess* ); + + private: + void startTranscode( int chapter ); + + K3bVideoDVD::VideoDVD m_dvd; + + int m_clippingTop; + int m_clippingBottom; + int m_clippingLeft; + int m_clippingRight; + + int m_titleNumber; + + bool m_lowPriority; + + class Private; + Private* d; +}; + +#endif diff --git a/libk3b/jobs/k3bvideodvdtitletranscodingjob.cpp b/libk3b/jobs/k3bvideodvdtitletranscodingjob.cpp new file mode 100644 index 0000000..9fec637 --- /dev/null +++ b/libk3b/jobs/k3bvideodvdtitletranscodingjob.cpp @@ -0,0 +1,583 @@ +/* + * + * $Id: sourceheader 511311 2006-02-19 14:51:05Z trueg $ + * Copyright (C) 2006 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bvideodvdtitletranscodingjob.h" + +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + + +class K3bVideoDVDTitleTranscodingJob::Private +{ +public: + const K3bExternalBin* usedTranscodeBin; + + K3bProcess* process; + + QString twoPassEncodingLogFile; + + int currentEncodingPass; + + bool canceled; + + int lastProgress; + int lastSubProgress; +}; + + + +K3bVideoDVDTitleTranscodingJob::K3bVideoDVDTitleTranscodingJob( K3bJobHandler* hdl, QObject* parent ) + : K3bJob( hdl, parent ), + m_clippingTop( 0 ), + m_clippingBottom( 0 ), + m_clippingLeft( 0 ), + m_clippingRight( 0 ), + m_width( 0 ), + m_height( 0 ), + m_titleNumber( 1 ), + m_audioStreamIndex( 0 ), + m_videoCodec( VIDEO_CODEC_FFMPEG_MPEG4 ), + m_audioCodec( AUDIO_CODEC_MP3 ), + m_videoBitrate( 1800 ), + m_audioBitrate( 128 ), + m_audioVBR( false ), + m_resampleAudio( false ), + m_twoPassEncoding( false ), + m_lowPriority( true ) +{ + d = new Private; + d->process = 0; +} + + +K3bVideoDVDTitleTranscodingJob::~K3bVideoDVDTitleTranscodingJob() +{ + delete d->process; + delete d; +} + + +void K3bVideoDVDTitleTranscodingJob::start() +{ + jobStarted(); + + d->canceled = false; + d->lastProgress = 0; + + d->usedTranscodeBin = k3bcore->externalBinManager()->binObject("transcode"); + if( !d->usedTranscodeBin ) { + emit infoMessage( i18n("%1 executable could not be found.").arg("transcode"), ERROR ); + jobFinished( false ); + return; + } + + if( d->usedTranscodeBin->version < K3bVersion( 1, 0, 0 ) ){ + emit infoMessage( i18n("%1 version %2 is too old.") + .arg("transcode") + .arg(d->usedTranscodeBin->version), ERROR ); + jobFinished( false ); + return; + } + + emit debuggingOutput( "Used versions", "transcode: " + d->usedTranscodeBin->version ); + + if( !d->usedTranscodeBin->copyright.isEmpty() ) + emit infoMessage( i18n("Using %1 %2 - Copyright (C) %3") + .arg(d->usedTranscodeBin->name()) + .arg(d->usedTranscodeBin->version) + .arg(d->usedTranscodeBin->copyright), INFO ); + + // + // Let's take a look at the filename + // + if( m_filename.isEmpty() ) { + m_filename = K3b::findTempFile( "avi" ); + } + else { + // let's see if the directory exists and we can write to it + QFileInfo fileInfo( m_filename ); + QFileInfo dirInfo( fileInfo.dirPath() ); + if( !dirInfo.exists() && !KStandardDirs::makeDir( dirInfo.absFilePath() ) ) { + emit infoMessage( i18n("Unable to create folder '%1'").arg(dirInfo.filePath()), ERROR ); + return; + } + else if( !dirInfo.isDir() || !dirInfo.isWritable() ) { + emit infoMessage( i18n("Invalid filename: '%1'").arg(m_filename), ERROR ); + jobFinished( false ); + return; + } + } + + // + // Determine a log file for two-pass encoding + // + d->twoPassEncodingLogFile = K3b::findTempFile( "log" ); + + emit newTask( i18n("Transcoding title %1 from Video DVD %2").arg(m_titleNumber).arg(m_dvd.volumeIdentifier()) ); + + // + // Ok then, let's begin + // + startTranscode( m_twoPassEncoding ? 1 : 0 ); +} + + +void K3bVideoDVDTitleTranscodingJob::startTranscode( int pass ) +{ + d->currentEncodingPass = pass; + d->lastSubProgress = 0; + + QString videoCodecString; + switch( m_videoCodec ) { + case VIDEO_CODEC_XVID: + videoCodecString = "xvid"; + break; + + case VIDEO_CODEC_FFMPEG_MPEG4: + videoCodecString = "ffmpeg"; + break; + + default: + emit infoMessage( i18n("Invalid Video codec set: %1").arg(m_videoCodec), ERROR ); + jobFinished( false ); + return; + } + + QString audioCodecString; + switch( m_audioCodec ) { + case AUDIO_CODEC_MP3: + audioCodecString = "0x55"; + break; + + // ogg only works (as in: transcode does something) with .y ,ogg + // but then the video is garbage (at least to xine and mplayer on my system) + // case AUDIO_CODEC_OGG_VORBIS: + // audioCodecString = "0xfffe"; + // break; + + case AUDIO_CODEC_AC3_STEREO: + case AUDIO_CODEC_AC3_PASSTHROUGH: + audioCodecString = "0x2000"; + break; + + default: + emit infoMessage( i18n("Invalid Audio codec set: %1").arg(m_audioCodec), ERROR ); + jobFinished( false ); + return; + } + + // + // prepare the process + // + delete d->process; + d->process = new K3bProcess(); + d->process->setSuppressEmptyLines(true); + d->process->setSplitStdout(true); + connect( d->process, SIGNAL(stderrLine(const QString&)), this, SLOT(slotTranscodeStderr(const QString&)) ); + connect( d->process, SIGNAL(stdoutLine(const QString&)), this, SLOT(slotTranscodeStderr(const QString&)) ); + connect( d->process, SIGNAL(processExited(KProcess*)), this, SLOT(slotTranscodeExited(KProcess*)) ); + + // the executable + *d->process << d->usedTranscodeBin; + + // low priority + if( m_lowPriority ) + *d->process << "--nice" << "19"; + + // we only need 100 steps, but to make sure we use 150 + if ( d->usedTranscodeBin->version.simplify() >= K3bVersion( 1, 1, 0 ) ) + *d->process << "--progress_meter" << "2" << "--progress_rate" << QString::number(m_dvd[m_titleNumber-1].playbackTime().totalFrames()/150); + else + *d->process << "--print_status" << QString::number(m_dvd[m_titleNumber-1].playbackTime().totalFrames()/150); + + // the input + *d->process << "-i" << m_dvd.device()->blockDeviceName(); + + // just to make sure + *d->process << "-x" << "dvd"; + + // select the title number + *d->process << "-T" << QString("%1,-1,1").arg( m_titleNumber ); + + // select the audio stream to extract + if ( m_dvd[m_titleNumber-1].numAudioStreams() > 0 ) + *d->process << "-a" << QString::number( m_audioStreamIndex ); + + // clipping + *d->process << "-j" << QString("%1,%2,%3,%4") + .arg(m_clippingTop) + .arg(m_clippingLeft) + .arg(m_clippingBottom) + .arg(m_clippingRight); + + // select the encoding type (single pass or two-pass) and the log file for two-pass encoding + // the latter is unused for pass = 0 + *d->process << "-R" << QString("%1,%2").arg( pass ).arg( d->twoPassEncodingLogFile ); + + // depending on the pass we use different options + if( pass != 1 ) { + // select video codec + *d->process << "-y" << videoCodecString; + + // select the audio codec to use + *d->process << "-N" << audioCodecString; + + if( m_audioCodec == AUDIO_CODEC_AC3_PASSTHROUGH ) { + // keep 5.1 sound + *d->process << "-A"; + } + else { + // audio quality settings + *d->process << "-b" << QString("%1,%2").arg(m_audioBitrate).arg(m_audioVBR ? 1 : 0); + + // resample audio stream to 44.1 khz + if( m_resampleAudio ) + *d->process << "-E" << "44100"; + } + + // the output filename + *d->process << "-o" << m_filename; + } + else { + // gather information about the video stream, ignore audio + *d->process << "-y" << QString("%1,null").arg( videoCodecString ); + + // we ignore the output from the first pass + *d->process << "-o" << "/dev/null"; + } + + // choose the ffmpeg codec + if( m_videoCodec == VIDEO_CODEC_FFMPEG_MPEG4 ) { + *d->process << "-F" << "mpeg4"; + } + + // video bitrate + *d->process << "-w" << QString::number( m_videoBitrate ); + + // video resizing + int usedWidth = m_width; + int usedHeight = m_height; + if( m_width == 0 || m_height == 0 ) { + // + // The "real" size of the video, considering anamorph encoding + // + int realHeight = m_dvd[m_titleNumber-1].videoStream().realPictureHeight(); + int readWidth = m_dvd[m_titleNumber-1].videoStream().realPictureWidth(); + + // + // The clipped size with the correct aspect ratio + // + int clippedHeight = realHeight - m_clippingTop - m_clippingBottom; + int clippedWidth = readWidth - m_clippingLeft - m_clippingRight; + + // + // Now simply resize the clipped video to the wanted size + // + if( usedWidth > 0 ) { + usedHeight = clippedHeight * usedWidth / clippedWidth; + } + else { + if( usedHeight == 0 ) { + // + // This is the default case in which both m_width and m_height are 0. + // The result will be a size of clippedWidth x clippedHeight + // + usedHeight = clippedHeight; + } + usedWidth = clippedWidth * usedHeight / clippedHeight; + } + } + + // + // Now make sure both width and height are multiple of 16 the simple way + // + usedWidth -= usedWidth%16; + usedHeight -= usedHeight%16; + + // we only give information about the resizing of the video once + if( pass < 2 ) + emit infoMessage( i18n("Resizing picture of title %1 to %2x%3").arg(m_titleNumber).arg(usedWidth).arg(usedHeight), INFO ); + *d->process << "-Z" << QString("%1x%2").arg(usedWidth).arg(usedHeight); + + // additional user parameters from config + const QStringList& params = d->usedTranscodeBin->userParameters(); + for( QStringList::const_iterator it = params.begin(); it != params.end(); ++it ) + *d->process << *it; + + // produce some debugging output + kdDebug() << "***** transcode parameters:\n"; + const QValueList& args = d->process->args(); + QString s; + for( QValueList::const_iterator it = args.begin(); it != args.end(); ++it ) { + s += *it + " "; + } + kdDebug() << s << flush << endl; + emit debuggingOutput( d->usedTranscodeBin->name() + " command:", s); + + // start the process + if( !d->process->start( KProcess::NotifyOnExit, KProcess::All ) ) { + // something went wrong when starting the program + // it "should" be the executable + emit infoMessage( i18n("Could not start %1.").arg(d->usedTranscodeBin->name()), K3bJob::ERROR ); + jobFinished(false); + } + else { + if( pass == 0 ) + emit newSubTask( i18n("Single-pass Encoding") ); + else if( pass == 1 ) + emit newSubTask( i18n("Two-pass Encoding: First Pass") ); + else + emit newSubTask( i18n("Two-pass Encoding: Second Pass") ); + + emit subPercent( 0 ); + } +} + + +void K3bVideoDVDTitleTranscodingJob::cancel() +{ + // FIXME: do not cancel before one frame has been encoded. transcode seems to hang then + // find a way to determine all subprocess ids to kill all of them + d->canceled = true; + if( d->process && d->process->isRunning() ) + d->process->kill(); +} + + +void K3bVideoDVDTitleTranscodingJob::cleanup( bool success ) +{ + if( QFile::exists( d->twoPassEncodingLogFile ) ) { + QFile::remove( d->twoPassEncodingLogFile ); + } + + if( !success && QFile::exists( m_filename ) ) { + emit infoMessage( i18n("Removing incomplete video file '%1'").arg(m_filename), INFO ); + QFile::remove( m_filename ); + } +} + + +void K3bVideoDVDTitleTranscodingJob::slotTranscodeStderr( const QString& line ) +{ + emit debuggingOutput( "transcode", line ); + + // parse progress + // encoding frames [000000-000144], 27.58 fps, EMT: 0:00:05, ( 0| 0| 0) + if( line.startsWith( "encoding frame" ) ) { + int pos1 = line.find( '-', 15 ); + int pos2 = line.find( ']', pos1+1 ); + if( pos1 > 0 && pos2 > 0 ) { + bool ok; + int encodedFrames = line.mid( pos1+1, pos2-pos1-1 ).toInt( &ok ); + if( ok ) { + int progress = 100 * encodedFrames / m_dvd[m_titleNumber-1].playbackTime().totalFrames(); + + if( progress > d->lastSubProgress ) { + d->lastSubProgress = progress; + emit subPercent( progress ); + } + + if( m_twoPassEncoding ) { + progress /= 2; + if( d->currentEncodingPass == 2 ) + progress += 50; + } + + if( progress > d->lastProgress ) { + d->lastProgress = progress; + emit percent( progress ); + } + } + } + } +} + + +void K3bVideoDVDTitleTranscodingJob::slotTranscodeExited( KProcess* p ) +{ + if( d->canceled ) { + emit canceled(); + cleanup( false ); + jobFinished( false ); + } + else if( p->normalExit() ) { + switch( p->exitStatus() ) { + case 0: + if( d->currentEncodingPass == 1 ) { + emit percent( 50 ); + // start second encoding pass + startTranscode( 2 ); + } + else { + emit percent( 100 ); + cleanup( true ); + jobFinished( true ); + } + break; + + default: + // FIXME: error handling + + emit infoMessage( i18n("%1 returned an unknown error (code %2).") + .arg(d->usedTranscodeBin->name()).arg(p->exitStatus()), + K3bJob::ERROR ); + emit infoMessage( i18n("Please send me an email with the last output."), K3bJob::ERROR ); + + cleanup( false ); + jobFinished( false ); + } + } + else { + cleanup( false ); + emit infoMessage( i18n("Execution of %1 failed.").arg("transcode"), ERROR ); + emit infoMessage( i18n("Please consult the debugging output for details."), ERROR ); + jobFinished( false ); + } +} + + +void K3bVideoDVDTitleTranscodingJob::setClipping( int top, int left, int bottom, int right ) +{ + m_clippingTop = top; + m_clippingLeft = left; + m_clippingBottom = bottom; + m_clippingRight = right; + + // + // transcode seems unable to handle different clipping values for left and right + // + m_clippingLeft = m_clippingRight = QMIN( m_clippingRight, m_clippingLeft ); +} + + +void K3bVideoDVDTitleTranscodingJob::setSize( int width, int height ) +{ + m_width = width; + m_height = height; +} + + +QString K3bVideoDVDTitleTranscodingJob::audioCodecString( K3bVideoDVDTitleTranscodingJob::AudioCodec codec ) +{ + switch( codec ) { + case AUDIO_CODEC_AC3_STEREO: + return i18n("AC3 (Stereo)"); + case AUDIO_CODEC_AC3_PASSTHROUGH: + return i18n("AC3 (Pass-through)"); + case AUDIO_CODEC_MP3: + return i18n("MPEG1 Layer III"); + default: + return "unknown audio codec"; + } +} + + +QString K3bVideoDVDTitleTranscodingJob::videoCodecString( K3bVideoDVDTitleTranscodingJob::VideoCodec codec ) +{ + switch( codec ) { + case VIDEO_CODEC_FFMPEG_MPEG4: + return i18n("MPEG4 (FFMPEG)"); + case VIDEO_CODEC_XVID: + return i18n("XviD"); + default: + return "unknown video codec"; + } +} + + +QString K3bVideoDVDTitleTranscodingJob::videoCodecDescription( K3bVideoDVDTitleTranscodingJob::VideoCodec codec ) +{ + switch( codec ) { + case VIDEO_CODEC_FFMPEG_MPEG4: + return i18n("FFmpeg is an open-source project trying to support most video and audio codecs used " + "these days. Its subproject libavcodec forms the basis for multimedia players such as " + "xine or mplayer.") + + "
" + + i18n("FFmpeg contains an implementation of the MPEG-4 video encoding standard which produces " + "high quality results."); + case VIDEO_CODEC_XVID: + return i18n("XviD is a free and open source MPEG-4 video codec. XviD was created by a group of " + "volunteer programmers after the OpenDivX source was closed in July 2001.") + + "
" + + i18n("XviD features MPEG-4 Advanced Profile settings such as b-frames, global " + "and quarter pixel motion compensation, lumi masking, trellis quantization, and " + "H.263, MPEG and custom quantization matrices.") + + "
" + + i18n("XviD is a primary competitor of DivX (XviD being DivX spelled backwards). " + "While DivX is closed source and may only run on Windows, Mac OS and Linux, " + "XviD is open source and can potentially run on any platform.") + + "
" + + i18n("(Description taken from the Wikipedia article)") + + ""; + default: + return "unknown video codec"; + } +} + + +QString K3bVideoDVDTitleTranscodingJob::audioCodecDescription( K3bVideoDVDTitleTranscodingJob::AudioCodec codec ) +{ + static QString s_ac3General = i18n("AC3, better known as Dolby Digital is standardized as ATSC A/52. " + "It contains up to 6 total channels of sound."); + switch( codec ) { + case AUDIO_CODEC_AC3_STEREO: + return s_ac3General + + "
" + i18n("With this setting K3b will create a two-channel stereo " + "Dolby Digital audio stream."); + case AUDIO_CODEC_AC3_PASSTHROUGH: + return s_ac3General + + "
" + i18n("With this setting K3b will use the Dolby Digital audio stream " + "from the source DVD without changing it.") + + "
" + i18n("Use this setting to preserve 5.1 channel sound from the DVD."); + case AUDIO_CODEC_MP3: + return i18n("MPEG1 Layer III is better known as MP3 and is the most used lossy audio format.") + + "
" + i18n("With this setting K3b will create a two-channel stereo MPEG1 Layer III audio stream."); + default: + return "unknown audio codec"; + } +} + + +bool K3bVideoDVDTitleTranscodingJob::transcodeBinaryHasSupportFor( K3bVideoDVDTitleTranscodingJob::VideoCodec codec, const K3bExternalBin* bin ) +{ + static char* s_codecFeatures[] = { "xvid", "ffmpeg" }; + if( !bin ) + bin = k3bcore->externalBinManager()->binObject("transcode"); + if( !bin ) + return false; + return bin->hasFeature( QString::fromLatin1( s_codecFeatures[(int)codec] ) ); +} + + +bool K3bVideoDVDTitleTranscodingJob::transcodeBinaryHasSupportFor( K3bVideoDVDTitleTranscodingJob::AudioCodec codec, const K3bExternalBin* bin ) +{ + static char* s_codecFeatures[] = { "lame", "ac3", "ac3" }; + if( !bin ) + bin = k3bcore->externalBinManager()->binObject("transcode"); + if( !bin ) + return false; + return bin->hasFeature( QString::fromLatin1( s_codecFeatures[(int)codec] ) ); +} + +#include "k3bvideodvdtitletranscodingjob.moc" diff --git a/libk3b/jobs/k3bvideodvdtitletranscodingjob.h b/libk3b/jobs/k3bvideodvdtitletranscodingjob.h new file mode 100644 index 0000000..77a48b5 --- /dev/null +++ b/libk3b/jobs/k3bvideodvdtitletranscodingjob.h @@ -0,0 +1,275 @@ +/* + * + * $Id: sourceheader 511311 2006-02-19 14:51:05Z trueg $ + * Copyright (C) 2006 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_VIDEODVD_TITLE_TRANSCODING_JOB_H_ +#define _K3B_VIDEODVD_TITLE_TRANSCODING_JOB_H_ + +#include +#include +#include + +class KProcess; +class K3bExternalBin; + + +/** + * The K3bVideoDVDTitleTranscodingJob rips a Video DVD title directly + * from the medium and transcodes it on-the-fly to, for example, an XviD video + * + * For now only one audio stream is supported. + */ +class LIBK3B_EXPORT K3bVideoDVDTitleTranscodingJob : public K3bJob +{ + Q_OBJECT + + public: + K3bVideoDVDTitleTranscodingJob( K3bJobHandler* hdl, QObject* parent ); + ~K3bVideoDVDTitleTranscodingJob(); + + /** + * The video codecs supported by this job. + */ + enum VideoCodec { + VIDEO_CODEC_XVID, + VIDEO_CODEC_FFMPEG_MPEG4, + VIDEO_CODEC_NUM_ENTRIES /**< Do not use this as a codec. */ + }; + + /** + * The audio codecs supported by this job. + */ + enum AudioCodec { + AUDIO_CODEC_MP3, + /* AUDIO_CODEC_OGG_VORBIS,*/ + AUDIO_CODEC_AC3_STEREO, + AUDIO_CODEC_AC3_PASSTHROUGH, + AUDIO_CODEC_NUM_ENTRIES /**< Do not use this as a codec. */ + }; + + const K3bVideoDVD::VideoDVD& videoDVD() const { return m_dvd; } + int title() const { return m_titleNumber; } + int audioStream() const { return m_audioStreamIndex; } + int clippingTop() const { return m_clippingTop; } + int clippingLeft() const { return m_clippingLeft; } + int clippingBottom() const { return m_clippingBottom; } + int clippingRight() const { return m_clippingRight; } + int height() const { return m_height; } + int width() const { return m_width; } + const QString& filename() { return m_filename; } + VideoCodec videoCodec() const { return m_videoCodec; } + int videoBitrate() const { return m_videoBitrate; } + bool twoPassEncoding() const { return m_twoPassEncoding; } + AudioCodec audioCodec() const { return m_audioCodec; } + int audioBitrate() const { return m_audioBitrate; } + bool audioVBR() const { return m_audioVBR; } + bool resampleAudioTo44100() const { return m_resampleAudio; } + bool lowPriority() const { return m_lowPriority; } + + /** + * \param bin If 0 the default binary from K3bCore will be used + */ + static bool transcodeBinaryHasSupportFor( VideoCodec codec, const K3bExternalBin* bin = 0 ); + + /** + * \param bin If 0 the default binary from K3bCore will be used + */ + static bool transcodeBinaryHasSupportFor( AudioCodec codec, const K3bExternalBin* bin = 0 ); + + static QString videoCodecString( VideoCodec ); + static QString audioCodecString( AudioCodec ); + + static QString videoCodecDescription( VideoCodec ); + static QString audioCodecDescription( AudioCodec ); + + public slots: + void start(); + void cancel(); + + /** + * The device containing the Video DVD + */ + void setVideoDVD( const K3bVideoDVD::VideoDVD& dvd ) { m_dvd = dvd; } + + /** + * Set the title number to be transcoded + * + * The default value is 1, denoting the first title. + */ + void setTitle( int t ) { m_titleNumber = t; } + + /** + * Set the audio stream to use. + * + * For now K3b does not support encoding multiple audio streams + * in one video file. + * + * The default value is 0, meaning that the first audio stream will + * be encoded. + */ + void setAudioStream( int i ) { m_audioStreamIndex = i; } + + /** + * Set the clipping values for the Video title. + * The clipping will be applied before the transcoding. + * + * For now it is not possible to use different clipping values for left + * and right as transcode cannot handle this. Thus, the job uses the + * smaller value for both the left and right clipping. + * + * The default is to not clip the video. + */ + void setClipping( int top, int left, int bottom, int right ); + + /** + * The size of the resulting transcoded video. + * + * The default is to automatically adjust the size (width=height=0), which + * essentially means that anamorph encoded source material will be resized + * according to its aspect ratio. + * + * It is also possible to set just the width or just the height and leave + * the other value to 0 which will then be determined automatically. + * + * The clipping values will be taken into account if at least one value + * is determined automatically. + * + * The width and height values have to be a multiple of 16. If it is not, + * they will be changed accordingly. + * + * FIXME: GET INFORMATION: why a multiple of 16 and not 8 or 32? + */ + void setSize( int width, int height ); + + /** + * The filename to write the resulting video to. + * + * The default is some automatically generated filename + * in the default K3b temp directory. + */ + void setFilename( const QString& name ) { m_filename = name; } + + /** + * Set the video codec used to encode the video title. + * + * The default is VIDEO_CODEC_FFMPEG_MPEG4 + */ + void setVideoCodec( VideoCodec codec ) { m_videoCodec = codec; } + + /** + * Set the bitrate used to encode the video. + * + * The default is 1800 + */ + void setVideoBitrate( int bitrate ) { m_videoBitrate = bitrate; } + + /** + * Set if the job should use two-pass encoding to improve + * the quality of the resulting video. + * + * The default is false. + */ + void setTwoPassEncoding( bool b ) { m_twoPassEncoding = b; } + + /** + * Set the audio codec used to encode the audio stream + * in the video title. + * + * The default is AUDIO_CODEC_MP3 + */ + void setAudioCodec( AudioCodec codec ) { m_audioCodec = codec; } + + /** + * Set the bitrate used to encode the audio stream. + * + * The default is 128 + * + * In case of the AC3 codec the bitrate can be some value between 32 and 640. + * + * For the AC3 passthrough mode the bitrate is ignored. + */ + void setAudioBitrate( int bitrate ) { m_audioBitrate = bitrate; } + + /** + * Set if the audio stream should be encoded with a variable bitrate. + * + * The default is false. + * + * For the AC3 passthrough mode the bitrate is ignored. + */ + void setAudioVBR( bool vbr ) { m_audioVBR = vbr; } + + /** + * Set if the audio data should be resampled to 44100 Hz/s + * + * The default is false. + * + * For the AC3 passthrough mode this is ignored. + */ + void setResampleAudioTo44100( bool b ) { m_resampleAudio = b; } + + /** + * If true the transcode processes will be run with a very low scheduling + * priority. + * + * The default is true. + */ + void setLowPriority( bool b ) { m_lowPriority = b; } + + private slots: + void slotTranscodeStderr( const QString& ); + void slotTranscodeExited( KProcess* ); + + private: + /** + * \param 0 - single pass encoding + * 1 - two pass encoding/first pass + * 2 - two pass encoding/second pass + */ + void startTranscode( int pass ); + + void cleanup( bool success ); + + K3bVideoDVD::VideoDVD m_dvd; + + QString m_filename; + + int m_clippingTop; + int m_clippingBottom; + int m_clippingLeft; + int m_clippingRight; + + int m_width; + int m_height; + + int m_titleNumber; + int m_audioStreamIndex; + + VideoCodec m_videoCodec; + AudioCodec m_audioCodec; + + int m_videoBitrate; + int m_audioBitrate; + bool m_audioVBR; + + bool m_resampleAudio; + bool m_twoPassEncoding; + + bool m_lowPriority; + + class Private; + Private* d; +}; + +#endif diff --git a/libk3b/k3bimage.xsd b/libk3b/k3bimage.xsd new file mode 100644 index 0000000..ab7f36c --- /dev/null +++ b/libk3b/k3bimage.xsd @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libk3b/plugin/Makefile.am b/libk3b/plugin/Makefile.am new file mode 100644 index 0000000..49ac69b --- /dev/null +++ b/libk3b/plugin/Makefile.am @@ -0,0 +1,28 @@ +if compile_libsamplerate +USED_LIBSAMPLERATE=./libsamplerate/libsamplerate.la +SUBDIRS = libsamplerate +else +USED_LIBSAMPLERATE=$(LIBSAMPLERATE) +endif + + +AM_CPPFLAGS = -I$(srcdir)/.. -I$(srcdir)/../core/ -I$(srcdir)/../../src -I$(srcdir)/../../libk3bdevice $(all_includes) + +METASOURCES = AUTO + +noinst_LTLIBRARIES = libk3bplugin.la + +libk3bplugin_la_LIBADD = $(USED_LIBSAMPLERATE) + +libk3bplugin_la_LDFLAGS = $(all_libraries) + +libk3bplugin_la_SOURCES = k3bplugin.cpp \ + k3bpluginconfigwidget.cpp \ + k3bpluginmanager.cpp \ + k3baudiodecoder.cpp \ + k3baudioencoder.cpp \ + k3baudioclient.cpp \ + k3baudioserver.cpp + + +include_HEADERS = k3bplugin.h k3bpluginfactory.h k3bpluginmanager.h k3baudiodecoder.h k3baudioencoder.h k3bpluginconfigwidget.h k3baudiooutputplugin.h k3bprojectplugin.h diff --git a/libk3b/plugin/k3baudioclient.cpp b/libk3b/plugin/k3baudioclient.cpp new file mode 100644 index 0000000..5133d28 --- /dev/null +++ b/libk3b/plugin/k3baudioclient.cpp @@ -0,0 +1,46 @@ +/* + * + * $Id: k3baudioclient.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2004 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3baudioclient.h" +#include "k3baudioserver.h" + + +K3bAudioClient::K3bAudioClient() + : m_attached(false) +{ +} + + +K3bAudioClient::~K3bAudioClient() +{ +} + + +void K3bAudioClient::startStreaming() +{ + if( !m_attached ) { + K3bAudioServer::instance()->attachClient( this ); + m_attached = true; + } +} + + +void K3bAudioClient::stopStreaming() +{ + if( m_attached ) { + K3bAudioServer::instance()->detachClient( this ); + m_attached = false; + } +} diff --git a/libk3b/plugin/k3baudioclient.h b/libk3b/plugin/k3baudioclient.h new file mode 100644 index 0000000..9d6c015 --- /dev/null +++ b/libk3b/plugin/k3baudioclient.h @@ -0,0 +1,51 @@ +/* + * + * $Id: k3baudioclient.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2004 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_AUDIO_CLIENT_H_ +#define _K3B_AUDIO_CLIENT_H_ + +#include "k3b_export.h" +/** + * Interface for all K3b audio client classes which may attach to + * a K3b Audio Server to play 44100 16bit stereo audio data. + */ +class LIBK3B_EXPORT K3bAudioClient +{ + public: + virtual ~K3bAudioClient(); + + /** + * if this method returns a value below 0 streaming is stopped. + */ + virtual int read( char* data, int maxlen ) = 0; + + protected: + K3bAudioClient(); + + /** + * This will start the streaming. + */ + void startStreaming(); + + /** + * This stops the streaming, + */ + void stopStreaming(); + + private: + bool m_attached; +}; + +#endif diff --git a/libk3b/plugin/k3baudiodecoder.cpp b/libk3b/plugin/k3baudiodecoder.cpp new file mode 100644 index 0000000..82f4adb --- /dev/null +++ b/libk3b/plugin/k3baudiodecoder.cpp @@ -0,0 +1,599 @@ +/* + * + * $Id: k3baudiodecoder.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include + +#include + +#include "k3baudiodecoder.h" +#include "k3bpluginmanager.h" + +#include +#include + +#include + +#include + +#ifdef HAVE_LIBSAMPLERATE +#include +#else +#include "libsamplerate/samplerate.h" +#endif + +#if !(HAVE_LRINT && HAVE_LRINTF) +#define lrint(dbl) ((int) (dbl)) +#define lrintf(flt) ((int) (flt)) +#endif + +// use a one second buffer +static const int DECODING_BUFFER_SIZE = 75*2352; + +class K3bAudioDecoder::Private +{ +public: + Private() + : metaInfo(0), + resampleState(0), + resampleData(0), + inBuffer(0), + inBufferPos(0), + inBufferFill(0), + outBuffer(0), + monoBuffer(0), + decodingBufferPos(0), + decodingBufferFill(0), + valid(true) { + } + + // the current position of the decoder + // This does NOT include the decodingBuffer + K3b::Msf currentPos; + + // since the current position above is measured in frames + // there might be a little offset since the decoded data is not + // always a multiple of 2353 bytes + int currentPosOffset; + + // already decoded bytes from last init or last seek + // TODO: replace alreadyDecoded with currentPos + unsigned long alreadyDecoded; + + K3b::Msf decodingStartPos; + + KFileMetaInfo* metaInfo; + + // set to true once decodeInternal() returned 0 + bool decoderFinished; + + // resampling + SRC_STATE* resampleState; + SRC_DATA* resampleData; + + float* inBuffer; + float* inBufferPos; + int inBufferFill; + + float* outBuffer; + + int samplerate; + int channels; + + // mono -> stereo conversion + char* monoBuffer; + + char decodingBuffer[DECODING_BUFFER_SIZE]; + char* decodingBufferPos; + int decodingBufferFill; + + QMap technicalInfoMap; + QMap metaInfoMap; + + bool valid; +}; + + + +K3bAudioDecoder::K3bAudioDecoder( QObject* parent, const char* name ) + : QObject( parent, name ) +{ + d = new Private(); +} + + +K3bAudioDecoder::~K3bAudioDecoder() +{ + cleanup(); + + if( d->inBuffer ) delete [] d->inBuffer; + if( d->outBuffer ) delete [] d->outBuffer; + if( d->monoBuffer ) delete [] d->monoBuffer; + + delete d->metaInfo; + delete d->resampleData; + if( d->resampleState ) + src_delete( d->resampleState ); + delete d; +} + + +void K3bAudioDecoder::setFilename( const QString& filename ) +{ + m_fileName = filename; + delete d->metaInfo; + d->metaInfo = 0; +} + + +bool K3bAudioDecoder::isValid() const +{ + return d->valid; +} + + +bool K3bAudioDecoder::analyseFile() +{ + d->technicalInfoMap.clear(); + d->metaInfoMap.clear(); + delete d->metaInfo; + d->metaInfo = 0; + + cleanup(); + + bool ret = analyseFileInternal( m_length, d->samplerate, d->channels ); + if( ret && ( d->channels == 1 || d->channels == 2 ) && m_length > 0 ) { + d->valid = initDecoder(); + return d->valid; + } + else { + d->valid = false; + return false; + } +} + + +bool K3bAudioDecoder::initDecoder( const K3b::Msf& startOffset ) +{ + if( initDecoder() ) { + if( startOffset > 0 ) + return seek( startOffset ); + else + return true; + } + else + return false; +} + + +bool K3bAudioDecoder::initDecoder() +{ + cleanup(); + + if( d->resampleState ) + src_reset( d->resampleState ); + + d->alreadyDecoded = 0; + d->currentPos = 0; + d->currentPosOffset = 0; + d->decodingBufferFill = 0; + d->decodingBufferPos = 0; + d->decodingStartPos = 0; + d->inBufferFill = 0; + + d->decoderFinished = false; + + return initDecoderInternal(); +} + + +int K3bAudioDecoder::decode( char* _data, int maxLen ) +{ + unsigned long lengthToDecode = (m_length - d->decodingStartPos).audioBytes(); + + if( d->alreadyDecoded >= lengthToDecode ) + return 0; + + if( maxLen <= 0 ) + return 0; + + int read = 0; + + if( d->decodingBufferFill == 0 ) { + // + // now we decode into the decoding buffer + // to ensure a minimum buffer size + // + d->decodingBufferFill = 0; + d->decodingBufferPos = d->decodingBuffer; + + if( !d->decoderFinished ) { + if( d->samplerate != 44100 ) { + + // check if we have data left from some previous conversion + if( d->inBufferFill > 0 ) { + read = resample( d->decodingBuffer, DECODING_BUFFER_SIZE ); + } + else { + if( !d->inBuffer ) { + d->inBuffer = new float[DECODING_BUFFER_SIZE/2]; + } + + if( (read = decodeInternal( d->decodingBuffer, DECODING_BUFFER_SIZE )) == 0 ) + d->decoderFinished = true; + + d->inBufferFill = read/2; + d->inBufferPos = d->inBuffer; + from16bitBeSignedToFloat( d->decodingBuffer, d->inBuffer, d->inBufferFill ); + + read = resample( d->decodingBuffer, DECODING_BUFFER_SIZE ); + } + } + else if( d->channels == 1 ) { + if( !d->monoBuffer ) { + d->monoBuffer = new char[DECODING_BUFFER_SIZE/2]; + } + + // we simply duplicate every frame + if( (read = decodeInternal( d->monoBuffer, DECODING_BUFFER_SIZE/2 )) == 0 ) + d->decoderFinished = true; + + for( int i = 0; i < read; i+=2 ) { + d->decodingBuffer[2*i] = d->decodingBuffer[2*i+2] = d->monoBuffer[i]; + d->decodingBuffer[2*i+1] = d->decodingBuffer[2*i+3] = d->monoBuffer[i+1]; + } + + read *= 2; + } + else { + if( (read = decodeInternal( d->decodingBuffer, DECODING_BUFFER_SIZE )) == 0 ) + d->decoderFinished = true; + } + } + + if( read < 0 ) { + return -1; + } + else if( read == 0 ) { + // check if we need to pad + int bytesToPad = lengthToDecode - d->alreadyDecoded; + if( bytesToPad > 0 ) { + kdDebug() << "(K3bAudioDecoder) track length: " << lengthToDecode + << "; decoded module data: " << d->alreadyDecoded + << "; we need to pad " << bytesToPad << " bytes." << endl; + + if( DECODING_BUFFER_SIZE < bytesToPad ) + bytesToPad = DECODING_BUFFER_SIZE; + + ::memset( d->decodingBuffer, 0, bytesToPad ); + + kdDebug() << "(K3bAudioDecoder) padded " << bytesToPad << " bytes." << endl; + + read = bytesToPad; + } + else { + kdDebug() << "(K3bAudioDecoder) decoded " << d->alreadyDecoded << " bytes." << endl; + return 0; + } + } + else { + + // check if we decoded too much + if( d->alreadyDecoded + read > lengthToDecode ) { + kdDebug() << "(K3bAudioDecoder) we decoded too much. Cutting output by " + << (read + d->alreadyDecoded - lengthToDecode) << endl; + read = lengthToDecode - d->alreadyDecoded; + } + } + + d->decodingBufferFill = read; + } + + + // clear out the decoding buffer + read = QMIN( maxLen, d->decodingBufferFill ); + ::memcpy( _data, d->decodingBufferPos, read ); + d->decodingBufferPos += read; + d->decodingBufferFill -= read; + + d->alreadyDecoded += read; + d->currentPos += (read+d->currentPosOffset)/2352; + d->currentPosOffset = (read+d->currentPosOffset)%2352; + + return read; +} + + +// resample data in d->inBufferPos and save the result to data +// +// +int K3bAudioDecoder::resample( char* data, int maxLen ) +{ + if( !d->resampleState ) { + d->resampleState = src_new( SRC_SINC_MEDIUM_QUALITY, d->channels, 0 ); + if( !d->resampleState ) { + kdDebug() << "(K3bAudioDecoder) unable to initialize resampler." << endl; + return -1; + } + d->resampleData = new SRC_DATA; + } + + if( !d->outBuffer ) { + d->outBuffer = new float[DECODING_BUFFER_SIZE/2]; + } + + d->resampleData->data_in = d->inBufferPos; + d->resampleData->data_out = d->outBuffer; + d->resampleData->input_frames = d->inBufferFill/d->channels; + d->resampleData->output_frames = maxLen/2/2; // in case of mono files we need the space anyway + d->resampleData->src_ratio = 44100.0/(double)d->samplerate; + if( d->inBufferFill == 0 ) + d->resampleData->end_of_input = 1; // this should force libsamplerate to output the last frames + else + d->resampleData->end_of_input = 0; + + int len = 0; + if( (len = src_process( d->resampleState, d->resampleData ) ) ) { + kdDebug() << "(K3bAudioDecoder) error while resampling: " << src_strerror(len) << endl; + return -1; + } + + if( d->channels == 2 ) + fromFloatTo16BitBeSigned( d->outBuffer, data, d->resampleData->output_frames_gen*d->channels ); + else { + for( int i = 0; i < d->resampleData->output_frames_gen; ++i ) { + fromFloatTo16BitBeSigned( &d->outBuffer[i], &data[4*i], 1 ); + fromFloatTo16BitBeSigned( &d->outBuffer[i], &data[4*i+2], 1 ); + } + } + + d->inBufferPos += d->resampleData->input_frames_used*d->channels; + d->inBufferFill -= d->resampleData->input_frames_used*d->channels; + if( d->inBufferFill <= 0 ) { + d->inBufferPos = d->inBuffer; + d->inBufferFill = 0; + } + + // 16 bit frames, so we need to multiply by 2 + // and we always have two channels + return d->resampleData->output_frames_gen*2*2; +} + + +void K3bAudioDecoder::from16bitBeSignedToFloat( char* src, float* dest, int samples ) +{ + while( samples ) { + samples--; + dest[samples] = static_cast( Q_INT16(((src[2*samples]<<8)&0xff00)|(src[2*samples+1]&0x00ff)) / 32768.0 ); + } +} + + +void K3bAudioDecoder::fromFloatTo16BitBeSigned( float* src, char* dest, int samples ) +{ + while( samples ) { + samples--; + + float scaled = src[samples] * 32768.0; + Q_INT16 val = 0; + + // clipping + if( scaled >= ( 1.0 * 0x7FFF ) ) + val = 32767; + else if( scaled <= ( -8.0 * 0x1000 ) ) + val = -32768; + else + val = lrintf(scaled); + + dest[2*samples] = val>>8; + dest[2*samples+1] = val; + } +} + + +void K3bAudioDecoder::from8BitTo16BitBeSigned( char* src, char* dest, int samples ) +{ + while( samples ) { + samples--; + + float scaled = static_cast(Q_UINT8(src[samples])-128) / 128.0 * 32768.0; + Q_INT16 val = 0; + + // clipping + if( scaled >= ( 1.0 * 0x7FFF ) ) + val = 32767; + else if( scaled <= ( -8.0 * 0x1000 ) ) + val = -32768; + else + val = lrintf(scaled); + + dest[2*samples] = val>>8; + dest[2*samples+1] = val; + } +} + + +bool K3bAudioDecoder::seek( const K3b::Msf& pos ) +{ + kdDebug() << "(K3bAudioDecoder) seek from " << d->currentPos.toString() << " (+" << d->currentPosOffset + << ") to " << pos.toString() << endl; + + if( pos > length() ) + return false; + + d->decoderFinished = false; + + if( pos == d->currentPos && d->currentPosOffset == 0 ) + return true; + + if( pos == 0 ) + return initDecoder(); + + bool success = false; + + // + // First check if we may do a "perfect seek". + // We cannot rely on the decoding plugins to seek perfectly. Especially + // the mp3 decoder does not. But in case we want to split a live recording + // it is absolutely nesseccary to perform a perfect seek. + // So if we did not already decode past the seek position and the difference + // between the current position and the seek position is less than some fixed + // value we simply decode up to the seek position. + // + if( ( pos > d->currentPos || + ( pos == d->currentPos && d->currentPosOffset == 0 ) ) + && + ( pos - d->currentPos < K3b::Msf(0,10,0) ) ) { // < 10 seconds is ok + kdDebug() << "(K3bAudioDecoder) performing perfect seek from " << d->currentPos.toString() + << " to " << pos.toString() << ". :)" << endl; + + unsigned long bytesToDecode = pos.audioBytes() - d->currentPos.audioBytes() - d->currentPosOffset; + kdDebug() << "(K3bAudioDecoder) seeking " << bytesToDecode << " bytes." << endl; + char buffi[10*2352]; + while( bytesToDecode > 0 ) { + int read = decode( buffi, QMIN(10*2352, bytesToDecode) ); + if( read <= 0 ) + return false; + + bytesToDecode -= read; + } + + kdDebug() << "(K3bAudioDecoder) perfect seek done." << endl; + + success = true; + } + else { + // + // Here we have to reset the resampling stuff since we restart decoding at another position. + // + if( d->resampleState ) + src_reset( d->resampleState ); + d->inBufferFill = 0; + + // + // And also reset the decoding buffer to not return any garbage from previous decoding. + // + d->decodingBufferFill = 0; + + success = seekInternal( pos ); + } + + d->alreadyDecoded = 0; + d->currentPos = d->decodingStartPos = pos; + d->currentPosOffset = 0; + + return success; +} + + +void K3bAudioDecoder::cleanup() +{ +} + + +QString K3bAudioDecoder::metaInfo( MetaDataField f ) +{ + if( d->metaInfoMap.contains( f ) ) + return d->metaInfoMap[f]; + + // fall back to KFileMetaInfo + if( !d->metaInfo ) + d->metaInfo = new KFileMetaInfo( filename() ); + + if( d->metaInfo->isValid() ) { + QString tag; + switch( f ) { + case META_TITLE: + tag = "Title"; + break; + case META_ARTIST: + tag = "Artist"; + break; + case META_SONGWRITER: + tag = "Songwriter"; + break; + case META_COMPOSER: + tag = "Composer"; + break; + case META_COMMENT: + tag = "Comment"; + break; + } + + KFileMetaInfoItem item = d->metaInfo->item( tag ); + if( item.isValid() ) + return item.string(); + } + + return QString::null; +} + + +void K3bAudioDecoder::addMetaInfo( MetaDataField f, const QString& value ) +{ + if( !value.isEmpty() ) + d->metaInfoMap[f] = value; + else + kdDebug() << "(K3bAudioDecoder) empty meta data field." << endl; +} + + +QStringList K3bAudioDecoder::supportedTechnicalInfos() const +{ + QStringList l; + for( QMap::const_iterator it = d->technicalInfoMap.begin(); + it != d->technicalInfoMap.end(); ++it ) + l.append( it.key() ); + return l; +} + + +QString K3bAudioDecoder::technicalInfo( const QString& key ) const +{ + return d->technicalInfoMap[key]; +} + + +void K3bAudioDecoder::addTechnicalInfo( const QString& key, const QString& value ) +{ + d->technicalInfoMap[key] = value; +} + + +K3bAudioDecoder* K3bAudioDecoderFactory::createDecoder( const KURL& url ) +{ + kdDebug() << "(K3bAudioDecoderFactory::createDecoder( " << url.path() << " )" << endl; + QPtrList fl = k3bcore->pluginManager()->plugins( "AudioDecoder" ); + + // first search for a single format decoder + for( QPtrListIterator it( fl ); it.current(); ++it ) { + K3bAudioDecoderFactory* f = dynamic_cast( it.current() ); + if( f && !f->multiFormatDecoder() && f->canDecode( url ) ) { + kdDebug() << "1" << endl; return f->createDecoder();} + } + + // no single format decoder. Search for a multi format decoder + for( QPtrListIterator it( fl ); it.current(); ++it ) { + K3bAudioDecoderFactory* f = dynamic_cast( it.current() ); + if( f && f->multiFormatDecoder() && f->canDecode( url ) ) { + kdDebug() << "2" << endl; return f->createDecoder();} + } + + kdDebug() << "(K3bAudioDecoderFactory::createDecoder( " << url.path() << " ) no success" << endl; + + // nothing found + return 0; +} + +#include "k3baudiodecoder.moc" diff --git a/libk3b/plugin/k3baudiodecoder.h b/libk3b/plugin/k3baudiodecoder.h new file mode 100644 index 0000000..69f594c --- /dev/null +++ b/libk3b/plugin/k3baudiodecoder.h @@ -0,0 +1,254 @@ +/* + * + * $Id: k3baudiodecoder.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_AUDIO_DECODER_H_ +#define _K3B_AUDIO_DECODER_H_ + + +#include +#include +#include "k3b_export.h" +#include + + + +/** + * Abstract streaming class for all the audio input. + * Has to output data in the following format: + * MSBLeft LSBLeft MSBRight LSBRight (big endian byte order) + * + * Instances are created by K3bAudioDecoderFactory + **/ +class LIBK3B_EXPORT K3bAudioDecoder : public QObject +{ + Q_OBJECT + + public: + K3bAudioDecoder( QObject* parent = 0, const char* name = 0 ); + virtual ~K3bAudioDecoder(); + + + /** + * Set the file to decode. Be aware that one cannot rely + * on the file length until analyseFile() has been called. + */ + void setFilename( const QString& ); + + /** + * Since this may take a while depending on the filetype it is best + * to run it in a separate thread. + * + * This method will also call initDecoder(). + */ + bool analyseFile(); + + /** + * @return true if the file was successfully analysed by analyseFile. + */ + bool isValid() const; + + /** + * Initialize the decoding. + * Normally there is no need to call this as analyseFile already does so. + */ + bool initDecoder(); + + /** + * initialize the decoding. + * @param startOffset the number of frames to skip at the beginning of the file. + * + * This is the same as calling: initDecoder() and seek(startOffset) + */ + bool initDecoder( const K3b::Msf& startOffset ); + + enum MetaDataField { + META_TITLE, + META_ARTIST, + META_SONGWRITER, + META_COMPOSER, + META_COMMENT + }; + + /** + * This should at least support "Title" and "Artist" + * + * the default implementation returns the infos set via @p addMetaInfo + * and uses KFileMetaInfo if none was set + */ + virtual QString metaInfo( MetaDataField ); + + /** + * The filetype is only used for informational purposes. + * It is not necessary but highly recommended to implement this method + * as it enhances usability. + * @returne The filetype of the decoded file. + */ + virtual QString fileType() const { return QString::null; } + + /** + * This method may be reimplemented to provide technical information about + * the file. It should return localized strings. + * + * the default implementation returns the infos set via @p addTechnicalInfo + */ + virtual QStringList supportedTechnicalInfos() const; + + /** + * The framework will call this method with all strings returned by the + * supportedTechnicalInfos() method. It should return localized strings. + * + * the default implementation returns the infos set via @p addTechnicalInfo + */ + virtual QString technicalInfo( const QString& ) const; + + /** + * returnes -1 on error, 0 when finished, length of data otherwise + * takes care of padding + * calls decodeInternal() to actually decode data + * + * Fill the data buffer with maximal maxLen bytes. + */ + int decode( char* data, int maxLen ); + + /** + * Cleanup after decoding like closing files. + * Be aware that this is the counterpart to @p initDecoder(). + * + * There might happen multiple calls to initDecoder() and cleanup(). + */ + virtual void cleanup(); + + /** + * Seek to the position pos. + * Decoding is started new. That means that the data will be padded to + * length() - pos. + * returnes true on success; + */ + bool seek( const K3b::Msf& pos ); + + /** + * Be aware that one cannot rely + * on the file length until analyseFile() has been called. + */ + virtual K3b::Msf length() const { return m_length; } + + const QString& filename() const { return m_fileName; } + + // some helper methods + static void fromFloatTo16BitBeSigned( float* src, char* dest, int samples ); + static void from16bitBeSignedToFloat( char* src, float* dest, int samples ); + static void from8BitTo16BitBeSigned( char* src, char* dest, int samples ); + + protected: + /** + * Use this method if using the default implementation of @p metaInfo + */ + void addMetaInfo( MetaDataField, const QString& ); + + /** + * Use this method if using the default implementation of @p technicalInfo + * and @p supportedTechnicalInfos. + */ + void addTechnicalInfo( const QString&, const QString& ); + + /** + * This will be called once before the first call to decodeInternal. + * Use it to initialize decoding structures if necessary. + * + * There might happen multiple calls to initDecoder() and cleanup(). + */ + virtual bool initDecoderInternal() = 0; + + /** + * This method should analyze the file to determine the exact length, + * the samplerate in Hz, and the number of channels. The framework takes care of + * resampling and converting mono to stereo data. + * This method may be time consuming. + */ + virtual bool analyseFileInternal( K3b::Msf& length, int& samplerate, int& channels ) = 0; + + /** + * fill the already allocated data with maximal maxLen bytes of decoded samples. + * The framework will take care of padding or cutting the decoded data as well + * as resampling to 44100 Hz and converting mono samples to stereo. + */ + virtual int decodeInternal( char* data, int maxLen ) = 0; + + virtual bool seekInternal( const K3b::Msf& ) { return false; } + + private: + int resample( char* data, int maxLen ); + + QString m_fileName; + K3b::Msf m_length; + + class Private; + Private* d; +}; + + + +/** + * PluginFactory that needs to be subclassed in order to create an + * audio decoder. + * We need this because K3b uses multiple AudioDecoders of the same type at the + * same time. + */ +class LIBK3B_EXPORT K3bAudioDecoderFactory : public K3bPlugin +{ + Q_OBJECT + + public: + K3bAudioDecoderFactory( QObject* parent = 0, const char* name = 0 ) + : K3bPlugin( parent, name ) { + } + + virtual ~K3bAudioDecoderFactory() { + } + + QString group() const { return "AudioDecoder"; } + + /** + * K3b uses this flag to decide which plugins to test first + * when searching for an audio decoder. + * + * Decoders that are specialized on one format are favored over + * multi-format-decoders. + */ + virtual bool multiFormatDecoder() const { return false; } + + /** + * This is the most important method of the AudioDecoderFactory. + * It is used to determine if a certain file can be decoded by the + * decoder this factory creates. + * It is important that this method does not work lazy since it will + * be called with urls to every kind of files and if it returns true + * a decoder of this type is used for the file. + */ + virtual bool canDecode( const KURL& filename ) = 0; + + virtual K3bAudioDecoder* createDecoder( QObject* parent = 0, const char* name = 0 ) const = 0; + + /** + * Searching for an audiodecoder for @p filename. + * + * It first searches the single format decoder and the the multiformat decoder. + * + * @returns a newly created decoder on success and 0 when no decoder could be found. + */ + static K3bAudioDecoder* createDecoder( const KURL& url ); +}; + +#endif diff --git a/libk3b/plugin/k3baudioencoder.cpp b/libk3b/plugin/k3baudioencoder.cpp new file mode 100644 index 0000000..3b1309a --- /dev/null +++ b/libk3b/plugin/k3baudioencoder.cpp @@ -0,0 +1,175 @@ +/* + * + * $Id: k3baudioencoder.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3baudioencoder.h" + +#include + +#include + + +class K3bAudioEncoder::Private +{ +public: + Private() + : outputFile(0) { + } + + QFile* outputFile; + QString outputFilename; + + QString lastErrorString; +}; + + +K3bAudioEncoder::K3bAudioEncoder( QObject* parent, const char* name ) + : K3bPlugin( parent, name ) +{ + d = new Private(); +} + + +K3bAudioEncoder::~K3bAudioEncoder() +{ + closeFile(); + delete d; +} + + +bool K3bAudioEncoder::openFile( const QString& ext, const QString& filename, const K3b::Msf& length ) +{ + closeFile(); + + d->outputFile = new QFile( filename ); + if( d->outputFile->open( IO_WriteOnly ) ) { + return initEncoder( ext, length ); + } + else { + kdDebug() << "(K3bAudioEncoder) unable to open file " << filename << endl; + closeFile(); + return false; + } +} + + +bool K3bAudioEncoder::isOpen() const +{ + if( d->outputFile ) + return d->outputFile->isOpen(); + else + return false; +} + + +void K3bAudioEncoder::closeFile() +{ + if( d->outputFile ) { + finishEncoder(); + if( d->outputFile->isOpen() ) + d->outputFile->close(); + delete d->outputFile; + d->outputFile = 0; + d->outputFilename = QString::null; + } +} + + +const QString& K3bAudioEncoder::filename() const +{ + if( d->outputFile ) + return d->outputFilename; + else + return QString::null; +} + + + +void K3bAudioEncoder::setMetaData( K3bAudioEncoder::MetaDataField f, const QString& data ) +{ + if( !data.isEmpty() ) + return setMetaDataInternal( f, data ); +} + + +long K3bAudioEncoder::encode( const char* data, Q_ULONG len ) +{ + return encodeInternal( data, len ); +} + + +bool K3bAudioEncoder::initEncoder( const QString& ext, const K3b::Msf& length ) +{ + if( !isOpen() ) { + kdDebug() << "(K3bAudioEncoder) call to initEncoder without openFile!" << endl; + return false; + } + + return initEncoderInternal( ext, length ); +} + + +Q_LONG K3bAudioEncoder::writeData( const char* data, Q_ULONG len ) +{ + if( d->outputFile ) { + return d->outputFile->writeBlock( data, len ); + } + else { + kdDebug() << "(K3bAudioEncoder) call to writeData without opening a file first." << endl; + return -1; + } +} + + +bool K3bAudioEncoder::initEncoderInternal( const QString&, const K3b::Msf& ) +{ + // do nothing + return true; +} + + +void K3bAudioEncoder::setMetaDataInternal( K3bAudioEncoder::MetaDataField, const QString& ) +{ + // do nothing +} + + +void K3bAudioEncoder::finishEncoder() +{ + if( isOpen() ) + finishEncoderInternal(); +} + + +void K3bAudioEncoder::finishEncoderInternal() +{ + // do nothing +} + + +void K3bAudioEncoder::setLastError( const QString& e ) +{ + d->lastErrorString = e; +} + + +QString K3bAudioEncoder::lastErrorString() const +{ + if( d->lastErrorString.isEmpty() ) + return i18n("An unknown error occurred."); + else + return d->lastErrorString; +} + +#include "k3baudioencoder.moc" diff --git a/libk3b/plugin/k3baudioencoder.h b/libk3b/plugin/k3baudioencoder.h new file mode 100644 index 0000000..137b49d --- /dev/null +++ b/libk3b/plugin/k3baudioencoder.h @@ -0,0 +1,203 @@ +/* + * + * $Id: k3baudioencoder.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_AUDIO_ENCODER_H_ +#define _K3B_AUDIO_ENCODER_H_ + +#include + +#include +#include "k3b_export.h" + + +/** + * The base class for all audio encoders. + * Do not be alarmed by the number of methods since most of them + * do not need to be touched. They are just there to keep the API + * clean and extendable. + * + * see the skeleton files for further help. + */ +class LIBK3B_EXPORT K3bAudioEncoder : public K3bPlugin +{ + Q_OBJECT + + public: + K3bAudioEncoder( QObject* parent = 0, const char* name = 0 ); + virtual ~K3bAudioEncoder(); + + // TODO: if the following methods are to be activated the config methods in + // K3bPluginConfigWidget also need to be changed since they do not allow + // to use an extern config object yet. + // Perhaps these two methods should even go into K3bPlugin. + /** + * This calls readConfig using the k3bcore config object + */ + // void readConfig(); + + /** + * Force the plugin to read it's configuration + */ + // virtual void readConfig( KConfig* ); + + QString group() const { return "AudioEncoder"; } + + /** + * This should return the fileextensions supported by the filetype written in the + * encoder. + * May return an empty list in which case the encoder will not be usable (this may come + * in handy if the encoder is based on some external program or lib which is not + * available on runtime.) + */ + virtual QStringList extensions() const = 0; + + /** + * The filetype as presented to the user. + */ + virtual QString fileTypeComment( const QString& extension ) const = 0; + + /** + * Determine the filesize of the encoded file (~) + * default implementation returnes -1 (unknown) + * First parameter is the extension to be used + */ + virtual long long fileSize( const QString&, const K3b::Msf& ) const { return -1; } + + /** + * The default implementation openes the file for writing with + * writeData. Normally this does not need to be reimplemented. + * @param extension the filetype to be used. + * + */ + virtual bool openFile( const QString& extension, const QString& filename, const K3b::Msf& length ); + + + /** + * The default implementation returnes true if openFile (default implementation) has been + * successfully called. Normally this does not need to be reimplemented but it has to be + * if openFile is reimplemented. + */ + virtual bool isOpen() const; + + /** + * The default implementation closes the file opened by openFile + * (default implementation) + * Normally this does not need to be reimplemented but it has to be + * if openFile is reimplemented. + */ + virtual void closeFile(); + + /** + * The default implementation returnes the filename set in openFile + * or QString::null if no file has been opened. + * Normally this does not need to be reimplemented but it has to be + * if openFile is reimplemented. + */ + virtual const QString& filename() const; + + enum MetaDataField { + META_TRACK_TITLE, + META_TRACK_ARTIST, + META_TRACK_COMMENT, + META_TRACK_NUMBER, + META_ALBUM_TITLE, + META_ALBUM_ARTIST, + META_ALBUM_COMMENT, + META_YEAR, + META_GENRE }; + + /** + * Calling this method does only make sense after successfully + * calling openFile and before calling encode. + * This calls setMetaDataInternal. + */ + void setMetaData( MetaDataField, const QString& ); + + /** + * Returnes the amount of actually written bytes or -1 if an error + * occurred. + * + * Be aware that the returned amount of written data may very well differ + * from len since the data is encoded. + */ + long encode( const char*, Q_ULONG len ); + + /** + * Use this signal in case of an error to provide the user with information + * about the problem. + */ + virtual QString lastErrorString() const; + + protected: + /** + * Called by the default implementation of openFile + * This calls initEncoderInternal. + */ + bool initEncoder( const QString& extension, const K3b::Msf& length ); + + /** + * Called by the deafult implementation of openFile + * This calls finishEncoderInternal. + */ + void finishEncoder(); + + /** + * Use this to write the data to the file when + * using the default implementation of openFile + * Returnes the number of bytes actually written. + */ + Q_LONG writeData( const char*, Q_ULONG len ); + + /** + * initzialize the decoder structures. + * default implementation does nothing + * this may already write data. + */ + virtual bool initEncoderInternal( const QString& extension, const K3b::Msf& length ); + + /** + * reimplement this if the encoder needs to do some + * finishing touch. + */ + virtual void finishEncoderInternal(); + + /** + * encode the data and write it with writeData (when using + * the default) + * The data will always be 16bit 44100 Hz stereo little endian samples. + * Should return the amount of actually written bytes (may be 0) and -1 + * on error. + */ + // TODO: use Q_INT16* instead of char* + // FIXME: why little endian while CDs use big endian??? + virtual long encodeInternal( const char*, Q_ULONG len ) = 0; + + /** + * default implementation does nothing + * this may already write data. + */ + virtual void setMetaDataInternal( MetaDataField, const QString& ); + + /** + * Use this in combination with the default implementation of lastError() + */ + void setLastError( const QString& ); + + private: + class Private; + Private* d; +}; + +#endif diff --git a/libk3b/plugin/k3baudiooutputplugin.h b/libk3b/plugin/k3baudiooutputplugin.h new file mode 100644 index 0000000..97e897a --- /dev/null +++ b/libk3b/plugin/k3baudiooutputplugin.h @@ -0,0 +1,69 @@ +/* + * + * $Id: k3baudiooutputplugin.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2004 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_AUDIO_OUTPUTPLUGIN_H_ +#define _K3B_AUDIO_OUTPUTPLUGIN_H_ + +#include +#include "k3b_export.h" + +/** + * + */ +class LIBK3B_EXPORT K3bAudioOutputPlugin : public K3bPlugin +{ + Q_OBJECT + + public: + virtual ~K3bAudioOutputPlugin() { + } + + QString group() const { return "AudioOutput"; } + + /** + * This is the short name of the sound system which can be used + * to specify the sound system on the command line (like "arts", "alsa", or "oss") + */ + virtual QCString soundSystem() const = 0; + + /** + * Initialize the plugin. + * + * Return true on success. + * In case of a failure report the error through lastErrorMessage + */ + virtual bool init() { return true; } + + /** + * Cleanup the plugin. This is the counterpart to init() + */ + virtual void cleanup() {} + + virtual QString lastErrorMessage() const { return QString::null; } + + /** + * Let there be sound... + * + * @returns number of written bytes or -1 on error. + */ + virtual int write( char* data, int len ) = 0; + + protected: + K3bAudioOutputPlugin( QObject* parent = 0, const char* name = 0 ) + : K3bPlugin( parent, name ) { + } +}; + +#endif diff --git a/libk3b/plugin/k3baudioserver.cpp b/libk3b/plugin/k3baudioserver.cpp new file mode 100644 index 0000000..ecfb25f --- /dev/null +++ b/libk3b/plugin/k3baudioserver.cpp @@ -0,0 +1,214 @@ +/* + * + * $Id: k3baudioserver.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2004 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include +#include +#include +#include "k3baudioserver.h" +#include "k3baudioclient.h" +#include "k3bpluginmanager.h" +#include "k3baudiooutputplugin.h" + +#include +#include +#include +#include + +#include + + + +K3bAudioServer* K3bAudioServer::s_instance = 0; + + + +class K3bAudioServer::Private : public K3bThread +{ +public: + Private( K3bAudioServer* s ) + : m_streaming(false), + m_server(s) { + setProgressInfoEventHandler( m_server ); + } + + + void stop() { + m_streaming = false; + } + +protected: + void run() { + m_streaming = true; + + char buffer[2048*10]; + + while( m_streaming ) { + int len = m_server->m_client->read( buffer, 2048*10 ); + if( len > 0 ) { + if( m_server->m_pluginInitialized ) { + if( write( buffer, len ) < 0 ) { + kdDebug() << "Audio Streaming failed: " << m_server->m_usedOutputPlugin->lastErrorMessage() << endl; + emitInfoMessage( m_server->m_usedOutputPlugin->lastErrorMessage(), 0 ); + return; + } + } + // else just drop the data into space... + } + else { + // FIXME: no data or error... what to do? + } + } + } + + int write( char* buffer, int len ) { + int written = m_server->m_usedOutputPlugin->write( buffer, len ); + return written; +// if( written < 0 ) +// return -1; +// else if( written < len ) +// return write( buffer+written, len-written ) + written; +// else +// return len; + } + +private: + bool m_streaming; + K3bAudioServer* m_server; +}; + + +K3bAudioServer::K3bAudioServer( QObject* parent, const char* name ) + : QObject( parent, name ), + m_usedOutputPlugin(0), + m_pluginInitialized(false), + m_client(0) +{ + s_instance = this; + d = new Private( this ); +} + + +K3bAudioServer::~K3bAudioServer() +{ + delete d; + s_instance = 0; +} + + +bool K3bAudioServer::setOutputMethod( const QCString& name ) +{ + if( K3bAudioOutputPlugin* p = findOutputPlugin( name ) ) { + setOutputPlugin( p ); + return true; + } + else + return false; +} + + +void K3bAudioServer::setOutputPlugin( K3bAudioOutputPlugin* p ) +{ + if( p != m_usedOutputPlugin ) { + bool restart = d->running(); + if( restart ) { + d->stop(); + d->wait(); + } + + if( m_usedOutputPlugin ) { + m_usedOutputPlugin->cleanup(); + m_pluginInitialized = false; + } + + m_usedOutputPlugin = p; + + if( restart ) + d->start(); + } +} + + +void K3bAudioServer::attachClient( K3bAudioClient* c ) +{ + // for now we simply allow only one client and stop the old one + if( m_client ) { + kdDebug() << "(K3bAudioServer) leaving old client hanging. :(" << endl; + detachClient( m_client ); + } + + m_client = c; + + if( m_usedOutputPlugin && !m_pluginInitialized ) { + if( !m_usedOutputPlugin->init() ) { + emit error( i18n("Could not initialize Audio Output plugin %1 (%2)") + .arg(m_usedOutputPlugin->pluginInfo().name()) + .arg(m_usedOutputPlugin->lastErrorMessage()) ); + } + else + m_pluginInitialized = true; + } + else + kdDebug() << "(K3bAudioServer::attachClient) no output plugin selected. Using null output." << endl; + + // start the streaming + d->start(); +} + + +void K3bAudioServer::detachClient( K3bAudioClient* c ) +{ + if( m_client == c ) { + m_client = 0; + + // stop the streaming + d->stop(); + d->wait(); + + if( m_usedOutputPlugin && m_pluginInitialized ) { + m_usedOutputPlugin->cleanup(); + m_pluginInitialized = false; + } + } +} + + +K3bAudioOutputPlugin* K3bAudioServer::findOutputPlugin( const QCString& name ) +{ + QPtrList fl = k3bcore->pluginManager()->plugins( "AudioOutput" ); + + for( QPtrListIterator it( fl ); it.current(); ++it ) { + K3bAudioOutputPlugin* f = dynamic_cast( it.current() ); + + if( f && f->soundSystem() == name ) { + return f; + } + } + + kdDebug() << "(K3bAudioServer::findOutputPlugin) could not find output plugin " << name << endl; + + return 0; +} + + +void K3bAudioServer::customEvent( QCustomEvent* e ) +{ + if( K3bProgressInfoEvent* be = dynamic_cast(e) ) { + if( be->type() == K3bProgressInfoEvent::InfoMessage ) { + emit error( be->firstString() ); + } + } +} + +#include "k3baudioserver.moc" diff --git a/libk3b/plugin/k3baudioserver.h b/libk3b/plugin/k3baudioserver.h new file mode 100644 index 0000000..1e8d4a8 --- /dev/null +++ b/libk3b/plugin/k3baudioserver.h @@ -0,0 +1,85 @@ +/* + * + * $Id$ + * Copyright (C) 2004 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_AUDIO_SERVER_H_ +#define _K3B_AUDIO_SERVER_H_ + +#include +#include "k3b_export.h" +class K3bAudioOutputPlugin; +class K3bAudioClient; + + +/** + * The AudioServer manages AudioClients to play audio data through + * some output plugin. + */ +class LIBK3B_EXPORT K3bAudioServer : public QObject +{ + Q_OBJECT + + public: + K3bAudioServer( QObject* parent = 0, const char* name = 0 ); + ~K3bAudioServer(); + + /** + * Returns false in case the named output method could not be found. + */ + bool setOutputMethod( const QCString& name ); + void setOutputPlugin( K3bAudioOutputPlugin* p ); + + /** + * Start playing the clients data. It's up to the server if older + * clients are suspended, stopped or mixed into a single stream. + * + * This is called by K3bAudioClient + */ + void attachClient( K3bAudioClient* ); + + /** + * Stop streaming data from the client. + * This is called by K3bAudioClient + */ + void detachClient( K3bAudioClient* ); + + /** + * We need to be able to play data from everywhere in K3b. + */ + static K3bAudioServer* instance() { return s_instance; } + + /** + * Find a plugin by classname. + */ + static K3bAudioOutputPlugin* findOutputPlugin( const QCString& name ); + + signals: + void error( const QString& ); + + private: + void customEvent( QCustomEvent* e ); + + class Private; + friend class Private; + + static K3bAudioServer* s_instance; + + K3bAudioOutputPlugin* m_usedOutputPlugin; + bool m_pluginInitialized; + K3bAudioClient* m_client; + + Private* d; +}; + +#endif diff --git a/libk3b/plugin/k3bplugin.cpp b/libk3b/plugin/k3bplugin.cpp new file mode 100644 index 0000000..db75bb4 --- /dev/null +++ b/libk3b/plugin/k3bplugin.cpp @@ -0,0 +1,36 @@ +/* + * + * $Id: k3bplugin.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include "k3bplugin.h" + + +K3bPlugin::K3bPlugin( QObject* parent, const char* name ) + : QObject( parent, name ) +{ +} + + +K3bPlugin::~K3bPlugin() +{ +} + + +K3bPluginConfigWidget* K3bPlugin::createConfigWidget( QWidget*, const char* ) const +{ + return 0; +} + +#include "k3bplugin.moc" diff --git a/libk3b/plugin/k3bplugin.h b/libk3b/plugin/k3bplugin.h new file mode 100644 index 0000000..f4501a7 --- /dev/null +++ b/libk3b/plugin/k3bplugin.h @@ -0,0 +1,113 @@ +/* + * + * $Id: k3bplugin.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef _K3B_PLUGIN_H_ +#define _K3B_PLUGIN_H_ + +#include +#include +#include "k3b_export.h" + +#define K3B_PLUGIN_SYSTEM_VERSION 3 + + +class K3bPluginConfigWidget; +class QWidget; + + + +class K3bPluginInfo +{ + friend class K3bPluginManager; + + public: + K3bPluginInfo() { + } + + K3bPluginInfo( QString libraryName, + QString name, + QString author, + QString email, + QString comment, + QString version, + QString licence ) + : m_libraryName(libraryName), + m_name(name), + m_author(author), + m_email(email), + m_comment(comment), + m_version(version), + m_licence(licence) { + } + + const QString& name() const { return m_name; } + const QString& author() const { return m_author; } + const QString& email() const { return m_email; } + const QString& comment() const { return m_comment; } + const QString& version() const { return m_version; } + const QString& licence() const { return m_licence; } + + const QString& libraryName() const { return m_libraryName; } + + private: + QString m_libraryName; + + QString m_name; + QString m_author; + QString m_email; + QString m_comment; + QString m_version; + QString m_licence; +}; + + +/** + * Base class for all plugins. You may use the K3bPluginFactory to make your plugin available. + */ +class LIBK3B_EXPORT K3bPlugin : public QObject +{ + Q_OBJECT + + friend class K3bPluginManager; + + public: + K3bPlugin( QObject* parent = 0, const char* name = 0 ); + virtual ~K3bPlugin(); + + const K3bPluginInfo& pluginInfo() const { return m_pluginInfo; } + + /** + * Version of the plugin system this plugin was written for. + */ + virtual int pluginSystemVersion() const = 0; + + /** + * The plugin group. + */ + virtual QString group() const = 0; + + /** + * Returns a widget which configures the plugin. + * + * The caller has to destroy the widget + */ + virtual K3bPluginConfigWidget* createConfigWidget( QWidget* parent = 0, const char* name = 0 ) const; + + private: + K3bPluginInfo m_pluginInfo; +}; + +#endif diff --git a/libk3b/plugin/k3bpluginconfigwidget.cpp b/libk3b/plugin/k3bpluginconfigwidget.cpp new file mode 100644 index 0000000..09b7f0b --- /dev/null +++ b/libk3b/plugin/k3bpluginconfigwidget.cpp @@ -0,0 +1,48 @@ +/* + * + * $Id: k3bpluginconfigwidget.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bpluginconfigwidget.h" +#include "k3bpluginfactory.h" + +#include + +#include +#include + + +K3bPluginConfigWidget::K3bPluginConfigWidget( QWidget* parent, const char* name ) + : QWidget( parent, name ) +{ +} + + +K3bPluginConfigWidget::~K3bPluginConfigWidget() +{ +} + + +void K3bPluginConfigWidget::loadConfig() +{ + // do nothing +} + + +void K3bPluginConfigWidget::saveConfig() +{ + // do nothing +} + + +#include "k3bpluginconfigwidget.moc" diff --git a/libk3b/plugin/k3bpluginconfigwidget.h b/libk3b/plugin/k3bpluginconfigwidget.h new file mode 100644 index 0000000..baa07ab --- /dev/null +++ b/libk3b/plugin/k3bpluginconfigwidget.h @@ -0,0 +1,40 @@ +/* + * + * $Id: k3bpluginconfigwidget.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef _K3B_PLUGIN_CONFIG_WIDGET_H_ +#define _K3B_PLUGIN_CONFIG_WIDGET_H_ + +#include +#include "k3b_export.h" + +class LIBK3B_EXPORT K3bPluginConfigWidget : public QWidget +{ + Q_OBJECT + + public: + K3bPluginConfigWidget( QWidget* parent = 0, const char* name = 0 ); + virtual ~K3bPluginConfigWidget(); + + public slots: + /** + * Use k3bcore->config() to store the settings + * FIXME: add a KConfig parameter here + */ + virtual void loadConfig(); + virtual void saveConfig(); +}; + +#endif diff --git a/libk3b/plugin/k3bpluginfactory.cpp b/libk3b/plugin/k3bpluginfactory.cpp new file mode 100644 index 0000000..7d8f8fe --- /dev/null +++ b/libk3b/plugin/k3bpluginfactory.cpp @@ -0,0 +1,33 @@ +/* + * + * $Id: k3bpluginfactory.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bpluginfactory.h" + + +template +KInstance* K3bPluginFactory::s_instance = 0; + + +template +K3bPluginFactory* K3bPluginFactory::s_self = 0; + + +template +KInstance* K3bPluginFactory::instance() +{ + if( !s_instance && s_self ) + s_instance = new KInstance( s_self->m_instanceName ); + return s_instance; +} diff --git a/libk3b/plugin/k3bpluginfactory.h b/libk3b/plugin/k3bpluginfactory.h new file mode 100644 index 0000000..6dbc6cb --- /dev/null +++ b/libk3b/plugin/k3bpluginfactory.h @@ -0,0 +1,98 @@ +/* + * + * $Id: k3bpluginfactory.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef _K3B_PLUGIN_FACTORY_H_ +#define _K3B_PLUGIN_FACTORY_H_ + +#include +#include +#include +#include + +/** + * Template based on KGenericFactory. This is just here to avoid using the QStringList args parameter + * in every plugin's constructor. + * + * Use this as follows: + * K_EXPORT_COMPONENT_FACTORY( libk3bartsaudioserver, K3bPluginFactory( "k3bartsaudioserver" ) ) + * + * See KGenericFactory for more information. + */ +template +class K3bPluginFactory : public KLibFactory +{ + public: + K3bPluginFactory( const char* instanceName ) + : m_instanceName(instanceName) { + s_self = this; + m_catalogueInitialized = false; + } + + ~K3bPluginFactory() { + if ( s_instance ) + KGlobal::locale()->removeCatalogue( s_instance->instanceName() ); + delete s_instance; + s_instance = 0; + s_self = 0; + } + + static KInstance* instance(); + + protected: + virtual void setupTranslations( void ) { + if( instance() ) + KGlobal::locale()->insertCatalogue( instance()->instanceName() ); + } + + void initializeMessageCatalogue() { + if( !m_catalogueInitialized ) { + m_catalogueInitialized = true; + setupTranslations(); + } + } + + virtual QObject* createObject( QObject *parent, const char *name, + const char*, const QStringList& ) { + initializeMessageCatalogue(); + return new T( parent, name ); + } + + private: + QCString m_instanceName; + bool m_catalogueInitialized; + + static KInstance* s_instance; + static K3bPluginFactory *s_self; +}; + + +template +KInstance* K3bPluginFactory::s_instance = 0; + + +template +K3bPluginFactory* K3bPluginFactory::s_self = 0; + + +template +KInstance* K3bPluginFactory::instance() +{ + if( !s_instance && s_self ) + s_instance = new KInstance( s_self->m_instanceName ); + return s_instance; +} + +#endif diff --git a/libk3b/plugin/k3bpluginmanager.cpp b/libk3b/plugin/k3bpluginmanager.cpp new file mode 100644 index 0000000..3e963a2 --- /dev/null +++ b/libk3b/plugin/k3bpluginmanager.cpp @@ -0,0 +1,189 @@ +/* + * + * $Id: k3bpluginmanager.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bpluginmanager.h" +#include "k3bplugin.h" +#include "k3bpluginconfigwidget.h" +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + + + +class K3bPluginManager::Private +{ +public: + QPtrList plugins; +}; + + + + +K3bPluginManager::K3bPluginManager( QObject* parent, const char* name ) + : QObject( parent, name ) +{ + d = new Private(); +} + + +K3bPluginManager::~K3bPluginManager() +{ + delete d; +} + + + +QStringList K3bPluginManager::groups() const +{ + QStringList grps; + + QPtrList fl; + for( QPtrListIterator it( d->plugins ); + it.current(); ++it ) { + if( !grps.contains( it.current()->group() ) ) + grps.append( it.current()->group() ); + } + + return grps; +} + + +QPtrList K3bPluginManager::plugins( const QString& group ) const +{ + QPtrList fl; + for( QPtrListIterator it( d->plugins ); + it.current(); ++it ) { + if( it.current()->group() == group || group.isEmpty() ) + fl.append( it.current() ); + } + return fl; +} + + +void K3bPluginManager::loadPlugin( const QString& fileName ) +{ + KSimpleConfig c( fileName, true ); + c.setGroup( "K3b Plugin" ); + + QString libName = c.readEntry( "Lib" ); + if( libName.isEmpty() ) { + kdDebug() << "(K3bPluginManager) no Lib specified in " << fileName << endl; + return; + } + + // read the lib + KLibFactory* factory = KLibLoader::self()->factory( libName.latin1() ); + if( factory ) { + K3bPlugin* plugin = dynamic_cast( factory->create( this ) ); + if( plugin ) { + // FIXME: improve this versioning stuff + if( plugin->pluginSystemVersion() != K3B_PLUGIN_SYSTEM_VERSION ) { + delete plugin; + kdDebug() << "(K3bPluginManager) plugin system does not fit lib " << libName << endl; + } + else { + plugin->m_pluginInfo = K3bPluginInfo( libName, + c.readEntry( "Name" ), + c.readEntry( "Author" ), + c.readEntry( "Email" ), + c.readEntry( "Comment" ), + c.readEntry( "Version" ), + c.readEntry( "License" ) ); + + // make sure to only use the latest version of one plugin + bool addPlugin = true; + for( QPtrListIterator it( d->plugins ); *it; ++it ) { + if( it.current()->pluginInfo().name() == plugin->pluginInfo().name() ) { + if( K3bVersion(it.current()->pluginInfo().version()) < K3bVersion(plugin->pluginInfo().version()) ) { + K3bPlugin* p = it.current(); + d->plugins.removeRef( p ); + delete p; + } + else { + addPlugin = false; + } + break; + } + } + if( addPlugin ) + d->plugins.append( plugin ); + else + delete plugin; + } + } + else + kdDebug() << "(K3bPluginManager) lib " << libName << " not a K3b plugin" << endl; + } + else + kdDebug() << "(K3bPluginManager) lib " << libName << " not found" << endl; +} + + +void K3bPluginManager::loadAll() +{ + // we simply search the K3b plugin dir for now + QStringList dirs = KGlobal::dirs()->findDirs( "data", "k3b/plugins/" ); + + for( QStringList::const_iterator it = dirs.begin(); + it != dirs.end(); ++it ) { + QStringList entries = QDir(*it).entryList( "*.plugin", QDir::Files ); + for( QStringList::const_iterator it2 = entries.begin(); + it2 != entries.end(); ++it2 ) { + loadPlugin( *it + *it2 ); + } + } +} + +int K3bPluginManager::pluginSystemVersion() const +{ + return K3B_PLUGIN_SYSTEM_VERSION; +} + + +int K3bPluginManager::execPluginDialog( K3bPlugin* plugin, QWidget* parent, const char* name ) +{ + KDialogBase dlg( parent, + name, + true, + i18n("Configure plugin %1").arg( plugin->pluginInfo().name() ) ); + + K3bPluginConfigWidget* configWidget = plugin->createConfigWidget( &dlg ); + if( configWidget ) { + dlg.setMainWidget( configWidget ); + connect( &dlg, SIGNAL(applyClicked()), configWidget, SLOT(saveConfig()) ); + connect( &dlg, SIGNAL(okClicked()), configWidget, SLOT(saveConfig()) ); + configWidget->loadConfig(); + int r = dlg.exec(); + delete configWidget; + return r; + } + else { + KMessageBox::sorry( parent, i18n("No settings available for plugin %1.").arg( plugin->pluginInfo().name() ) ); + return 0; + } +} + +#include "k3bpluginmanager.moc" diff --git a/libk3b/plugin/k3bpluginmanager.h b/libk3b/plugin/k3bpluginmanager.h new file mode 100644 index 0000000..9295dee --- /dev/null +++ b/libk3b/plugin/k3bpluginmanager.h @@ -0,0 +1,70 @@ +/* + * + * $Id: k3bpluginmanager.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_PLUGIN_MANAGER_H_ +#define _K3B_PLUGIN_MANAGER_H_ + +#include +#include +#include +#include "k3b_export.h" + + +class K3bPlugin; +class QWidget; + + +/** + * Use this class to access all K3b plugins (this does not include the + * KParts Plugins!). + * Like the K3bCore the single instance (which has to be created manually) + * can be obtained with the k3bpluginmanager macro. + */ +class LIBK3B_EXPORT K3bPluginManager : public QObject +{ + Q_OBJECT + + public: + K3bPluginManager( QObject* parent = 0, const char* name = 0 ); + ~K3bPluginManager(); + + /** + * if group is empty all plugins are returned + */ + QPtrList plugins( const QString& group = QString::null ) const; + + /** + * Returnes a list of the available groups. + */ + QStringList groups() const; + + int pluginSystemVersion() const; + + public slots: + /** + * Loads all plugins from the ressource directories. + */ + void loadAll(); + + void loadPlugin( const QString& fileName ); + + int execPluginDialog( K3bPlugin*, QWidget* parent = 0, const char* name = 0 ); + + private: + class Private; + Private* d; +}; + +#endif diff --git a/libk3b/plugin/k3bprojectplugin.h b/libk3b/plugin/k3bprojectplugin.h new file mode 100644 index 0000000..c15b9a3 --- /dev/null +++ b/libk3b/plugin/k3bprojectplugin.h @@ -0,0 +1,161 @@ +/* + * + * $Id: k3bprojectplugin.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2004 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_PROJECT_PLUGIN_H_ +#define _K3B_PROJECT_PLUGIN_H_ + +#include +#include +#include "k3b_export.h" +class K3bDoc; + +/** + * In case your plugin provides a GUI it is recommended to use the + * K3bProjectPluginGUIBase interface. That way K3b can embed the GUI into + * a fancy dialog which fits the overall look. + * + * This is not derived from QWidget to make it possible to inherit + * from other QWidget derivates. + */ +class K3bProjectPluginGUIBase +{ + public: + K3bProjectPluginGUIBase() {} + virtual ~K3bProjectPluginGUIBase() {} + + virtual QWidget* qWidget() = 0; + + /** + * Title used for the GUI + */ + virtual QString title() const = 0; + virtual QString subTitle() const { return QString::null; } + + virtual void readSettings( KConfigBase* ) {} + virtual void saveSettings( KConfigBase* ) {} + + /** + * Load system defaults for the GUI + */ + virtual void loadDefaults() {} + + /** + * Start the plugin. This method should do the actual work. + */ + virtual void activate() = 0; +}; + + +/** + * A K3bProjectPlugin is supposed to modify a k3b project in some way or + * create additional data based on the project. + * + * Reimplement createGUI or activate and use setText, setToolTip, setWhatsThis, and setIcon + * to specify the gui elements used when presenting the plugin to the user. + */ +class LIBK3B_EXPORT K3bProjectPlugin : public K3bPlugin +{ + Q_OBJECT + + public: + /** + * @param type The type of the plugin + * @param gui If true the plugin is supposed to provide a widget via @p createGUI(). In that case + * @p activate() will not be used. A plugin has a GUI if it's functionality is started + * by some user input. + */ + K3bProjectPlugin( int type, bool gui = false, QObject* parent = 0, const char* name = 0 ) + : K3bPlugin( parent, name ), + m_type(type), + m_hasGUI(gui) { + } + + virtual ~K3bProjectPlugin() { + } + + // TODO: move this to K3bDoc? + enum Type { + AUDIO_CD = 0x1, + DATA_CD = 0x2, + MIXED_CD = 0x4, + VIDEO_CD = 0x8, + MOVIX_CD = 0x10, + DATA_DVD = 0x20, + VIDEO_DVD = 0x40, + MOVIX_DVD = 0x80, + DATA_PROJECTS = DATA_CD|DATA_DVD, + MOVIX_PROJECTS = MOVIX_CD|MOVIX_DVD + }; + + // TODO: maybe we should use something like "ProjectPlugin/AudioCD" based on the type? + QString group() const { return "ProjectPlugin"; } + + /** + * audio, data, videocd, or videodvd + * Needs to return a proper type. The default implementation returns the type specified + * in the constructor. + */ + virtual int type() const { return m_type; } + + /** + * Text used for menu entries and the like. + */ + const QString& text() const { return m_text; } + const QString& toolTip() const { return m_toolTip; } + const QString& whatsThis() const { return m_whatsThis; } + const QString& icon() const { return m_icon; } + + bool hasGUI() const { return m_hasGUI; } + + /** + * Create the GUI which provides the features for the plugin. + * This only needs to be implemented in case hasGUI returns true. + * The returned object has to be a QWidget based class. + * + * @param doc based on the type returned by the factory + * this will be the doc to work on. It should + * be dynamically casted to the needed project type. + */ + virtual K3bProjectPluginGUIBase* createGUI( K3bDoc* doc, QWidget* = 0, const char* = 0 ) { Q_UNUSED(doc); return 0; } + + /** + * This is where the action happens. + * There is no need to implement this in case hasGUI returns true. + * + * @param doc based on the type returned by the factory + * this will be the doc to work on. It should + * be dynamically casted to the needed project type. + * + * @param parent the parent widget to be used for things like progress dialogs. + */ + virtual void activate( K3bDoc* doc, QWidget* parent ) { Q_UNUSED(doc); Q_UNUSED(parent); } + + protected: + void setText( const QString& s ) { m_text = s; } + void setToolTip( const QString& s ) { m_toolTip = s; } + void setWhatsThis( const QString& s ) { m_whatsThis = s; } + void setIcon( const QString& s ) { m_icon = s; } + + private: + int m_type; + bool m_hasGUI; + QString m_text; + QString m_toolTip; + QString m_whatsThis; + QString m_icon; +}; + + +#endif diff --git a/libk3b/plugin/libsamplerate/Makefile.am b/libk3b/plugin/libsamplerate/Makefile.am new file mode 100644 index 0000000..3154ce2 --- /dev/null +++ b/libk3b/plugin/libsamplerate/Makefile.am @@ -0,0 +1,20 @@ +# This file was automatically generated from the Makefile.am +# DO NOT EDIT! + +noinst_LTLIBRARIES = libsamplerate.la +#include_HEADERS = samplerate.h + +EXTRA_DIST = config.h.in Version_script.in + +COEFF_HDRS = high_qual_coeffs.h mid_qual_coeffs.h fastest_coeffs.h + +noinst_HEADERS = common.h float_cast.h $(COEFF_HDRS) + +SRC_SOURCES = samplerate.c src_sinc.c src_zoh.c src_linear.c + +libsamplerate_la_SOURCES = $(SRC_SOURCES) +#libsamplerate_la_LDFLAGS = -version-info @SHARED_VERSION_INFO@ @SHLIB_VERSION_ARG@ +libsamplerate_la_LIBADD = -lm + +# Disable autoheader. +#AUTOHEADER=echo diff --git a/libk3b/plugin/libsamplerate/common.h b/libk3b/plugin/libsamplerate/common.h new file mode 100644 index 0000000..86021ae --- /dev/null +++ b/libk3b/plugin/libsamplerate/common.h @@ -0,0 +1,105 @@ +/* +** Copyright (C) 2002,2003 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** 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, write to the Free Software +** Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#ifndef COMMON_H_INCLUDED +#define COMMON_H_INCLUDED + +#ifdef HAVE_STDINT_H +#include +#elif (SIZEOF_INT == 4) +typedef int int32_t ; +#elif (SIZEOF_LONG == 4) +typedef long int32_t ; +#endif + +#define SRC_MAX_RATIO 12 +#define SRC_MIN_RATIO_DIFF (1e-20) + +#define MAX(a,b) (((a) > (b)) ? (a) : (b)) +#define MIN(a,b) (((a) < (b)) ? (a) : (b)) + +#define MAKE_MAGIC(a,b,c,d,e,f) ((a)+((b)<<4)+((c)<<8)+((d)<<12)+((e)<<16)+((f)<<20)) + +#include "samplerate.h" + +enum +{ SRC_FALSE = 0, + SRC_TRUE = 1 +} ; + +enum +{ SRC_ERR_NO_ERROR = 0, + + SRC_ERR_MALLOC_FAILED, + SRC_ERR_BAD_STATE, + SRC_ERR_BAD_DATA, + SRC_ERR_BAD_DATA_PTR, + SRC_ERR_NO_PRIVATE, + SRC_ERR_BAD_SRC_RATIO, + SRC_ERR_BAD_PROC_PTR, + SRC_ERR_SHIFT_BITS, + SRC_ERR_FILTER_LEN, + SRC_ERR_BAD_CONVERTER, + SRC_ERR_BAD_CHANNEL_COUNT, + SRC_ERR_SINC_BAD_BUFFER_LEN, + SRC_ERR_SIZE_INCOMPATIBILITY, + SRC_ERR_BAD_PRIV_PTR, + SRC_ERR_BAD_SINC_STATE, + SRC_ERR_DATA_OVERLAP, + + /* This must be the last error number. */ + SRC_ERR_MAX_ERROR +} ; + +typedef struct SRC_PRIVATE_tag +{ double last_ratio, last_position ; + + void *private_data ; + + int (*process) (struct SRC_PRIVATE_tag *psrc, SRC_DATA *data) ; + void (*reset) (struct SRC_PRIVATE_tag *psrc) ; + + int error ; + int channels ; +} SRC_PRIVATE ; + +/* In src_sinc.c */ +int sinc_process (SRC_PRIVATE *psrc, SRC_DATA *data) ; + +const char* sinc_get_name (int src_enum) ; +const char* sinc_get_description (int src_enum) ; + +int sinc_set_converter (SRC_PRIVATE *psrc, int src_enum) ; + +/* In src_linear.c */ +int linear_process (SRC_PRIVATE *psrc, SRC_DATA *data) ; + +const char* linear_get_name (int src_enum) ; +const char* linear_get_description (int src_enum) ; + +int linear_set_converter (SRC_PRIVATE *psrc, int src_enum) ; + +/* In src_zoh.c */ +int zoh_process (SRC_PRIVATE *psrc, SRC_DATA *data) ; + +const char* zoh_get_name (int src_enum) ; +const char* zoh_get_description (int src_enum) ; + +int zoh_set_converter (SRC_PRIVATE *psrc, int src_enum) ; + +#endif /* COMMON_H_INCLUDED */ diff --git a/libk3b/plugin/libsamplerate/configure.in.in b/libk3b/plugin/libsamplerate/configure.in.in new file mode 100644 index 0000000..06a8f55 --- /dev/null +++ b/libk3b/plugin/libsamplerate/configure.in.in @@ -0,0 +1,13 @@ +LIBS="-lm $all_libraries" + +AC_CHECK_DECL(lrint, + AC_DEFINE(HAVE_LRINT,1,[Define if lrint is supported]), + AC_DEFINE(HAVE_LRINT,0,[Define if lrint is not supported]), + [#include ] +) + +AC_CHECK_DECL(lrintf, + AC_DEFINE(HAVE_LRINTF,1,[Define if lrintf is supported]), + AC_DEFINE(HAVE_LRINTF,0,[Define if lrintf is not supported]), + [#include ] +) diff --git a/libk3b/plugin/libsamplerate/fastest_coeffs.h b/libk3b/plugin/libsamplerate/fastest_coeffs.h new file mode 100644 index 0000000..5343fc6 --- /dev/null +++ b/libk3b/plugin/libsamplerate/fastest_coeffs.h @@ -0,0 +1,2493 @@ +/* +** Copyright (C) 2002,2003 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** 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, write to the Free Software +** Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + + +/* +** f = make_filter (8, 128, 100.3) ; +** Pass band width : 0.0039062 (should be 0.0039062) +** Stop band atten. : 100.71 dB +** -3dB band width : 0.484 +** half length : 2463 +** increment : 128 +*/ + + 8.31472372954840555082e-01, + 8.31414005540308198583e-01, + 8.31238918266223869580e-01, + 8.30947156036480505392e-01, + 8.30538793675450581766e-01, + 8.30013935904800659316e-01, + 8.29372717311066987023e-01, + 8.28615302303967515840e-01, + 8.27741885065490623496e-01, + 8.26752689489751890761e-01, + 8.25647969113678215081e-01, + 8.24428007038499943704e-01, + 8.23093115842108757896e-01, + 8.21643637482293187624e-01, + 8.20079943190897053817e-01, + 8.18402433358933589780e-01, + 8.16611537412689103554e-01, + 8.14707713680854150873e-01, + 8.12691449252757824873e-01, + 8.10563259827706050764e-01, + 8.08323689555523805517e-01, + 8.05973310868314363198e-01, + 8.03512724303517833491e-01, + 8.00942558318331943035e-01, + 7.98263469095534694553e-01, + 7.95476140340800830231e-01, + 7.92581283071560838138e-01, + 7.89579635397499868255e-01, + 7.86471962292734527722e-01, + 7.83259055359786127148e-01, + 7.79941732585400893107e-01, + 7.76520838088307852054e-01, + 7.72997241859018080490e-01, + 7.69371839491718167992e-01, + 7.65645551908390675777e-01, + 7.61819325075220210586e-01, + 7.57894129711408459649e-01, + 7.53870960990470018181e-01, + 7.49750838234153449413e-01, + 7.45534804599028211314e-01, + 7.41223926755909090502e-01, + 7.36819294562192195208e-01, + 7.32322020727209643809e-01, + 7.27733240470738174110e-01, + 7.23054111174766811487e-01, + 7.18285812028632841830e-01, + 7.13429543667664534112e-01, + 7.08486527805442301009e-01, + 7.03458006859804640953e-01, + 6.98345243572719653891e-01, + 6.93149520624175785599e-01, + 6.87872140240182283755e-01, + 6.82514423795047564525e-01, + 6.77077711408058502407e-01, + 6.71563361534684655219e-01, + 6.65972750552474845875e-01, + 6.60307272341742135247e-01, + 6.54568337861228477514e-01, + 6.48757374718860524432e-01, + 6.42875826737744904271e-01, + 6.36925153517562181449e-01, + 6.30906829991492501541e-01, + 6.24822345978837789815e-01, + 6.18673205733470954470e-01, + 6.12460927488293727095e-01, + 6.06187042995817604307e-01, + 5.99853097065060292259e-01, + 5.93460647094893878339e-01, + 5.87011262603992944875e-01, + 5.80506524757569142281e-01, + 5.73948025891025337408e-01, + 5.67337369030688098981e-01, + 5.60676167411809700525e-01, + 5.53966043993961543279e-01, + 5.47208630974010734604e-01, + 5.40405569296826038261e-01, + 5.33558508163880174102e-01, + 5.26669104539922661168e-01, + 5.19739022657876970079e-01, + 5.12769933522119303326e-01, + 5.05763514410336290084e-01, + 4.98721448374081555155e-01, + 4.91645423738241937883e-01, + 4.84537133599546865348e-01, + 4.77398275324308896117e-01, + 4.70230550045545592219e-01, + 4.63035662159660077464e-01, + 4.55815318822846149427e-01, + 4.48571229447379538069e-01, + 4.41305105197960123586e-01, + 4.34018658488283970431e-01, + 4.26713602477997000495e-01, + 4.19391650570203500248e-01, + 4.12054515909689722530e-01, + 4.04703910882034223473e-01, + 3.97341546613763640927e-01, + 3.89969132473721613596e-01, + 3.82588375575806771689e-01, + 3.75200980283257823356e-01, + 3.67808647714624070701e-01, + 3.60413075251609871241e-01, + 3.53015956048925771960e-01, + 3.45618978546330835044e-01, + 3.38223825983006376461e-01, + 3.30832175914426429575e-01, + 3.23445699731881031180e-01, + 3.16066062184803764357e-01, + 3.08694920906066150312e-01, + 3.01333925940378832831e-01, + 2.93984719275965256102e-01, + 2.86648934379644393378e-01, + 2.79328195735489559492e-01, + 2.72024118387182545220e-01, + 2.64738307484245039003e-01, + 2.57472357832259801658e-01, + 2.50227853447243409057e-01, + 2.43006367114305704691e-01, + 2.35809459950733935063e-01, + 2.28638680973647728800e-01, + 2.21495566672345989279e-01, + 2.14381640585498134399e-01, + 2.07298412883298144305e-01, + 2.00247379954717363848e-01, + 1.93230023999986955108e-01, + 1.86247812628430653437e-01, + 1.79302198461779749294e-01, + 1.72394618743085786816e-01, + 1.65526494951356295537e-01, + 1.58699232422028796430e-01, + 1.51914219973401071195e-01, + 1.45172829539132269838e-01, + 1.38476415806921215879e-01, + 1.31826315863480453272e-01, + 1.25223848845901208904e-01, + 1.18670315599523901184e-01, + 1.12166998342411894374e-01, + 1.05715160336527447260e-01, + 9.93160455657086521652e-02, + 9.29708784205405536216e-02, + 8.66808633902153846673e-02, + 8.04471847614677826321e-02, + 7.42710063246745516574e-02, + 6.81534710872001986415e-02, + 6.20957009940759641076e-02, + 5.60987966560835549235e-02, + 5.01638370853247708703e-02, + 4.42918794383505357026e-02, + 3.84839587669171534490e-02, + 3.27410877764400740086e-02, + 2.70642565922108620236e-02, + 2.14544325334371267788e-02, + 1.59125598951669576520e-02, + 1.04395597381551803740e-02, + 5.03632968672305773861e-03, +-2.96256265336385191805e-04, +-5.55734794075828358179e-03, +-1.07461191566687631893e-02, +-1.58617678942645466689e-02, +-2.09035164602743607498e-02, +-2.58706116401622790435e-02, +-3.07623248430414844568e-02, +-3.55779522382659724178e-02, +-4.03168148836769782428e-02, +-4.49782588454727128013e-02, +-4.95616553096875425699e-02, +-5.40664006852556791594e-02, +-5.84919166986474642345e-02, +-6.28376504800633867154e-02, +-6.71030746411782619276e-02, +-7.12876873444269476554e-02, +-7.53910123638282386738e-02, +-7.94125991373483691715e-02, +-8.33520228108008270906e-02, +-8.72088842732959695914e-02, +-9.09828101842390379872e-02, +-9.46734529918955292072e-02, +-9.82804909435327500589e-02, +-1.01803628087157427284e-01, +-1.05242594264867719844e-01, +-1.08597145097841310535e-01, +-1.11867061962988789681e-01, +-1.15052151961296145188e-01, +-1.18152247877890054228e-01, +-1.21167208133862752684e-01, +-1.24096916729885473063e-01, +-1.26941283181660202750e-01, +-1.29700242447243679900e-01, +-1.32373754846295377252e-01, +-1.34961805971292009287e-01, +-1.37464406590764143257e-01, +-1.39881592544604443917e-01, +-1.42213424631507739937e-01, +-1.44459988488595730827e-01, +-1.46621394463294696386e-01, +-1.48697777477524800682e-01, +-1.50689296884269657850e-01, +-1.52596136316595465399e-01, +-1.54418503529190731527e-01, +-1.56156630232500315270e-01, +-1.57810771919529219121e-01, +-1.59381207685401427021e-01, +-1.60868240039743037872e-01, +-1.62272194711985145998e-01, +-1.63593420449666626659e-01, +-1.64832288809824062392e-01, +-1.65989193943563151379e-01, +-1.67064552373901109572e-01, +-1.68058802766975601273e-01, +-1.68972405696717037360e-01, +-1.69805843403086798027e-01, +-1.70559619543971530131e-01, +-1.71234258940853617537e-01, +-1.71830307318344255307e-01, +-1.72348331037702334756e-01, +-1.72788916824434257702e-01, +-1.73152671490098081231e-01, +-1.73440221648409775845e-01, +-1.73652213425782242506e-01, +-1.73789312166397952319e-01, +-1.73852202131942051855e-01, +-1.73841586196111674845e-01, +-1.73758185534021086793e-01, +-1.73602739306629005878e-01, +-1.73376004340306061335e-01, +-1.73078754801670009478e-01, +-1.72711781867818603420e-01, +-1.72275893392080048372e-01, +-1.71771913565416961545e-01, +-1.71200682573611373538e-01, +-1.70563056250360139954e-01, +-1.69859905726417126370e-01, +-1.69092117074913228514e-01, +-1.68260590952989147473e-01, +-1.67366242239875284703e-01, +-1.66409999671557895518e-01, +-1.65392805472166642966e-01, +-1.64315614982222552021e-01, +-1.63179396283883837437e-01, +-1.61985129823331186483e-01, +-1.60733808030429803360e-01, +-1.59426434935813571281e-01, +-1.58064025785527417778e-01, +-1.56647606653372045704e-01, +-1.55178214051094831571e-01, +-1.53656894536566474008e-01, +-1.52084704320088470730e-01, +-1.50462708868975059140e-01, +-1.48791982510548842500e-01, +-1.47073608033699704256e-01, +-1.45308676289147314931e-01, +-1.43498285788550977715e-01, +-1.41643542302611558092e-01, +-1.39745558458309881988e-01, +-1.37805453335422323224e-01, +-1.35824352062461073398e-01, +-1.33803385412180564362e-01, +-1.31743689396791985313e-01, +-1.29646404863030306753e-01, +-1.27512677087215337002e-01, +-1.25343655370452389253e-01, +-1.23140492634104758984e-01, +-1.20904345015691472298e-01, +-1.18636371465341922127e-01, +-1.16337733342949820048e-01, +-1.14009594016166518338e-01, +-1.11653118459372716065e-01, +-1.09269472853762789066e-01, +-1.06859824188683741331e-01, +-1.04425339864360325337e-01, +-1.01967187296145456177e-01, +-9.94865335204263567803e-02, +-9.69845448023236023083e-02, +-9.44623862453117940641e-02, +-9.19212214028948121358e-02, +-8.93622118924671249296e-02, +-8.67865170114848205607e-02, +-8.41952933560805999447e-02, +-8.15896944422443981537e-02, +-7.89708703296961439522e-02, +-7.63399672485739477779e-02, +-7.36981272290610500697e-02, +-7.10464877340710454501e-02, +-6.83861812951113146042e-02, +-6.57183351514422919859e-02, +-6.30440708926501142129e-02, +-6.03645041047437408421e-02, +-5.76807440198948140342e-02, +-5.49938931699267691267e-02, +-5.23050470436661057994e-02, +-4.96152937482609926456e-02, +-4.69257136745778041798e-02, +-4.42373791667729082677e-02, +-4.15513541961495605492e-02, +-3.88686940393953503370e-02, +-3.61904449613011935938e-02, +-3.35176439020573244121e-02, +-3.08513181692228674602e-02, +-2.81924851344595717162e-02, +-2.55421519351213023585e-02, +-2.29013151807887539724e-02, +-2.02709606648342685609e-02, +-1.76520630811025022733e-02, +-1.50455857457888787787e-02, +-1.24524803245954687053e-02, +-9.87368656524285036313e-03, +-7.31013203541311037958e-03, +-4.76273186619807602227e-03, +-2.23238850112297869746e-03, + 2.80008549183706099625e-04, + 2.77358294660976899965e-03, + 5.24747175940274562800e-03, + 7.70082569017439908660e-03, + 1.01328092980087648006e-02, + 1.25426012146140665460e-02, + 1.49293943544662570388e-02, + 1.72923961188884665885e-02, + 1.96308285940195309527e-02, + 2.19439287426209730936e-02, + 2.42309485896793734561e-02, + 2.64911554017603391442e-02, + 2.87238318600733545660e-02, + 3.09282762272103349532e-02, + 3.31038025075217068327e-02, + 3.52497406010981520486e-02, + 3.73654364513253609004e-02, + 3.94502521859858221176e-02, + 4.15035662518817155542e-02, + 4.35247735429537541130e-02, + 4.55132855218787699125e-02, + 4.74685303351244439196e-02, + 4.93899529214478216765e-02, + 5.12770151138242716304e-02, + 5.31291957347935772660e-02, + 5.49459906852194576721e-02, + 5.67269130264521220797e-02, + 5.84714930558940249039e-02, + 6.01792783759655322551e-02, + 6.18498339564735599705e-02, + 6.34827421903864652641e-02, + 6.50776029430226859995e-02, + 6.66340335946605799577e-02, + 6.81516690765814614483e-02, + 6.96301619005592065115e-02, + 7.10691821818139612965e-02, + 7.24684176554465098175e-02, + 7.38275736863740761340e-02, + 7.51463732727930683319e-02, + 7.64245570431912463194e-02, + 7.76618832469397474272e-02, + 7.88581277384926976337e-02, + 8.00130839552289779837e-02, + 8.11265628889681067459e-02, + 8.21983930512013155623e-02, + 8.32284204320703352442e-02, + 8.42165084531432683868e-02, + 8.51625379140240473808e-02, + 8.60664069328434949702e-02, + 8.69280308806818224898e-02, + 8.77473423099686122839e-02, + 8.85242908769151987114e-02, + 8.92588432580306151420e-02, + 8.99509830607803234637e-02, + 9.06007107284422380511e-02, + 9.12080434392217309636e-02, + 9.17730149996878741270e-02, + 9.22956757325926607782e-02, + 9.27760923591415126443e-02, + 9.32143478757788968014e-02, + 9.36105414255621187669e-02, + 9.39647881641913207407e-02, + 9.42772191207702781046e-02, + 9.45479810533706027664e-02, + 9.47772362994778183598e-02, + 9.49651626213951355338e-02, + 9.51119530466846413441e-02, + 9.52178157037280176178e-02, + 9.52829736524876819148e-02, + 9.53076647105531166160e-02, + 9.52921412745576373871e-02, + 9.52366701370536278271e-02, + 9.51415322989309503177e-02, + 9.50070227774735681647e-02, + 9.48334504101390751707e-02, + 9.46211376541590265532e-02, + 9.43704203820504156086e-02, + 9.40816476731309581094e-02, + 9.37551816011396865758e-02, + 9.33913970180541563870e-02, + 9.29906813342047527948e-02, + 9.25534342947849225647e-02, + 9.20800677528557931506e-02, + 9.15710054389489019888e-02, + 9.10266827273659706599e-02, + 9.04475463992783224043e-02, + 8.98340544027328158361e-02, + 8.91866756096650198371e-02, + 8.85058895700238101867e-02, + 8.77921862631190763615e-02, + 8.70460658462897246546e-02, + 8.62680384010083983748e-02, + 8.54586236765221690659e-02, + 8.46183508311429133375e-02, + 8.37477581712920277068e-02, + 8.28473928884114751980e-02, + 8.19178107938471483651e-02, + 8.09595760518180135312e-02, + 7.99732609105757996648e-02, + 7.89594454318716387764e-02, + 7.79187172188340326784e-02, + 7.68516711423724852015e-02, + 7.57589090662164482692e-02, + 7.46410395707000073884e-02, + 7.34986776754032733461e-02, + 7.23324445607601979047e-02, + 7.11429672887474440213e-02, + 6.99308785227581580779e-02, + 6.86968162467783832748e-02, + 6.74414234839716131287e-02, + 6.61653480147834510694e-02, + 6.48692420946761771905e-02, + 6.35537621716019962559e-02, + 6.22195686033254202751e-02, + 6.08673253747022482973e-02, + 5.94976998150253330588e-02, + 5.81113623155428762890e-02, + 5.67089860472591994478e-02, + 5.52912466791220663653e-02, + 5.38588220967053943333e-02, + 5.24123921214928872869e-02, + 5.09526382308646275110e-02, + 4.94802432788957607945e-02, + 4.79958912180662375380e-02, + 4.65002668219884549017e-02, + 4.49940554092515265783e-02, + 4.34779425684853407241e-02, + 4.19526138847447563340e-02, + 4.04187546673120054463e-02, + 3.88770496790168534895e-02, + 3.73281828671714888124e-02, + 3.57728370962169389680e-02, + 3.42116938821758476141e-02, + 3.26454331290065291604e-02, + 3.10747328669506231447e-02, + 2.95002689929673225788e-02, + 2.79227150133440210622e-02, + 2.63427417885741359249e-02, + 2.47610172805882329528e-02, + 2.31782063024293799591e-02, + 2.15949702704538760989e-02, + 2.00119669591453143431e-02, + 1.84298502586232419709e-02, + 1.68492699349288496680e-02, + 1.52708713931675090641e-02, + 1.36952954435869880129e-02, + 1.21231780706691841254e-02, + 1.05551502053105091677e-02, + 8.99183750016553651196e-03, + 7.43386010822696258193e-03, + 5.88183246471273707412e-03, + 4.33636307232945251988e-03, + 2.79805428998205086427e-03, + 1.26750212499337003291e-03, +-2.54703971099550386531e-04, +-1.76798130311027175757e-03, +-3.27175412906725469539e-03, +-4.76545385331804925710e-03, +-6.24851921581533794464e-03, +-7.72039647752874400727e-03, +-9.18053960192777122884e-03, +-1.06284104324833178490e-02, +-1.20634788661366718077e-02, +-1.34852230226875247771e-02, +-1.48931294100519973078e-02, +-1.62866930853476296615e-02, +-1.76654178117594401476e-02, +-1.90288162111466874205e-02, +-2.03764099123495759369e-02, +-2.17077296951579609696e-02, +-2.30223156299061669505e-02, +-2.43197172126588360974e-02, +-2.55994934959561624976e-02, +-2.68612132150869431513e-02, +-2.81044549098614510063e-02, +-2.93288070418574950415e-02, +-3.05338681071131295974e-02, +-3.17192467442452205595e-02, +-3.28845618379712614776e-02, +-3.40294426180154721551e-02, +-3.51535287533818185945e-02, +-3.62564704419792716017e-02, +-3.73379284955845242022e-02, +-3.83975744201309962533e-02, +-3.94350904913155775322e-02, +-4.04501698255130062720e-02, +-4.14425164459938585870e-02, +-4.24118453444415760556e-02, +-4.33578825377650758921e-02, +-4.42803651202084772032e-02, +-4.51790413107587551789e-02, +-4.60536704958539877541e-02, +-4.69040232673985507672e-02, +-4.77298814560914094751e-02, +-4.85310381600771723054e-02, +-4.93072977689298017068e-02, +-5.00584759829825892696e-02, +-5.07843998280173986037e-02, +-5.14849076653303427964e-02, +-5.21598491971914657306e-02, +-5.28090854677170859488e-02, +-5.34324888591782357072e-02, +-5.40299430837655400572e-02, +-5.46013431708381041796e-02, +-5.51465954496810906171e-02, +-5.56656175277993395256e-02, +-5.61583382647804357779e-02, +-5.66246977417538960298e-02, +-5.70646472264832865795e-02, +-5.74781491341238848225e-02, +-5.78651769836829588112e-02, +-5.82257153502198851469e-02, +-5.85597598128258789441e-02, +-5.88673168984241990120e-02, +-5.91484040214318093631e-02, +-5.94030494193287308957e-02, +-5.96312920841784027681e-02, +-5.98331816901454746627e-02, +-6.00087785170606569096e-02, +-6.01581533700810480725e-02, +-6.02813874954959694197e-02, +-6.03785724927326447609e-02, +-6.04498102226119424230e-02, +-6.04952127119116611631e-02, +-6.05149020542914278797e-02, +-6.05090103076376881197e-02, +-6.04776793878847099273e-02, +-6.04210609593744951695e-02, +-6.03393163218124903291e-02, +-6.02326162938837256222e-02, +-6.01011410935896536745e-02, +-5.99450802153716350018e-02, +-5.97646323040843391317e-02, +-5.95600050258849322837e-02, +-5.93314149361059764431e-02, +-5.90790873441773764507e-02, +-5.88032561756684640786e-02, +-5.85041638315173181950e-02, +-5.81820610445198463379e-02, +-5.78372067331465664064e-02, +-5.74698678527617162759e-02, +-5.70803192443151696800e-02, +-5.66688434805820984153e-02, +-5.62357307100216502471e-02, +-5.57812784983319834287e-02, +-5.53057916677746758127e-02, +-5.48095821343453915020e-02, +-5.42929687428649263015e-02, +-5.37562771000702349644e-02, +-5.31998394057807341695e-02, +-5.26239942822169029513e-02, +-5.20290866015511582754e-02, +-5.14154673117670768523e-02, +-5.07834932609073572141e-02, +-5.01335270197884388943e-02, +-4.94659367032617980353e-02, +-4.87810957901005926018e-02, +-4.80793829415919610204e-02, +-4.73611818189140221236e-02, +-4.66268808993793651418e-02, +-4.58768732916221277929e-02, +-4.51115565498113532672e-02, +-4.43313324869706107401e-02, +-4.35366069874822472774e-02, +-4.27277898188581847783e-02, +-4.19052944428566706558e-02, +-4.10695378260253277092e-02, +-4.02209402497498702544e-02, +-3.93599251198885058400e-02, +-3.84869187760717781921e-02, +-3.76023503007467674308e-02, +-3.67066513280452297319e-02, +-3.58002558525536487832e-02, +-3.48836000380640318119e-02, +-3.39571220263849699039e-02, +-3.30212617462878818553e-02, +-3.20764607226682249563e-02, +-3.11231618859974003277e-02, +-3.01618093821427596390e-02, +-2.91928483826300218251e-02, +-2.82167248954252464221e-02, +-2.72338855763107207109e-02, +-2.62447775409285488646e-02, +-2.52498481775659533444e-02, +-2.42495449607560524530e-02, +-2.32443152657647901516e-02, +-2.22346061840382018537e-02, +-2.12208643396787077773e-02, +-2.02035357070221716080e-02, +-1.91830654293842946256e-02, +-1.81598976390459701524e-02, +-1.71344752785447841659e-02, +-1.61072399233397958729e-02, +-1.50786316059164128556e-02, +-1.40490886413957953571e-02, +-1.30190474547137412242e-02, +-1.19889424094323342185e-02, +-1.09592056382471266657e-02, +-9.93026687525074697183e-03, +-8.90255329001433948211e-03, +-7.87648932354562125724e-03, +-6.85249652618241146540e-03, +-5.83099339747908569642e-03, +-4.81239522814202146106e-03, +-3.79711394406930576734e-03, +-2.78555795254968683455e-03, +-1.77813199067227692071e-03, +-7.75236976000132386663e-04, + 2.22730140442126654798e-04, + 1.21537651881706244492e-03, + 2.20231357271108733539e-03, + 3.18315710891246220898e-03, + 4.15752746468348553799e-03, + 5.12504964248380791986e-03, + 6.08535344210042478813e-03, + 7.03807359014245199208e-03, + 7.98284986685961206465e-03, + 8.91932723024580452476e-03, + 9.84715593738785290034e-03, + 1.07659916630240357766e-02, + 1.16754956152756248638e-02, + 1.25753346485176220604e-02, + 1.34651813733560731662e-02, + 1.43447142636787781933e-02, + 1.52136177607511777904e-02, + 1.60715823743268690360e-02, + 1.69183047807457617728e-02, + 1.77534879179936204430e-02, + 1.85768410776981605925e-02, + 1.93880799940382604618e-02, + 2.01869269295435888045e-02, + 2.09731107577651766649e-02, + 2.17463670427963037812e-02, + 2.25064381156266125894e-02, + 2.32530731473125917841e-02, + 2.39860282189490944815e-02, + 2.47050663884288181082e-02, + 2.54099577539762186418e-02, + 2.61004795144461655687e-02, + 2.67764160263764816605e-02, + 2.74375588577874841845e-02, + 2.80837068387202806741e-02, + 2.87146661085097808230e-02, + 2.93302501597869115513e-02, + 2.99302798792087168533e-02, + 3.05145835849139068774e-02, + 3.10829970607048658437e-02, + 3.16353635869560598226e-02, + 3.21715339682534032240e-02, + 3.26913665577675052742e-02, + 3.31947272783659833029e-02, + 3.36814896404726560331e-02, + 3.41515347566807569990e-02, + 3.46047513531298478462e-02, + 3.50410357776568884280e-02, + 3.54602920047340924858e-02, + 3.58624316372060172875e-02, + 3.62473739048404727803e-02, + 3.66150456597097023748e-02, + 3.69653813684179058385e-02, + 3.72983231011940682964e-02, + 3.76138205178691634178e-02, + 3.79118308507581658340e-02, + 3.81923188844700278732e-02, + 3.84552569326661666804e-02, + 3.87006248117945095277e-02, + 3.89284098118221136287e-02, + 3.91386066639944005252e-02, + 3.93312175056476295842e-02, + 3.95062518421033306848e-02, + 3.96637265056755394799e-02, + 3.98036656118202977761e-02, + 3.99261005124597820326e-02, + 4.00310697465144360585e-02, + 4.01186189876763035778e-02, + 4.01888009894591641258e-02, + 4.02416755275608953313e-02, + 4.02773093395744422041e-02, + 4.02957760620868618573e-02, + 4.02971561652026855072e-02, + 4.02815368845340013304e-02, + 4.02490121506946865737e-02, + 4.01996825163432602857e-02, + 4.01336550808131173329e-02, + 4.00510434123766412284e-02, + 3.99519674681838021790e-02, + 3.98365535119223901361e-02, + 3.97049340292425986809e-02, + 3.95572476409943238340e-02, + 3.93936390143226622396e-02, + 3.92142587716682866628e-02, + 3.90192633977227906761e-02, + 3.88088151443859719070e-02, + 3.85830819337740632546e-02, + 3.83422372593309676581e-02, + 3.80864600850902706997e-02, + 3.78159347431409609275e-02, + 3.75308508293468318096e-02, + 3.72314030973733209318e-02, + 3.69177913510723085255e-02, + 3.65902203352790472701e-02, + 3.62488996250740352911e-02, + 3.58940435135636018438e-02, + 3.55258708982338911042e-02, + 3.51446051659309519066e-02, + 3.47504740765239503175e-02, + 3.43437096453047957523e-02, + 3.39245480241803926136e-02, + 3.34932293817127510471e-02, + 3.30499977820627663383e-02, + 3.25951010628938789293e-02, + 3.21287907122915217251e-02, + 3.16513217447548164674e-02, + 3.11629525763171093267e-02, + 3.06639448988514501382e-02, + 3.01545635536184866710e-02, + 2.96350764041116987446e-02, + 2.91057542082603579181e-02, + 2.85668704900414009706e-02, + 2.80187014105628129368e-02, + 2.74615256386703497637e-02, + 2.68956242211381771345e-02, + 2.63212804524964143205e-02, + 2.57387797445546746833e-02, + 2.51484094956766456030e-02, + 2.45504589598617914414e-02, + 2.39452191156906725455e-02, + 2.33329825351894608321e-02, + 2.27140432526683408443e-02, + 2.20886966335908999093e-02, + 2.14572392435271874778e-02, + 2.08199687172471933905e-02, + 2.01771836280079629178e-02, + 1.95291833570884962312e-02, + 1.88762679636269269101e-02, + 1.82187380548123403767e-02, + 1.75568946564845403124e-02, + 1.68910390841945853846e-02, + 1.62214728147774996103e-02, + 1.55484973584896369464e-02, + 1.48724141317607399387e-02, + 1.41935243306124080076e-02, + 1.35121288047925294795e-02, + 1.28285279326754275003e-02, + 1.21430214969758445281e-02, + 1.14559085613274869858e-02, + 1.07674873477713456404e-02, + 1.00780551152029641815e-02, + 9.38790803882408146641e-03, + 8.69734109064560119429e-03, + 8.00664792108640895052e-03, + 7.31612074171312902482e-03, + 6.62605020916498532735e-03, + 5.93672531030635993593e-03, + 5.24843324865020312286e-03, + 4.56145933209378684481e-03, + 3.87608686200798923521e-03, + 3.19259702372048361982e-03, + 2.51126877843176705626e-03, + 1.83237875660391988202e-03, + 1.15620115285868549186e-03, + 4.83007622422852007059e-04, +-1.86932820843070034112e-04, +-8.53353904797455329115e-04, +-1.51599219771675255281e-03, +-2.17458720530792556924e-03, +-2.82888146600037857989e-03, +-3.47862064448672828401e-03, +-4.12355362347965707925e-03, +-4.76343259365718217635e-03, +-5.39801314176371720144e-03, +-6.02705433684159932323e-03, +-6.65031881456398799024e-03, +-7.26757285964317947813e-03, +-7.87858648628854928153e-03, +-8.48313351669007821576e-03, +-9.08099165750268083608e-03, +-9.67194257431004678072e-03, +-1.02557719640449674509e-02, +-1.08322696253466653482e-02, +-1.14012295268339416271e-02, +-1.19624498732761111452e-02, +-1.25157331696445651287e-02, +-1.30608862830260651078e-02, +-1.35977205023845738180e-02, +-1.41260515961539080687e-02, +-1.46456998676501564532e-02, +-1.51564902082884610246e-02, +-1.56582521485937077588e-02, +-1.61508199069943896020e-02, +-1.66340324363880263936e-02, +-1.71077334684716746149e-02, +-1.75717715558275228149e-02, +-1.80260001117568194329e-02, +-1.84702774478586080609e-02, +-1.89044668093441003975e-02, +-1.93284364080869922042e-02, +-1.97420594534034529732e-02, +-2.01452141805614354242e-02, +-2.05377838770183090977e-02, +-2.09196569063852221004e-02, +-2.12907267301215390176e-02, +-2.16508919269584217127e-02, +-2.20000562100566773860e-02, +-2.23381284419012192399e-02, +-2.26650226469371808558e-02, +-2.29806580219539050014e-02, +-2.32849589442222955349e-02, +-2.35778549773940013234e-02, +-2.38592808751701725145e-02, +-2.41291765827496146324e-02, +-2.43874872360661625048e-02, +-2.46341631588262027774e-02, +-2.48691598573592027865e-02, +-2.50924380132932847709e-02, +-2.53039634740697960691e-02, +-2.55037072413113186098e-02, +-2.56916454570593408291e-02, +-2.58677593878966008423e-02, +-2.60320354069717534162e-02, +-2.61844649739453247395e-02, +-2.63250446128731642459e-02, +-2.64537758880496950975e-02, +-2.65706653778289558776e-02, +-2.66757246464459155111e-02, +-2.67689702138592805492e-02, +-2.68504235236379437679e-02, +-2.69201109089152179621e-02, +-2.69780635564342181898e-02, +-2.70243174687087896191e-02, +-2.70589134243261995871e-02, +-2.70818969364167577707e-02, +-2.70933182093176481986e-02, +-2.70932320934577017257e-02, +-2.70816980384915410862e-02, +-2.70587800447114543156e-02, +-2.70245466127663376554e-02, +-2.69790706917171427270e-02, +-2.69224296254590607369e-02, +-2.68547050975419879237e-02, +-2.67759830744198866481e-02, +-2.66863537471611969587e-02, +-2.65859114716531889921e-02, +-2.64747547073322930800e-02, +-2.63529859544745573285e-02, +-2.62207116900796607939e-02, +-2.60780423023825730366e-02, +-2.59250920240284947471e-02, +-2.57619788639449828760e-02, +-2.55888245379471308827e-02, +-2.54057543981124761556e-02, +-2.52128973609604678519e-02, +-2.50103858344739478359e-02, +-2.47983556439997539222e-02, +-2.45769459570643403201e-02, +-2.43462992071435090080e-02, +-2.41065610164222128564e-02, +-2.38578801175844575078e-02, +-2.36004082746693114037e-02, +-2.33343002030331689300e-02, +-2.30597134884559483436e-02, +-2.27768085054302904524e-02, +-2.24857483346725776918e-02, +-2.21866986798954189675e-02, +-2.18798277838799307138e-02, +-2.15653063438876642366e-02, +-2.12433074264517691987e-02, +-2.09140063815867055519e-02, +-2.05775807564556566243e-02, +-2.02342102085360346642e-02, +-1.98840764183222142025e-02, +-1.95273630016047500257e-02, +-1.91642554213670816832e-02, +-1.87949408993371563925e-02, +-1.84196083272362247374e-02, +-1.80384481777610752862e-02, +-1.76516524153425696797e-02, +-1.72594144067167720724e-02, +-1.68619288313498413845e-02, +-1.64593915917550098760e-02, +-1.60519997237402040069e-02, +-1.56399513066264282679e-02, +-1.52234453734734331148e-02, +-1.48026818213531103502e-02, +-1.43778613217079923037e-02, +-1.39491852308316760523e-02, +-1.35168555005115483686e-02, +-1.30810745888681710658e-02, +-1.26420453714316226301e-02, +-1.21999710524887047813e-02, +-1.17550550767402828961e-02, +-1.13075010413035727252e-02, +-1.08575126080952908542e-02, +-1.04052934166326063736e-02, +-9.95104699728536351566e-03, +-9.49497668501652312967e-03, +-9.03728553364356763933e-03, +-8.57817623065582068875e-03, +-8.11785101262214349449e-03, +-7.65651158122056946231e-03, +-7.19435901992488725798e-03, +-6.73159371137851351291e-03, +-6.26841525548942068990e-03, +-5.80502238827697216589e-03, +-5.34161290150089295564e-03, +-4.87838356310490647849e-03, +-4.41553003850264462471e-03, +-3.95324681273798422126e-03, +-3.49172711354636287548e-03, +-3.03116283534747218975e-03, +-2.57174446419663202748e-03, +-2.11366100372138449731e-03, +-1.65709990207213789248e-03, +-1.20224697991074881177e-03, +-7.49286359465203312402e-04, +-2.98400394673150758020e-04, + 1.50230397559290287587e-04, + 5.96427404960260163468e-04, + 1.04001398633389997676e-03, + 1.48081553681653948010e-03, + 1.91865955192711671630e-03, + 2.35337569038958404136e-03, + 2.78479583570576333731e-03, + 3.21275415646031688166e-03, + 3.63708716533605539573e-03, + 4.05763377682291995208e-03, + 4.47423536360066955581e-03, + 4.88673581157838838457e-03, + 5.29498157357465894235e-03, + 5.69882172162047926506e-03, + 6.09810799787139853900e-03, + 6.49269486411187517899e-03, + 6.88243954983998491859e-03, + 7.26720209891677272618e-03, + 7.64684541476874993227e-03, + 8.02123530413159993580e-03, + 8.39024051932213063565e-03, + 8.75373279902990839019e-03, + 9.11158690761618844656e-03, + 9.46368067291306243327e-03, + 9.80989502251233651264e-03, + 1.01501140185368699670e-02, + 1.04842248908878447194e-02, + 1.08121180689596009528e-02, + 1.11336872118183785596e-02, + 1.14488292368375710328e-02, + 1.17574443467867335855e-02, + 1.20594360553697797084e-02, + 1.23547112112087492664e-02, + 1.26431800202723137322e-02, + 1.29247560667452802280e-02, + 1.31993563323394361153e-02, + 1.34669012140451026943e-02, + 1.37273145403230718842e-02, + 1.39805235857388930609e-02, + 1.42264590840399576116e-02, + 1.44650552396788801418e-02, + 1.46962497377853603536e-02, + 1.49199837525900817770e-02, + 1.51362019543059365262e-02, + 1.53448525144697818512e-02, + 1.55458871097522988158e-02, + 1.57392609242401407266e-02, + 1.59249326501989980909e-02, + 1.61028644873237487822e-02, + 1.62730221404839558996e-02, + 1.64353748159745995105e-02, + 1.65898952162792344411e-02, + 1.67365595333573702330e-02, + 1.68753474404654685292e-02, + 1.70062420825228405308e-02, + 1.71292300650343690127e-02, + 1.72443014415816948948e-02, + 1.73514496998961910423e-02, + 1.74506717465267233158e-02, + 1.75419678901157470585e-02, + 1.76253418232991503067e-02, + 1.77008006032431768062e-02, + 1.77683546308354950449e-02, + 1.78280176285450023266e-02, + 1.78798066169677284665e-02, + 1.79237418900749095885e-02, + 1.79598469891815541721e-02, + 1.79881486756524357207e-02, + 1.80086769023645003329e-02, + 1.80214647839439801036e-02, + 1.80265485657978320744e-02, + 1.80239675919585257136e-02, + 1.80137642717629609113e-02, + 1.79959840453853894826e-02, + 1.79706753482452019632e-02, + 1.79378895743111561878e-02, + 1.78976810383233188306e-02, + 1.78501069369546815080e-02, + 1.77952273089348571300e-02, + 1.77331049941585293384e-02, + 1.76638055918014250101e-02, + 1.75873974174670689996e-02, + 1.75039514593883366311e-02, + 1.74135413337067820883e-02, + 1.73162432388551425222e-02, + 1.72121359090659648006e-02, + 1.71013005670323306462e-02, + 1.69838208757447130248e-02, + 1.68597828895295613616e-02, + 1.67292750043147309125e-02, + 1.65923879071472879509e-02, + 1.64492145249898746862e-02, + 1.62998499728209574056e-02, + 1.61443915010654574782e-02, + 1.59829384423819872985e-02, + 1.58155921578329479449e-02, + 1.56424559824643004402e-02, + 1.54636351703211580993e-02, + 1.52792368389266484952e-02, + 1.50893699132506348831e-02, + 1.48941450691946284529e-02, + 1.46936746766213478105e-02, + 1.44880727419542387757e-02, + 1.42774548503756936596e-02, + 1.40619381076500047506e-02, + 1.38416410815988405458e-02, + 1.36166837432563775367e-02, + 1.33871874077307433104e-02, + 1.31532746747999255282e-02, + 1.29150693692685249875e-02, + 1.26726964811125480254e-02, + 1.24262821054400597609e-02, + 1.21759533822933443264e-02, + 1.19218384363212748234e-02, + 1.16640663163469111840e-02, + 1.14027669348586990772e-02, + 1.11380710074510391738e-02, + 1.08701099922405512027e-02, + 1.05990160292857588803e-02, + 1.03249218800347264402e-02, + 1.00479608668283364181e-02, + 9.76826681248407595326e-03, + 9.48597397998680001707e-03, + 9.20121701231205180171e-03, + 8.91413087240663405686e-03, + 8.62485078335300560382e-03, + 8.33351216874106057175e-03, + 8.04025059327335284154e-03, + 7.74520170362733365033e-03, + 7.44850116959968472363e-03, + 7.15028462555652392224e-03, + 6.85068761221313375642e-03, + 6.54984551876693164157e-03, + 6.24789352540736173808e-03, + 5.94496654622468298501e-03, + 5.64119917254172174859e-03, + 5.33672561668945780872e-03, + 5.03167965625017643561e-03, + 4.72619457878821046942e-03, + 4.42040312709122713147e-03, + 4.11443744494245557813e-03, + 3.80842902344421868274e-03, + 3.50250864791438413365e-03, + 3.19680634537424174582e-03, + 2.89145133264915015631e-03, + 2.58657196509964968506e-03, + 2.28229568600325869593e-03, + 1.97874897660506266980e-03, + 1.67605730685465247574e-03, + 1.37434508684857771554e-03, + 1.07373561899400072825e-03, + 7.74351050912206037222e-04, + 4.76312329096932108620e-04, + 1.79739153344913828647e-04, +-1.15250068026150436743e-04, +-4.08538262157430215240e-04, +-7.00009734810518881830e-04, +-9.89550212697529359140e-04, +-1.27704688496522110984e-03, +-1.56238844381914230262e-03, +-1.84546512427596291067e-03, +-2.12616874302977649017e-03, +-2.40439273642179809562e-03, +-2.68003219750039467159e-03, +-2.95298391216083011210e-03, +-3.22314639435426720723e-03, +-3.49041992035452591087e-03, +-3.75470656207426648626e-03, +-4.01591021941965966441e-03, +-4.27393665167596914500e-03, +-4.52869350791463860101e-03, +-4.78009035641408387002e-03, +-5.02803871308742881402e-03, +-5.27245206890878791856e-03, +-5.51324591633307794364e-03, +-5.75033777470175880286e-03, +-5.98364721463032038506e-03, +-6.21309588137129026331e-03, +-6.43860751714846711591e-03, +-6.66010798245885143193e-03, +-6.87752527633716734257e-03, +-7.09078955558135361203e-03, +-7.29983315293484570641e-03, +-7.50459059422442856246e-03, +-7.70499861445137022159e-03, +-7.90099617283428028169e-03, +-8.09252446680348673513e-03, +-8.27952694494581836748e-03, +-8.46194931890021165288e-03, +-8.63973957420479179992e-03, +-8.81284798009584514900e-03, +-8.98122709826090423468e-03, +-9.14483179054685624276e-03, +-9.30361922562642808254e-03, +-9.45754888462495800494e-03, +-9.60658256571109842037e-03, +-9.75068438765514661215e-03, +-9.88982079235872779677e-03, +-1.00239605463608785763e-02, +-1.01530747413246837108e-02, +-1.02771367935108499936e-02, +-1.03961224422430293518e-02, +-1.05100097473716045521e-02, +-1.06187790857425311958e-02, +-1.07224131466778661165e-02, +-1.08208969264758890494e-02, +-1.09142177219381259629e-02, +-1.10023651229317290939e-02, +-1.10853310039956218930e-02, +-1.11631095149994884197e-02, +-1.12356970708646971419e-02, +-1.13030923403568215463e-02, +-1.13652962339602110059e-02, +-1.14223118908440956359e-02, +-1.14741446649318026840e-02, +-1.15208021100836454503e-02, +-1.15622939644049946284e-02, +-1.15986321336910645080e-02, +-1.16298306740207010868e-02, +-1.16559057735113307669e-02, +-1.16768757332475214827e-02, +-1.16927609473963332182e-02, +-1.17035838825226608945e-02, +-1.17093690561177760784e-02, +-1.17101430143551586693e-02, +-1.17059343090872795129e-02, +-1.16967734740980097013e-02, +-1.16826930006248379257e-02, +-1.16637273121658596037e-02, +-1.16399127385864407935e-02, +-1.16112874895409699111e-02, +-1.15778916272246922003e-02, +-1.15397670384720374415e-02, +-1.14969574062164479888e-02, +-1.14495081803284975280e-02, +-1.13974665478479546959e-02, +-1.13408814026266253211e-02, +-1.12798033143984600957e-02, +-1.12142844972935168402e-02, +-1.11443787778127377519e-02, +-1.10701415622809114236e-02, +-1.09916298037944538957e-02, +-1.09089019686816925125e-02, +-1.08220180024931385970e-02, +-1.07310392955389764802e-02, +-1.06360286479915983754e-02, +-1.05370502345710423397e-02, +-1.04341695688310136247e-02, +-1.03274534670632443106e-02, +-1.02169700118386209270e-02, +-1.01027885152025192345e-02, +-9.98497948154308812008e-03, +-9.86361457015006402871e-03, +-9.73876655748246930488e-03, +-9.61050929916365190286e-03, +-9.47891769172138146105e-03, +-9.34406763409175583623e-03, +-9.20603598890469380922e-03, +-9.06490054356958417647e-03, +-8.92073997117914622990e-03, +-8.77363379124968326139e-03, +-8.62366233031589164704e-03, +-8.47090668239862398803e-03, +-8.31544866936306283078e-03, +-8.15737080118616487978e-03, +-7.99675623615058242533e-03, +-7.83368874098351944402e-03, +-7.66825265095798756787e-03, +-7.50053282997436773782e-03, +-7.33061463064018075525e-03, +-7.15858385436481461928e-03, +-6.98452671148786126409e-03, +-6.80852978145714965441e-03, +-6.63067997307481386826e-03, +-6.45106448482760802543e-03, +-6.26977076531890029770e-03, +-6.08688647381931853542e-03, +-5.90249944095203298716e-03, +-5.71669762953000513278e-03, +-5.52956909556100162373e-03, +-5.34120194943696596085e-03, +-5.15168431732329797079e-03, +-4.96110430276443595266e-03, +-4.76954994852103134756e-03, +-4.57710919865432410564e-03, +-4.38386986087277181340e-03, +-4.18991956915663876782e-03, +-3.99534574667439676410e-03, +-3.80023556900675307108e-03, +-3.60467592769156538676e-03, +-3.40875339410503987864e-03, +-3.21255418369197943973e-03, +-3.01616412055992575564e-03, +-2.81966860245005685598e-03, +-2.62315256609809257030e-03, +-2.42670045299875130826e-03, +-2.23039617558575898118e-03, +-2.03432308384080993632e-03, +-1.83856393234277533909e-03, +-1.64320084776991355742e-03, +-1.44831529686655904529e-03, +-1.25398805488530435195e-03, +-1.06029917451672204415e-03, +-8.67327955316482155854e-04, +-6.75152913641518712638e-04, +-4.83851753104545291573e-04, +-2.93501335557769932588e-04, +-1.04177652615230481180e-04, + 8.40442022771478958144e-05, + 2.71090061213828637746e-04, + 4.56886708636217294885e-04, + 6.41361907564611910364e-04, + 8.24444425246958221068e-04, + 1.00606405821750295726e-03, + 1.18615165675600578790e-03, + 1.36463914874257485378e-03, + 1.54145956289825905236e-03, + 1.71654705140769636706e-03, + 1.88983691191461173828e-03, + 2.06126560888645086675e-03, + 2.23077079434063144103e-03, + 2.39829132792830895110e-03, + 2.56376729636941056573e-03, + 2.72714003223500402184e-03, + 2.88835213207216685155e-03, + 3.04734747386685260462e-03, + 3.20407123384176817371e-03, + 3.35846990258462183704e-03, + 3.51049130050470068257e-03, + 3.66008459261367522647e-03, + 3.80720030262936314294e-03, + 3.95179032639856198800e-03, + 4.09380794463911311387e-03, + 4.23320783499702736619e-03, + 4.36994608342004212803e-03, + 4.50398019484403704799e-03, + 4.63526910319382156461e-03, + 4.76377318069614620610e-03, + 4.88945424650618146178e-03, + 5.01227557464674778470e-03, + 5.13220190126144337750e-03, + 5.24919943118207308480e-03, + 5.36323584381190321402e-03, + 5.47428029832571112767e-03, + 5.58230343818897148389e-03, + 5.68727739499729628703e-03, + 5.78917579163970574818e-03, + 5.88797374478673089110e-03, + 5.98364786670789981782e-03, + 6.07617626642060343345e-03, + 6.16553855017385084303e-03, + 6.25171582127166582804e-03, + 6.33469067923863194541e-03, + 6.41444721833308011821e-03, + 6.49097102541174898749e-03, + 6.56424917715103632687e-03, + 6.63427023662958338657e-03, + 6.70102424927795491810e-03, + 6.76450273820044644529e-03, + 6.82469869887525251023e-03, + 6.88160659323871527759e-03, + 6.93522234316026366108e-03, + 6.98554332331408935064e-03, + 7.03256835345506155222e-03, + 7.07629769010476809138e-03, + 7.11673301765615093362e-03, + 7.15387743890304877992e-03, + 7.18773546500291789924e-03, + 7.21831300488032408247e-03, + 7.24561735407938580650e-03, + 7.26965718307318129604e-03, + 7.29044252503875406940e-03, + 7.30798476310635155423e-03, + 7.32229661709144288850e-03, + 7.33339212971884264747e-03, + 7.34128665234775375920e-03, + 7.34599683020745793799e-03, + 7.34754058715258225737e-03, + 7.34593710994830336597e-03, + 7.34120683209452638829e-03, + 7.33337141719967496728e-03, + 7.32245374191355016119e-03, + 7.30847787843014878861e-03, + 7.29146907657012011139e-03, + 7.27145374545387114529e-03, + 7.24845943477565521351e-03, + 7.22251481568945107037e-03, + 7.19364966131744686118e-03, + 7.16189482689201083881e-03, + 7.12728222954231872138e-03, + 7.08984482773655864257e-03, + 7.04961660039112210374e-03, + 7.00663252565801673161e-03, + 6.96092855940177307472e-03, + 6.91254161337735619636e-03, + 6.86150953312070904788e-03, + 6.80787107556324582597e-03, + 6.75166588638215301593e-03, + 6.69293447709806265528e-03, + 6.63171820193170571955e-03, + 6.56805923443159328512e-03, + 6.50200054388410785683e-03, + 6.43358587151825807998e-03, + 6.36285970651646794888e-03, + 6.28986726184373092646e-03, + 6.21465444990643503531e-03, + 6.13726785805332464285e-03, + 6.05775472392990760317e-03, + 5.97616291069856791357e-03, + 5.89254088213594148099e-03, + 5.80693767761965816410e-03, + 5.71940288701587758180e-03, + 5.62998662548002196115e-03, + 5.53873950818146131014e-03, + 5.44571262496510149348e-03, + 5.35095751496040238082e-03, + 5.25452614115022934027e-03, + 5.15647086491062122543e-03, + 5.05684442053339500839e-03, + 4.95569988974256699088e-03, + 4.85309067621648645985e-03, + 4.74907048012647350216e-03, + 4.64369327270371719946e-03, + 4.53701327084515566163e-03, + 4.42908491176951992635e-03, + 4.31996282773485212186e-03, + 4.20970182082771107734e-03, + 4.09835683783572966160e-03, + 3.98598294521311340144e-03, + 3.87263530415101094040e-03, + 3.75836914576165720403e-03, + 3.64323974638825019007e-03, + 3.52730240304928790995e-03, + 3.41061240902878646739e-03, + 3.29322502962129748730e-03, + 3.17519547804233142826e-03, + 3.05657889151338601694e-03, + 2.93743030753160130203e-03, + 2.81780464033296821486e-03, + 2.69775665755896121301e-03, + 2.57734095713514719389e-03, + 2.45661194437134461702e-03, + 2.33562380929147129019e-03, + 2.21443050420279223534e-03, + 2.09308572151161147862e-03, + 1.97164287179554201940e-03, + 1.85015506213867531038e-03, + 1.72867507473943343883e-03, + 1.60725534579748128607e-03, + 1.48594794468843234732e-03, + 1.36480455343317803527e-03, + 1.24387644646943291808e-03, + 1.12321447073277739387e-03, + 1.00286902605367005473e-03, + 8.82890045877847201225e-04, + 7.63326978315998568199e-04, + 6.44228767529792380013e-04, + 5.25643835459782418976e-04, + 4.07620063901896608968e-04, + 2.90204776937506045247e-04, + 1.73444723723805766706e-04, + 5.73860616484244659592e-05, +-5.79256601447129809831e-05, +-1.72445516855139978872e-04, +-2.86129223744603178401e-04, +-3.98933151471683798521e-04, +-5.10814341036775051638e-04, +-6.21730518333987194034e-04, +-7.31640108305292775383e-04, +-8.40502248693749103720e-04, +-9.48276803391555388537e-04, +-1.05492437538016840815e-03, +-1.16040631925863960139e-03, +-1.26468475335793167046e-03, +-1.36772257143744795961e-03, +-1.46948345396231690001e-03, +-1.56993187895820992227e-03, +-1.66903313244173671925e-03, +-1.76675331842487395514e-03, +-1.86305936849075486246e-03, +-1.95791905094055886799e-03, +-2.05130097950870097026e-03, +-2.14317462164644121497e-03, +-2.23351030637205421117e-03, +-2.32227923168745655630e-03, +-2.40945347156019864382e-03, +-2.49500598247101752769e-03, +-2.57891060952624437755e-03, +-2.66114209213571661222e-03, +-2.74167606925580006200e-03, +-2.82048908419860059130e-03, +-2.89755858900738426376e-03, +-2.97286294839969704451e-03, +-3.04638144327833843006e-03, +-3.11809427381250833106e-03, +-3.18798256208930414976e-03, +-3.25602835433819615824e-03, +-3.32221462272949338845e-03, +-3.38652526674922864716e-03, +-3.44894511415224942069e-03, +-3.50945992149601917673e-03, +-3.56805637425754813494e-03, +-3.62472208653601482564e-03, +-3.67944560034401835918e-03, +-3.73221638449032109761e-03, +-3.78302483305743104600e-03, +-3.83186226347697993233e-03, +-3.87872091420681094562e-03, +-3.92359394201303914723e-03, +-3.96647541886111301701e-03, +-4.00736032841956212047e-03, +-4.04624456218095809173e-03, +-4.08312491520368761599e-03, +-4.11799908147960237043e-03, +-4.15086564893147550587e-03, +-4.18172409404541419592e-03, +-4.21057477614258761356e-03, +-4.23741893129556731340e-03, +-4.26225866589410255086e-03, +-4.28509694986558761776e-03, +-4.30593760955555893838e-03, +-4.32478532027361865092e-03, +-4.34164559851025946141e-03, +-4.35652479383043678834e-03, +-4.36943008044940375129e-03, +-4.38036944849687272935e-03, +-4.38935169497548655082e-03, +-4.39638641441941844384e-03, +-4.40148398925969356471e-03, +-4.40465557990201740657e-03, +-4.40591311452397972614e-03, +-4.40526927859759102890e-03, +-4.40273750414399336200e-03, +-4.39833195872687317957e-03, +-4.39206753419116562726e-03, +-4.38395983515392842489e-03, +-4.37402516725410826781e-03, +-4.36228052516814471251e-03, +-4.34874358039834783829e-03, +-4.33343266884099378305e-03, +-4.31636677814128347924e-03, +-4.29756553484226828249e-03, +-4.27704919133478460302e-03, +-4.25483861261575103258e-03, +-4.23095526286197242544e-03, +-4.20542119182673330285e-03, +-4.17825902106652539991e-03, +-4.14949193000528453179e-03, +-4.11914364184333848390e-03, +-4.08723840931864319803e-03, +-4.05380100032764340012e-03, +-4.01885668341308427420e-03, +-3.98243121312639048598e-03, +-3.94455081527187324114e-03, +-3.90524217204034265055e-03, +-3.86453240703949710971e-03, +-3.82244907022857112119e-03, +-3.77902012276458334344e-03, +-3.73427392176791782957e-03, +-3.68823920501411533363e-03, +-3.64094507555994461798e-03, +-3.59242098631046497328e-03, +-3.54269672453505143905e-03, +-3.49180239633924225512e-03, +-3.43976841109999795926e-03, +-3.38662546587152699790e-03, +-3.33240452976901182711e-03, +-3.27713682833726460339e-03, +-3.22085382791172753977e-03, +-3.16358721997866921757e-03, +-3.10536890554190866259e-03, +-3.04623097950279270868e-03, +-2.98620571506079835605e-03, +-2.92532554814109750294e-03, +-2.86362306185669341502e-03, +-2.80113097101106212072e-03, +-2.73788210664884781517e-03, +-2.67390940066071719841e-03, +-2.60924587044905360173e-03, +-2.54392460366138209102e-03, +-2.47797874299740972931e-03, +-2.41144147109654920225e-03, +-2.34434599551184728525e-03, +-2.27672553377682423265e-03, +-2.20861329857108918892e-03, +-2.14004248299099744321e-03, +-2.07104624593109319652e-03, +-2.00165769758243626206e-03, +-1.93190988505322330110e-03, +-1.86183577811795423693e-03, +-1.79146825509988766485e-03, +-1.72084008889326943795e-03, +-1.64998393312966343087e-03, +-1.57893230849462818527e-03, +-1.50771758919912264932e-03, +-1.43637198961127387532e-03, +-1.36492755105304883201e-03, +-1.29341612876705033125e-03, +-1.22186937905778840625e-03, +-1.15031874661246304344e-03, +-1.07879545200534983015e-03, +-1.00733047939059738862e-03, +-9.35954564387392199190e-04, +-8.64698182161781326270e-04, +-7.93591535709335898878e-04, +-7.22664544342259342231e-04, +-6.51946832385152269008e-04, +-5.81467718082645003419e-04, +-5.11256202723101406751e-04, +-4.41340959980976682391e-04, +-3.71750325482115011495e-04, +-3.02512286594312090893e-04, +-2.33654472446860898751e-04, +-1.65204144181543805632e-04, +-9.71881854382950145007e-05, +-2.96330930778333087529e-05, + 3.74350318557888840534e-05, + 1.03990492930665522531e-04, + 1.70008006877860913661e-04, + 2.35462711895771908792e-04, + 3.00330175705594570618e-04, + 3.64586403356421419591e-04, + 4.28207844777551787079e-04, + 4.91171402077186748311e-04, + 5.53454436585029511952e-04, + 6.15034775638214118408e-04, + 6.75890719108685204992e-04, + 7.36001045671158494674e-04, + 7.95345018810736208159e-04, + 8.53902392568785988461e-04, + 9.11653417026953884206e-04, + 9.68578843528107927274e-04, + 1.02465992963409239201e-03, + 1.07987844381954517861e-03, + 1.13421666990184857697e-03, + 1.18765741120669863183e-03, + 1.24018399446962118877e-03, + 1.29178027347317181048e-03, + 1.34243063242041153760e-03, + 1.39211998904448393775e-03, + 1.44083379745542361494e-03, + 1.48855805072399061464e-03, + 1.53527928320389963832e-03, + 1.58098457259274222282e-03, + 1.62566154173287799080e-03, + 1.66929836015300469068e-03, + 1.71188374535185877309e-03, + 1.75340696382495094506e-03, + 1.79385783183615881223e-03, + 1.83322671593499951850e-03, + 1.87150453322187351919e-03, + 1.90868275136241117781e-03, + 1.94475338835288632730e-03, + 1.97970901203875114180e-03, + 2.01354273938795765367e-03, + 2.04624823552140497340e-03, + 2.07781971250251560127e-03, + 2.10825192788842950831e-03, + 2.13754018304492627786e-03, + 2.16568032122775241954e-03, + 2.19266872543273649843e-03, + 2.21850231601753312277e-03, + 2.24317854809751244041e-03, + 2.26669540871874157159e-03, + 2.28905141381085521987e-03, + 2.31024560492300908704e-03, + 2.33027754574556848419e-03, + 2.34914731842113299123e-03, + 2.36685551964774167771e-03, + 2.38340325657774047483e-03, + 2.39879214251553785076e-03, + 2.41302429241780800814e-03, + 2.42610231819949092105e-03, + 2.43802932384921434983e-03, + 2.44880890035772524199e-03, + 2.45844512046309356806e-03, + 2.46694253321619750424e-03, + 2.47430615837057783779e-03, + 2.48054148060029584083e-03, + 2.48565444354972896537e-03, + 2.48965144371932805070e-03, + 2.49253932419119233338e-03, + 2.49432536819870756192e-03, + 2.49501729254406187306e-03, + 2.49462324086802481049e-03, + 2.49315177677595679884e-03, + 2.49061187682437026880e-03, + 2.48701292337218105022e-03, + 2.48236469730101589823e-03, + 2.47667737060877201499e-03, + 2.46996149888082565729e-03, + 2.46222801364318543901e-03, + 2.45348821460201170497e-03, + 2.44375376177385136151e-03, + 2.43303666751100867299e-03, + 2.42134928842652587602e-03, + 2.40870431722312039469e-03, + 2.39511477443066006163e-03, + 2.38059400005651662299e-03, + 2.36515564515335941637e-03, + 2.34881366330883401689e-03, + 2.33158230206161314751e-03, + 2.31347609424828503169e-03, + 2.29450984928561332182e-03, + 2.27469864439260342423e-03, + 2.25405781575686164908e-03, + 2.23260294964972971082e-03, + 2.21034987349466626252e-03, + 2.18731464689328946802e-03, + 2.16351355261355186160e-03, + 2.13896308754443764677e-03, + 2.11367995362164717843e-03, + 2.08768104872860673846e-03, + 2.06098345757712827012e-03, + 2.03360444257223585765e-03, + 2.00556143466523338278e-03, + 1.97687202419953838434e-03, + 1.94755395175337346625e-03, + 1.91762509898370150235e-03, + 1.88710347947544372464e-03, + 1.85600722960030926380e-03, + 1.82435459938927956557e-03, + 1.79216394342290039413e-03, + 1.75945371174334418141e-03, + 1.72624244079242210488e-03, + 1.69254874437936271916e-03, + 1.65839130468247841071e-03, + 1.62378886328829906069e-03, + 1.58876021227249563002e-03, + 1.55332418532590395277e-03, + 1.51749964892962602506e-03, + 1.48130549358308134279e-03, + 1.44476062508820820261e-03, + 1.40788395589385340219e-03, + 1.37069439650360901800e-03, + 1.33321084695073701146e-03, + 1.29545218834344489506e-03, + 1.25743727448406820806e-03, + 1.21918492356532437090e-03, + 1.18071390994699786103e-03, + 1.14204295601606406994e-03, + 1.10319072413361980722e-03, + 1.06417580867146756643e-03, + 1.02501672814153568618e-03, + 9.85731917420752321024e-04, + 9.46339720074761028661e-04, + 9.06858380782653099826e-04, + 8.67306037865940180828e-04, + 8.27700715924154601863e-04, + 7.88060318579825755218e-04, + 7.48402621335140681366e-04, + 7.08745264542995573667e-04, + 6.69105746494616255432e-04, + 6.29501416626196083105e-04, + 5.89949468846577432593e-04, + 5.50466934988384673337e-04, + 5.11070678384569518186e-04, + 4.71777387572266644969e-04, + 4.32603570126133903009e-04, + 3.93565546622840108093e-04, + 3.54679444738640930936e-04, + 3.15961193481461178213e-04, + 2.77426517559644606348e-04, + 2.39090931888283949464e-04, + 2.00969736235134577339e-04, + 1.63078010007227617185e-04, + 1.25430607179671989044e-04, + 8.80421513676910678318e-05, + 5.09270310433270975443e-05, + 1.40993948977051206995e-05, +-2.24268526499689963992e-05, +-5.86380557959355767418e-05, +-9.45208115468090933828e-05, +-1.30061973765318488264e-04, +-1.65248657065980185041e-04, +-2.00068240560348736649e-04, +-2.34508371450769772170e-04, +-2.68556968472767403858e-04, +-3.02202225185153135114e-04, +-3.35432613107714699702e-04, +-3.68236884706315019053e-04, +-4.00604076224976460123e-04, +-4.32523510365022737217e-04, +-4.63984798811095579957e-04, +-4.94977844604242624843e-04, +-5.25492844361963827582e-04, +-5.55520290345540247376e-04, +-5.85050972374773735341e-04, +-6.14075979590610184985e-04, +-6.42586702065795259929e-04, +-6.70574832264203037069e-04, +-6.98032366349193725621e-04, +-7.24951605341828033552e-04, +-7.51325156129156322866e-04, +-7.77145932323820387393e-04, +-8.02407154975299293648e-04, +-8.27102353133903219450e-04, +-8.51225364268258727699e-04, +-8.74770334537431802288e-04, +-8.97731718918501797773e-04, +-9.20104281190827605862e-04, +-9.41883093778050233848e-04, +-9.63063537449165905750e-04, +-9.83641300879760935652e-04, +-1.00361238007481306557e-03, +-1.02297307765449128208e-03, +-1.04172000200423238610e-03, +-1.05985006629069969386e-03, +-1.07736048734502422482e-03, +-1.09424878441514257174e-03, +-1.11051277778848088776e-03, +-1.12615058728708443934e-03, +-1.14116063063659394818e-03, +-1.15554162171100749217e-03, +-1.16929256865495575027e-03, +-1.18241277188544584124e-03, +-1.19490182197486941203e-03, +-1.20675959741726535404e-03, +-1.21798626227982297217e-03, +-1.22858226374166065384e-03, +-1.23854832952187280184e-03, +-1.24788546519901061629e-03, +-1.25659495142406364872e-03, +-1.26467834102919943727e-03, +-1.27213745603428412742e-03, +-1.27897438455362244883e-03, +-1.28519147760499177768e-03, +-1.29079134582336268501e-03, +-1.29577685608154116216e-03, +-1.30015112802015094483e-03, +-1.30391753048923449490e-03, +-1.30707967790388737521e-03, +-1.30964142651636395419e-03, +-1.31160687060702277167e-03, +-1.31298033859659005196e-03, +-1.31376638908218385492e-03, +-1.31396980679961724973e-03, +-1.31359559851441281067e-03, +-1.31264898884408520024e-03, +-1.31113541601419526274e-03, +-1.30906052755070225271e-03, +-1.30643017591116055581e-03, +-1.30325041405731484843e-03, +-1.29952749097163636725e-03, +-1.29526784712039586857e-03, +-1.29047810986578645812e-03, +-1.28516508882973415524e-03, +-1.27933577121191956356e-03, +-1.27299731706460124078e-03, +-1.26615705452684046764e-03, +-1.25882247502064623448e-03, +-1.25100122841167137044e-03, +-1.24270111813698665680e-03, +-1.23393009630251375940e-03, +-1.22469625875265661526e-03, +-1.21500784011470538623e-03, +-1.20487320882053006339e-03, +-1.19430086210808427544e-03, +-1.18329942100529298017e-03, +-1.17187762529875026674e-03, +-1.16004432848981092231e-03, +-1.14780849274044756403e-03, +-1.13517918381147498753e-03, +-1.12216556599544479457e-03, +-1.10877689704675665670e-03, +-1.09502252311132830878e-03, +-1.08091187365826806380e-03, +-1.06645445641585442931e-03, +-1.05165985231426076241e-03, +-1.03653771043727446592e-03, +-1.02109774298538512859e-03, +-1.00534972025243104707e-03, +-9.89303465618205854493e-04, +-9.72968850559070386023e-04, +-9.56355789678956110487e-04, +-9.39474235762757228438e-04, +-9.22334174854466432199e-04, +-9.04945621361946477522e-04, +-8.87318613190598128385e-04, +-8.69463206907894578697e-04, +-8.51389472940857513876e-04, +-8.33107490808391681729e-04, +-8.14627344390523211622e-04, +-7.95959117236444131487e-04, +-7.77112887913182157074e-04, +-7.58098725396869001399e-04, +-7.38926684508335205812e-04, +-7.19606801394884719458e-04, +-7.00149089059903611230e-04, +-6.80563532942129469604e-04, +-6.60860086546161931871e-04, +-6.41048667125920334890e-04, +-6.21139151422514545521e-04, +-6.01141371458319205383e-04, +-5.81065110388481308873e-04, +-5.60920098411564179222e-04, +-5.40716008740645473485e-04, +-5.20462453636329636791e-04, +-5.00168980502928035153e-04, +-4.79845068049252442000e-04, +-4.59500122515179752151e-04, +-4.39143473965308969373e-04, +-4.18784372650737749064e-04, +-3.98431985440370181519e-04, +-3.78095392322528038760e-04, +-3.57783582978218623466e-04, +-3.37505453426840712917e-04, +-3.17269802745462131330e-04, +-2.97085329862539673351e-04, +-2.76960630426857884294e-04, +-2.56904193752789059696e-04, +-2.36924399842341755311e-04, +-2.17029516485020210204e-04, +-1.97227696436049984184e-04, +-1.77526974673721080374e-04, +-1.57935265736364822877e-04, +-1.38460361139671443579e-04, +-1.19109926874780676581e-04, +-9.98915009877096604120e-05, +-8.08124912404658787314e-05, +-6.18801728543761411219e-05, +-4.31016863358901726119e-05, +-2.44840353852607290751e-05, +-6.03408488822807525549e-06, + 1.22414410087942923482e-05, + 3.03359607401630166279e-05, + 4.82430370786643698930e-05, + 6.59563788094303331657e-05, + 8.34698423199615796228e-05, + 1.00777433106333784039e-04, + 1.17873307195481496850e-04, + 1.34751772483674884346e-04, + 1.51407289991337552218e-04, + 1.67834475034225882872e-04, + 1.84028098311239825778e-04, + 1.99983086909011169297e-04, + 2.15694525223608961004e-04, + 2.31157655799539194473e-04, + 2.46367880086458945071e-04, + 2.61320759113890506518e-04, + 2.76012014084471178285e-04, + 2.90437526885940853344e-04, + 3.04593340522622661477e-04, + 3.18475659466672001308e-04, + 3.32080849929764377465e-04, + 3.45405440055728798956e-04, + 3.58446120034815369788e-04, + 3.71199742140139986053e-04, + 3.83663320687053425832e-04, + 3.95834031916090828447e-04, + 4.07709213800306149479e-04, + 4.19286365777668133727e-04, + 4.30563148409382728376e-04, + 4.41537382964913725693e-04, + 4.52207050934656925797e-04, + 4.62570293470961546242e-04, + 4.72625410758635230730e-04, + 4.82370861315684551149e-04, + 4.91805261225328150740e-04, + 5.00927383300294468485e-04, + 5.09736156180340470138e-04, + 5.18230663364083014855e-04, + 5.26410142176160977465e-04, + 5.34273982670858136115e-04, + 5.41821726473215733132e-04, + 5.49053065558819199977e-04, + 5.55967840973343140065e-04, + 5.62566041493084596781e-04, + 5.68847802227587348751e-04, + 5.74813403165606124842e-04, + 5.80463267665585255090e-04, + 5.85797960891953992807e-04, + 5.90818188198352634011e-04, + 5.95524793459205619046e-04, + 5.99918757350793364382e-04, + 6.04001195583171897330e-04, + 6.07773357084216074402e-04, + 6.11236622137123529822e-04, + 6.14392500472671181100e-04, + 6.17242629317575641247e-04, + 6.19788771400296852575e-04, + 6.22032812915646266330e-04, + 6.23976761449542352556e-04, + 6.25622743865282679096e-04, + 6.26973004152734866845e-04, + 6.28029901241785953013e-04, + 6.28795906781460817864e-04, + 6.29273602886090081127e-04, + 6.29465679849935955126e-04, + 6.29374933831637162034e-04, + 6.29004264509917614644e-04, + 6.28356672711923979618e-04, + 6.27435258015602670238e-04, + 6.26243216327530610385e-04, + 6.24783837437580067548e-04, + 6.23060502551831571320e-04, + 6.21076681805128117189e-04, + 6.18835931754663313292e-04, + 6.16341892855999597296e-04, + 6.13598286922899423257e-04, + 6.10608914572360016171e-04, + 6.07377652656219848941e-04, + 6.03908451680720608987e-04, + 6.00205333215381750360e-04, + 5.96272387292547546150e-04, + 5.92113769798962869678e-04, + 5.87733699860716260477e-04, + 5.83136457222883410056e-04, + 5.78326379625196070923e-04, + 5.73307860175058681823e-04, + 5.68085344719199331932e-04, + 5.62663329215264671791e-04, + 5.57046357104629347515e-04, + 5.51239016687691835844e-04, + 5.45245938502918582949e-04, + 5.39071792710859535452e-04, + 5.32721286484389919269e-04, + 5.26199161406370888652e-04, + 5.19510190875949965511e-04, + 5.12659177524647379116e-04, + 5.05650950643461694588e-04, + 4.98490363622070692395e-04, + 4.91182291401325650700e-04, + 4.83731627940122419548e-04, + 4.76143283697776802978e-04, + 4.68422183132952726740e-04, + 4.60573262220249240485e-04, + 4.52601465985464203410e-04, + 4.44511746060588389465e-04, + 4.36309058259498746754e-04, + 4.27998360175392566791e-04, + 4.19584608800889610671e-04, + 4.11072758171783069880e-04, + 4.02467757035333936928e-04, + 3.93774546544049656484e-04, + 3.84998057975832470683e-04, + 3.76143210481313700240e-04, + 3.67214908859312392543e-04, + 3.58218041361136620669e-04, + 3.49157477524604336044e-04, + 3.40038066038525694287e-04, + 3.30864632638427479810e-04, + 3.21641978034209344382e-04, + 3.12374875870502510550e-04, + 3.03068070720368721877e-04, + 2.93726276113044930307e-04, + 2.84354172596324122988e-04, + 2.74956405834251703824e-04, + 2.65537584740686090270e-04, + 2.56102279649332684359e-04, + 2.46655020520732712157e-04, + 2.37200295186851598233e-04, + 2.27742547633623577692e-04, + 2.18286176322046336163e-04, + 2.08835532548216017655e-04, + 1.99394918842769620351e-04, + 1.89968587410093434423e-04, + 1.80560738607737464008e-04, + 1.71175519466368710516e-04, + 1.61817022250571095152e-04, + 1.52489283060860649410e-04, + 1.43196280477158617963e-04, + 1.33941934244020521144e-04, + 1.24730103997818122337e-04, + 1.15564588036148766046e-04, + 1.06449122129624024050e-04, + 9.73873783762444747338e-05, + 8.83829640984437603628e-05, + 7.94394207830501368397e-05, + 7.05602230641164422306e-05, + 6.17487777488439845697e-05, + 5.30084228865277819307e-05, + 4.43424268807018922721e-05, + 3.57539876443504868529e-05, + 2.72462317982963840894e-05, + 1.88222139126731892130e-05, + 1.04849157914673770899e-05, + 2.23724580001398245952e-06, +-5.91796176458841909860e-06, +-1.39779472603022615363e-05, +-2.19400262443108254274e-05, +-2.98015899747312779436e-05, +-3.75601058699388188874e-05, +-4.52131179258346812058e-05, +-5.27582470911579511194e-05, +-6.01931916011169823111e-05, +-6.75157272696155086192e-05, +-7.47237077402686759994e-05, +-8.18150646965978259242e-05, +-8.87878080315813176041e-05, +-9.56400259770174112402e-05, +-1.02369885192932295447e-04, +-1.08975630817447491838e-04, +-1.15455586477445233109e-04, +-1.21808154260462635915e-04, +-1.28031814648165977134e-04, +-1.34125126411867404445e-04, +-1.40086726470483718130e-04, +-1.45915329711446663599e-04, +-1.51609728774925367391e-04, +-1.57168793801964925671e-04, +-1.62591472146915872604e-04, +-1.67876788054762332352e-04, +-1.73023842303760092562e-04, +-1.78031811814023872061e-04, +-1.82899949222519527144e-04, +-1.87627582425063416539e-04, +-1.92214114085866635134e-04, +-1.96659021115234305434e-04, +-2.00961854115964548605e-04, +-2.05122236799067813760e-04, +-2.09139865369424642018e-04, +-2.13014507881963919287e-04, +-2.16746003569016719827e-04, +-2.20334262139455170628e-04, +-2.23779263050288623272e-04, +-2.27081054751326671731e-04, +-2.30239753903598189230e-04, +-2.33255544572162539776e-04, +-2.36128677394024743099e-04, +-2.38859468721759089912e-04, +-2.41448299743606627134e-04, +-2.43895615580664562507e-04, +-2.46201924361897988517e-04, +-2.48367796277648787261e-04, +-2.50393862612362249915e-04, +-2.52280814757210175570e-04, +-2.54029403203337271477e-04, +-2.55640436516424906718e-04, +-2.57114780293308988878e-04, +-2.58453356101321892260e-04, +-2.59657140401130335366e-04, +-2.60727163453730896234e-04, +-2.61664508212373382850e-04, +-2.62470309200077975623e-04, +-2.63145751373508769710e-04, +-2.63692068973905575490e-04, +-2.64110544365773612825e-04, +-2.64402506864084673854e-04, +-2.64569331550674807438e-04, +-2.64612438080565591254e-04, +-2.64533289478916812908e-04, +-2.64333390929326621406e-04, +-2.64014288554176887285e-04, +-2.63577568187730454374e-04, +-2.63024854142685936189e-04, +-2.62357807970878796362e-04, +-2.61578127218826830911e-04, +-2.60687544178804346540e-04, +-2.59687824636131118095e-04, +-2.58580766613355161020e-04, +-2.57368199111998000473e-04, +-2.56051980852535184582e-04, +-2.54633999013272917245e-04, +-2.53116167968770410229e-04, +-2.51500428028467203686e-04, +-2.49788744176148520739e-04, +-2.47983104810888498049e-04, +-2.46085520490098991209e-04, +-2.44098022675305284133e-04, +-2.42022662481256641692e-04, +-2.39861509428983846149e-04, +-2.37616650203396260988e-04, +-2.35290187416002671578e-04, +-2.32884238373345356290e-04, +-2.30400933851706944807e-04, +-2.27842416878660760553e-04, +-2.25210841522004905167e-04, +-2.22508371686640725982e-04, +-2.19737179919906623887e-04, +-2.16899446225907947382e-04, +-2.13997356889345798732e-04, +-2.11033103309352538255e-04, +-2.08008880843819519632e-04, +-2.04926887664708660573e-04, +-2.01789323624807442155e-04, +-1.98598389136399967663e-04, +-1.95356284062287273917e-04, +-1.92065206619610498147e-04, +-1.88727352296894345393e-04, +-1.85344912784731391314e-04, +-1.81920074920499755819e-04, +-1.78455019647530454055e-04, +-1.74951920989073971512e-04, +-1.71412945037461607323e-04, +-1.67840248958807175192e-04, +-1.64235980013589989322e-04, +-1.60602274593463965847e-04, +-1.56941257274607583660e-04, +-1.53255039887926981963e-04, +-1.49545720606400077326e-04, +-1.45815383049865629223e-04, +-1.42066095407511174204e-04, +-1.38299909578337953649e-04, +-1.34518860329830815736e-04, +-1.30724964475093245915e-04, +-1.26920220068654472992e-04, +-1.23106605621173758290e-04, +-1.19286079333219134950e-04, +-1.15460578348350841244e-04, +-1.11632018025632952099e-04, +-1.07802291231779830637e-04, +-1.03973267653065606659e-04, +-1.00146793127148565233e-04, +-9.63246889949230804435e-05, +-9.25087514725346873358e-05, +-8.87007510436452450671e-05, +-8.49024318720545515026e-05, +-8.11155112347393549661e-05, +-7.73416789754019609908e-05, +-7.35825969785674924512e-05, +-6.98398986642887023612e-05, +-6.61151885034750767074e-05, +-6.24100415538899748772e-05, +-5.87260030168200428450e-05, +-5.50645878143974986741e-05, +-5.14272801876128782695e-05, +-4.78155333149380714058e-05, +-4.42307689515766361233e-05, +-4.06743770892715146635e-05, +-3.71477156366324749162e-05, +-3.36521101199027279356e-05, +-3.01888534041130525139e-05, +-2.67592054345224943665e-05, +-2.33643929982665948157e-05, +-2.00056095060906951114e-05, +-1.66840147940797201324e-05, +-1.34007349452439661363e-05, +-1.01568621308437851693e-05, +-6.95345447128813701427e-06, +-3.79153591650250810366e-06, +-6.72096145553293655593e-07, + 2.40390951459279597616e-06, + 5.43556015137456058426e-06, + 8.42196931017640123499e-06, + 1.13622850193110927676e-05, + 1.42556897966238257746e-05, + 1.71014006379341248229e-05, + 1.98986689875390831126e-05, + 2.26467806909793172563e-05, + 2.53450559303131682314e-05, + 2.79928491421220740245e-05, + 3.05895489185053302676e-05, + 3.31345778912925430443e-05, + 3.56273925997451632237e-05, + 3.80674833419947510364e-05, + 4.04543740105068599521e-05, + 4.27876219118044463113e-05, + 4.50668175707753267513e-05, + 4.72915845198089502860e-05, + 4.94615790730713200283e-05, + 5.15764900862005805371e-05, + 5.36360387017334339240e-05, + 5.56399780805481871900e-05, + 5.75880931196438774090e-05, + 5.94802001565561985590e-05, + 6.13161466607366493955e-05, + 6.30958109121965409621e-05, + 6.48191016677504891876e-05, + 6.64859578151715343739e-05, + 6.80963480156043240521e-05, + 6.96502703345347587470e-05, + 7.11477518616810702089e-05, + 7.25888483201263885920e-05, + 7.39736436650163245096e-05, + 7.53022496721903708853e-05, + 7.65748055170595645635e-05, + 7.77914773440878826866e-05, + 7.89524578272120806021e-05, + 8.00579657215541123884e-05, + 8.11082454067584148567e-05, + 8.21035664223097817662e-05, + 8.30442229951717527346e-05, + 8.39305335600990616227e-05, + 8.47628402729624154692e-05, + 8.55415085174379832356e-05, + 8.62669264054029689666e-05, + 8.69395042713942022743e-05, + 8.75596741614536786501e-05, + 8.81278893167311284636e-05, + 8.86446236521661512422e-05, + 8.91103712306026604075e-05, + 8.95256457326717546962e-05, + 8.98909799227875892661e-05, + 9.02069251115862640782e-05, + 9.04740506151490363976e-05, + 9.06929432113401867103e-05, + 9.08642065935940279782e-05, + 9.09884608224771455898e-05, + 9.10663417753510066833e-05, + 9.10985005944656069544e-05, + 9.10856031337957275460e-05, + 9.10283294049456589850e-05, + 9.09273730224310103125e-05, + 9.07834406486567112131e-05, + 9.05972514388884682737e-05, + 9.03695364865346147717e-05, + 9.01010382690298824038e-05, + 8.97925100946232214449e-05, + 8.94447155503604388049e-05, + 8.90584279515538464710e-05, + 8.86344297930203114553e-05, + 8.81735122023717546660e-05, + 8.76764743956322256668e-05, + 8.71441231354561004216e-05, + 8.65772721922116491981e-05, + 8.59767418081955635050e-05, + 8.53433581652348287718e-05, + 8.46779528559294970011e-05, + 8.39813623587842351167e-05, + 8.32544275174723505482e-05, + 8.24979930244696123580e-05, + 8.17129069092911340059e-05, + 8.09000200315580515319e-05, + 8.00601855791177764851e-05, + 7.91942585714318722121e-05, + 7.83030953684469709260e-05, + 7.73875531851490379041e-05, + 7.64484896120066966278e-05, + 7.54867621414943666810e-05, + 7.45032277008856680736e-05, + 7.34987421914997258445e-05, + 7.24741600345781298914e-05, + 7.14303337239639759421e-05, + 7.03681133857495075701e-05, + 6.92883463450485250238e-05, + 6.81918767000556897513e-05, + 6.70795449035298084342e-05, + 6.59521873518545653477e-05, + 6.48106359818019012913e-05, + 6.36557178751403541801e-05, + 6.24882548712000070136e-05, + 6.13090631875229413088e-05, + 6.01189530487050480105e-05, + 5.89187283235398522627e-05, + 5.77091861705600261078e-05, + 5.64911166920768371556e-05, + 5.52653025968012133018e-05, + 5.40325188711331935503e-05, + 5.27935324591918643858e-05, + 5.15491019516612150597e-05, + 5.02999772835162253098e-05, + 4.90468994406823114189e-05, + 4.77906001756943685883e-05, + 4.65318017323872241855e-05, + 4.52712165796745444508e-05, + 4.40095471544385224527e-05, + 4.27474856135762158195e-05, + 4.14857135952114382585e-05, + 4.02249019891050019768e-05, + 3.89657107162695045101e-05, + 3.77087885178019617646e-05, + 3.64547727529321324196e-05, + 3.52042892062907349744e-05, + 3.39579519043854685862e-05, + 3.27163629412759540162e-05, + 3.14801123134230239524e-05, + 3.02497777637023744978e-05, + 2.90259246345387218443e-05, + 2.78091057301432964695e-05, + 2.65998611878025348972e-05, + 2.53987183581919854364e-05, + 2.42061916946511448772e-05, + 2.30227826513813061706e-05, + 2.18489795905047869758e-05, + 2.06852576979222047276e-05, + 1.95320789079097866306e-05, + 1.83898918363816234168e-05, + 1.72591317227478167385e-05, + 1.61402203802856600485e-05, + 1.50335661549492530784e-05, + 1.39395638925266073790e-05, + 1.28585949140593193966e-05, + 1.17910269994264146578e-05, + 1.07372143790027249535e-05, + 9.69749773328629209753e-06, + 8.67220420039572420566e-06, + 7.66164739132314657512e-06, + 6.66612741284622437347e-06, + 5.68593089796976951548e-06, + 4.72133104379410701050e-06, + 3.77258765668374723169e-06, + 2.83994720461857994069e-06, + 1.92364287659795633360e-06, + 1.02389464897677183691e-06, + 1.40909358598783243636e-07, +-7.25119217400925882488e-07, +-1.57401027526573751796e-06, +-2.40559589188401177682e-06, +-3.21972092580435969379e-06, +-4.01624291213239929447e-06, +-4.79503195145223449727e-06, +-5.55597059291959898474e-06, +-6.29895371166915398527e-06, +-7.02388838068995278969e-06, +-7.73069373730662337714e-06, +-8.41930084443043260571e-06, +-9.08965254672049638874e-06, +-9.74170332181420186798e-06, +-1.03754191267770145960e-05, +-1.09907772399306088372e-05, +-1.15877660982095854786e-05, +-1.21663851302071818753e-05, +-1.27266445850638015879e-05, +-1.32685653573596831328e-05, +-1.37921788081646564831e-05, +-1.42975265824070264185e-05, +-1.47846604227169150120e-05, +-1.52536419799077777845e-05, +-1.57045426202454864190e-05, +-1.61374432296745794440e-05, +-1.65524340151509907705e-05, +-1.69496143032443776877e-05, +-1.73290923361651281922e-05, +-1.76909850653765942752e-05, +-1.80354179429455134585e-05, +-1.83625247107888849940e-05, +-1.86724471879742999741e-05, +-1.89653350562250020523e-05, +-1.92413456437866339777e-05, +-1.95006437078064384194e-05, +-1.97434012153796016272e-05, +-1.99697971234102591856e-05, +-2.01800171574394671614e-05, +-2.03742535895865872536e-05, +-2.05527050157544749519e-05, +-2.07155761322383869926e-05, +-2.08630775118898238230e-05, +-2.09954253799722451970e-05, +-2.11128413898529763743e-05, +-2.12155523986690494219e-05, +-2.13037902431062623279e-05, +-2.13777915154254429865e-05, +-2.14377973398712400380e-05, +-2.14840531495946086989e-05, +-2.15168084642204138245e-05, +-2.15363166681862903517e-05, +-2.15428347899803886579e-05, +-2.15366232824005027408e-05, +-2.15179458039577262574e-05, +-2.14870690015422825217e-05, +-2.14442622944694083432e-05, +-2.13897976600211963056e-05, +-2.13239494205938423077e-05, +-2.12469940325636042692e-05, +-2.11592098769767039874e-05, +-2.10608770521689021838e-05, +-2.09522771684173563140e-05, +-2.08336931447246940868e-05, +-2.07054090078323760555e-05, +-2.05677096935581607638e-05, +-2.04208808505498906150e-05, +-2.02652086465450858026e-05, +-2.01009795772225878085e-05, +-1.99284802777307897448e-05, +-1.97479973369733553508e-05, +-1.95598171147313057406e-05, +-1.93642255616965921713e-05, +-1.91615080424908975211e-05, +-1.89519491617392180451e-05, +-1.87358325932659067312e-05, +-1.85134409124775290410e-05, +-1.82850554319945745078e-05, +-1.80509560405904254164e-05, +-1.78114210454942761765e-05, +-1.75667270181107023892e-05, +-1.73171486432067083623e-05, +-1.70629585716134836285e-05, +-1.68044272764881711800e-05, +-1.65418229131769521309e-05, +-1.62754111827191523261e-05, +-1.60054551990284544996e-05, +-1.57322153597849753270e-05, +-1.54559492210684566130e-05, +-1.51769113757617390406e-05, +-1.48953533357483810943e-05, +-1.46115234179280960335e-05, +-1.43256666340692667526e-05, +-1.40380245845161517285e-05, +-1.37488353557644599467e-05, +-1.34583334219182035850e-05, +-1.31667495500361276861e-05, +-1.28743107093750131593e-05, +-1.25812399845332226092e-05, +-1.22877564924967183814e-05, +-1.19940753035859587103e-05, +-1.17004073663007361519e-05, +-1.14069594360560160192e-05, +-1.11139340078022052344e-05, +-1.08215292525168970740e-05, +-1.05299389575568482923e-05, +-1.02393524708539662493e-05, +-9.94995464893742348120e-06, +-9.66192580876271611343e-06, +-9.37544168332491989210e-06, +-9.09067338103246418157e-06, +-8.80778734881422739372e-06, +-8.52694533893248795902e-06, +-8.24830437947059051977e-06, +-7.97201674846333152320e-06, +-7.69822995163491404110e-06, +-7.42708670370925303302e-06, +-7.15872491325360909230e-06, +-6.89327767101633304933e-06, +-6.63087324171573705124e-06, +-6.37163505923899323223e-06, +-6.11568172520321447157e-06, +-5.86312701083429459631e-06, +-5.61407986211404469277e-06, +-5.36864440814655013182e-06, +-5.12691997269171846217e-06, +-4.88900108881444233564e-06, +-4.65497751659457443244e-06, +-4.42493426384305196255e-06, +-4.19895160976678087265e-06, +-3.97710513152554464493e-06, +-3.75946573362158312445e-06, +-3.54609968006129461300e-06, +-3.33706862922910230812e-06, +-3.13242967141053148128e-06, +-2.93223536890220278037e-06, +-2.73653379864365903313e-06, +-2.54536859730841838172e-06, +-2.35877900878616331091e-06, +-2.17679993399191934131e-06, +-1.99946198293410626841e-06, +-1.82679152897453787459e-06, +-1.65881076521146377169e-06, +-1.49553776291791911430e-06, +-1.33698653196547020166e-06, +-1.18316708316432299485e-06, +-1.03408549244911473199e-06, +-8.89743966841013678409e-07, +-7.50140912114827378233e-07, +-6.15271002100918799020e-07, +-4.85125249549975873449e-07, +-3.59691078491283933177e-07, +-2.38952398011216803052e-07, +-1.22889677382464548894e-07, + 0 /* Need a final zero coefficient */ + diff --git a/libk3b/plugin/libsamplerate/float_cast.h b/libk3b/plugin/libsamplerate/float_cast.h new file mode 100644 index 0000000..af362e3 --- /dev/null +++ b/libk3b/plugin/libsamplerate/float_cast.h @@ -0,0 +1,203 @@ +/* +** Copyright (C) 2001-2003 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** 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, write to the Free Software +** Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +/* Version 1.3 */ + + +/*============================================================================ +** On Intel Pentium processors (especially PIII and probably P4), converting +** from float to int is very slow. To meet the C specs, the code produced by +** most C compilers targeting Pentium needs to change the FPU rounding mode +** before the float to int conversion is performed. +** +** Changing the FPU rounding mode causes the FPU pipeline to be flushed. It +** is this flushing of the pipeline which is so slow. +** +** Fortunately the ISO C99 specifications define the functions lrint, lrintf, +** llrint and llrintf which fix this problem as a side effect. +** +** On Unix-like systems, the configure process should have detected the +** presence of these functions. If they weren't found we have to replace them +** here with a standard C cast. +*/ + +/* +** The C99 prototypes for lrint and lrintf are as follows: +** +** long int lrintf (float x) ; +** long int lrint (double x) ; +*/ + +#include "config.h" + +/* +** The presence of the required functions are detected during the configure +** process and the values HAVE_LRINT and HAVE_LRINTF are set accordingly in +** the config.h file. +*/ + +#define HAVE_LRINT_REPLACEMENT 0 + +#if (HAVE_LRINT && HAVE_LRINTF) + + /* + ** These defines enable functionality introduced with the 1999 ISO C + ** standard. They must be defined before the inclusion of math.h to + ** engage them. If optimization is enabled, these functions will be + ** inlined. With optimization switched off, you have to link in the + ** maths library using -lm. + */ + + #define _ISOC9X_SOURCE 1 + #define _ISOC99_SOURCE 1 + + #define __USE_ISOC9X 1 + #define __USE_ISOC99 1 + + #include + +#elif (defined (WIN32) || defined (_WIN32)) + + #undef HAVE_LRINT_REPLACEMENT + #define HAVE_LRINT_REPLACEMENT 1 + #include + + /* + ** Win32 doesn't seem to have these functions. + ** Therefore implement inline versions of these functions here. + */ + + __inline long int + lrint (double flt) + { int intgr; + + _asm + { fld flt + fistp intgr + } ; + + return intgr ; + } + + __inline long int + lrintf (float flt) + { int intgr; + + _asm + { fld flt + fistp intgr + } ; + + return intgr ; + } + +#elif (defined (__MWERKS__) && defined (macintosh)) + + /* This MacOS 9 solution was provided by Stephane Letz */ + + #undef HAVE_LRINT_REPLACEMENT + #define HAVE_LRINT_REPLACEMENT 1 + #include + + #undef lrint + #undef lrintf + + #define lrint double2int + #define lrintf float2int + + inline int + float2int (register float in) + { long res [2] ; + + asm + { fctiw in,in + stfd in,res + } + return res [1] ; + } /* float2int */ + + inline int + double2int (register double in) + { long res [2] ; + + asm + { fctiw in,in + stfd in,res + } + return res [1] ; + } /* double2int */ + +#elif (defined (__MACH__) && defined (__APPLE__)) + + /* For Apple MacOSX. */ + + #undef HAVE_LRINT_REPLACEMENT + #define HAVE_LRINT_REPLACEMENT 1 + #include + + #undef lrint + #undef lrintf + + #define lrint double2int + #define lrintf float2int + + inline static long int + float2int (register float in) + { int res [2] ; + + __asm__ __volatile__ + ( "fctiw %1, %1\n\t" + "stfd %1, %0" + : "=m" (res) /* Output */ + : "f" (in) /* Input */ + : "memory" + ) ; + + return res [1] ; + } /* lrintf */ + + inline static long int + double2int (register double in) + { int res [2] ; + + __asm__ __volatile__ + ( "fctiw %1, %1\n\t" + "stfd %1, %0" + : "=m" (res) /* Output */ + : "f" (in) /* Input */ + : "memory" + ) ; + + return res [1] ; + } /* lrint */ + +#else + #ifndef __sgi + #warning "Don't have the functions lrint() and lrintf()." + #warning "Replacing these functions with a standard C cast." + #endif + + #include + + #define lrint(dbl) ((int) (dbl)) + #define lrintf(flt) ((int) (flt)) + +#endif + + + diff --git a/libk3b/plugin/libsamplerate/high_qual_coeffs.h b/libk3b/plugin/libsamplerate/high_qual_coeffs.h new file mode 100644 index 0000000..229bc79 --- /dev/null +++ b/libk3b/plugin/libsamplerate/high_qual_coeffs.h @@ -0,0 +1,17116 @@ +/* +** Copyright (C) 2002,2003 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** 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, write to the Free Software +** Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +/* +** f = make_filter (65, 128, 100.3) ; +** Pass band width : 0.0039062 (should be 0.0039062) +** Stop band atten. : 101.20 dB +** -3dB band width : 0.846 +** half length : 17087 +** increment : 128 +*/ + + 9.73822959712628111184e-01, + 9.73730227534126968614e-01, + 9.73452062795049033461e-01, + 9.72988560871685836950e-01, + 9.72339880681256651940e-01, + 9.71506244617024061760e-01, + 9.70487938457503807044e-01, + 9.69285311249795999977e-01, + 9.67898775167100988703e-01, + 9.66328805340476049146e-01, + 9.64575939664910952942e-01, + 9.62640778579811451365e-01, + 9.60523984823974497083e-01, + 9.58226283165186876190e-01, + 9.55748460104550945360e-01, + 9.53091363555660264772e-01, + 9.50255902498805649081e-01, + 9.47243046610318550904e-01, + 9.44053825867236739988e-01, + 9.40689330127495004774e-01, + 9.37150708685763667027e-01, + 9.33439169805209578712e-01, + 9.29555980225306610620e-01, + 9.25502464645995059911e-01, + 9.21280005188352291157e-01, + 9.16890040832049391106e-01, + 9.12334066829837087020e-01, + 9.07613634099317501125e-01, + 9.02730348592271192310e-01, + 8.97685870641828032035e-01, + 8.92481914287746591619e-01, + 8.87120246580144211634e-01, + 8.81602686861939210949e-01, + 8.75931106030353401337e-01, + 8.70107425777795429056e-01, + 8.64133617812459453589e-01, + 8.58011703058984220860e-01, + 8.51743750839512703266e-01, + 8.45331878035551986805e-01, + 8.38778248230970913113e-01, + 8.32085070836509732572e-01, + 8.25254600196225540643e-01, + 8.18289134676235541122e-01, + 8.11191015736170029093e-01, + 8.03962626983747541409e-01, + 7.96606393212902830214e-01, + 7.89124779425847022729e-01, + 7.81520289839554460620e-01, + 7.73795466877067239508e-01, + 7.65952890144075193568e-01, + 7.57995175391232733908e-01, + 7.49924973462656851986e-01, + 7.41744969231072803773e-01, + 7.33457880520075322650e-01, + 7.25066457013996301662e-01, + 7.16573479155810266761e-01, + 7.07981757033636860399e-01, + 6.99294129256251117965e-01, + 6.90513461818149987259e-01, + 6.81642646954653708136e-01, + 6.72684601987533770107e-01, + 6.63642268161698578588e-01, + 6.54518609473419998857e-01, + 6.45316611490632463521e-01, + 6.36039280165809350898e-01, + 6.26689640641951539735e-01, + 6.17270736052177193542e-01, + 6.07785626313482429950e-01, + 5.98237386915153934730e-01, + 5.88629107702400733437e-01, + 5.78963891655698170702e-01, + 5.69244853666411754212e-01, + 5.59475119309209012464e-01, + 5.49657823611788054485e-01, + 5.39796109822496594788e-01, + 5.29893128176318617406e-01, + 5.19952034659813655537e-01, + 5.09975989775514948477e-01, + 4.99968157306331650869e-01, + 4.89931703080488667457e-01, + 4.79869793737535021982e-01, + 4.69785595495954833023e-01, + 4.59682272922913082169e-01, + 4.49562987706663808041e-01, + 4.39430897432148248605e-01, + 4.29289154360313895964e-01, + 4.19140904211673437363e-01, + 4.08989284954621334922e-01, + 3.98837425599043837732e-01, + 3.88688444995713366925e-01, + 3.78545450641997294206e-01, + 3.68411537494394758507e-01, + 3.58289786788378861182e-01, + 3.48183264866087693878e-01, + 3.38095022012320112204e-01, + 3.28028091299366553191e-01, + 3.17985487441129255348e-01, + 3.07970205657046469661e-01, + 2.97985220546282070231e-01, + 2.88033484972657738421e-01, + 2.78117928960799731808e-01, + 2.68241458603957205753e-01, + 2.58406954983961600902e-01, + 2.48617273103761360353e-01, + 2.38875240832987723039e-01, + 2.29183657866993378827e-01, + 2.19545294699780346726e-01, + 2.09962891611264163005e-01, + 2.00439157669269424344e-01, + 1.90976769746686869667e-01, + 1.81578371554184297976e-01, + 1.72246572688870225321e-01, + 1.62983947699301107148e-01, + 1.53793035167208436143e-01, + 1.44676336806320998685e-01, + 1.35636316578646581865e-01, + 1.26675399828566487281e-01, + 1.17795972435093473929e-01, + 1.09000379982627515485e-01, + 1.00290926950544131979e-01, + 9.16698759219308212387e-02, + 8.31394468117901269677e-02, + 7.47018161150024284645e-02, + 6.63591161743508073378e-02, + 5.81134344688867474082e-02, + 4.99668129229093108123e-02, + 4.19212472358281990070e-02, + 3.39786862331567796058e-02, + 2.61410312388884458201e-02, + 1.84101354694814652035e-02, + 1.07878034496857889285e-02, + 3.27579045041895364904e-03, +-4.12419805110235924983e-03, +-1.14105068887806991584e-02, +-1.85815317024259456236e-02, +-2.56357194097392264431e-02, +-3.25715686553301464468e-02, +-3.93876302366183567161e-02, +-4.60825075064776670808e-02, +-5.26548567524927901840e-02, +-5.91033875527125010518e-02, +-6.54268631077873363822e-02, +-7.16241005493989252306e-02, +-7.76939712248916614090e-02, +-8.36354009580342477870e-02, +-8.94473702858456093390e-02, +-9.51289146714309197250e-02, +-1.00679124692788404816e-01, +-1.06097146207554629549e-01, +-1.11382180493666688159e-01, +-1.16533484365933040494e-01, +-1.21550370268516991223e-01, +-1.26432206343341957400e-01, +-1.31178416474445280748e-01, +-1.35788480308313530553e-01, +-1.40261933250244968940e-01, +-1.44598366436796466061e-01, +-1.48797426684381700612e-01, +-1.52858816414098541703e-01, +-1.56782293552872986631e-01, +-1.60567671411021850592e-01, +-1.64214818536340179111e-01, +-1.67723658544838616358e-01, +-1.71094169928257461288e-01, +-1.74326385838498049141e-01, +-1.77420393849128360531e-01, +-1.80376335694119815933e-01, +-1.83194406983985758064e-01, +-1.85874856899509832697e-01, +-1.88417987863249564162e-01, +-1.90824155189017602430e-01, +-1.93093766709557357331e-01, +-1.95227282382623990031e-01, +-1.97225213875713484279e-01, +-1.99088124129663118778e-01, +-2.00816626901390404836e-01, +-2.02411386286012268121e-01, +-2.03873116218622224549e-01, +-2.05202579955993086314e-01, +-2.06400589538496825881e-01, +-2.07468005232528396320e-01, +-2.08405734953734406156e-01, +-2.09214733671363894985e-01, +-2.09896002794046132589e-01, +-2.10450589537331811396e-01, +-2.10879586273321456558e-01, +-2.11184129862729524918e-01, +-2.11365400969725530933e-01, +-2.11424623359909302778e-01, +-2.11363063181782606659e-01, +-2.11182028232088397912e-01, +-2.10882867205385543530e-01, +-2.10466968928249342774e-01, +-2.09935761578479540557e-01, +-2.09290711889717429006e-01, +-2.08533324341858283812e-01, +-2.07665140337684211991e-01, +-2.06687737366111012882e-01, +-2.05602728152473046563e-01, +-2.04411759796272074485e-01, +-2.03116512896803713684e-01, +-2.01718700667107064817e-01, +-2.00220068036660509003e-01, +-1.98622390743273286029e-01, +-1.96927474414606312747e-01, +-1.95137153639780930314e-01, +-1.93253291031515200826e-01, +-1.91277776279251604530e-01, +-1.89212525193726166517e-01, +-1.87059478743444584925e-01, +-1.84820602083524743176e-01, +-1.82497883577372205233e-01, +-1.80093333811659150889e-01, +-1.77608984605069908369e-01, +-1.75046888011289869524e-01, +-1.72409115316711214483e-01, +-1.69697756033324376190e-01, +-1.66914916887274944468e-01, +-1.64062720803562822613e-01, +-1.61143305887356008688e-01, +-1.58158824402401171350e-01, +-1.55111441747006084668e-01, +-1.52003335428069458191e-01, +-1.48836694033641553370e-01, +-1.45613716204482351868e-01, +-1.42336609605105829379e-01, +-1.39007589894771910188e-01, +-1.35628879698910465024e-01, +-1.32202707581443923424e-01, +-1.28731307018481316851e-01, +-1.25216915373852127891e-01, +-1.21661772876947515964e-01, +-1.18068121603333617275e-01, +-1.14438204458597023172e-01, +-1.10774264165883040700e-01, +-1.07078542257586659114e-01, +-1.03353278071642365465e-01, +-9.96007077528702211566e-02, +-9.58230632598184722815e-02, +-9.20225713775505993475e-02, +-8.82014527368129436224e-02, +-8.43619208400154807492e-02, +-8.05061810944624617337e-02, +-7.66364298532504761852e-02, +-7.27548534642616651080e-02, +-6.88636273276640731300e-02, +-6.49649149623320182334e-02, +-6.10608670815911136476e-02, +-5.71536206786884617981e-02, +-5.32452981223815041689e-02, +-4.93380062630371721277e-02, +-4.54338355496189602589e-02, +-4.15348591579423748188e-02, +-3.76431321305677607514e-02, +-3.37606905286930644716e-02, +-2.98895505964036217739e-02, +-2.60317079376298707305e-02, +-2.21891367061550388862e-02, +-1.83637888090092127324e-02, +-1.45575931235783270074e-02, +-1.07724547287478406021e-02, +-7.01025415039811198442e-03, +-3.27284662155273445641e-03, + 4.37938642517908310794e-04, + 4.12029915395035594566e-03, + 7.77245984641533344678e-03, + 1.13926737534469080249e-02, + 1.49792226707046640527e-02, + 1.85304178019153227563e-02, + 2.20446003882424183817e-02, + 2.55201423208448671676e-02, + 2.89554467363942642788e-02, + 3.23489485953257979722e-02, + 3.56991152426125377128e-02, + 3.90044469508545738057e-02, + 4.22634774454904785235e-02, + 4.54747744119432459331e-02, + 4.86369399845229810619e-02, + 5.17486112169195516808e-02, + 5.48084605341252126265e-02, + 5.78151961656372809228e-02, + 6.07675625598040544673e-02, + 6.36643407791787629968e-02, + 6.65043488767638746317e-02, + 6.92864422530337364936e-02, + 7.20095139936314521112e-02, + 7.46724951876515663507e-02, + 7.72743552264206767788e-02, + 7.98141020827076302924e-02, + 8.22907825702981904348e-02, + 8.47034825838767768680e-02, + 8.70513273191783898408e-02, + 8.93334814733681981114e-02, + 9.15491494256309712441e-02, + 9.36975753979484987655e-02, + 9.57780435960658566019e-02, + 9.77898783306437036078e-02, + 9.97324441186170501661e-02, + 1.01605145764776208517e-01, + 1.03407428423609545898e-01, + 1.05138777641444206012e-01, + 1.06798719378940032421e-01, + 1.08386820013995285872e-01, + 1.09902686325133475131e-01, + 1.11345965455456150095e-01, + 1.12716344857240108324e-01, + 1.14013552217288011148e-01, + 1.15237355363129817531e-01, + 1.16387562150195578159e-01, + 1.17464020330083573906e-01, + 1.18466617400054957665e-01, + 1.19395280433899547701e-01, + 1.20249975894323096748e-01, + 1.21030709427012495016e-01, + 1.21737525636550936170e-01, + 1.22370507844354617366e-01, + 1.22929777828819461472e-01, + 1.23415495547866391202e-01, + 1.23827858844088756207e-01, + 1.24167103132708178670e-01, + 1.24433501072553173716e-01, + 1.24627362220290069383e-01, + 1.24749032668130088730e-01, + 1.24798894665256510095e-01, + 1.24777366223214461471e-01, + 1.24684900705517007213e-01, + 1.24521986401729317651e-01, + 1.24289146086293156301e-01, + 1.23986936562369309822e-01, + 1.23615948190973698462e-01, + 1.23176804405697795652e-01, + 1.22670161213299697134e-01, + 1.22096706680470845630e-01, + 1.21457160407075034914e-01, + 1.20752272986177383585e-01, + 1.19982825451170740938e-01, + 1.19149628710327484815e-01, + 1.18253522969096608319e-01, + 1.17295377140480550082e-01, + 1.16276088243826986046e-01, + 1.15196580792372674229e-01, + 1.14057806169890793568e-01, + 1.12860741996784086361e-01, + 1.11606391485979145051e-01, + 1.10295782788982596467e-01, + 1.08929968332454704671e-01, + 1.07510024145666946427e-01, + 1.06037049179214082351e-01, + 1.04512164615345154450e-01, + 1.02936513170294341446e-01, + 1.01311258388983055356e-01, + 9.96375839324763756810e-02, + 9.79166928585712137423e-02, + 9.61498068959035084857e-02, + 9.43381657119597566430e-02, + 9.24830261753778609668e-02, + 9.05856616129300240559e-02, + 8.86473610615743090602e-02, + 8.66694285159709948418e-02, + 8.46531821718525673282e-02, + 8.25999536656427529868e-02, + 8.05110873107188207420e-02, + 7.83879393307109761935e-02, + 7.62318770902338793682e-02, + 7.40442783234440127238e-02, + 7.18265303608213723230e-02, + 6.95800293545625059277e-02, + 6.73061795029863685347e-02, + 6.50063922743394223547e-02, + 6.26820856303954981881e-02, + 6.03346832502406754672e-02, + 5.79656137546301838959e-02, + 5.55763099313076533448e-02, + 5.31682079616711544823e-02, + 5.07427466491714163066e-02, + 4.83013666498223193102e-02, + 4.58455097052048524131e-02, + 4.33766178783417805098e-02, + 4.08961327928156204159e-02, + 3.84054948755038344510e-02, + 3.59061426032981009793e-02, + 3.33995117541749445000e-02, + 3.08870346629779371495e-02, + 2.83701394822698481357e-02, + 2.58502494486117818939e-02, + 2.33287821546176998844e-02, + 2.08071488271321346220e-02, + 1.82867536118745781237e-02, + 1.57689928648852076276e-02, + 1.32552544511122961240e-02, + 1.07469170504618516393e-02, + 8.24534947164058847069e-03, + 5.75190997410870291651e-03, + 3.26794559845353929303e-03, + 7.94791505500461897306e-04, +-1.66622967554532603295e-03, +-4.11380848962069559788e-03, +-6.54664928870115660209e-03, +-8.96347085478857441565e-03, +-1.13630070127026094190e-02, +-1.37440072324107598334e-02, +-1.61052372206219249207e-02, +-1.84454795013846463425e-02, +-2.07635339854373018875e-02, +-2.30582185280550702733e-02, +-2.53283694751598974226e-02, +-2.75728421974516593740e-02, +-2.97905116123358577884e-02, +-3.19802726934248146562e-02, +-3.41410409673992970570e-02, +-3.62717529980220235175e-02, +-3.83713668571045649069e-02, +-4.04388625822339128901e-02, +-4.24732426210736174754e-02, +-4.44735322620624928813e-02, +-4.64387800513385851087e-02, +-4.83680581957297989204e-02, +-5.02604629516505974074e-02, +-5.21151149997620341536e-02, +-5.39311598052534396652e-02, +-5.57077679636137287900e-02, +-5.74441355317703919448e-02, +-5.91394843444778550712e-02, +-6.07930623158483146584e-02, +-6.24041437259244130553e-02, +-6.39720294922026394557e-02, +-6.54960474260223579623e-02, +-6.69755524737441765293e-02, +-6.84099269426502037961e-02, +-6.97985807115074213813e-02, +-7.11409514257386743630e-02, +-7.24365046771608261933e-02, +-7.36847341682554390907e-02, +-7.48851618609372993163e-02, +-7.60373381098108092058e-02, +-7.71408417798946782762e-02, +-7.81952803488157183187e-02, +-7.92002899934755172362e-02, +-8.01555356612003028216e-02, +-8.10607111253977136167e-02, +-8.19155390257452209468e-02, +-8.27197708929510444609e-02, +-8.34731871581248646708e-02, +-8.41755971468178959549e-02, +-8.48268390577856662427e-02, +-8.54267799265437804968e-02, +-8.59753155737910251810e-02, +-8.64723705387828583957e-02, +-8.69178979977427990100e-02, +-8.73118796674136471436e-02, +-8.76543256938471931905e-02, +-8.79452745265522362050e-02, +-8.81847927781117119084e-02, +-8.83729750694022264668e-02, +-8.85099438605464611252e-02, +-8.85958492677388215197e-02, +-8.86308688660923243985e-02, +-8.86152074786611815282e-02, +-8.85490969517982173809e-02, +-8.84327959170169153325e-02, +-8.82665895395295801995e-02, +-8.80507892536431108210e-02, +-8.77857324851982756542e-02, +-8.74717823612454203897e-02, +-8.71093274071546297410e-02, +-8.66987812313650407781e-02, +-8.62405821979837367008e-02, +-8.57351930874506312774e-02, +-8.51831007454873639917e-02, +-8.45848157205629364030e-02, +-8.39408718901024919479e-02, +-8.32518260756789918453e-02, +-8.25182576474303292047e-02, +-8.17407681179471573563e-02, +-8.09199807258840636548e-02, +-8.00565400095505641520e-02, +-7.91511113707415864260e-02, +-7.82043806290729365260e-02, +-7.72170535670915342275e-02, +-7.61898554664313942819e-02, +-7.51235306352922710404e-02, +-7.40188419275257664109e-02, +-7.28765702536047221827e-02, +-7.16975140837712299202e-02, +-7.04824889436477669546e-02, +-6.92323269026086512978e-02, +-6.79478760552057331479e-02, +-6.66299999959486799472e-02, +-6.52795772877406560442e-02, +-6.38975009242730290770e-02, +-6.24846777866859409700e-02, +-6.10420280948025528733e-02, +-5.95704848532464525945e-02, +-5.80709932927548425075e-02, +-5.65445103069988283528e-02, +-5.49920038852278469932e-02, +-5.34144525410520376596e-02, +-5.18128447376807535485e-02, +-5.01881783099329334408e-02, +-4.85414598833405000478e-02, +-4.68737042906593598390e-02, +-4.51859339861135078653e-02, +-4.34791784576844600463e-02, +-4.17544736377706837693e-02, +-4.00128613125346824231e-02, +-3.82553885302546123337e-02, +-3.64831070090038678266e-02, +-3.46970725439699687054e-02, +-3.28983444147356932086e-02, +-3.10879847928346199348e-02, +-2.92670581498969371859e-02, +-2.74366306667012324616e-02, +-2.55977696434401616465e-02, +-2.37515429115148085648e-02, +-2.18990182471639621697e-02, +-2.00412627872342125057e-02, +-1.81793424474003748048e-02, +-1.63143213431318143125e-02, +-1.44472612137104394064e-02, +-1.25792208495948080321e-02, +-1.07112555234262843418e-02, +-8.84441642496919776251e-03, +-6.97975010027273440327e-03, +-5.11829789534247545785e-03, +-3.26109540460238272672e-03, +-1.40917192442717876394e-03, + 4.36450087979504280662e-04, + 2.27475555008947467189e-03, + 4.10473728366783034011e-03, + 5.92539653824247346953e-03, + 7.73574350816149444027e-03, + 9.53479784298774321605e-03, + 1.13215891509725555958e-02, + 1.30951574953684958535e-02, + 1.48545538833333903156e-02, + 1.65988407471903930135e-02, + 1.83270924178097725787e-02, + 2.00383955898867233136e-02, + 2.17318497788877018628e-02, + 2.34065677694524146291e-02, + 2.50616760550354221448e-02, + 2.66963152685791259289e-02, + 2.83096406040205736399e-02, + 2.99008222284305145988e-02, + 3.14690456845965957355e-02, + 3.30135122838646696830e-02, + 3.45334394890581680704e-02, + 3.60280612873039099431e-02, + 3.74966285525929615696e-02, + 3.89384093979178655398e-02, + 4.03526895168305685391e-02, + 4.17387725142676843659e-02, + 4.30959802265037661417e-02, + 4.44236530300948923022e-02, + 4.57211501396783959184e-02, + 4.69878498945072997639e-02, + 4.82231500336007049001e-02, + 4.94264679593977643290e-02, + 5.05972409898094652170e-02, + 5.17349265985714082405e-02, + 5.28390026438036938816e-02, + 5.39089675846917554258e-02, + 5.49443406862122687984e-02, + 5.59446622118279432434e-02, + 5.69094936040880627903e-02, + 5.78384176530744725797e-02, + 5.87310386526413361064e-02, + 5.95869825444026307570e-02, + 6.04058970494284683261e-02, + 6.11874517876177664855e-02, + 6.19313383847234916191e-02, + 6.26372705670065754724e-02, + 6.33049842435138704344e-02, + 6.39342375759682501890e-02, + 6.45248110362744708990e-02, + 6.50765074516480857003e-02, + 6.55891520373845793301e-02, + 6.60625924172834749770e-02, + 6.64966986317623437452e-02, + 6.68913631336883612866e-02, + 6.72465007719728613544e-02, + 6.75620487629735172463e-02, + 6.78379666497569006056e-02, + 6.80742362492841729393e-02, + 6.82708615875821517305e-02, + 6.84278688229765230666e-02, + 6.85453061574607669382e-02, + 6.86232437362914587942e-02, + 6.86617735358941577717e-02, + 6.86610092401827576403e-02, + 6.86210861053920678776e-02, + 6.85421608135311638543e-02, + 6.84244113145758836581e-02, + 6.82680366575164482290e-02, + 6.80732568103898511014e-02, + 6.78403124694252068760e-02, + 6.75694648574412526365e-02, + 6.72609955116377500328e-02, + 6.69152060609276150283e-02, + 6.65324179929640407982e-02, + 6.61129724110185862385e-02, + 6.56572297808763333249e-02, + 6.51655696679120516324e-02, + 6.46383904645234791397e-02, + 6.40761091080973010925e-02, + 6.34791607896909026998e-02, + 6.28479986536143592213e-02, + 6.21830934881068692066e-02, + 6.14849334072996994704e-02, + 6.07540235246672929992e-02, + 5.99908856181665117724e-02, + 5.91960577872764140417e-02, + 5.83700941021449495882e-02, + 5.75135642450580880647e-02, + 5.66270531444532515541e-02, + 5.57111606016933366692e-02, + 5.47665009108296851892e-02, + 5.37937024715815850784e-02, + 5.27934073957626870399e-02, + 5.17662711073889059143e-02, + 5.07129619367031950206e-02, + 4.96341607083598743144e-02, + 4.85305603240058919257e-02, + 4.74028653395071053467e-02, + 4.62517915370636301109e-02, + 4.50780654924642990022e-02, + 4.38824241377281029641e-02, + 4.26656143193894568655e-02, + 4.14283923526756400757e-02, + 4.01715235718370783369e-02, + 3.88957818768817381594e-02, + 3.76019492769772492591e-02, + 3.62908154307766822599e-02, + 3.49631771839265942381e-02, + 3.36198381040227756156e-02, + 3.22616080132712215733e-02, + 3.08893025191169512400e-02, + 2.95037425431055044811e-02, + 2.81057538482372380739e-02, + 2.66961665650768086022e-02, + 2.52758147168840839603e-02, + 2.38455357440239580635e-02, + 2.24061700279218310727e-02, + 2.09585604148223095256e-02, + 1.95035517396166743764e-02, + 1.80419903499945237513e-02, + 1.65747236311830255240e-02, + 1.51025995315297069388e-02, + 1.36264660891878813115e-02, + 1.21471709601575494908e-02, + 1.06655609479410495855e-02, + 9.18248153506075540098e-03, + 7.69877641669523653245e-03, + 6.21528703667832953944e-03, + 4.73285212611389023013e-03, + 3.25230724484593071086e-03, + 1.77448432603104764606e-03, + 3.00211224053546050453e-04, +-1.16968873398075085164e-03, +-2.63439719293501574751e-03, +-4.09310121028114842767e-03, +-5.54499369246326881400e-03, +-6.98927382675401144552e-03, +-8.42514750838012187184e-03, +-9.85182776269834421801e-03, +-1.12685351622023224166e-02, +-1.26744982381468297011e-02, +-1.40689538865774264181e-02, +-1.54511477685608713400e-02, +-1.68203347044119586040e-02, +-1.81757790617144907031e-02, +-1.95167551369457396848e-02, +-2.08425475305089903666e-02, +-2.21524515149872230912e-02, +-2.34457733964363347623e-02, +-2.47218308685369890509e-02, +-2.59799533594318662888e-02, +-2.72194823710760064328e-02, +-2.84397718109379513129e-02, +-2.96401883158870678436e-02, +-3.08201115681125577261e-02, +-3.19789346029227747326e-02, +-3.31160641082781370681e-02, +-3.42309207159130005071e-02, +-3.53229392839145145411e-02, +-3.63915691706218277779e-02, +-3.74362744997228866217e-02, +-3.84565344164232020274e-02, +-3.94518433345735566875e-02, +-4.04217111746440760367e-02, +-4.13656635924379983971e-02, +-4.22832421984465703368e-02, +-4.31740047677477145616e-02, +-4.40375254403603463849e-02, +-4.48733949119690250784e-02, +-4.56812206149411689782e-02, +-4.64606268895620885817e-02, +-4.72112551454219875335e-02, +-4.79327640128901638628e-02, +-4.86248294846227807620e-02, +-4.92871450470508051800e-02, +-4.99194218018040730689e-02, +-5.05213885770312357004e-02, +-5.10927920285815725943e-02, +-5.16333967310192848421e-02, +-5.21429852584503056301e-02, +-5.26213582551397357490e-02, +-5.30683344959132635710e-02, +-5.34837509363331325973e-02, +-5.38674627526497529217e-02, +-5.42193433715342787416e-02, +-5.45392844896020398404e-02, +-5.48271960827455065446e-02, +-5.50830064052948084607e-02, +-5.53066619790379757071e-02, +-5.54981275721307884541e-02, +-5.56573861679344195075e-02, +-5.57844389238277491017e-02, +-5.58793051200398085965e-02, +-5.59420220985603691699e-02, +-5.59726451921854703531e-02, +-5.59712476437655773176e-02, +-5.59379205157255615655e-02, +-5.58727725899317365088e-02, +-5.57759302579874938210e-02, +-5.56475374020423893540e-02, +-5.54877552662062720201e-02, +-5.52967623186622694864e-02, +-5.50747541045816801919e-02, +-5.48219430899443069261e-02, +-5.45385584963738595521e-02, +-5.42248461271042508924e-02, +-5.38810681841958433180e-02, +-5.35075030771247142636e-02, +-5.31044452228734698007e-02, +-5.26722048376558060756e-02, +-5.22111077204129997442e-02, +-5.17214950282209942611e-02, +-5.12037230437547910555e-02, +-5.06581629349584436350e-02, +-5.00852005070748507176e-02, +-4.94852359471897595977e-02, +-4.88586835614527661975e-02, +-4.82059715051387852047e-02, +-4.75275415057165098731e-02, +-4.68238485790967787215e-02, +-4.60953607392339606563e-02, +-4.53425587012589517699e-02, +-4.45659355783224117586e-02, +-4.37659965723364227652e-02, +-4.29432586587956896529e-02, +-4.20982502658717866462e-02, +-4.12315109479716793150e-02, +-4.03435910539542696984e-02, +-3.94350513902031810098e-02, +-3.85064628787541649024e-02, +-3.75584062106811000792e-02, +-3.65914714949422334445e-02, +-3.56062579028932485459e-02, +-3.46033733086755293518e-02, +-3.35834339256887229319e-02, +-3.25470639393581201437e-02, +-3.14948951364113841067e-02, +-3.04275665308768074324e-02, +-2.93457239870188353603e-02, +-2.82500198394295444493e-02, +-2.71411125104896906735e-02, +-2.60196661254226829785e-02, +-2.48863501251557692195e-02, +-2.37418388772132477049e-02, +-2.25868112848582602847e-02, +-2.14219503947065334493e-02, +-2.02479430030328977352e-02, +-1.90654792609915822721e-02, +-1.78752522789717531448e-02, +-1.66779577303104824260e-02, +-1.54742934545847657390e-02, +-1.42649590607015902544e-02, +-1.30506555300084672172e-02, +-1.18320848196448689948e-02, +-1.06099494663520910881e-02, +-9.38495219096077346044e-03, +-8.15779550377599728395e-03, +-6.92918131107302364552e-03, +-5.69981052292132129439e-03, +-4.47038266255170985142e-03, +-3.24159547747867194528e-03, +-2.01414455258872894527e-03, +-7.88722925405390719311e-04, + 4.33979296259515102616e-04, + 1.65327531406484059748e-03, + 2.86848201610344138643e-03, + 4.07892035086573293695e-03, + 5.28391569800646006272e-03, + 6.48279823571479112132e-03, + 7.67490330449144362440e-03, + 8.85957176714050748112e-03, + 1.00361503647855877797e-02, + 1.12039920687220222878e-02, + 1.23624564279179102733e-02, + 1.35109099119845744302e-02, + 1.46487262494354297110e-02, + 1.57752867610552773014e-02, + 1.68899806882093564409e-02, + 1.79922055159205465658e-02, + 1.90813672905472929420e-02, + 2.01568809318992299418e-02, + 2.12181705396309386313e-02, + 2.22646696937574897768e-02, + 2.32958217491361675722e-02, + 2.43110801237692714105e-02, + 2.53099085807794131620e-02, + 2.62917815039164816382e-02, + 2.72561841664596578305e-02, + 2.82026129933784439063e-02, + 2.91305758166261995201e-02, + 3.00395921234366258812e-02, + 3.09291932975059961908e-02, + 3.17989228529399620138e-02, + 3.26483366608550443222e-02, + 3.34770031685240748720e-02, + 3.42845036109633918842e-02, + 3.50704322148587890884e-02, + 3.58343963947392735170e-02, + 3.65760169413035240993e-02, + 3.72949282018151320739e-02, + 3.79907782524846540650e-02, + 3.86632290627611160949e-02, + 3.93119566514606166852e-02, + 3.99366512346636878816e-02, + 4.05370173653198731523e-02, + 4.11127740644999239983e-02, + 4.16636549442422551848e-02, + 4.21894083219462659451e-02, + 4.26897973262660088145e-02, + 4.31645999944682140503e-02, + 4.36136093612174424727e-02, + 4.40366335387612217733e-02, + 4.44334957884889164559e-02, + 4.48040345838451384286e-02, + 4.51481036645831335097e-02, + 4.54655720823471248826e-02, + 4.57563242375793044481e-02, + 4.60202599077495430602e-02, + 4.62572942669144740457e-02, + 4.64673578966120978673e-02, + 4.66503967881086306635e-02, + 4.68063723360144789964e-02, + 4.69352613232939530619e-02, + 4.70370558976949404428e-02, + 4.71117635396342340770e-02, + 4.71594070215737987128e-02, + 4.71800243589305737246e-02, + 4.71736687525673714649e-02, + 4.71404085229153516079e-02, + 4.70803270357842834626e-02, + 4.69935226199208050391e-02, + 4.68801084763797309973e-02, + 4.67402125797770004456e-02, + 4.65739775714988368804e-02, + 4.63815606449435313685e-02, + 4.61631334228796152974e-02, + 4.59188818270049037285e-02, + 4.56490059397985786793e-02, + 4.53537198587595224986e-02, + 4.50332515431300858810e-02, + 4.46878426532076045152e-02, + 4.43177483823498988280e-02, + 4.39232372817854738178e-02, + 4.35045910783411482470e-02, + 4.30621044852065107400e-02, + 4.25960850058553150421e-02, + 4.21068527312480900271e-02, + 4.15947401304457009541e-02, + 4.10600918347645213458e-02, + 4.05032644156081075848e-02, + 3.99246261561139251239e-02, + 3.93245568167555487049e-02, + 3.87034473950466154091e-02, + 3.80616998794914215831e-02, + 3.73997269979330568268e-02, + 3.67179519604542980993e-02, + 3.60168081969824901978e-02, + 3.52967390897612337541e-02, + 3.45581977008463520074e-02, + 3.38016464947914485606e-02, + 3.30275570566867723854e-02, + 3.22364098057202272396e-02, + 3.14286937044311875944e-02, + 3.06049059638265272265e-02, + 2.97655517445348863359e-02, + 2.89111438541742558905e-02, + 2.80422024411093630258e-02, + 2.71592546847793693543e-02, + 2.62628344827749958534e-02, + 2.53534821348480460257e-02, + 2.44317440240356988090e-02, + 2.34981722950843643916e-02, + 2.25533245303600957121e-02, + 2.15977634234290963300e-02, + 2.06320564504986307675e-02, + 1.96567755399048478548e-02, + 1.86724967398384719686e-02, + 1.76797998844943696217e-02, + 1.66792682588392839060e-02, + 1.56714882621848752842e-02, + 1.46570490707573775069e-02, + 1.36365422994567421500e-02, + 1.26105616629926826217e-02, + 1.15797026365911225748e-02, + 1.05445621164599462327e-02, + 9.50573808020578961409e-03, + 8.46382924739110323320e-03, + 7.41943474041982693745e-03, + 6.37315374594339158210e-03, + 5.32558517697237672472e-03, + 4.27732733588230377986e-03, + 3.22897757850148679412e-03, + 2.18113197946379544154e-03, + 1.13438499901297824499e-03, + 8.93291514401199637785e-05, +-9.53445324662180308285e-04, +-1.99335079414908163467e-03, +-3.02980255089889101774e-03, +-4.06221914103327592926e-03, +-5.09002268361045690642e-03, +-6.11263918861550906853e-03, +-7.12949887207463706834e-03, +-8.14003646812562139945e-03, +-9.14369153787539246103e-03, +-1.01399087748766797423e-02, +-1.11281383070643315192e-02, +-1.21078359949849043153e-02, +-1.30784637261652115364e-02, +-1.40394897054589556235e-02, +-1.49903887412209321783e-02, +-1.59306425271560810064e-02, +-1.68597399196934796817e-02, +-1.77771772107420643338e-02, +-1.86824583956837868282e-02, +-1.95750954364632238913e-02, +-2.04546085196391988492e-02, +-2.13205263092617232357e-02, +-2.21723861944465271134e-02, +-2.30097345315165013879e-02, +-2.38321268805886041231e-02, +-2.46391282364846579689e-02, +-2.54303132538467105417e-02, +-2.62052664663464558725e-02, +-2.69635824998752660075e-02, +-2.77048662796101873018e-02, +-2.84287332308504510359e-02, +-2.91348094735277007850e-02, +-2.98227320102924450818e-02, +-3.04921489080843266528e-02, +-3.11427194730996177718e-02, +-3.17741144190714572271e-02, +-3.23860160287801970846e-02, +-3.29781183087202514614e-02, +-3.35501271368501066683e-02, +-3.41017604033561905208e-02, +-3.46327481443660725735e-02, +-3.51428326685533573559e-02, +-3.56317686765738189658e-02, +-3.60993233732840035355e-02, +-3.65452765726929293399e-02, +-3.69694207956033291107e-02, +-3.73715613599018697810e-02, +-3.77515164634644601049e-02, +-3.81091172596444149878e-02, +-3.84442079253161372865e-02, +-3.87566457214516685292e-02, +-3.90463010462121923316e-02, +-3.93130574805393290250e-02, +-3.95568118262348833447e-02, +-3.97774741365262002324e-02, +-3.99749677391120911141e-02, +-4.01492292516929735746e-02, +-4.03002085899928502721e-02, +-4.04278689682822170437e-02, +-4.05321868924172351578e-02, +-4.06131521454162341955e-02, +-4.06707677655930785465e-02, +-4.07050500172784421316e-02, +-4.07160283541586343059e-02, +-4.07037453752667754969e-02, +-4.06682567736679767556e-02, +-4.06096312778803508747e-02, +-4.05279505860795044581e-02, +-4.04233092931398294012e-02, +-4.02958148105644620163e-02, +-4.01455872793672688403e-02, +-3.99727594759664850432e-02, +-3.97774767111586519119e-02, +-3.95598967222433872681e-02, +-3.93201895583720484328e-02, +-3.90585374591997241955e-02, +-3.87751347269212551239e-02, +-3.84701875917762628476e-02, +-3.81439140711113400251e-02, +-3.77965438220935409652e-02, +-3.74283179881668356948e-02, +-3.70394890393534528816e-02, +-3.66303206065006978220e-02, +-3.62010873095778978881e-02, +-3.57520745801320274926e-02, +-3.52835784780144504080e-02, +-3.47959055024906621645e-02, +-3.42893723978519651685e-02, +-3.37643059536492443073e-02, +-3.32210427996700446984e-02, +-3.26599291957861484481e-02, +-3.20813208167984795227e-02, +-3.14855825324110299990e-02, +-3.08730881824660075008e-02, +-3.02442203475766398235e-02, +-2.95993701152947666366e-02, +-2.89389368419537100496e-02, +-2.82633279103284111577e-02, +-2.75729584832571511521e-02, +-2.68682512533715799063e-02, +-2.61496361890828643570e-02, +-2.54175502769729139141e-02, +-2.46724372607451357398e-02, +-2.39147473768850267473e-02, +-2.31449370871867204924e-02, +-2.23634688083034216532e-02, +-2.15708106384762607344e-02, +-2.07674360816027074594e-02, +-1.99538237688046717067e-02, +-1.91304571776571320785e-02, +-1.82978243492389613944e-02, +-1.74564176031696584313e-02, +-1.66067332507972391376e-02, +-1.57492713066995013160e-02, +-1.48845351986653506166e-02, +-1.40130314763233891628e-02, +-1.31352695185807718387e-02, +-1.22517612400427650804e-02, +-1.13630207965765197414e-02, +-1.04695642901892153193e-02, +-9.57190947338527192700e-03, +-8.67057545317061195700e-03, +-7.76608239487228645126e-03, +-6.85895122593805847688e-03, +-5.94970333988319773771e-03, +-5.03886030055244581866e-03, +-4.12694354685914054082e-03, +-3.21447409816993977597e-03, +-2.30197226049791555877e-03, +-1.38995733366734314576e-03, +-4.78947319613120116137e-04, + 4.30541368021724365611e-04, + 1.33799419283328071238e-03, + 2.24289878298409997917e-03, + 3.14474521675841243995e-03, + 4.04302630618200674328e-03, + 4.93723787855436784672e-03, + 5.82687905573941924281e-03, + 6.71145253105821966433e-03, + 7.59046484363825723490e-03, + 8.46342665006433181318e-03, + 9.32985299318577973593e-03, + 1.01892635679366270335e-02, + 1.10411829840201432262e-02, + 1.18851410253191149685e-02, + 1.27206729058918742437e-02, + 1.35473195224164386086e-02, + 1.43646277029455919638e-02, + 1.51721504518438701781e-02, + 1.59694471907719792725e-02, + 1.67560839955920790056e-02, + 1.75316338290704282210e-02, + 1.82956767692504761180e-02, + 1.90478002333781711031e-02, + 1.97875991972636944283e-02, + 2.05146764099610016963e-02, + 2.12286426036550797403e-02, + 2.19291166986495568436e-02, + 2.26157260033451115722e-02, + 2.32881064091071711408e-02, + 2.39459025799248388655e-02, + 2.45887681367592640658e-02, + 2.52163658364931847489e-02, + 2.58283677453865524731e-02, + 2.64244554069528701790e-02, + 2.70043200041730317718e-02, + 2.75676625159635493856e-02, + 2.81141938678234649951e-02, + 2.86436350765866577783e-02, + 2.91557173892062447551e-02, + 2.96501824155063799238e-02, + 3.01267822548387659287e-02, + 3.05852796165800439043e-02, + 3.10254479344173710043e-02, + 3.14470714743682391856e-02, + 3.18499454364842490839e-02, + 3.22338760501942114822e-02, + 3.25986806632450124011e-02, + 3.29441878242012764488e-02, + 3.32702373584682215002e-02, + 3.35766804378105562789e-02, + 3.38633796433344125276e-02, + 3.41302090219154988238e-02, + 3.43770541360479547910e-02, + 3.46038121071011867125e-02, + 3.48103916519715006483e-02, + 3.49967131131205394512e-02, + 3.51627084819939664251e-02, + 3.53083214158219776957e-02, + 3.54335072478019763587e-02, + 3.55382329906705415890e-02, + 3.56224773336756214692e-02, + 3.56862306329609538236e-02, + 3.57294948953816096648e-02, + 3.57522837557707126588e-02, + 3.57546224476834179073e-02, + 3.57365477676438725307e-02, + 3.56981080329308309018e-02, + 3.56393630329330246553e-02, + 3.55603839741180857703e-02, + 3.54612534186531380698e-02, + 3.53420652167257473564e-02, + 3.52029244326149889921e-02, + 3.50439472645631341918e-02, + 3.48652609585071091014e-02, + 3.46670037157273194794e-02, + 3.44493245944778661571e-02, + 3.42123834056644454682e-02, + 3.39563506026385533709e-02, + 3.36814071651815385988e-02, + 3.33877444777541942944e-02, + 3.30755642020896523103e-02, + 3.27450781442136518162e-02, + 3.23965081159751852602e-02, + 3.20300857911755970653e-02, + 3.16460525563882003053e-02, + 3.12446593565609519183e-02, + 3.08261665354972284880e-02, + 3.03908436713170998500e-02, + 2.99389694069978791469e-02, + 2.94708312760984421363e-02, + 2.89867255237756110686e-02, + 2.84869569232016131566e-02, + 2.79718385874915022316e-02, + 2.74416917772590980562e-02, + 2.68968457039136660258e-02, + 2.63376373288174668585e-02, + 2.57644111584257248793e-02, + 2.51775190355282320331e-02, + 2.45773199267213977859e-02, + 2.39641797062345729419e-02, + 2.33384709362384548670e-02, + 2.27005726437677947394e-02, + 2.20508700943889204837e-02, + 2.13897545627447401018e-02, + 2.07176231001132207798e-02, + 2.00348782991160503930e-02, + 1.93419280557122104380e-02, + 1.86391853286192524242e-02, + 1.79270678963008890661e-02, + 1.72059981116597301987e-02, + 1.64764026545822124536e-02, + 1.57387122824750626260e-02, + 1.49933615789394694695e-02, + 1.42407887007263995321e-02, + 1.34814351231214504812e-02, + 1.27157453839016106739e-02, + 1.19441668260144781555e-02, + 1.11671493391258293271e-02, + 1.03851451001812210978e-02, + 9.59860831313457708858e-03, + 8.80799494798568949339e-03, + 8.01376247928074769700e-03, + 7.21636962422106571780e-03, + 6.41627608052837850733e-03, + 5.61394226421643282449e-03, + 4.80982904741692092465e-03, + 4.00439749640451800317e-03, + 3.19810860997276008924e-03, + 2.39142305830572152181e-03, + 1.58480092248966769435e-03, + 7.78701434814883992376e-04, +-2.64172799899629922237e-05, +-8.30098462447035776932e-04, +-1.63188697479669402902e-03, +-2.43132955610078941786e-03, +-3.22797507584321246785e-03, +-4.02137478588284608128e-03, +-4.81108257062173427093e-03, +-5.59665519525267239620e-03, +-6.37765255194445643272e-03, +-7.15363790383393653022e-03, +-7.92417812668915269581e-03, +-8.68884394811023953731e-03, +-9.44721018414002543240e-03, +-1.01988559731527404090e-02, +-1.09433650068938154165e-02, +-1.16803257585482624797e-02, +-1.24093317077095619677e-02, +-1.31299815621298259644e-02, +-1.38418794761330250093e-02, +-1.45446352655703541046e-02, +-1.52378646192042489088e-02, +-1.59211893064089386740e-02, +-1.65942373810739063344e-02, +-1.72566433816031643278e-02, +-1.79080485269053901742e-02, +-1.85481009082684548950e-02, +-1.91764556770177840850e-02, +-1.97927752278625780635e-02, +-2.03967293778293395912e-02, +-2.09879955406921600569e-02, +-2.15662588968082193086e-02, +-2.21312125582700525150e-02, +-2.26825577292899260851e-02, +-2.32200038617330316304e-02, +-2.37432688057198117149e-02, +-2.42520789552232059194e-02, +-2.47461693885826818085e-02, +-2.52252840038678892431e-02, +-2.56891756490234268728e-02, +-2.61376062467286660040e-02, +-2.65703469139121004061e-02, +-2.69871780758624488228e-02, +-2.73878895748791845177e-02, +-2.77722807734117477230e-02, +-2.81401606516388999579e-02, +-2.84913478994407130818e-02, +-2.88256710027211988934e-02, +-2.91429683240446539549e-02, +-2.94430881775452554794e-02, +-2.97258888980813616720e-02, +-2.99912389046026704731e-02, +-3.02390167577045836100e-02, +-3.04691112113477519108e-02, +-3.06814212587221760153e-02, +-3.08758561722402014027e-02, +-3.10523355376465907962e-02, +-3.12107892822333435334e-02, +-3.13511576971570726791e-02, +-3.14733914538524867099e-02, +-3.15774516145448311266e-02, +-3.16633096368639233020e-02, +-3.17309473725677151923e-02, +-3.17803570603852336696e-02, +-3.18115413129928040203e-02, +-3.18245130981409940496e-02, +-3.18192957139523252552e-02, +-3.17959227584129339172e-02, +-3.17544380930855907330e-02, +-3.16948958010739717528e-02, +-3.16173601392711264846e-02, +-3.15219054849285862385e-02, +-3.14086162765858309398e-02, +-3.12775869494028441187e-02, +-3.11289218649403939820e-02, +-3.09627352354390518452e-02, +-3.07791510426457977367e-02, +-3.05783029512460211019e-02, +-3.03603342169560183605e-02, +-3.01253975893385171625e-02, +-2.98736552094041353522e-02, +-2.96052785020640661651e-02, +-2.93204480635056198568e-02, +-2.90193535435597504968e-02, +-2.87021935231378082232e-02, +-2.83691753868116139370e-02, +-2.80205151906207892976e-02, +-2.76564375251866501060e-02, +-2.72771753742177547331e-02, +-2.68829699684970599427e-02, +-2.64740706354380586629e-02, +-2.60507346443026310823e-02, +-2.56132270471758974328e-02, +-2.51618205157945855344e-02, +-2.46967951743263178233e-02, +-2.42184384282035404523e-02, +-2.37270447891129755702e-02, +-2.32229156962464287906e-02, +-2.27063593339205324617e-02, +-2.21776904456732447402e-02, +-2.16372301449491780123e-02, +-2.10853057224852889762e-02, +-2.05222504505109502870e-02, +-1.99484033838788939186e-02, +-1.93641091582448833519e-02, +-1.87697177854121780016e-02, +-1.81655844459648781186e-02, +-1.75520692793087393357e-02, +-1.69295371712437116296e-02, +-1.62983575391910488761e-02, +-1.56589041152024530112e-02, +-1.50115547268741284653e-02, +-1.43566910762958008241e-02, +-1.36946985171622712812e-02, +-1.30259658301738225072e-02, +-1.23508849968591849500e-02, +-1.16698509719491937131e-02, +-1.09832614544311153726e-02, +-1.02915166574176798753e-02, +-9.59501907696169199780e-03, +-8.89417325994698755587e-03, +-8.18938557119236638926e-03, +-7.48106395989599822632e-03, +-6.76961772555855368499e-03, +-6.05545728351598779721e-03, +-5.33899393021318099950e-03, +-4.62063960835571319735e-03, +-3.90080667206999139041e-03, +-3.17990765220415401091e-03, +-2.45835502190418740687e-03, +-1.73656096259670639399e-03, +-1.01493713050778409414e-03, +-2.93894423852804689834e-04, + 4.26157249173980906629e-04, + 1.14480920148214617565e-03, + 1.86165419710703351590e-03, + 2.57628668004443710932e-03, + 3.28830300177243139287e-03, + 3.99730164732982774095e-03, + 4.70288345982820387564e-03, + 5.40465186327331818111e-03, + 6.10221308357093879249e-03, + 6.79517636759518171841e-03, + 7.48315420020127710504e-03, + 8.16576251905792339925e-03, + 8.84262092718743515640e-03, + 9.51335290309166317635e-03, + 1.01775860083515076043e-02, + 1.08349520925866381338e-02, + 1.14850874956621031020e-02, + 1.21276332470322649459e-02, + 1.27622352621157286734e-02, + 1.33885445355916270910e-02, + 1.40062173315140241908e-02, + 1.46149153701442997833e-02, + 1.52143060113965177677e-02, + 1.58040624348002624322e-02, + 1.63838638158842961334e-02, + 1.69533954988862062274e-02, + 1.75123491656954573259e-02, + 1.80604230009418498248e-02, + 1.85973218531409432985e-02, + 1.91227573918102446149e-02, + 1.96364482604763183893e-02, + 2.01381202254901497950e-02, + 2.06275063205740884220e-02, + 2.11043469870254470078e-02, + 2.15683902095024221390e-02, + 2.20193916473261919187e-02, + 2.24571147612263599669e-02, + 2.28813309354701996390e-02, + 2.32918195953102993845e-02, + 2.36883683196934501092e-02, + 2.40707729491726543647e-02, + 2.44388376889697125915e-02, + 2.47923752071377255513e-02, + 2.51312067277732788251e-02, + 2.54551621192373560276e-02, + 2.57640799773376678872e-02, + 2.60578077034374286369e-02, + 2.63362015774511563915e-02, + 2.65991268256962030969e-02, + 2.68464576835671930866e-02, + 2.70780774530085012464e-02, + 2.72938785547578652291e-02, + 2.74937625753404746298e-02, + 2.76776403087958637605e-02, + 2.78454317931197334324e-02, + 2.79970663414113134226e-02, + 2.81324825677129637669e-02, + 2.82516284075390901320e-02, + 2.83544611330882809219e-02, + 2.84409473631392593906e-02, + 2.85110630676332979516e-02, + 2.85647935669472025078e-02, + 2.86021335258679100522e-02, + 2.86230869422767590649e-02, + 2.86276671305612032126e-02, + 2.86158966997688939127e-02, + 2.85878075265257568238e-02, + 2.85434407227408461216e-02, + 2.84828465981240355753e-02, + 2.84060846175463004026e-02, + 2.83132233532735408388e-02, + 2.82043404321091033260e-02, + 2.80795224774836003900e-02, + 2.79388650465300265868e-02, + 2.77824725621904008999e-02, + 2.76104582403968873416e-02, + 2.74229440123787519823e-02, + 2.72200604421439854019e-02, + 2.70019466391913931513e-02, + 2.67687501665088492531e-02, + 2.65206269439171582469e-02, + 2.62577411468211084633e-02, + 2.59802651004316341454e-02, + 2.56883791695271083977e-02, + 2.53822716438199466604e-02, + 2.50621386190043350661e-02, + 2.47281838735542228158e-02, + 2.43806187413515146334e-02, + 2.40196619802195698856e-02, + 2.36455396364462083758e-02, + 2.32584849053751770154e-02, + 2.28587379881527788528e-02, + 2.24465459447181145403e-02, + 2.20221625431206817491e-02, + 2.15858481052626192953e-02, + 2.11378693491531578774e-02, + 2.06784992277722831644e-02, + 2.02080167646385595870e-02, + 1.97267068861813506253e-02, + 1.92348602510139590760e-02, + 1.87327730762112433516e-02, + 1.82207469606941833973e-02, + 1.76990887058239218521e-02, + 1.71681101333155360089e-02, + 1.66281279005709090035e-02, + 1.60794633135482208097e-02, + 1.55224421372705916056e-02, + 1.49573944040871566891e-02, + 1.43846542198004401919e-02, + 1.38045595677690705744e-02, + 1.32174521111029039805e-02, + 1.26236769930632777847e-02, + 1.20235826357873512582e-02, + 1.14175205374468860531e-02, + 1.08058450679664186378e-02, + 1.01889132634121089283e-02, + 9.56708461917343822023e-03, + 8.94072088205428300300e-03, + 8.31018584139599399141e-03, + 7.67584511934790540699e-03, + 7.03806596040880416698e-03, + 6.39721702035818493709e-03, + 5.75366815469682043455e-03, + 5.10779020672127558739e-03, + 4.45995479534525007814e-03, + 3.81053410279771258631e-03, + 3.15990066231072903868e-03, + 2.50842714592023827147e-03, + 1.85648615250139353144e-03, + 1.20444999615454471746e-03, + 5.52690495064260415084e-04, +-9.84212390521464980473e-05, +-7.48515010783776918966e-04, +-1.39722175004304473983e-03, +-2.04417372013348868851e-03, +-2.68900472475985721083e-03, +-3.33135031386035986023e-03, +-3.97084798814866836436e-03, +-4.60713740224857979527e-03, +-5.23986056631194768718e-03, +-5.86866204600630658739e-03, +-6.49318916075832062301e-03, +-7.11309218015082015546e-03, +-7.72802451835431433724e-03, +-8.33764292649709012895e-03, +-8.94160768285747094286e-03, +-9.53958278078098804997e-03, +-1.01312361142165130445e-02, +-1.07162396607681370542e-02, +-1.12942696621660988721e-02, +-1.18650068020553327297e-02, +-1.24281363810071557308e-02, +-1.29833484886548687631e-02, +-1.35303381728667914546e-02, +-1.40688056058569672252e-02, +-1.45984562471500062958e-02, +-1.51190010033104265535e-02, +-1.56301563843482677063e-02, +-1.61316446567209455243e-02, +-1.66231939928469449330e-02, +-1.71045386170529077619e-02, +-1.75754189478743681752e-02, +-1.80355817366393243739e-02, +-1.84847802022550938839e-02, +-1.89227741621333586663e-02, +-1.93493301591808192219e-02, +-1.97642215847910959758e-02, +-2.01672287977736237885e-02, +-2.05581392391563748390e-02, +-2.09367475428056254438e-02, +-2.13028556418044003051e-02, +-2.16562728705364630766e-02, +-2.19968160624214870147e-02, +-2.23243096432573610854e-02, +-2.26385857201165559272e-02, +-2.29394841657579208472e-02, +-2.32268526985093780313e-02, +-2.35005469575834645413e-02, +-2.37604305737897300577e-02, +-2.40063752356104789798e-02, +-2.42382607506086561466e-02, +-2.44559751021389444603e-02, +-2.46594145013394015764e-02, +-2.48484834343765149944e-02, +-2.50230947049280248728e-02, +-2.51831694718824584955e-02, +-2.53286372822437155783e-02, +-2.54594360992264553967e-02, +-2.55755123255348194855e-02, +-2.56768208218174157076e-02, +-2.57633249202947785250e-02, +-2.58349964335584103559e-02, +-2.58918156585436348704e-02, +-2.59337713756803804610e-02, +-2.59608608432293705426e-02, +-2.59730897868132928896e-02, +-2.59704723841564268094e-02, +-2.59530312450472130936e-02, +-2.59207973865424462501e-02, +-2.58738102034334269130e-02, +-2.58121174339979962686e-02, +-2.57357751210636476191e-02, +-2.56448475684109972184e-02, +-2.55394072925489191983e-02, +-2.54195349698946651551e-02, +-2.52853193793951269708e-02, +-2.51368573406296827444e-02, +-2.49742536474338513997e-02, +-2.47976209970892889911e-02, +-2.46070799151258470805e-02, +-2.44027586757840746212e-02, +-2.41847932181901530135e-02, +-2.39533270582963850326e-02, +-2.37085111966422665275e-02, +-2.34505040219958535430e-02, +-2.31794712109343950535e-02, +-2.28955856234271913630e-02, +-2.25990271944861188802e-02, +-2.22899828219497650461e-02, +-2.19686462504703923504e-02, +-2.16352179517750840831e-02, +-2.12899050012748461413e-02, +-2.09329209510937253036e-02, +-2.05644856995994759763e-02, +-2.01848253575104240320e-02, +-1.97941721106610450664e-02, +-1.93927640795097180892e-02, +-1.89808451754700721614e-02, +-1.85586649541545842257e-02, +-1.81264784656151936582e-02, +-1.76845461016740639060e-02, +-1.72331334404288091799e-02, +-1.67725110880316378992e-02, +-1.63029545178296972341e-02, +-1.58247439069643912324e-02, +-1.53381639705272194985e-02, +-1.48435037933645017777e-02, +-1.43410566596358455410e-02, +-1.38311198802215200299e-02, +-1.33139946180815798432e-02, +-1.27899857116674387641e-02, +-1.22594014964915645066e-02, +-1.17225536249535751410e-02, +-1.11797568845337768478e-02, +-1.06313290144546303273e-02, +-1.00775905209177212701e-02, +-9.51886449102469674177e-03, +-8.95547640548645211556e-03, +-8.38775395023088309043e-03, +-7.81602682701561073120e-03, +-7.24062656315801675411e-03, +-6.66188632048521009454e-03, +-6.08014070362140109788e-03, +-5.49572556771589591090e-03, +-4.90897782572374818955e-03, +-4.32023525535186938423e-03, +-3.72983630577348361859e-03, +-3.13811990422953454236e-03, +-2.54542526261991586267e-03, +-1.95209168419812327012e-03, +-1.35845837047655643853e-03, +-7.64864228454678000274e-04, +-1.71647678275262160000e-04, + 4.20853538580006714207e-04, + 1.01230255044841479378e-03, + 1.60236354589089790082e-03, + 2.19070196323387957060e-03, + 2.77698467914542839949e-03, + 3.36088019613725542609e-03, + 3.94205882888990985502e-03, + 4.52019288929302043289e-03, + 5.09495687010455642479e-03, + 5.66602762711795274880e-03, + 6.23308455974283786433e-03, + 6.79580978989625592024e-03, + 7.35388833910371412378e-03, + 7.90700830371526483531e-03, + 8.45486102813735630745e-03, + 8.99714127598559912369e-03, + 9.53354739906401085769e-03, + 1.00637815040785765647e-02, + 1.05875496169915012112e-02, + 1.11045618449284663742e-02, + 1.16145325355499640790e-02, + 1.21171804337962679687e-02, + 1.26122288359273460739e-02, + 1.30994057407662432141e-02, + 1.35784439980698272421e-02, + 1.40490814539434016872e-02, + 1.45110610932224059350e-02, + 1.49641311787415132173e-02, + 1.54080453874216524723e-02, + 1.58425629430952868981e-02, + 1.62674487460044807363e-02, + 1.66824734989000737773e-02, + 1.70874138296747413168e-02, + 1.74820524104663498066e-02, + 1.78661780731680860934e-02, + 1.82395859212837498087e-02, + 1.86020774380712544671e-02, + 1.89534605909168415994e-02, + 1.92935499318850137151e-02, + 1.96221666943946111694e-02, + 1.99391388859692132718e-02, + 2.02443013770143460939e-02, + 2.05374959855790205354e-02, + 2.08185715580545618875e-02, + 2.10873840457748047694e-02, + 2.13437965774761310989e-02, + 2.15876795275838501142e-02, + 2.18189105802902433284e-02, + 2.20373747893947494192e-02, + 2.22429646338771422331e-02, + 2.24355800691775179867e-02, + 2.26151285741611890456e-02, + 2.27815251937450065356e-02, + 2.29346925771693951890e-02, + 2.30745610118978684844e-02, + 2.32010684531324534730e-02, + 2.33141605489318240463e-02, + 2.34137906609261335633e-02, + 2.34999198806205046586e-02, + 2.35725170412852368107e-02, + 2.36315587254308061282e-02, + 2.36770292678692914623e-02, + 2.37089207543672679523e-02, + 2.37272330158955317703e-02, + 2.37319736184848778526e-02, + 2.37231578487003234856e-02, + 2.37008086947469512329e-02, + 2.36649568232238372012e-02, + 2.36156405515453339528e-02, + 2.35529058160507051567e-02, + 2.34768061358264293337e-02, + 2.33874025722661145477e-02, + 2.32847636843980104748e-02, + 2.31689654800100834631e-02, + 2.30400913626058086170e-02, + 2.28982320742268929958e-02, + 2.27434856341802542345e-02, + 2.25759572737094099670e-02, + 2.23957593666531708243e-02, + 2.22030113561352687723e-02, + 2.19978396773321642488e-02, + 2.17803776763693009155e-02, + 2.15507655253935614947e-02, + 2.13091501338791566855e-02, + 2.10556850562188986598e-02, + 2.07905303956600374937e-02, + 2.05138527046431831669e-02, + 2.02258248816056598884e-02, + 1.99266260643129536345e-02, + 1.96164415197817541825e-02, + 1.92954625308645287551e-02, + 1.89638862795599161259e-02, + 1.86219157271243600238e-02, + 1.82697594910530766721e-02, + 1.79076317190069930763e-02, + 1.75357519597588440430e-02, + 1.71543450312383258249e-02, + 1.67636408857523670768e-02, + 1.63638744724620595339e-02, + 1.59552855971977040894e-02, + 1.55381187796942588780e-02, + 1.51126231083333045085e-02, + 1.46790520924749527676e-02, + 1.42376635124681055061e-02, + 1.37887192674271304160e-02, + 1.33324852208636900064e-02, + 1.28692310442640404228e-02, + 1.23992300587048714933e-02, + 1.19227590745975605552e-02, + 1.14400982296555958628e-02, + 1.09515308251813669321e-02, + 1.04573431607620833533e-02, + 9.95782436747753331441e-03, + 9.45326623971061603957e-03, + 8.94396306566137833105e-03, + 8.43021145666009164010e-03, + 7.91231017538069313078e-03, + 7.39055996305047670919e-03, + 6.86526336575661762229e-03, + 6.33672455995178390137e-03, + 5.80524917725282890713e-03, + 5.27114412864063391212e-03, + 4.73471742815538901294e-03, + 4.19627801619143914885e-03, + 3.65613558249144616347e-03, + 3.11460038894114266822e-03, + 2.57198309226452578868e-03, + 2.02859456672282133238e-03, + 1.48474572691466213253e-03, + 9.40747350779479814438e-04, + 3.96909902906757746776e-04, +-1.46456641755227459385e-04, +-6.89042973683567970891e-04, +-1.23054062396519788870e-03, +-1.77064213877926087543e-03, +-2.30904125308122910865e-03, +-2.84543306338863035906e-03, +-3.37951419957442612471e-03, +-3.91098299557036087337e-03, +-4.43953965888237763598e-03, +-4.96488643882942240482e-03, +-5.48672779340401636783e-03, +-6.00477055466794654159e-03, +-6.51872409258721658559e-03, +-7.02830047721765636265e-03, +-7.53321463914807636086e-03, +-8.03318452811570618555e-03, +-8.52793126970340098492e-03, +-9.01717932003300026711e-03, +-9.50065661837041358639e-03, +-9.97809473755507415904e-03, +-1.04492290321770483347e-02, +-1.09137987844132033910e-02, +-1.13715473474486038208e-02, +-1.18222222864012831839e-02, +-1.22655755166751010560e-02, +-1.27013634396638160073e-02, +-1.31293470757343818528e-02, +-1.35492921944166400117e-02, +-1.39609694417272556244e-02, +-1.43641544645633414262e-02, +-1.47586280320936603927e-02, +-1.51441761540860777430e-02, +-1.55205901961063368055e-02, +-1.58876669915270080091e-02, +-1.62452089502858505743e-02, +-1.65930241643379994265e-02, +-1.69309265097449777870e-02, +-1.72587357453450260247e-02, +-1.75762776079578519894e-02, +-1.78833839040674798249e-02, +-1.81798925979421467647e-02, +-1.84656478961397856053e-02, +-1.87405003283600303521e-02, +-1.90043068245987142872e-02, +-1.92569307885670955305e-02, +-1.94982421673372645354e-02, +-1.97281175171806696933e-02, +-1.99464400655660206718e-02, +-2.01530997692852438530e-02, +-2.03479933686821802541e-02, +-2.05310244379545009386e-02, +-2.07021034315073952647e-02, +-2.08611477263374693603e-02, +-2.10080816604267042735e-02, +-2.11428365671300945439e-02, +-2.12653508055429402157e-02, +-2.13755697868347541157e-02, +-2.14734459965394662573e-02, +-2.15589390127965130350e-02, +-2.16320155205337663618e-02, +-2.16926493215929237779e-02, +-2.17408213407943202988e-02, +-2.17765196279432124427e-02, +-2.17997393557822147225e-02, +-2.18104828138950025684e-02, +-2.18087593985702259125e-02, +-2.17945855986363228041e-02, +-2.17679849772805522612e-02, +-2.17289881498666827275e-02, +-2.16776327577697588977e-02, +-2.16139634382471537699e-02, +-2.15380317903683393688e-02, +-2.14498963370269787876e-02, +-2.13496224830621826596e-02, +-2.12372824695176258547e-02, +-2.11129553240687953264e-02, +-2.09767268076514190600e-02, +-2.08286893573265061153e-02, +-2.06689420254178614356e-02, +-2.04975904149630808182e-02, +-2.03147466115173279400e-02, +-2.01205291113544029735e-02, +-1.99150627461096366155e-02, +-1.96984786039120784995e-02, +-1.94709139470550414430e-02, +-1.92325121262560613800e-02, +-1.89834224915587240767e-02, +-1.87238002999316095754e-02, +-1.84538066196213920711e-02, +-1.81736082313160018931e-02, +-1.78833775261818227198e-02, +-1.75832924008327562415e-02, +-1.72735361492968621244e-02, +-1.69542973520454935688e-02, +-1.66257697621504420271e-02, +-1.62881521886383481834e-02, +-1.59416483771111401613e-02, +-1.55864668877057875596e-02, +-1.52228209704614383946e-02, +-1.48509284381741404196e-02, +-1.44710115368087768872e-02, +-1.40832968135484268984e-02, +-1.36880149825567599964e-02, +-1.32854007885348044532e-02, +-1.28756928681500511930e-02, +-1.24591336094203239404e-02, +-1.20359690091351341501e-02, +-1.16064485283965002776e-02, +-1.11708249463664966578e-02, +-1.07293542123018670331e-02, +-1.02822952959679969620e-02, +-9.82991003651416048181e-03, +-9.37246298989989796990e-03, +-8.91022127496175937733e-03, +-8.44345441820766075269e-03, +-7.97243419742989060939e-03, +-7.49743448422606276194e-03, +-7.01873108552144003153e-03, +-6.53660158417858263430e-03, +-6.05132517879274946238e-03, +-5.56318252275954730490e-03, +-5.07245556271012591060e-03, +-4.57942737640496932289e-03, +-4.08438201018109132978e-03, +-3.58760431604305358652e-03, +-3.08937978849174819246e-03, +-2.58999440118657569057e-03, +-2.08973444352780410305e-03, +-1.58888635726068356765e-03, +-1.08773657318487516898e-03, +-5.86571348070346666216e-04, +-8.56766018661410432358e-05, + 4.14662244703500838458e-04, + 9.14160432062568030845e-04, + 1.41253402313765564872e-03, + 1.90950006404986844660e-03, + 2.40477674405564865318e-03, + 2.89808355464306636670e-03, + 3.38914144770032432427e-03, + 3.87767299266011901057e-03, + 4.36340253253783821180e-03, + 4.84605633877375780588e-03, + 5.32536276479152106272e-03, + 5.80105239818985360389e-03, + 6.27285821148045302093e-03, + 6.74051571128982465742e-03, + 7.20376308593877450609e-03, + 7.66234135132374139660e-03, + 8.11599449501146374963e-03, + 8.56446961847351709296e-03, + 9.00751707737854762081e-03, + 9.44489061986596677156e-03, + 9.87634752272530808126e-03, + 1.03016487254043390825e-02, + 1.07205589617752304610e-02, + 1.11328468895841945635e-02, + 1.15382852175153500368e-02, + 1.19366508297968510616e-02, + 1.23277249082861840856e-02, + 1.27112930519620286746e-02, + 1.30871453937629941139e-02, + 1.34550767147076835023e-02, + 1.38148865552336977403e-02, + 1.41663793236976622014e-02, + 1.45093644019762355729e-02, + 1.48436562481129210450e-02, + 1.51690744959529933561e-02, + 1.54854440517186581205e-02, + 1.57925951874666216368e-02, + 1.60903636313842884897e-02, + 1.63785906548734767896e-02, + 1.66571231563775630502e-02, + 1.69258137419078108499e-02, + 1.71845208022262455061e-02, + 1.74331085866468830925e-02, + 1.76714472734152173994e-02, + 1.78994130366322383441e-02, + 1.81168881096860183433e-02, + 1.83237608451629584161e-02, + 1.85199257712043326152e-02, + 1.87052836442837197573e-02, + 1.88797414983780387221e-02, + 1.90432126905080711943e-02, + 1.91956169426277314938e-02, + 1.93368803798427274510e-02, + 1.94669355649397177177e-02, + 1.95857215292121362993e-02, + 1.96931837995691326471e-02, + 1.97892744219159630314e-02, + 1.98739519807974267251e-02, + 1.99471816152978105585e-02, + 2.00089350311917421599e-02, + 2.00591905093446473685e-02, + 2.00979329103609591356e-02, + 2.01251536754834259302e-02, + 2.01408508237461286727e-02, + 2.01450289453875622248e-02, + 2.01376991915322746396e-02, + 2.01188792601508376068e-02, + 2.00885933783103917682e-02, + 2.00468722807307861422e-02, + 1.99937531846619727383e-02, + 1.99292797611018770998e-02, + 1.98535021023752838998e-02, + 1.97664766860958553141e-02, + 1.96682663355367028102e-02, + 1.95589401764357864733e-02, + 1.94385735902649521567e-02, + 1.93072481639931514685e-02, + 1.91650516363770367922e-02, + 1.90120778408122484415e-02, + 1.88484266447838007263e-02, + 1.86742038859517046900e-02, + 1.84895213049142380368e-02, + 1.82944964746886706841e-02, + 1.80892527269562349013e-02, + 1.78739190751135354485e-02, + 1.76486301341811334387e-02, + 1.74135260376162073759e-02, + 1.71687523510813504213e-02, + 1.69144599832216704915e-02, + 1.66508050935038308393e-02, + 1.63779489971747002630e-02, + 1.60960580673943053076e-02, + 1.58053036346042924398e-02, + 1.55058618831906466079e-02, + 1.51979137455046566657e-02, + 1.48816447933020276628e-02, + 1.45572451266690657684e-02, + 1.42249092604983910781e-02, + 1.38848360085833399946e-02, + 1.35372283653998979475e-02, + 1.31822933856448436252e-02, + 1.28202420616024131972e-02, + 1.24512891984102161413e-02, + 1.20756532873008502055e-02, + 1.16935563768882661712e-02, + 1.13052239425808411649e-02, + 1.09108847541921957086e-02, + 1.05107707418293280094e-02, + 1.01051168601380188944e-02, + 9.69416095097974661599e-03, + 9.27814360462589186873e-03, + 8.85730801954525207020e-03, + 8.43189986086877521498e-03, + 8.00216711761173211948e-03, + 7.56835995873902413200e-03, + 7.13073058815158738327e-03, + 6.68953309868379475400e-03, + 6.24502332519116971910e-03, + 5.79745869681476747037e-03, + 5.34709808850850412676e-03, + 4.89420167191210314650e-03, + 4.43903076565723645613e-03, + 3.98184768519108632512e-03, + 3.52291559220632970878e-03, + 3.06249834375802321845e-03, + 2.60086034116042237249e-03, + 2.13826637874443706636e-03, + 1.67498149256396322397e-03, + 1.21127080913929915072e-03, + 7.47399394318058719021e-04, + 2.83632102346346049587e-04, +-1.79766574769843468212e-04, +-6.42532657524515324506e-04, +-1.10440282870957989618e-03, +-1.56511458266390263150e-03, +-2.02440637389199361643e-03, +-2.48201776496643914185e-03, +-2.93768957363143169009e-03, +-3.39116401902536928475e-03, +-3.84218486693827703318e-03, +-4.29049757402515802296e-03, +-4.73584943089246784842e-03, +-5.17798970397907992042e-03, +-5.61666977614957031034e-03, +-6.05164328592657299599e-03, +-6.48266626527806404806e-03, +-6.90949727588800570455e-03, +-7.33189754383248466774e-03, +-7.74963109258556843290e-03, +-8.16246487428337087755e-03, +-8.57016889917199681248e-03, +-8.97251636316816550409e-03, +-9.36928377346218227428e-03, +-9.76025107209459868995e-03, +-1.01452017574365904035e-02, +-1.05239230035099728261e-02, +-1.08962057770798960432e-02, +-1.12618449524549517349e-02, +-1.16206394239357687498e-02, +-1.19723922158460008985e-02, +-1.23169105900894394756e-02, +-1.26540061511731961180e-02, +-1.29834949486409296365e-02, +-1.33051975768588605364e-02, +-1.36189392721043061457e-02, +-1.39245500069003491639e-02, +-1.42218645815492452517e-02, +-1.45107227128146703404e-02, +-1.47909691197041746891e-02, +-1.50624536063089509152e-02, +-1.53250311416544826582e-02, +-1.55785619365223330923e-02, +-1.58229115171997537781e-02, +-1.60579507961227489765e-02, +-1.62835561393713836031e-02, +-1.64996094309859363258e-02, +-1.67059981340693386453e-02, +-1.69026153486439532914e-02, +-1.70893598662360153562e-02, +-1.72661362211572987080e-02, +-1.74328547384603599335e-02, +-1.75894315785435489952e-02, +-1.77357887783837660234e-02, +-1.78718542893771675795e-02, +-1.79975620117707353629e-02, +-1.81128518256681338150e-02, +-1.82176696185966900676e-02, +-1.83119673096232941922e-02, +-1.83957028700091167195e-02, +-1.84688403403957639159e-02, +-1.85313498445167090800e-02, +-1.85832075994299093791e-02, +-1.86243959222697728906e-02, +-1.86549032335186701359e-02, +-1.86747240567995964611e-02, +-1.86838590151944261564e-02, +-1.86823148240932573882e-02, +-1.86701042805831954330e-02, +-1.86472462493857613075e-02, +-1.86137656453560576542e-02, +-1.85696934125556128992e-02, +-1.85150664999163827584e-02, +-1.84499278335122293693e-02, +-1.83743262854581951293e-02, +-1.82883166394587175219e-02, +-1.81919595530277734829e-02, +-1.80853215164069915100e-02, +-1.79684748082077037912e-02, +-1.78414974478062274277e-02, +-1.77044731445240056955e-02, +-1.75574912436227900669e-02, +-1.74006466691516183121e-02, +-1.72340398636801027388e-02, +-1.70577767249556339069e-02, +-1.68719685395252033677e-02, +-1.66767319133613971249e-02, +-1.64721886995365836281e-02, +-1.62584659229890703125e-02, +-1.60356957024269768108e-02, +-1.58040151694183554631e-02, +-1.55635663847157393325e-02, +-1.53144962518665349316e-02, +-1.50569564281600679762e-02, +-1.47911032329673657743e-02, +-1.45170975535258116318e-02, +-1.42351047482265624655e-02, +-1.39452945474637136913e-02, +-1.36478409521007416211e-02, +-1.33429221296188608992e-02, +-1.30307203080056444033e-02, +-1.27114216674486905923e-02, +-1.23852162298968091619e-02, +-1.20522977465561034055e-02, +-1.17128635833847836306e-02, +-1.13671146046554968900e-02, +-1.10152550546535922538e-02, +-1.06574924375795083986e-02, +-1.02940373957274844408e-02, +-9.92510358600978345733e-03, +-9.55090755489973984582e-03, +-9.17166861186629808755e-03, +-8.78760870137362294641e-03, +-8.39895227351954501427e-03, +-8.00592615338992057150e-03, +-7.60875940920200354023e-03, +-7.20768321931454427481e-03, +-6.80293073818321551022e-03, +-6.39473696133400267699e-03, +-5.98333858943855649570e-03, +-5.56897389156482680583e-03, +-5.15188256768454866386e-03, +-4.73230561051499881708e-03, +-4.31048516677632470584e-03, +-3.88666439794171014385e-03, +-3.46108734056119323949e-03, +-3.03399876624102851630e-03, +-2.60564404135369374893e-03, +-2.17626898656492900885e-03, +-1.74611973625276640544e-03, +-1.31544259790159325310e-03, +-8.84483911549698064228e-04, +-4.53489909372157390909e-04, +-2.27065754763732153979e-05, + 4.07620494008173754521e-04, + 8.37246230468182989909e-04, + 1.26592623189187344218e-03, + 1.69341690142426519808e-03, + 2.11947558531578586147e-03, + 2.54386071017997711027e-03, + 2.96633191949158747311e-03, + 3.38665020924181978113e-03, + 3.80457806267612890991e-03, + 4.21987958404042469429e-03, + 4.63232063125803249226e-03, + 5.04166894746706922836e-03, + 5.44769429133779015118e-03, + 5.85016856610528698801e-03, + 6.24886594723963670339e-03, + 6.64356300868360755141e-03, + 7.03403884758925946469e-03, + 7.42007520748272191013e-03, + 7.80145659978820089214e-03, + 8.17797042364491223732e-03, + 8.54940708395133565356e-03, + 8.91556010756844319332e-03, + 9.27622625762106536862e-03, + 9.63120564583299677841e-03, + 9.98030184283307808535e-03, + 1.03233219863735226768e-02, + 1.06600768874003729025e-02, + 1.09903811339163819116e-02, + 1.13140531925830963023e-02, + 1.16309155080034538898e-02, + 1.19407945996319476284e-02, + 1.22435211562607008245e-02, + 1.25389301280292575491e-02, + 1.28268608159079269826e-02, + 1.31071569586075614006e-02, + 1.33796668168697750756e-02, + 1.36442432550884507059e-02, + 1.39007438202245533349e-02, + 1.41490308179680942396e-02, + 1.43889713861080018736e-02, + 1.46204375650716145163e-02, + 1.48433063655967166505e-02, + 1.50574598334992579285e-02, + 1.52627851115045704011e-02, + 1.54591744981103021428e-02, + 1.56465255034476218021e-02, + 1.58247409021165554022e-02, + 1.59937287829656459015e-02, + 1.61534025957906987592e-02, + 1.63036811949317031467e-02, + 1.64444888797439722761e-02, + 1.65757554319247296659e-02, + 1.66974161496777871727e-02, + 1.68094118786993561299e-02, + 1.69116890399709611514e-02, + 1.70041996543472719028e-02, + 1.70869013639282085748e-02, + 1.71597574502064462165e-02, + 1.72227368489833373988e-02, + 1.72758141620482467971e-02, + 1.73189696656185082579e-02, + 1.73521893155377665563e-02, + 1.73754647492341991744e-02, + 1.73887932844398809817e-02, + 1.73921779146764994561e-02, + 1.73856273015124823678e-02, + 1.73691557636001317477e-02, + 1.73427832625017742940e-02, + 1.73065353853169359710e-02, + 1.72604433241233257146e-02, + 1.72045438522471921816e-02, + 1.71388792973795056618e-02, + 1.70634975115566134285e-02, + 1.69784518380263448056e-02, + 1.68838010750209793764e-02, + 1.67796094364609134353e-02, + 1.66659465096161037156e-02, + 1.65428872097501365734e-02, + 1.64105117317781858122e-02, + 1.62689054989683147545e-02, + 1.61181591087189469980e-02, + 1.59583682754456043784e-02, + 1.57896337706140629797e-02, + 1.56120613599556659623e-02, + 1.54257617379032624383e-02, + 1.52308504592903026092e-02, + 1.50274478683518758482e-02, + 1.48156790250726522890e-02, + 1.45956736289267492018e-02, + 1.43675659400543699606e-02, + 1.41314946979236334690e-02, + 1.38876030375264993694e-02, + 1.36360384031594637777e-02, + 1.33769524598382864855e-02, + 1.31105010024045141870e-02, + 1.28368438623721048408e-02, + 1.25561448125739872489e-02, + 1.22685714696633887261e-02, + 1.19742951945275791920e-02, + 1.16734909906738484192e-02, + 1.13663374006453127274e-02, + 1.10530164005323595922e-02, + 1.07337132926358554130e-02, + 1.04086165963493543218e-02, + 1.00779179373233617606e-02, + 9.74181193497532758874e-03, + 9.40049608841225445288e-03, + 9.05417066083279500899e-03, + 8.70303856247552944103e-03, + 8.34730523218016502718e-03, + 7.98717851763572177226e-03, + 7.62286855437785230982e-03, + 7.25458764361144089333e-03, + 6.88255012892701172750e-03, + 6.50697227198192371805e-03, + 6.12807212721856470888e-03, + 5.74606941569283727334e-03, + 5.36118539808457146567e-03, + 4.97364274696218688909e-03, + 4.58366541837830314410e-03, + 4.19147852286664863303e-03, + 3.79730819591561500129e-03, + 3.40138146799415100677e-03, + 3.00392613420201199520e-03, + 2.60517062362004749726e-03, + 2.20534386843704386522e-03, + 1.80467517292383881899e-03, + 1.40339408233299683948e-03, + 1.00173025179804741150e-03, + 5.99913315305479412538e-04, + 1.98172754814968598257e-04, +-2.03262230396802987941e-04, +-6.04162854095924620711e-04, +-1.00430087308224437644e-03, +-1.40344871673197396644e-03, +-1.80137961602673795508e-03, +-2.19786773199013999239e-03, +-2.59268828346089896114e-03, +-2.98561767413182141753e-03, +-3.37643361878200423329e-03, +-3.76491526863040370035e-03, +-4.15084333574143593548e-03, +-4.53400021641445216680e-03, +-4.91417011348194241599e-03, +-5.29113915745588105771e-03, +-5.66469552644815847742e-03, +-6.03462956480155590655e-03, +-6.40073390036281514998e-03, +-6.76280356033400701504e-03, +-7.12063608563857919354e-03, +-7.47403164373383350344e-03, +-7.82279313981379918752e-03, +-8.16672632633589495876e-03, +-8.50563991081211730194e-03, +-8.83934566180608928543e-03, +-9.16765851307686438498e-03, +-9.49039666581114917110e-03, +-9.80738168888878152074e-03, +-1.01184386171277399674e-02, +-1.04233960474500557403e-02, +-1.07220862329222184350e-02, +-1.10143451746142415071e-02, +-1.13000127112285256303e-02, +-1.15789326064506051250e-02, +-1.18509526339738002071e-02, +-1.21159246601509965058e-02, +-1.23737047242299964128e-02, +-1.26241531161297524527e-02, +-1.28671344517128152796e-02, +-1.31025177455174803715e-02, +-1.33301764809086713964e-02, +-1.35499886776097172580e-02, +-1.37618369565811367317e-02, +-1.39656086022109764133e-02, +-1.41611956217838150934e-02, +-1.43484948021984325128e-02, +-1.45274077639039357612e-02, +-1.46978410120258608934e-02, +-1.48597059846577242426e-02, +-1.50129190982918585967e-02, +-1.51574017903672395718e-02, +-1.52930805589124932387e-02, +-1.54198869992662364325e-02, +-1.55377578378534803027e-02, +-1.56466349630057406650e-02, +-1.57464654528072754702e-02, +-1.58372015999561979727e-02, +-1.59188009336289001960e-02, +-1.59912262383383775577e-02, +-1.60544455697791341175e-02, +-1.61084322676517156803e-02, +-1.61531649654640882541e-02, +-1.61886275973061356803e-02, +-1.62148094015971411253e-02, +-1.62317049218069497929e-02, +-1.62393140041536092333e-02, +-1.62376417922817130324e-02, +-1.62266987189277553383e-02, +-1.62065004945800873737e-02, +-1.61770680931431522220e-02, +-1.61384277346172493040e-02, +-1.60906108648061207944e-02, +-1.60336541320681771894e-02, +-1.59675993611263326855e-02, +-1.58924935239547066024e-02, +-1.58083887077626328299e-02, +-1.57153420800955900827e-02, +-1.56134158510770112288e-02, +-1.55026772328152578212e-02, +-1.53831983960010937329e-02, +-1.52550564237238350102e-02, +-1.51183332625351458250e-02, +-1.49731156707911920722e-02, +-1.48194951643046812090e-02, +-1.46575679593417048524e-02, +-1.44874349129977750272e-02, +-1.43092014609884597698e-02, +-1.41229775528962445130e-02, +-1.39288775849084438263e-02, +-1.37270203300904457960e-02, +-1.35175288662355702618e-02, +-1.33005305013339011205e-02, +-1.30761566967065763489e-02, +-1.28445429878512040744e-02, +-1.26058289030446593615e-02, +-1.23601578797534680798e-02, +-1.21076771789009329794e-02, +-1.18485377970418380433e-02, +-1.15828943764964987367e-02, +-1.13109051134989493925e-02, +-1.10327316644120605738e-02, +-1.07485390500640064226e-02, +-1.04584955582669985458e-02, +-1.01627726445692283253e-02, +-9.86154483130371323218e-03, +-9.55498960498988268719e-03, +-9.24328731215033269630e-03, +-8.92662105360215486771e-03, +-8.60517657728362625469e-03, +-8.27914216968341290515e-03, +-7.94870854592883563372e-03, +-7.61406873860231547119e-03, +-7.27541798534921645147e-03, +-6.93295361534090708033e-03, +-6.58687493466020984600e-03, +-6.23738311067596751247e-03, +-5.88468105547270119854e-03, +-5.52897330840119299866e-03, +-5.17046591782320454772e-03, +-4.80936632211110496465e-03, +-4.44588322997643489720e-03, +-4.08022650019468531568e-03, +-3.71260702079436550813e-03, +-3.34323658778045351356e-03, +-2.97232778346277022249e-03, +-2.60009385445763652536e-03, +-2.22674858943125442146e-03, +-1.85250619666033739495e-03, +-1.47758118147215886107e-03, +-1.10218822363969577716e-03, +-7.26542054800227666764e-04, +-3.50857335965947274205e-04, + 2.46514648028058004550e-05, + 3.99770194491305848588e-04, + 7.74285136923100344129e-04, + 1.14798313418393348531e-03, + 1.52065170760259482478e-03, + 1.89207917822773732594e-03, + 2.26205478672706098917e-03, + 2.63036881264248683862e-03, + 2.99681269293534556161e-03, + 3.36117913975389048103e-03, + 3.72326225735529307836e-03, + 4.08285765811985511958e-03, + 4.43976257758913958607e-03, + 4.79377598846415613199e-03, + 5.14469871350105301122e-03, + 5.49233353723946847447e-03, + 5.83648531650244987989e-03, + 6.17696108960405759064e-03, + 6.51357018420694721533e-03, + 6.84612432376711325249e-03, + 7.17443773250708155542e-03, + 7.49832723886042704087e-03, + 7.81761237732933426947e-03, + 8.13211548869811375051e-03, + 8.44166181854820452113e-03, + 8.74607961402130464068e-03, + 9.04520021877286591050e-03, + 9.33885816606978835797e-03, + 9.62689126997642689865e-03, + 9.90914071458013148708e-03, + 1.01854511412086366773e-02, + 1.04556707335903883299e-02, + 1.07196513009111780990e-02, + 1.09772483587224512630e-02, + 1.12283212076583951283e-02, + 1.14727330099153260884e-02, + 1.17103508634570831898e-02, + 1.19410458739028241953e-02, + 1.21646932240592649255e-02, + 1.23811722410611373818e-02, + 1.25903664610832344978e-02, + 1.27921636915890018366e-02, + 1.29864560710836914048e-02, + 1.31731401263407224556e-02, + 1.33521168270687006635e-02, + 1.35232916379940497353e-02, + 1.36865745683296211738e-02, + 1.38418802186039205382e-02, + 1.39891278248280535867e-02, + 1.41282412999769145523e-02, + 1.42591492727635726218e-02, + 1.43817851236876445564e-02, + 1.44960870183408006145e-02, + 1.46019979379505230460e-02, + 1.46994657071504129797e-02, + 1.47884430189622918805e-02, + 1.48688874569784020702e-02, + 1.49407615147348158541e-02, + 1.50040326122672287162e-02, + 1.50586731098424179975e-02, + 1.51046603188603172779e-02, + 1.51419765099236949824e-02, + 1.51706089180728420640e-02, + 1.51905497451859678587e-02, + 1.52017961595458175883e-02, + 1.52043502925764267841e-02, + 1.51982192327537388166e-02, + 1.51834150166969984036e-02, + 1.51599546174485608208e-02, + 1.51278599299513004384e-02, + 1.50871577537351683751e-02, + 1.50378797728247023263e-02, + 1.49800625328825147420e-02, + 1.49137474156039364498e-02, + 1.48389806103799235665e-02, + 1.47558130832480607908e-02, + 1.46643005431505314001e-02, + 1.45645034055218620950e-02, + 1.44564867532300453390e-02, + 1.43403202948947962325e-02, + 1.42160783206099778503e-02, + 1.40838396550982923594e-02, + 1.39436876083266405452e-02, + 1.37957099236124917929e-02, + 1.36399987232554212313e-02, + 1.34766504517241942490e-02, + 1.33057658164359091102e-02, + 1.31274497261638489060e-02, + 1.29418112271095040594e-02, + 1.27489634366789363756e-02, + 1.25490234750032566419e-02, + 1.23421123942442402532e-02, + 1.21283551057263516704e-02, + 1.19078803049420742233e-02, + 1.16808203944710996269e-02, + 1.14473114048624195760e-02, + 1.12074929135256729645e-02, + 1.09615079616787580025e-02, + 1.07095029694022052941e-02, + 1.04516276488501973219e-02, + 1.01880349156695994978e-02, + 9.91888079867737047779e-03, + 9.64432434785405211242e-03, + 9.36452754070147760923e-03, + 9.07965518702451984678e-03, + 8.78987483218966227094e-03, + 8.49535665891908500780e-03, + 8.19627338767603061398e-03, + 7.89280017569949157719e-03, + 7.58511451474948479590e-03, + 7.27339612761909639488e-03, + 6.95782686347547630473e-03, + 6.63859059209071476759e-03, + 6.31587309702252765881e-03, + 5.98986196780740103029e-03, + 5.66074649122982193061e-03, + 5.32871754172747295192e-03, + 4.99396747099837244599e-03, + 4.65668999687305143476e-03, + 4.31708009151461624686e-03, + 3.97533386901183748152e-03, + 3.63164847243082006614e-03, + 3.28622196038877781299e-03, + 2.93925319321392116909e-03, + 2.59094171876164420382e-03, + 2.24148765794563754883e-03, + 1.89109159005432995830e-03, + 1.53995443791703993247e-03, + 1.18827735298423120720e-03, + 8.36261600388259543348e-04, + 4.84108444050918994457e-04, + 1.32019031902150203511e-04, +-2.19805718726241933539e-04, +-5.71165235461442008166e-04, +-9.21859404947263896997e-04, +-1.27168868652862017930e-03, +-1.62045422549978823494e-03, +-1.96795796585350459343e-03, +-2.31400276246625583032e-03, +-2.65839249265560281787e-03, +-3.00093216704766258679e-03, +-3.34142803969362210681e-03, +-3.67968771736809294182e-03, +-4.01552026799475991758e-03, +-4.34873632813331280345e-03, +-4.67914820946864051104e-03, +-5.00657000424378773040e-03, +-5.33081768957552153132e-03, +-5.65170923059745127642e-03, +-5.96906468236742954181e-03, +-6.28270629048909966946e-03, +-6.59245859038667947338e-03, +-6.89814850517884731868e-03, +-7.19960544209851966563e-03, +-7.49666138740393440260e-03, +-7.78915099972798865430e-03, +-8.07691170181503576009e-03, +-8.35978377059490469769e-03, +-8.63761042554191810217e-03, +-8.91023791527316942618e-03, +-9.17751560233688937207e-03, +-9.43929604614376221994e-03, +-9.69543508399723329150e-03, +-9.94579191017774290329e-03, +-1.01902291530364327854e-02, +-1.04286129500589536817e-02, +-1.06608130208563391117e-02, +-1.08867027380436017653e-02, +-1.11061591959687958747e-02, +-1.13190632772547025708e-02, +-1.15252997171166309681e-02, +-1.17247571654230976768e-02, +-1.19173282464660659080e-02, +-1.21029096164066742036e-02, +-1.22814020183694711658e-02, +-1.24527103351532476838e-02, +-1.26167436395315489539e-02, +-1.27734152421167899277e-02, +-1.29226427367628814158e-02, +-1.30643480434822645969e-02, +-1.31984574488560428562e-02, +-1.33249016439166492742e-02, +-1.34436157594821689004e-02, +-1.35545393989273295354e-02, +-1.36576166683727209111e-02, +-1.37527962042781285584e-02, +-1.38400311984271696952e-02, +-1.39192794202912337870e-02, +-1.39905032367616116717e-02, +-1.40536696292427546601e-02, +-1.41087502080980680547e-02, +-1.41557212244426133818e-02, +-1.41945635792792845820e-02, +-1.42252628299752575947e-02, +-1.42478091940773932134e-02, +-1.42621975504671379131e-02, +-1.42684274378570910558e-02, +-1.42665030506319845394e-02, +-1.42564332320393345743e-02, +-1.42382314647362499815e-02, +-1.42119158586999447952e-02, +-1.41775091365116089059e-02, +-1.41350386160245498901e-02, +-1.40845361904284333693e-02, +-1.40260383057241797000e-02, +-1.39595859356245310251e-02, +-1.38852245538964112065e-02, +-1.38030041041644433580e-02, +-1.37129789671941813151e-02, +-1.36152079256764129561e-02, +-1.35097541265353955631e-02, +-1.33966850407841280013e-02, +-1.32760724209521549510e-02, +-1.31479922561130030401e-02, +-1.30125247245378994343e-02, +-1.28697541440061513640e-02, +-1.27197689198022458740e-02, +-1.25626614904315592192e-02, +-1.23985282710872991158e-02, +-1.22274695949040924925e-02, +-1.20495896520329080076e-02, +-1.18649964265733695590e-02, +-1.16738016314043534238e-02, +-1.14761206409479885049e-02, +-1.12720724219102334807e-02, +-1.10617794620386598187e-02, +-1.08453676969394192248e-02, +-1.06229664349969266796e-02, +-1.03947082804420436186e-02, +-1.01607290546128509884e-02, +-9.92116771545450623626e-03, +-9.67616627530844784777e-03, +-9.42586971703506318332e-03, +-9.17042590852275470159e-03, +-8.90998551563223703531e-03, +-8.64470191362698078819e-03, +-8.37473109714258721892e-03, +-8.10023158874558640852e-03, +-7.82136434613948418326e-03, +-7.53829266806671071527e-03, +-7.25118209896521460911e-03, +-6.96020033243441478554e-03, +-6.66551711356555987714e-03, +-6.36730414019388325786e-03, +-6.06573496313063138113e-03, +-5.76098488543169522103e-03, +-5.45323086076018610086e-03, +-5.14265139090599315841e-03, +-4.82942642251557672367e-03, +-4.51373724309595599630e-03, +-4.19576637635184213071e-03, +-3.87569747691505085002e-03, +-3.55371522452749104282e-03, +-3.23000521773942998738e-03, +-2.90475386718291829144e-03, +-2.57814828848035217795e-03, +-2.25037619485449289641e-03, +-1.92162578949469156631e-03, +-1.59208565774584761589e-03, +-1.26194465918040934528e-03, +-9.31391819614034682621e-04, +-6.00616223127062396486e-04, +-2.69806904154944583816e-04, + 6.08472602942396962656e-05, + 3.91157658230999324359e-04, + 7.20936050023826264892e-04, + 1.04999467542699867657e-03, + 1.37814636023528779528e-03, + 1.70520462250435696737e-03, + 2.03098377827778953097e-03, + 2.35529904676215007600e-03, + 2.67796665488591583565e-03, + 2.99880394118968215261e-03, + 3.31762945898433653930e-03, + 3.63426307872031237670e-03, + 3.94852608951128981885e-03, + 4.26024129975459756037e-03, + 4.56923313679098372364e-03, + 4.87532774554888699570e-03, + 5.17835308611915706711e-03, + 5.47813903020093976443e-03, + 5.77451745637115685522e-03, + 6.06732234411917498856e-03, + 6.35638986659726578504e-03, + 6.64155848203327753981e-03, + 6.92266902375569294359e-03, + 7.19956478878218397721e-03, + 7.47209162491841317327e-03, + 7.74009801632427347357e-03, + 8.00343516749617983619e-03, + 8.26195708562018661658e-03, + 8.51552066125116358108e-03, + 8.76398574727313937893e-03, + 9.00721523609652845177e-03, + 9.24507513505131058029e-03, + 9.47743463993477690266e-03, + 9.70416620667113177801e-03, + 9.92514562104791428498e-03, + 1.01402520664879789575e-02, + 1.03493681898213143316e-02, + 1.05523801650215433984e-02, + 1.07491777548722518970e-02, + 1.09396543705291681564e-02, + 1.11237071289475124292e-02, + 1.13012369081435404966e-02, + 1.14721484002587425371e-02, + 1.16363501624019635705e-02, + 1.17937546652395908869e-02, + 1.19442783393092378380e-02, + 1.20878416190330750107e-02, + 1.22243689844071853207e-02, + 1.23537890003452277554e-02, + 1.24760343536569357631e-02, + 1.25910418876418357670e-02, + 1.26987526342805939761e-02, + 1.27991118440086270452e-02, + 1.28920690130565843839e-02, + 1.29775779083439509604e-02, + 1.30555965899154108323e-02, + 1.31260874309076600724e-02, + 1.31890171350384308863e-02, + 1.32443567516100473014e-02, + 1.32920816880211477284e-02, + 1.33321717197816842077e-02, + 1.33646109980275606260e-02, + 1.33893880545334492682e-02, + 1.34064958042229027263e-02, + 1.34159315451764481197e-02, + 1.34176969561404253045e-02, + 1.34117980915397661673e-02, + 1.33982453740004014281e-02, + 1.33770535843872502568e-02, + 1.33482418493662668285e-02, + 1.33118336264995938689e-02, + 1.32678566868845784765e-02, + 1.32163430953490413505e-02, + 1.31573291882161602651e-02, + 1.30908555486537094698e-02, + 1.30169669796242129522e-02, + 1.29357124744537473754e-02, + 1.28471451850375104065e-02, + 1.27513223877034967413e-02, + 1.26483054467555582068e-02, + 1.25381597757181027092e-02, + 1.24209547963076202132e-02, + 1.22967638951557260707e-02, + 1.21656643783110817586e-02, + 1.20277374235470257274e-02, + 1.18830680305065279623e-02, + 1.17317449687113807555e-02, + 1.15738607234699020926e-02, + 1.14095114397158373110e-02, + 1.12387968638101957974e-02, + 1.10618202833434337712e-02, + 1.08786884649728424201e-02, + 1.06895115903328993823e-02, + 1.04944031900558870651e-02, + 1.02934800759447477037e-02, + 1.00868622713343389363e-02, + 9.87467293968604525878e-03, + 9.65703831145729371666e-03, + 9.43408760928757944564e-03, + 9.20595297154692439323e-03, + 8.97276937429128222667e-03, + 8.73467455167086133383e-03, + 8.49180891483720598489e-03, + 8.24431546939977458188e-03, + 7.99233973147535532722e-03, + 7.73602964238361088395e-03, + 7.47553548203802858269e-03, + 7.21100978108041128223e-03, + 6.94260723181349802963e-03, + 6.67048459797950268196e-03, + 6.39480062344236106775e-03, + 6.11571593982157112740e-03, + 5.83339297313448506416e-03, + 5.54799584949982379362e-03, + 5.25969029995765075675e-03, + 4.96864356445977841531e-03, + 4.67502429508827137272e-03, + 4.37900245855606801149e-03, + 4.08074923804454484794e-03, + 3.78043693443984004168e-03, + 3.47823886701886190315e-03, + 3.17432927364564567915e-03, + 2.86888321053426365720e-03, + 2.56207645163618802017e-03, + 2.25408538770850491381e-03, + 1.94508692512463700341e-03, + 1.63525838447931698427e-03, + 1.32477739905105789536e-03, + 1.01382181317911045614e-03, + 7.02569580610471595104e-04, + 3.91198662877513612512e-04, + 7.98869277630744821202e-05, +-2.31187952088860002205e-04, +-5.41848600360482837712e-04, +-8.51918037984115972261e-04, +-1.16121978375175968247e-03, +-1.46957795454782155081e-03, +-1.77681736514933067382e-03, +-2.08276362753950002732e-03, +-2.38724324967590261284e-03, +-2.69008373365854430367e-03, +-2.99111367324205812759e-03, +-3.29016285063819195061e-03, +-3.58706233255040498470e-03, +-3.88164456539251325612e-03, +-4.17374346963266494581e-03, +-4.46319453321069280205e-03, +-4.74983490397884282330e-03, +-5.03350348111142233826e-03, +-5.31404100543327127110e-03, +-5.59129014861656486318e-03, +-5.86509560119571633080e-03, +-6.13530415935167362795e-03, +-6.40176481041693050400e-03, +-6.66432881705371002456e-03, +-6.92284980005934951625e-03, +-7.17718381975063907108e-03, +-7.42718945588436395278e-03, +-7.67272788607022311613e-03, +-7.91366296262873900047e-03, +-8.14986128785674147912e-03, +-8.38119228765579413198e-03, +-8.60752828348398772718e-03, +-8.82874456259165676930e-03, +-9.04471944650279101319e-03, +-9.25533435770336740389e-03, +-9.46047388450147082317e-03, +-9.66002584402477111614e-03, +-9.85388134331765391805e-03, +-1.00419348385086572295e-02, +-1.02240841920141073418e-02, +-1.04002307277476988001e-02, +-1.05702792843059330957e-02, +-1.07341382661022052142e-02, +-1.08917196924194058932e-02, +-1.10429392443588056394e-02, +-1.11877163096573035983e-02, +-1.13259740253500613971e-02, +-1.14576393182570599599e-02, +-1.15826429432718831097e-02, +-1.17009195194323206701e-02, +-1.18124075637551975010e-02, +-1.19170495228175868374e-02, +-1.20147918020679297935e-02, +-1.21055847928538372338e-02, +-1.21893828971518514148e-02, +-1.22661445499873279080e-02, +-1.23358322395343555922e-02, +-1.23984125248859967938e-02, +-1.24538560514863300838e-02, +-1.25021375642184340987e-02, +-1.25432359181423137146e-02, +-1.25771340868788758516e-02, +-1.26038191686375488504e-02, +-1.26232823898858471240e-02, +-1.26355191066611412948e-02, +-1.26405288035257891421e-02, +-1.26383150901686648615e-02, +-1.26288856956566081235e-02, +-1.26122524603418419142e-02, +-1.25884313254311982350e-02, +-1.25574423202261184485e-02, +-1.25193095470420810711e-02, +-1.24740611638184551585e-02, +-1.24217293644305545874e-02, +-1.23623503567175385687e-02, +-1.22959643382403553680e-02, +-1.22226154697852723574e-02, +-1.21423518466312625047e-02, +-1.20552254675984453491e-02, +-1.19612922018975387228e-02, +-1.18606117538015195384e-02, +-1.17532476251614014656e-02, +-1.16392670757887554955e-02, +-1.15187410817310965927e-02, +-1.13917442914640253127e-02, +-1.12583549800273283181e-02, +-1.11186550011346148292e-02, +-1.09727297372832800770e-02, +-1.08206680478965637515e-02, +-1.06625622155284947856e-02, +-1.04985078901642363974e-02, +-1.03286040316486818491e-02, +-1.01529528502798636891e-02, +-9.97165974559921335085e-03, +-9.78483324341799902413e-03, +-9.59258493111724702684e-03, +-9.39502939125761923900e-03, +-9.19228413354054689488e-03, +-8.98446952515993303712e-03, +-8.77170871958610903762e-03, +-8.55412758382280251357e-03, +-8.33185462418275894769e-03, +-8.10502091062164677082e-03, +-7.87375999967769406307e-03, +-7.63820785606213713270e-03, +-7.39850277294432437381e-03, +-7.15478529097991495372e-03, +-6.90719811612892573005e-03, +-6.65588603631140588585e-03, +-6.40099583694948154333e-03, +-6.14267621544471731365e-03, +-5.88107769464080425842e-03, +-5.61635253532167481177e-03, +-5.34865464779504806714e-03, +-5.07813950261468052133e-03, +-4.80496404049110190093e-03, +-4.52928658144188898277e-03, +-4.25126673323850644282e-03, +-3.97106529919719845184e-03, +-3.68884418537053504483e-03, +-3.40476630719170527545e-03, +-3.11899549562579155026e-03, +-2.83169640288094461716e-03, +-2.54303440773591491603e-03, +-2.25317552053609778881e-03, +-1.96228628791152723623e-03, +-1.67053369727637865058e-03, +-1.37808508115876398453e-03, +-1.08510802141915333602e-03, +-7.91770253410941553598e-04, +-4.98239570138193856204e-04, +-2.04683726464174046067e-04, + 8.87296565722855913767e-05, + 3.81833187280424608996e-04, + 6.74459798627879405716e-04, + 9.66442843278491714280e-04, + 1.25761618830957477670e-03, + 1.54781430955123577679e-03, + 1.83687238549551422676e-03, + 2.12462639072184518788e-03, + 2.41091318878710377666e-03, + 2.69557062452432027663e-03, + 2.97843761570351769560e-03, + 3.25935424399821128960e-03, + 3.53816184520730405566e-03, + 3.81470309868363116265e-03, + 4.08882211591671436424e-03, + 4.36036452822079721725e-03, + 4.62917757347863778605e-03, + 4.89511018189369654513e-03, + 5.15801306069900780682e-03, + 5.41773877778122490978e-03, + 5.67414184416796703314e-03, + 5.92707879533384274229e-03, + 6.17640827128176569949e-03, + 6.42199109535173794788e-03, + 6.66369035171747361307e-03, + 6.90137146152226561152e-03, + 7.13490225761727499265e-03, + 7.36415305785760327534e-03, + 7.58899673691662904340e-03, + 7.80930879657879342681e-03, + 8.02496743447280412587e-03, + 8.23585361120545214608e-03, + 8.44185111586123922145e-03, + 8.64284662983217863430e-03, + 8.83872978893951791179e-03, + 9.02939324381753054272e-03, + 9.21473271852386519032e-03, + 9.39464706734555871082e-03, + 9.56903832976962673285e-03, + 9.73781178358892364477e-03, + 9.90087599611340699046e-03, + 1.00581428734606900116e-02, + 1.02095277078994902537e-02, + 1.03549492232184597862e-02, + 1.04943296180992785144e-02, + 1.06275946074688987242e-02, + 1.07546734618099455033e-02, + 1.08754990444085344187e-02, + 1.09900078465200706085e-02, + 1.10981400204346221383e-02, + 1.11998394104246661029e-02, + 1.12950535815609064139e-02, + 1.13837338463788559362e-02, + 1.14658352893853201365e-02, + 1.15413167893916573242e-02, + 1.16101410396627392763e-02, + 1.16722745658728050550e-02, + 1.17276877418591822522e-02, + 1.17763548031668534993e-02, + 1.18182538583788306064e-02, + 1.18533668982268927672e-02, + 1.18816798024796634742e-02, + 1.19031823446065308097e-02, + 1.19178681942160510920e-02, + 1.19257349172696772155e-02, + 1.19267839740727354947e-02, + 1.19210207150453346286e-02, + 1.19084543742781455433e-02, + 1.18890980608779301547e-02, + 1.18629687481103703039e-02, + 1.18300872603478539336e-02, + 1.17904782578316710134e-02, + 1.17441702192595375659e-02, + 1.16911954222092898115e-02, + 1.16315899214134987893e-02, + 1.15653935248972560695e-02, + 1.14926497679962574816e-02, + 1.14134058852708338005e-02, + 1.13277127803342991114e-02, + 1.12356249936141419643e-02, + 1.11372006680669592693e-02, + 1.10325015128680588988e-02, + 1.09215927650972884078e-02, + 1.08045431494469181682e-02, + 1.06814248359739724648e-02, + 1.05523133959240563579e-02, + 1.04172877556533635679e-02, + 1.02764301486764821764e-02, + 1.01298260658689662922e-02, + 9.97756420385554482211e-03, + 9.81973641161405612354e-03, + 9.65643763532623641832e-03, + 9.48776586151135747915e-03, + 9.31382205847339390836e-03, + 9.13471011609818910049e-03, + 8.95053678403625804783e-03, + 8.76141160830776546953e-03, + 8.56744686636650917833e-03, + 8.36875750066302069585e-03, + 8.16546105074440926874e-03, + 7.95767758393019740415e-03, + 7.74552962460837469971e-03, + 7.52914208218922759858e-03, + 7.30864217776142511412e-03, + 7.08415936949292109753e-03, + 6.85582527682011919762e-03, + 6.62377360346902248345e-03, + 6.38814005935512633366e-03, + 6.14906228140583120678e-03, + 5.90667975335047463342e-03, + 5.66113372452884365538e-03, + 5.41256712776044118796e-03, + 5.16112449632528166171e-03, + 4.90695188010295546555e-03, + 4.65019676091923093997e-03, + 4.39100796714859270553e-03, + 4.12953558762247860403e-03, + 3.86593088489268566291e-03, + 3.60034620790024339002e-03, + 3.33293490409898975416e-03, + 3.06385123108688468482e-03, + 2.79325026779358087312e-03, + 2.52128782527450854764e-03, + 2.24812035716717229308e-03, + 1.97390486985574153955e-03, + 1.69879883239866091155e-03, + 1.42296008626978756108e-03, + 1.14654675496503560654e-03, + 8.69717153525156449340e-04, + 5.92629698028697892917e-04, + 3.15442815104587483740e-04, + 3.83148515150130003753e-05, +-2.38596016135179852516e-04, +-5.15131871516745108372e-04, +-7.91135148467245652611e-04, +-1.06644872060530828545e-03, +-1.34091599061669417524e-03, +-1.61438097916256320837e-03, +-1.88668841335719902723e-03, +-2.15768381476730232091e-03, +-2.42721358688397208930e-03, +-2.69512510201327460183e-03, +-2.96126678754182314640e-03, +-3.22548821152533965809e-03, +-3.48764016755303369807e-03, +-3.74757475883982088538e-03, +-4.00514548149979391495e-03, +-4.26020730695223729528e-03, +-4.51261676341580680871e-03, +-4.76223201644600246940e-03, +-5.00891294846663153589e-03, +-5.25252123725567128532e-03, +-5.49292043333865411675e-03, +-5.72997603624744288736e-03, +-5.96355556960147161621e-03, +-6.19352865496984421323e-03, +-6.41976708447395284091e-03, +-6.64214489208741348802e-03, +-6.86053842359856183575e-03, +-7.07482640519247439614e-03, +-7.28489001061597037101e-03, +-7.49061292688948335977e-03, +-7.69188141852844651375e-03, +-7.88858439023906905796e-03, +-8.08061344805422777926e-03, +-8.26786295887581117181e-03, +-8.45023010839095374547e-03, +-8.62761495733049832424e-03, +-8.79992049603937377678e-03, +-8.96705269732801270310e-03, +-9.12892056757751840790e-03, +-9.28543619607121589743e-03, +-9.43651480252325272624e-03, +-9.58207478278219441925e-03, +-9.72203775268269676513e-03, +-9.85632859002284582306e-03, +-9.98487547464438525424e-03, +-1.01076099265952259326e-02, +-1.02244668423529874723e-02, +-1.03353845290914767713e-02, +-1.04403047369727476623e-02, +-1.05391726894459199226e-02, +-1.06319371115395251703e-02, +-1.07185502561315034592e-02, +-1.07989679281840673941e-02, +-1.08731495069313705004e-02, +-1.09410579660090354764e-02, +-1.10026598915155138930e-02, +-1.10579254979971536299e-02, +-1.11068286423497506604e-02, +-1.11493468356296306782e-02, +-1.11854612527701267194e-02, +-1.12151567401993432216e-02, +-1.12384218213567241285e-02, +-1.12552487001068551170e-02, +-1.12656332620508243397e-02, +-1.12695750737355805671e-02, +-1.12670773797639463265e-02, +-1.12581470978087311990e-02, +-1.12427948115352074887e-02, +-1.12210347614381672487e-02, +-1.11928848336002705749e-02, +-1.11583665463801332690e-02, +-1.11175050350392178033e-02, +-1.10703290343182984834e-02, +-1.10168708589748198801e-02, +-1.09571663822947782535e-02, +-1.08912550125919559835e-02, +-1.08191796677104181551e-02, +-1.07409867475466505593e-02, +-1.06567261046078953085e-02, +-1.05664510126258718442e-02, +-1.04702181332450312140e-02, +-1.03680874808063875486e-02, +-1.02601223852479897514e-02, +-1.01463894531454990044e-02, +-1.00269585269162232050e-02, +-9.90190264221126568989e-03, +-9.77129798352259666683e-03, +-9.63522383803080625930e-03, +-9.49376254772124616998e-03, +-9.34699945979887078518e-03, +-9.19502287542989238389e-03, +-9.03792399684144424910e-03, +-8.87579687281107691799e-03, +-8.70873834257845577667e-03, +-8.53684797821176177823e-03, +-8.36022802546492783959e-03, +-8.17898334315863943800e-03, +-7.99322134112125451399e-03, +-7.80305191672834696365e-03, +-7.60858739007534007337e-03, +-7.40994243782330200970e-03, +-7.20723402575608202564e-03, +-7.00058134008851255109e-03, +-6.79010571756536070176e-03, +-6.57593057439340850090e-03, +-6.35818133404676254922e-03, +-6.13698535398672032765e-03, +-5.91247185134246861643e-03, +-5.68477182759180490329e-03, +-5.45401799228807746683e-03, +-5.22034468587699671677e-03, +-4.98388780164810921841e-03, +-4.74478470686644573928e-03, +-4.50317416312886326102e-03, +-4.25919624599436445062e-03, +-4.01299226392974606181e-03, +-3.76470467662182433494e-03, +-3.51447701270230384446e-03, +-3.26245378693090131231e-03, +-3.00878041688648536350e-03, +-2.75360313921323108730e-03, +-2.49706892547035515587e-03, +-2.23932539763252707460e-03, +-1.98052074329282566320e-03, +-1.72080363061157654535e-03, +-1.46032312306425922019e-03, +-1.19922859403635969841e-03, +-9.37669641312056218428e-04, +-6.75796001507703134221e-04, +-4.13757464498088920954e-04, +-1.51703787884435286606e-04, + 1.10215388447121949347e-04, + 3.71850627627885114545e-04, + 6.33052780921098995522e-04, + 8.93673072601122806674e-04, + 1.15356318454689905743e-03, + 1.41257534050370911136e-03, + 1.67056238996633678491e-03, + 1.92737789163165596125e-03, + 2.18287619637864190730e-03, + 2.43691252972557228021e-03, + 2.68934307371902769912e-03, + 2.94002504820795344462e-03, + 3.18881679145808279857e-03, + 3.43557784005892952531e-03, + 3.68016900808052979666e-03, + 3.92245246543618079904e-03, + 4.16229181540278981438e-03, + 4.39955217126052674365e-03, + 4.63410023200553494727e-03, + 4.86580435709433288538e-03, + 5.09453464017795010221e-03, + 5.32016298178517119816e-03, + 5.54256316091259002704e-03, + 5.76161090548329372224e-03, + 5.97718396163549221811e-03, + 6.18916216179911122391e-03, + 6.39742749152663690154e-03, + 6.60186415503853565173e-03, + 6.80235863944797080477e-03, + 6.99879977762879034592e-03, + 7.19107880969246070213e-03, + 7.37908944304029295463e-03, + 7.56272791095595735972e-03, + 7.74189302970967625078e-03, + 7.91648625413953442587e-03, + 8.08641173168029268881e-03, + 8.25157635481136783606e-03, + 8.41188981189416006001e-03, + 8.56726463637145184415e-03, + 8.71761625430204217801e-03, + 8.86286303020573928979e-03, + 9.00292631119170398690e-03, + 9.13773046934988723844e-03, + 9.26720294237984125452e-03, + 9.39127427243598503215e-03, + 9.50987814316970984929e-03, + 9.62295141494749588229e-03, + 9.73043415822708555873e-03, + 9.83226968507381650364e-03, + 9.92840457880114421463e-03, + 1.00187887217194990935e-02, + 1.01033753209798602551e-02, + 1.01821209324982810823e-02, + 1.02549854829495166314e-02, + 1.03219322898189282134e-02, + 1.03829280795032750928e-02, + 1.04379430034503180302e-02, + 1.04869506523312169127e-02, + 1.05299280682385320435e-02, + 1.05668557549043577726e-02, + 1.05977176859349212640e-02, + 1.06225013110582688913e-02, + 1.06411975603831251286e-02, + 1.06538008466682248415e-02, + 1.06603090656027660321e-02, + 1.06607235940987827433e-02, + 1.06550492865989197139e-02, + 1.06432944694025734267e-02, + 1.06254709330158968877e-02, + 1.06015939225314811956e-02, + 1.05716821260445053426e-02, + 1.05357576611141614403e-02, + 1.04938460592794574611e-02, + 1.04459762486396531833e-02, + 1.03921805345111133156e-02, + 1.03324945781732863842e-02, + 1.02669573737173662475e-02, + 1.01956112230122235285e-02, + 1.01185017088040590805e-02, + 1.00356776659660425211e-02, + 9.94719115091608624413e-03, + 9.85309740922234687799e-03, + 9.75345484141500011777e-03, + 9.64832496702668768185e-03, + 9.53777238688333431349e-03, + 9.42186474366750112419e-03, + 9.30067268077903845647e-03, + 9.17426979951779277001e-03, + 9.04273261461393390581e-03, + 8.90614050813234511828e-03, + 8.76457568178037361994e-03, + 8.61812310764482544800e-03, + 8.46687047738961182097e-03, + 8.31090814994421903106e-03, + 8.15032909771297095491e-03, + 7.98522885133778372035e-03, + 7.81570544304719359852e-03, + 7.64185934862476878848e-03, + 7.46379342803140874429e-03, + 7.28161286471641980289e-03, + 7.09542510365326374588e-03, + 6.90533978813562872995e-03, + 6.71146869537252947074e-03, + 6.51392567091878173929e-03, + 6.31282656197840099516e-03, + 6.10828914962330098148e-03, + 5.90043307996295039036e-03, + 5.68937979430757592714e-03, + 5.47525245836473755529e-03, + 5.25817589051068290384e-03, + 5.03827648917754868096e-03, + 4.81568215940014407450e-03, + 4.59052223856344730063e-03, + 4.36292742139295433579e-03, + 4.13302968423510681123e-03, + 3.90096220866709446004e-03, + 3.66685930448303705129e-03, + 3.43085633209993298015e-03, + 3.19308962442840099660e-03, + 2.95369640825326627495e-03, + 2.71281472516826487051e-03, + 2.47058335211343968810e-03, + 2.22714172155590722779e-03, + 1.98262984136404274774e-03, + 1.73718821442020768774e-03, + 1.49095775801618085979e-03, + 1.24407972307950527406e-03, + 9.96695613276132701130e-04, + 7.48947104035837802997e-04, + 5.00975961545737855096e-04, + 2.52923961761159811490e-04, + 4.93280947509291801083e-06, +-2.42855942503384357196e-04, +-4.90300974016580110200e-04, +-7.37261278027570056415e-04, +-9.83596240843677242782e-04, +-1.22916572204938767329e-03, +-1.47383013410300081451e-03, +-1.71745052155293964798e-03, +-1.95988863982576476050e-03, +-2.20100703354622747807e-03, +-2.44066911434088866517e-03, +-2.67873923808214847372e-03, +-2.91508278153101421312e-03, +-3.14956621833333222718e-03, +-3.38205719432752276860e-03, +-3.61242460212125989991e-03, +-3.84053865489516728718e-03, +-4.06627095939203833663e-03, +-4.28949458805057831645e-03, +-4.51008415024378109953e-03, +-4.72791586258040994611e-03, +-4.94286761823193362270e-03, +-5.15481905524671577684e-03, +-5.36365162380991484375e-03, +-5.56924865241561605628e-03, +-5.77149541291191014308e-03, +-5.97027918438345836516e-03, +-6.16548931583604711143e-03, +-6.35701728764813140532e-03, +-6.54475677175619420523e-03, +-6.72860369053819660362e-03, +-6.90845627436653328401e-03, +-7.08421511779518033730e-03, +-7.25578323435132135910e-03, +-7.42306610990221913543e-03, +-7.58597175456684601896e-03, +-7.74441075314436476462e-03, +-7.89829631403181527116e-03, +-8.04754431660486060918e-03, +-8.19207335703401803850e-03, +-8.33180479251450362144e-03, +-8.46666278388312140701e-03, +-8.59657433660001440989e-03, +-8.72146934007399753097e-03, +-8.84128060530934949124e-03, +-8.95594390085470426488e-03, +-9.06539798703423320425e-03, +-9.16958464844403950411e-03, +-9.26844872469488080535e-03, +-9.36193813938749827552e-03, +-9.45000392730357963167e-03, +-9.53260025979855117606e-03, +-9.60968446838431425427e-03, +-9.68121706648877346224e-03, +-9.74716176938165805577e-03, +-9.80748551225691343747e-03, +-9.86215846646274103826e-03, +-9.91115405387120278202e-03, +-9.95444895938146258330e-03, +-9.99202314155041813881e-03, +-1.00238598413463411013e-02, +-1.00499455890222209875e-02, +-1.00702702091063772682e-02, +-1.00848268235089154332e-02, +-1.00936118527438327408e-02, +-1.00966250152679168361e-02, +-1.00938693249378146077e-02, +-1.00853510865886227682e-02, +-1.00710798897381062500e-02, +-1.00510686004214797040e-02, +-1.00253333511630630254e-02, +-9.99389352909173418749e-03, +-9.95677176220922943717e-03, +-9.91399390381976150510e-03, +-9.86558901513197826494e-03, +-9.81158934604420447656e-03, +-9.75203031412597010075e-03, +-9.68695048180868989451e-03, +-9.61639153180029321311e-03, +-9.54039824073970449403e-03, +-9.45901845110641917302e-03, +-9.37230304140389963719e-03, +-9.28030589463477509349e-03, +-9.18308386508685792204e-03, +-9.08069674345089207501e-03, +-8.97320722029071662917e-03, +-8.86068084788880529212e-03, +-8.74318600048899774446e-03, +-8.62079383296257897862e-03, +-8.49357823791978966410e-03, +-8.36161580129450403287e-03, +-8.22498575642871369851e-03, +-8.08376993668271683069e-03, +-7.93805272660061574108e-03, +-7.78792101165969724574e-03, +-7.63346412663362498818e-03, +-7.47477380259930785505e-03, +-7.31194411262098796500e-03, +-7.14507141614020412773e-03, +-6.97425430210722122754e-03, +-6.79959353088687573630e-03, +-6.62119197497169301864e-03, +-6.43915455853849138385e-03, +-6.25358819588309883253e-03, +-6.06460172876989358354e-03, +-5.87230586273140842124e-03, +-5.67681310235816811993e-03, +-5.47823768561213342299e-03, +-5.27669551720578392656e-03, +-5.07230410108449637774e-03, +-4.86518247205038317088e-03, +-4.65545112656870225393e-03, +-4.44323195279612039033e-03, +-4.22864815987201558140e-03, +-4.01182420651321949151e-03, +-3.79288572895385015307e-03, +-3.57195946827177420596e-03, +-3.34917319714373535808e-03, +-3.12465564607069309216e-03, +-2.89853642911835473334e-03, +-2.67094596921149977573e-03, +-2.44201542302870371753e-03, +-2.21187660553990271539e-03, +-1.98066191422849313675e-03, +-1.74850425304324988245e-03, +-1.51553695612283568887e-03, +-1.28189371133704578531e-03, +-1.04770848368741461600e-03, +-8.13115438614004488148e-04, +-5.78248865247532866513e-04, +-3.43243099654593679469e-04, +-1.08232448119056134180e-04, + 1.26648889498497872709e-04, + 3.61266896277643255724e-04, + 5.95487814588576617851e-04, + 8.29178222232456471966e-04, + 1.06220510832932932450e-03, + 1.29443594890761418982e-03, + 1.52573878215697851524e-03, + 1.75598228329790738422e-03, + 1.98503583902642517095e-03, + 2.21276962149356305753e-03, + 2.43905466177587538015e-03, + 2.66376292279626092005e-03, + 2.88676737165370449201e-03, + 3.10794205132203151670e-03, + 3.32716215167451348847e-03, + 3.54430407979887786632e-03, + 3.75924552955919340572e-03, + 3.97186555036659408313e-03, + 4.18204461512168643861e-03, + 4.38966468728887570377e-03, + 4.59460928706578036751e-03, + 4.79676355661041737416e-03, + 4.99601432429057183693e-03, + 5.19225016791701170921e-03, + 5.38536147692926601277e-03, + 5.57524051349589811616e-03, + 5.76178147249606278230e-03, + 5.94488054035048445189e-03, + 6.12443595266757775941e-03, + 6.30034805067354337221e-03, + 6.47251933639503632123e-03, + 6.64085452656393640525e-03, + 6.80526060521449791679e-03, + 6.96564687494400421736e-03, + 7.12192500680845601291e-03, + 7.27400908882688563423e-03, + 7.42181567306544106438e-03, + 7.56526382127895545560e-03, + 7.70427514908233069396e-03, + 7.83877386862820088598e-03, + 7.96868682976907029281e-03, + 8.09394355968027362502e-03, + 8.21447630092295155713e-03, + 8.33022004792652141780e-03, + 8.44111258187129308295e-03, + 8.54709450395172223858e-03, + 8.64810926700426002567e-03, + 8.74410320548165559407e-03, + 8.83502556375806609446e-03, + 8.92082852275120734287e-03, + 9.00146722484649296214e-03, + 9.07689979711120281669e-03, + 9.14708737278599470777e-03, + 9.21199411104400324446e-03, + 9.27158721500605589871e-03, + 9.32583694800504132971e-03, + 9.37471664808996879570e-03, + 9.41820274076340252511e-03, + 9.45627474994699748767e-03, + 9.48891530716929401668e-03, + 9.51611015897272857766e-03, + 9.53784817253677981441e-03, + 9.55412133951539892240e-03, + 9.56492477808816750351e-03, + 9.57025673322536851728e-03, + 9.57011857516825228953e-03, + 9.56451479612665210472e-03, + 9.55345300519767903769e-03, + 9.53694392150929680374e-03, + 9.51500136559463131902e-03, + 9.48764224900292864329e-03, + 9.45488656215475072042e-03, + 9.41675736044983967277e-03, + 9.37328074863657233207e-03, + 9.32448586345385396768e-03, + 9.27040485455623772260e-03, + 9.21107286373510844579e-03, + 9.14652800244862389245e-03, + 9.07681132767460333022e-03, + 9.00196681610215994340e-03, + 8.92204133667740678648e-03, + 8.83708462152045341742e-03, + 8.74714923523178117248e-03, + 8.65229054260652913344e-03, + 8.55256667477650479869e-03, + 8.44803849380110737088e-03, + 8.33876955572694297802e-03, + 8.22482607214039367072e-03, + 8.10627687023531343091e-03, + 7.98319335141973659975e-03, + 7.85564944848663425370e-03, + 7.72372158137452947957e-03, + 7.58748861154383627547e-03, + 7.44703179499617545084e-03, + 7.30243473396576317502e-03, + 7.15378332730893639474e-03, + 7.00116571962369673571e-03, + 6.84467224912835292550e-03, + 6.68439539432962807203e-03, + 6.52042971951210560688e-03, + 6.35287181908096316302e-03, + 6.18182026079089775444e-03, + 6.00737552789352719645e-03, + 5.82963996023949920094e-03, + 5.64871769436637964634e-03, + 5.46471460260989760210e-03, + 5.27773823127398664101e-03, + 5.08789773789389884046e-03, + 4.89530382763052763356e-03, + 4.70006868883239992823e-03, + 4.50230592780280144960e-03, + 4.30213050280925293073e-03, + 4.09965865737595570178e-03, + 3.89500785289395058675e-03, + 3.68829670059122758860e-03, + 3.47964489290170791991e-03, + 3.26917313427090060543e-03, + 3.05700307144005523768e-03, + 2.84325722324815094444e-03, + 2.62805890999240517047e-03, + 2.41153218238787615466e-03, + 2.19380175016706995342e-03, + 1.97499291036058082296e-03, + 1.75523147530006872613e-03, + 1.53464370038409927272e-03, + 1.31335621165009405059e-03, + 1.09149593319219089145e-03, + 8.69190014465733669022e-04, + 6.46565757523822519717e-04, + 4.23750544222993737447e-04, + 2.00871763442388796871e-04, +-2.19432616430028802536e-05, +-2.44567346193297504003e-04, +-4.66873516198418401623e-04, +-6.88735080792504629141e-04, +-9.10025704351406588243e-04, +-1.13061947832844914008e-03, +-1.35039099278848459193e-03, +-1.56921540760134731185e-03, +-1.78696852325255445618e-03, +-2.00352685123184786134e-03, +-2.21876768395961026376e-03, +-2.43256916421236753928e-03, +-2.64481035400563951540e-03, +-2.85537130289943187622e-03, +-3.06413311568427739612e-03, +-3.27097801941039290421e-03, +-3.47578942972392133937e-03, +-3.67845201647113524343e-03, +-3.87885176853450686779e-03, +-4.07687605786403312047e-03, +-4.27241370266879562367e-03, +-4.46535502973073768207e-03, +-4.65559193580989804512e-03, +-4.84301794810346793868e-03, +-5.02752828372539546653e-03, +-5.20901990817508944720e-03, +-5.38739159276095062184e-03, +-5.56254397094743408686e-03, +-5.73437959359436588702e-03, +-5.90280298305815697563e-03, +-6.06772068612327578757e-03, +-6.22904132573793255234e-03, +-6.38667565152189597305e-03, +-6.54053658902132174086e-03, +-6.69053928768123529203e-03, +-6.83660116751098716203e-03, +-6.97864196441732535098e-03, +-7.11658377417776714241e-03, +-7.25035109503333486530e-03, +-7.37987086887549603720e-03, +-7.50507252100559608954e-03, +-7.62588799844512044840e-03, +-7.74225180677637174476e-03, +-7.85410104549275414620e-03, +-7.96137544184076853537e-03, +-8.06401738313571557482e-03, +-8.16197194753211924256e-03, +-8.25518693323474758716e-03, +-8.34361288613344465048e-03, +-8.42720312584763903141e-03, +-8.50591377016694447089e-03, +-8.57970375787523234501e-03, +-8.64853486994612667693e-03, +-8.71237174909944220302e-03, +-8.77118191770899502391e-03, +-8.82493579405169495389e-03, +-8.87360670689150109192e-03, +-8.91717090839015333326e-03, +-8.95560758533894135658e-03, +-8.98889886870667467744e-03, +-9.01702984149947012193e-03, +-9.03998854492910064451e-03, +-9.05776598288827831940e-03, +-9.07035612473096330977e-03, +-9.07775590635802147321e-03, +-9.07996522960853764961e-03, +-9.07698695995886803423e-03, +-9.06882692253164167384e-03, +-9.05549389641891432079e-03, +-9.03699960732328583246e-03, +-9.01335871852335275556e-03, +-8.98458882016932476600e-03, +-8.95071041691646723804e-03, +-8.91174691390494294607e-03, +-8.86772460109508213477e-03, +-8.81867263596835572470e-03, +-8.76462302460546613392e-03, +-8.70561060115330326292e-03, +-8.64167300569398770527e-03, +-8.57285066052993274810e-03, +-8.49918674489946214534e-03, +-8.42072716813898301813e-03, +-8.33752054130776007468e-03, +-8.24961814729350748077e-03, +-8.15707390941654633676e-03, +-8.05994435855085684939e-03, +-7.95828859878412557538e-03, +-7.85216827163510294740e-03, +-7.74164751885155454081e-03, +-7.62679294381024292654e-03, +-7.50767357154260520785e-03, +-7.38436080740939235212e-03, +-7.25692839445000407311e-03, +-7.12545236943096498700e-03, +-6.99001101761916477512e-03, +-6.85068482630888687945e-03, +-6.70755643712759620778e-03, +-6.56071059715018171238e-03, +-6.41023410885009203158e-03, +-6.25621577891687877943e-03, +-6.09874636596976875402e-03, +-5.93791852719933836713e-03, +-5.77382676396723509143e-03, +-5.60656736639539039074e-03, +-5.43623835697979850695e-03, +-5.26293943325864543858e-03, +-5.08677190957020682743e-03, +-4.90783865793382578085e-03, +-4.72624404808862780270e-03, +-4.54209388672411652765e-03, +-4.35549535594014370493e-03, +-4.16655695096843255165e-03, +-3.97538841719484881826e-03, +-3.78210068651828800954e-03, +-3.58680581308160571774e-03, +-3.38961690841329795279e-03, +-3.19064807601676572041e-03, +-2.99001434544510355171e-03, +-2.78783160589872848825e-03, +-2.58421653938650406832e-03, +-2.37928655348473936521e-03, +-2.17315971373707597994e-03, +-1.96595467573080053339e-03, +-1.75779061689126871355e-03, +-1.54878716803180682161e-03, +-1.33906434469759582327e-03, +-1.12874247834651849839e-03, +-9.17942147402158120997e-04, +-7.06784108220954348026e-04, +-4.95389226012176797989e-04, +-2.83878405750408527308e-04, +-7.23725231191953317922e-05, + 1.39007644472942073393e-04, + 3.50141486766494293426e-04, + 5.60908629376450848514e-04, + 7.71189002326557382014e-04, + 9.80862908357632698117e-04, + 1.18981109096850837074e-03, + 1.39791480215185285468e-03, + 1.60505586978618446266e-03, + 1.81111676464667430489e-03, + 2.01598066699498323223e-03, + 2.21953153271216372527e-03, + 2.42165415893787249260e-03, + 2.62223424917535025483e-03, + 2.82115847782954658890e-03, + 3.01831455413943379809e-03, + 3.21359128546936040696e-03, + 3.40687863992359188381e-03, + 3.59806780824958004350e-03, + 3.78705126499338838933e-03, + 3.97372282887472824675e-03, + 4.15797772234820922632e-03, + 4.33971263031428678564e-03, + 4.51882575795083032272e-03, + 4.69521688763073485884e-03, + 4.86878743489439942682e-03, + 5.03944050344600283364e-03, + 5.20708093914320439138e-03, + 5.37161538294856407555e-03, + 5.53295232281637763133e-03, + 5.69100214448343532520e-03, + 5.84567718113605111485e-03, + 5.99689176192734485493e-03, + 6.14456225931638965604e-03, + 6.28860713520388876080e-03, + 6.42894698583886935878e-03, + 6.56550458547169348000e-03, + 6.69820492872941122137e-03, + 6.82697527169041310652e-03, + 6.95174517163579808177e-03, + 7.07244652545614607003e-03, + 7.18901360669207869364e-03, + 7.30138310118917405883e-03, + 7.40949414134865064208e-03, + 7.51328833895314410901e-03, + 7.61270981655247976766e-03, + 7.70770523739102830091e-03, + 7.79822383386149457080e-03, + 7.88421743446952177914e-03, + 7.96564048929547866007e-03, + 8.04245009393938191378e-03, + 8.11460601193707622980e-03, + 8.18207069563602756856e-03, + 8.24480930551941583462e-03, + 8.30278972796945347046e-03, + 8.35598259146062144476e-03, + 8.40436128117489321399e-03, + 8.44790195203182735229e-03, + 8.48658354012752670636e-03, + 8.52038777257667530318e-03, + 8.54929917575385743544e-03, + 8.57330508193055763899e-03, + 8.59239563430499141139e-03, + 8.60656379042347950692e-03, + 8.61580532399272396027e-03, + 8.62011882508288869442e-03, + 8.61950569872288463458e-03, + 8.61397016188992017960e-03, + 8.60351923889614116081e-03, + 8.58816275517627555902e-03, + 8.56791332948142643489e-03, + 8.54278636448400040260e-03, + 8.51280003580121708007e-03, + 8.47797527944401177469e-03, + 8.43833577770019410691e-03, + 8.39390794346085364341e-03, + 8.34472090300016587638e-03, + 8.29080647722033568792e-03, + 8.23219916137209704876e-03, + 8.16893610326531807719e-03, + 8.10105707998175217366e-03, + 8.02860447310570039814e-03, + 7.95162324248711339936e-03, + 7.87016089855287724608e-03, + 7.78426747318477444543e-03, + 7.69399548918007353260e-03, + 7.59939992831438169973e-03, + 7.50053819802581206444e-03, + 7.39747009674054673695e-03, + 7.29025777786024634097e-03, + 7.17896571243396234424e-03, + 7.06366065053597690093e-03, + 6.94441158137212768281e-03, + 6.82128969214047548714e-03, + 6.69436832566827795532e-03, + 6.56372293685217843284e-03, + 6.42943104792645641482e-03, + 6.29157220258638738564e-03, + 6.15022791899296188828e-03, + 6.00548164168810023889e-03, + 5.85741869244729099903e-03, + 5.70612622009830997016e-03, + 5.55169314933761943315e-03, + 5.39421012857201238877e-03, + 5.23376947681718652367e-03, + 5.07046512968433327889e-03, + 4.90439258448602602436e-03, + 4.73564884449306690989e-03, + 4.56433236237605791802e-03, + 4.39054298286334701573e-03, + 4.21438188464811746420e-03, + 4.03595152158122121716e-03, + 3.85535556318054341285e-03, + 3.67269883449336575001e-03, + 3.48808725534603724164e-03, + 3.30162777901616766654e-03, + 3.11342833036215701700e-03, + 2.92359774344746591729e-03, + 2.73224569869404739636e-03, + 2.53948265960054347934e-03, + 2.34541980906500472509e-03, + 2.15016898534491464681e-03, + 1.95384261769374848600e-03, + 1.75655366171025071990e-03, + 1.55841553443768969338e-03, + 1.35954204925029724198e-03, + 1.16004735056427139318e-03, + 9.60045848410695946279e-04, + 7.59652152908002432571e-04, + 5.58981008670681638398e-04, + 3.58147229193453995114e-04, + 1.57265631246792758451e-04, +-4.35490306794674293363e-05, +-2.44182129843599320107e-04, +-4.44519232597282950344e-04, +-6.44446163569028346828e-04, +-8.43849070649477944230e-04, +-1.04261448974139812711e-03, +-1.24062940923833162771e-03, +-1.43778133419359788019e-03, +-1.63395835014485757766e-03, +-1.82904918655875121242e-03, +-2.02294327985625636140e-03, +-2.21553083598718210043e-03, +-2.40670289251588859908e-03, +-2.59635138018404895352e-03, +-2.78436918391547104032e-03, +-2.97065020322924595864e-03, +-3.15508941202569071979e-03, +-3.33758291771281195501e-03, +-3.51802801964081748518e-03, +-3.69632326680855837625e-03, +-3.87236851481334142661e-03, +-4.04606498200982094005e-03, +-4.21731530484743474818e-03, +-4.38602359235502371748e-03, +-4.55209547974291459105e-03, +-4.71543818109126672972e-03, +-4.87596054109631048268e-03, +-5.03357308584660798761e-03, +-5.18818807259795525266e-03, +-5.33971953852289266118e-03, +-5.48808334840551401146e-03, +-5.63319724125592186798e-03, +-5.77498087581854776390e-03, +-5.91335587494941708475e-03, +-6.04824586883698656764e-03, +-6.17957653704386423305e-03, +-6.30727564934618813858e-03, +-6.43127310534771529787e-03, +-6.55150097284682483151e-03, +-6.66789352493667251270e-03, +-6.78038727581722639598e-03, +-6.88892101529996712939e-03, +-6.99343584198691605586e-03, +-7.09387519510564119873e-03, +-7.19018488498349497839e-03, +-7.28231312214434444580e-03, +-7.37021054501293959582e-03, +-7.45383024621102448920e-03, +-7.53312779743236203556e-03, +-7.60806127288360129618e-03, +-7.67859127127740528906e-03, +-7.74468093636805719054e-03, +-7.80629597601776963056e-03, +-7.86340467978466871324e-03, +-7.91597793502309132752e-03, +-7.96398924148845367699e-03, +-8.00741472443937570003e-03, +-8.04623314623062815820e-03, +-8.08042591639200093179e-03, +-8.10997710018770794071e-03, +-8.13487342565317322896e-03, +-8.15510428910632897970e-03, +-8.17066175913122756669e-03, +-8.18154057903300313548e-03, +-8.18773816776408903950e-03, +-8.18925461932203113680e-03, +-8.18609270062076350982e-03, +-8.17825784783763644337e-03, +-8.16575816123921681411e-03, +-8.14860439849041627569e-03, +-8.12680996645165354408e-03, +-8.10039091146990027081e-03, +-8.06936590817051296876e-03, +-8.03375624675719754442e-03, +-7.99358581882871586932e-03, +-7.94888110172140179011e-03, +-7.89967114138754450403e-03, +-7.84598753382080051078e-03, +-7.78786440504017178632e-03, +-7.72533838964500462615e-03, +-7.65844860795453739877e-03, +-7.58723664174604933708e-03, +-7.51174650860678399383e-03, +-7.43202463491451133931e-03, +-7.34811982746492921986e-03, +-7.26008324376091473962e-03, +-7.16796836098336151433e-03, +-7.07183094366188418067e-03, +-6.97172901006430818793e-03, +-6.86772279732582834055e-03, +-6.75987472533817052023e-03, +-6.64824935942080145340e-03, +-6.53291337179604837682e-03, +-6.41393550189129496575e-03, +-6.29138651549170698635e-03, +-6.16533916276751359220e-03, +-6.03586813520128485228e-03, +-5.90305002144024624361e-03, +-5.76696326209861012679e-03, +-5.62768810353925751089e-03, +-5.48530655065889230504e-03, +-5.33990231870646887141e-03, +-5.19156078416207946574e-03, +-5.04036893470575456805e-03, +-4.88641531830454143442e-03, +-4.72978999144895145140e-03, +-4.57058446656796041330e-03, +-4.40889165865240156839e-03, +-4.24480583112071818697e-03, +-4.07842254095536725644e-03, +-3.90983858314355049030e-03, +-3.73915193445415730208e-03, +-3.56646169658344580969e-03, +-3.39186803870199487382e-03, +-3.21547213943741911138e-03, +-3.03737612832535950474e-03, +-2.85768302676162435152e-03, +-2.67649668849279489050e-03, +-2.49392173967607306759e-03, +-2.31006351854499665868e-03, +-2.12502801471515026521e-03, +-1.93892180816497236052e-03, +-1.75185200792604364207e-03, +-1.56392619051968551937e-03, +-1.37525233817362515544e-03, +-1.18593877685428585739e-03, +-9.96094114151082135611e-04, +-8.05827177048465143755e-04, +-6.15246949619699455385e-04, +-4.24462510679590970634e-04, +-2.33582971431131201836e-04, +-4.27174131418600218075e-05, + 1.48025175115281873829e-04, + 3.38535958618741729398e-04, + 5.28706319021235741570e-04, + 7.18427916200129542020e-04, + 9.07592749900823655106e-04, + 1.09609322113959862730e-03, + 1.28382219332944988964e-03, + 1.47067305309492128707e-03, + 1.65653977074134688835e-03, + 1.84131696034424701021e-03, + 2.02489993942486920173e-03, + 2.20718478817801639844e-03, + 2.38806840821935862512e-03, + 2.56744858081750862433e-03, + 2.74522402457949956170e-03, + 2.92129445255769277026e-03, + 3.09556062874293989526e-03, + 3.26792442391583577016e-03, + 3.43828887082240275061e-03, + 3.60655821864397721499e-03, + 3.77263798673060360075e-03, + 3.93643501756839753886e-03, + 4.09785752894968862553e-03, + 4.25681516531844095913e-03, + 4.41321904826232503521e-03, + 4.56698182612100180705e-03, + 4.71801772268583795300e-03, + 4.86624258496219565945e-03, + 5.01157392996826912823e-03, + 5.15393099054442353768e-03, + 5.29323476014809113366e-03, + 5.42940803660817671028e-03, + 5.56237546481617214228e-03, + 5.69206357833054472223e-03, + 5.81840083986934729354e-03, + 5.94131768067147035539e-03, + 6.06074653870333594774e-03, + 6.17662189569052801769e-03, + 6.28888031295409682953e-03, + 6.39746046603201657527e-03, + 6.50230317806734740144e-03, + 6.60335145194352116094e-03, + 6.70055050115188084031e-03, + 6.79384777937258772795e-03, + 6.88319300875362728720e-03, + 6.96853820687349644752e-03, + 7.04983771237240302437e-03, + 7.12704820923858520243e-03, + 7.20012874973695923136e-03, + 7.26904077596829921448e-03, + 7.33374814004676342516e-03, + 7.39421712288685674397e-03, + 7.45041645158874780291e-03, + 7.50231731541360375576e-03, + 7.54989338034125958415e-03, + 7.59312080220247119511e-03, + 7.63197823837959577614e-03, + 7.66644685807015349721e-03, + 7.69651035110831445440e-03, + 7.72215493534070089587e-03, + 7.74336936255298931286e-03, + 7.76014492294555859042e-03, + 7.77247544815607566138e-03, + 7.78035731282916958457e-03, + 7.78378943473276123377e-03, + 7.78277327342252397968e-03, + 7.77731282745607217788e-03, + 7.76741463015983343160e-03, + 7.75308774395181993927e-03, + 7.73434375322510497819e-03, + 7.71119675579651046859e-03, + 7.68366335292724762090e-03, + 7.65176263792180597761e-03, + 7.61551618331250072119e-03, + 7.57494802663899804984e-03, + 7.53008465483087727904e-03, + 7.48095498720392076963e-03, + 7.42759035708089564165e-03, + 7.37002449204788440129e-03, + 7.30829349285897541394e-03, + 7.24243581100231150621e-03, + 7.17249222494118019583e-03, + 7.09850581504455676457e-03, + 7.02052193722279248289e-03, + 6.93858819528464596665e-03, + 6.85275441203157895803e-03, + 6.76307259910770459943e-03, + 6.66959692562291064227e-03, + 6.57238368556857608521e-03, + 6.47149126404455293793e-03, + 6.36698010231910756229e-03, + 6.25891266174058436000e-03, + 6.14735338652398939641e-03, + 6.03236866543420662684e-03, + 5.91402679238786036647e-03, + 5.79239792599798089534e-03, + 5.66755404808486160789e-03, + 5.53956892117803134656e-03, + 5.40851804503346585140e-03, + 5.27447861219351547823e-03, + 5.13752946261299917735e-03, + 4.99775103738003996512e-03, + 4.85522533155877469846e-03, + 4.71003584618005094464e-03, + 4.56226753940958736772e-03, + 4.41200677692144428016e-03, + 4.25934128150591128498e-03, + 4.10436008194120516279e-03, + 3.94715346115854636561e-03, + 3.78781290373112009690e-03, + 3.62643104271654281509e-03, + 3.46310160588530037765e-03, + 3.29791936136483157180e-03, + 3.13098006273033763885e-03, + 2.96238039357679455374e-03, + 2.79221791160092977502e-03, + 2.62059099222753267427e-03, + 2.44759877181191781020e-03, + 2.27334109045146740002e-03, + 2.09791843443869838876e-03, + 1.92143187839023546828e-03, + 1.74398302708383490592e-03, + 1.56567395703608109106e-03, + 1.38660715785749919481e-03, + 1.20688547341501702971e-03, + 1.02661204283784578128e-03, + 8.45890241399772859106e-04, + 6.64823621311828307986e-04, + 4.83515852459311156267e-04, + 3.02070663116303390200e-04, + 1.20591780673772898239e-04, +-6.08171275885414341889e-05, +-2.42052513649585246663e-04, +-4.23011007780704729672e-04, +-6.03589477433417857279e-04, +-7.83685085946226591899e-04, +-9.63195351037734169043e-04, +-1.14201820305262708236e-03, +-1.32005204292819870032e-03, +-1.49719579984629639312e-03, +-1.67334898854166894480e-03, +-1.84841176623110319682e-03, +-2.02228498913186371597e-03, +-2.19487026853879690913e-03, +-2.36607002642698479797e-03, +-2.53578755054913694555e-03, +-2.70392704899653085748e-03, +-2.87039370419339950197e-03, +-3.03509372629227804768e-03, +-3.19793440594374599878e-03, +-3.35882416640786475581e-03, +-3.51767261497890407207e-03, +-3.67439059369556366569e-03, +-3.82889022930704356340e-03, +-3.98108498246762219919e-03, +-4.13088969613195546721e-03, +-4.27822064312436464023e-03, +-4.42299557285530213491e-03, +-4.56513375715911651903e-03, +-4.70455603522795286209e-03, +-4.84118485761577625054e-03, +-4.97494432928909796621e-03, +-5.10576025170110612411e-03, +-5.23356016386354247483e-03, +-5.35827338239640901113e-03, +-5.47983104053158340957e-03, +-5.59816612604972611844e-03, +-5.71321351812927209768e-03, +-5.82491002308763421852e-03, +-5.93319440899438971249e-03, +-6.03800743913827410447e-03, +-6.13929190432966741947e-03, +-6.23699265402067378611e-03, +-6.33105662622569179826e-03, +-6.42143287622725950775e-03, +-6.50807260405082601412e-03, +-6.59092918069416680571e-03, +-6.66995817309711056670e-03, +-6.74511736783881075269e-03, +-6.81636679354884200688e-03, +-6.88366874202207389838e-03, +-6.94698778802482330014e-03, +-7.00629080778204620106e-03, +-7.06154699613719197271e-03, +-7.11272788237445920123e-03, +-7.15980734469658271213e-03, +-7.20276162335014690646e-03, +-7.24156933239256637991e-03, +-7.27621147009427024499e-03, +-7.30667142797224253986e-03, +-7.33293499844991664843e-03, +-7.35499038114030730118e-03, +-7.37282818775028547797e-03, +-7.38644144560350775219e-03, +-7.39582559978183007310e-03, +-7.40097851388428658315e-03, +-7.40190046940486859328e-03, +-7.39859416373013153989e-03, +-7.39106470675889026811e-03, +-7.37931961614715723613e-03, +-7.36336881118193880419e-03, +-7.34322460528822728437e-03, +-7.31890169717512584224e-03, +-7.29041716062642924934e-03, +-7.25779043294308163353e-03, +-7.22104330204492456807e-03, +-7.18019989224008559070e-03, +-7.13528664867118991161e-03, +-7.08633232044840466468e-03, +-7.03336794247966679700e-03, +-6.97642681600977102030e-03, +-6.91554448788011654620e-03, +-6.85075872852217854225e-03, +-6.78210950869807035341e-03, +-6.70963897500246285455e-03, +-6.63339142414092006877e-03, +-6.55341327599992442415e-03, +-6.46975304552541326253e-03, +-6.38246131342605754061e-03, +-6.29159069572002467574e-03, +-6.19719581214200551655e-03, +-6.09933325343054149464e-03, +-5.99806154751515805540e-03, +-5.89344112462262485069e-03, +-5.78553428132379601867e-03, +-5.67440514354219504439e-03, +-5.56011962854616095114e-03, +-5.44274540594681839611e-03, +-5.32235185772599213305e-03, +-5.19901003731562585258e-03, +-5.07279262775460568907e-03, +-4.94377389894712446911e-03, +-4.81202966404692660668e-03, +-4.67763723499383179960e-03, +-4.54067537722822531232e-03, +-4.40122426361012723806e-03, +-4.25936542756916083213e-03, +-4.11518171551450429035e-03, +-3.96875723852973399941e-03, +-3.82017732338308995885e-03, +-3.66952846288120431220e-03, +-3.51689826559387639163e-03, +-3.36237540498054293669e-03, +-3.20604956794714058416e-03, +-3.04801140286350535219e-03, +-2.88835246707072135566e-03, +-2.72716517391074315599e-03, +-2.56454273930563836012e-03, +-2.40057912792011364511e-03, +-2.23536899893777120732e-03, +-2.06900765148108206626e-03, +-1.90159096970791930900e-03, +-1.73321536761559679037e-03, +-1.56397773358425175305e-03, +-1.39397537469151283109e-03, +-1.22330596083027954082e-03, +-1.05206746866192031586e-03, +-8.80358125436270775623e-04, +-7.08276352712239277640e-04, +-5.35920710009009110958e-04, +-3.63389838422367814508e-04, +-1.90782404235573607330e-04, +-1.81970425606722737690e-05, + 1.54267698961177570456e-04, + 3.26513416366015622218e-04, + 4.98441905449340362869e-04, + 6.69955217690751999443e-04, + 8.40955715991319185942e-04, + 1.01134613018985628115e-03, + 1.18102961232867528438e-03, + 1.34990979163519928159e-03, + 1.51789082919096310863e-03, + 1.68487747225296133520e-03, + 1.85077510820205867401e-03, + 2.01548981808303672575e-03, + 2.17892842970867023702e-03, + 2.34099857029698189825e-03, + 2.50160871861258458579e-03, + 2.66066825658141034583e-03, + 2.81808752035150444221e-03, + 2.97377785076984252691e-03, + 3.12765164324742489868e-03, + 3.27962239698395725818e-03, + 3.42960476352574062178e-03, + 3.57751459462877022255e-03, + 3.72326898939903325192e-03, + 3.86678634068614995867e-03, + 4.00798638070307827741e-03, + 4.14679022584586980810e-03, + 4.28312042068948461981e-03, + 4.41690098113505479061e-03, + 4.54805743668363141041e-03, + 4.67651687181444911112e-03, + 4.80220796644356944655e-03, + 4.92506103544097621760e-03, + 5.04500806718418456226e-03, + 5.16198276112742483052e-03, + 5.27592056436465041414e-03, + 5.38675870716774727459e-03, + 5.49443623747928808210e-03, + 5.59889405434115926957e-03, + 5.70007494024133646443e-03, + 5.79792359236085651231e-03, + 5.89238665270259628914e-03, + 5.98341273708859113650e-03, + 6.07095246300716831489e-03, + 6.15495847629641840842e-03, + 6.23538547664926560282e-03, + 6.31219024192670834228e-03, + 6.38533165126559023456e-03, + 6.45477070696955871482e-03, + 6.52047055517085416554e-03, + 6.58239650525249079399e-03, + 6.64051604802040618125e-03, + 6.69479887261659797199e-03, + 6.74521688216371366476e-03, + 6.79174420813415374160e-03, + 6.83435722343555315111e-03, + 6.87303455420689574096e-03, + 6.90775709031867489462e-03, + 6.93850799457300902728e-03, + 6.96527271059846700418e-03, + 6.98803896943703088673e-03, + 7.00679679481976212113e-03, + 7.02153850712936879186e-03, + 7.03225872604836682589e-03, + 7.03895437189253850990e-03, + 7.04162466562946627591e-03, + 7.04027112758361280076e-03, + 7.03489757482926060528e-03, + 7.02551011727416043623e-03, + 7.01211715243688429866e-03, + 6.99472935892183310391e-03, + 6.97335968859667636177e-03, + 6.94802335747783921666e-03, + 6.91873783532993662237e-03, + 6.88552283398612303966e-03, + 6.84840029439715090170e-03, + 6.80739437241735696749e-03, + 6.76253142333664569730e-03, + 6.71383998516838706450e-03, + 6.66135076070345499843e-03, + 6.60509659834187211336e-03, + 6.54511247171371459558e-03, + 6.48143545810195200602e-03, + 6.41410471568024109779e-03, + 6.34316145958003368976e-03, + 6.26864893680093449718e-03, + 6.19061239997995525763e-03, + 6.10909908003542511529e-03, + 6.02415815770170753884e-03, + 5.93584073397201983369e-03, + 5.84419979946794454495e-03, + 5.74929020275181338478e-03, + 5.65116861760294342948e-03, + 5.54989350927625503529e-03, + 5.44552509976333788677e-03, + 5.33812533207639414862e-03, + 5.22775783357706802512e-03, + 5.11448787837056554478e-03, + 4.99838234878814680062e-03, + 4.87950969598033648666e-03, + 4.75793989964418302663e-03, + 4.63374442690764765801e-03, + 4.50699619039651548646e-03, + 4.37776950550668349227e-03, + 4.24614004690850900536e-03, + 4.11218480430692711475e-03, + 3.97598203748505876071e-03, + 3.83761123065512682953e-03, + 3.69715304614688265381e-03, + 3.55468927745570878116e-03, + 3.41030280168198429019e-03, + 3.26407753138687091454e-03, + 3.11609836589335845169e-03, + 2.96645114206062080267e-03, + 2.81522258455971620753e-03, + 2.66250025568077076238e-03, + 2.50837250469876198167e-03, + 2.35292841682855887256e-03, + 2.19625776179852754202e-03, + 2.03845094207133958539e-03, + 1.87959894074250246331e-03, + 1.71979326914796590980e-03, + 1.55912591420826569452e-03, + 1.39768928554081183456e-03, + 1.23557616237141834267e-03, + 1.07287964027444793387e-03, + 9.09693077772073983855e-04, + 7.46110042824598817396e-04, + 5.82224259240568249411e-04, + 4.18129553038750639577e-04, + 2.53919798792089188456e-04, + 8.96888659844675517445e-05, +-7.44694345896905772258e-05, +-2.38461404350935065157e-04, +-4.02193510356873369562e-04, +-5.65572438589027263849e-04, +-7.28505147074144480956e-04, +-8.90898918810926966801e-04, +-1.05266141447140325338e-03, +-1.21370072484502889917e-03, +-1.37392542300045520862e-03, +-1.53324461613069552152e-03, +-1.69156799705494180486e-03, +-1.84880589534694829770e-03, +-2.00486932806183924816e-03, +-2.15967005003114657924e-03, +-2.31312060369968800280e-03, +-2.46513436847466778021e-03, +-2.61562560955978882365e-03, +-2.76450952624671683969e-03, +-2.91170229963722427408e-03, +-3.05712113976792237979e-03, +-3.20068433211290236454e-03, +-3.34231128343639950426e-03, +-3.48192256697167851556e-03, +-3.61943996689886252766e-03, +-3.75478652209826086611e-03, +-3.88788656915454566149e-03, +-4.01866578458679943320e-03, +-4.14705122628237707327e-03, +-4.27297137411052248279e-03, +-4.39635616969335368820e-03, +-4.51713705531228693069e-03, +-4.63524701192860166116e-03, +-4.75062059629599835880e-03, +-4.86319397714623982004e-03, +-4.97290497042671315875e-03, +-5.07969307357067009767e-03, +-5.18349949878208187543e-03, +-5.28426720531614563942e-03, +-5.38194093073713492048e-03, +-5.47646722113816729338e-03, +-5.56779446030545265012e-03, +-5.65587289781075818612e-03, +-5.74065467601772051742e-03, +-5.82209385598695533526e-03, +-5.90014644226589859283e-03, +-5.97477040655035752242e-03, +-6.04592571020508891960e-03, +-6.11357432563106647366e-03, +-6.17768025646842598719e-03, +-6.23820955662453009022e-03, +-6.29513034811653680867e-03, +-6.34841283772002301644e-03, +-6.39802933241444878737e-03, +-6.44395425361771970879e-03, +-6.48616415020282759824e-03, +-6.52463771028981894679e-03, +-6.55935577180693108607e-03, +-6.59030133181688366345e-03, +-6.61745955460281767846e-03, +-6.64081777851058003420e-03, +-6.66036552154464483316e-03, +-6.67609448571504417863e-03, +-6.68799856013396580579e-03, +-6.69607382286100619867e-03, +-6.70031854149736628978e-03, +-6.70073317252893423113e-03, +-6.69732035942032649656e-03, +-6.69008492946125080808e-03, +-6.67903388936833767447e-03, +-6.66417641964580503844e-03, +-6.64552386770900921364e-03, +-6.62308973977570117353e-03, +-6.59688969153084895508e-03, +-6.56694151757089734922e-03, +-6.53326513963461280587e-03, +-6.49588259362816715370e-03, +-6.45481801545267231540e-03, +-6.41009762564318658074e-03, +-6.36174971282886698998e-03, +-6.30980461602472040422e-03, +-6.25429470576554895345e-03, +-6.19525436409436129626e-03, +-6.13271996341689488996e-03, +-6.06672984423554158967e-03, +-5.99732429177634272788e-03, +-5.92454551152269380532e-03, +-5.84843760367088558172e-03, +-5.76904653652344102249e-03, +-5.68642011883526560245e-03, +-5.60060797112928252656e-03, +-5.51166149599965557448e-03, +-5.41963384741940817219e-03, +-5.32457989907073915570e-03, +-5.22655621171772520606e-03, +-5.12562099963942419123e-03, +-5.02183409614448406089e-03, +-4.91525691818681109702e-03, +-4.80595243010374650883e-03, +-4.69398510649735815209e-03, +-4.57942089428194781808e-03, +-4.46232717391857429401e-03, +-4.34277271986037178425e-03, +-4.22082766023175893350e-03, +-4.09656343576443940369e-03, +-3.97005275801442028549e-03, +-3.84136956688634241541e-03, +-3.71058898748600606704e-03, +-3.57778728632999511172e-03, +-3.44304182693580453772e-03, +-3.30643102481900002035e-03, +-3.16803430192340654270e-03, +-3.02793204051044796687e-03, +-2.88620553653542132044e-03, +-2.74293695253627518860e-03, +-2.59820927006318425079e-03, +-2.45210624167601677625e-03, +-2.30471234253809770590e-03, +-2.15611272163192388071e-03, +-2.00639315262918054017e-03, +-1.85563998443917131317e-03, +-1.70394009146592178422e-03, +-1.55138082360318694218e-03, +-1.39804995599510811267e-03, +-1.24403563859131600054e-03, +-1.08942634552675727232e-03, +-9.34310824353430722893e-04, +-7.78778045154488265424e-04, +-6.22917149569355557345e-04, +-4.66817399759168381000e-04, +-3.10568127341177748629e-04, +-1.54258682322715390484e-04, + 2.02161793800758804308e-06, + 1.58183539713823383393e-04, + 3.14137983804192602675e-04, + 4.69796036316565991924e-04, + 6.25069019303870366394e-04, + 7.79868541228004980535e-04, + 9.34106547223279145772e-04, + 1.08769536912991875675e-03, + 1.24054777526851588154e-03, + 1.39257701992830692887e-03, + 1.54369689254121996921e-03, + 1.69382176651257680342e-03, + 1.84286664768265498297e-03, + 1.99074722239030730067e-03, + 2.13737990511212458747e-03, + 2.28268188564996954079e-03, + 2.42657117584086636994e-03, + 2.56896665576163141242e-03, + 2.70978811940393539068e-03, + 2.84895631979290410787e-03, + 2.98639301352399176917e-03, + 3.12202100469403682342e-03, + 3.25576418820130086482e-03, + 3.38754759238860721909e-03, + 3.51729742100961384824e-03, + 3.64494109449081107530e-03, + 3.77040729046844522859e-03, + 3.89362598357706262905e-03, + 4.01452848446753798178e-03, + 4.13304747803329777800e-03, + 4.24911706082250345551e-03, + 4.36267277761673982761e-03, + 4.47365165715500091859e-03, + 4.58199224698366443242e-03, + 4.68763464741256234702e-03, + 4.79052054456022714107e-03, + 4.89059324246701558614e-03, + 4.98779769426149852812e-03, + 5.08208053236177022260e-03, + 5.17339009769468647498e-03, + 5.26167646791786663280e-03, + 5.34689148462896227804e-03, + 5.42898877954677526458e-03, + 5.50792379965109931556e-03, + 5.58365383126675513675e-03, + 5.65613802307947735604e-03, + 5.72533740807081026336e-03, + 5.79121492436091966222e-03, + 5.85373543494751170241e-03, + 5.91286574633094908632e-03, + 5.96857462601572963390e-03, + 6.02083281887862576537e-03, + 6.06961306239588074124e-03, + 6.11489010072096151466e-03, + 6.15664069760550429489e-03, + 6.19484364815777593938e-03, + 6.22947978943221101350e-03, + 6.26053200984478218361e-03, + 6.28798525741010132240e-03, + 6.31182654679610100068e-03, + 6.33204496519319988412e-03, + 6.34863167699579490633e-03, + 6.36157992729387798680e-03, + 6.37088504417378069522e-03, + 6.37654443982793583956e-03, + 6.37855761047346776077e-03, + 6.37692613508076319023e-03, + 6.37165367291377907760e-03, + 6.36274595988404155500e-03, + 6.35021080372164415523e-03, + 6.33405807796656641212e-03, + 6.31429971478498618803e-03, + 6.29094969661516800058e-03, + 6.26402404664898240089e-03, + 6.23354081815498742292e-03, + 6.19952008265027120631e-03, + 6.16198391692862612601e-03, + 6.12095638895326834422e-03, + 6.07646354262293339477e-03, + 6.02853338142123572341e-03, + 5.97719585095891989962e-03, + 5.92248282042035986694e-03, + 5.86442806292514912103e-03, + 5.80306723481761356498e-03, + 5.73843785389547937636e-03, + 5.67057927659296145267e-03, + 5.59953267413014401516e-03, + 5.52534100764390679467e-03, + 5.44804900231556955836e-03, + 5.36770312051036008194e-03, + 5.28435153394469885046e-03, + 5.19804409489867894761e-03, + 5.10883230648978472338e-03, + 5.01676929202641425087e-03, + 4.92190976345897174271e-03, + 4.82430998894739331007e-03, + 4.72402775956395210022e-03, + 4.62112235515180647810e-03, + 4.51565450935827780027e-03, + 4.40768637386434840308e-03, + 4.29728148183127715148e-03, + 4.18450471058511973971e-03, + 4.06942224356152213588e-03, + 3.95210153153399603582e-03, + 3.83261125314650298243e-03, + 3.71102127477429544200e-03, + 3.58740260973707415088e-03, + 3.46182737688722997824e-03, + 3.33436875859757829790e-03, + 3.20510095817370162935e-03, + 3.07409915671442122986e-03, + 2.94143946944645578653e-03, + 2.80719890155818000560e-03, + 2.67145530355801606032e-03, + 2.53428732618405597871e-03, + 2.39577437488870843840e-03, + 2.25599656392876232389e-03, + 2.11503467008288762591e-03, + 1.97297008602663600726e-03, + 1.82988477338951447716e-03, + 1.68586121552325774765e-03, + 1.54098237000600303548e-03, + 1.39533162091338329772e-03, + 1.24899273087909832951e-03, + 1.10204979297680240487e-03, + 9.54587182448630219150e-04, + 8.06689508308766145897e-04, + 6.58441564849216722996e-04, + 5.09928283076855021032e-04, + 3.61234682107735086132e-04, + 2.12445820547849437534e-04, + 6.36467478874062951924e-05, +-8.50775440627651754989e-05, +-2.33642169667408998316e-04, +-3.81962397863639291536e-04, +-5.29953700435123313019e-04, +-6.77531800134304070492e-04, +-8.24612718624688793498e-04, +-9.71112824217015813653e-04, +-1.11694887937219939321e-03, +-1.26203808794284771423e-03, +-1.40629814212836251781e-03, +-1.54964726911566716763e-03, +-1.69200427737972594958e-03, +-1.83328860261746241604e-03, +-1.97342035328964800558e-03, +-2.11232035574377557952e-03, +-2.24991019889414630914e-03, +-2.38611227843281599459e-03, +-2.52084984054647175469e-03, +-2.65404702511572903115e-03, +-2.78562890837174507302e-03, +-2.91552154498523870621e-03, +-3.04365200956643270486e-03, +-3.16994843755161225321e-03, +-3.29434006545274672348e-03, +-3.41675727044862646842e-03, +-3.53713160929501439778e-03, +-3.65539585653244531588e-03, +-3.77148404196936751220e-03, +-3.88533148742125408054e-03, +-3.99687484268407104693e-03, +-4.10605212072268164342e-03, +-4.21280273205412725268e-03, +-4.31706751830841783946e-03, +-4.41878878494509144681e-03, +-4.51791033311113327670e-03, +-4.61437749061991125260e-03, +-4.70813714203596311164e-03, +-4.79913775784764073951e-03, +-4.88732942271308690857e-03, +-4.97266386276206447808e-03, +-5.05509447194163030054e-03, +-5.13457633738856073641e-03, +-5.21106626381633106920e-03, +-5.28452279690304685400e-03, +-5.35490624566773484178e-03, +-5.42217870382271597413e-03, +-5.48630407009116985440e-03, +-5.54724806747858376760e-03, +-5.60497826148812720165e-03, +-5.65946407726994771964e-03, +-5.71067681569638677108e-03, +-5.75858966835306532173e-03, +-5.80317773143970965649e-03, +-5.84441801857288768113e-03, +-5.88228947248397703723e-03, +-5.91677297560679570088e-03, +-5.94785135954983314177e-03, +-5.97550941344791256699e-03, +-5.99973389119013312404e-03, +-6.02051351752001286111e-03, +-6.03783899300595460619e-03, +-6.05170299787924879931e-03, +-6.06210019473904081905e-03, +-6.06902723012296262811e-03, +-6.07248273494360914920e-03, +-6.07246732379158708770e-03, +-6.06898359310613279977e-03, +-6.06203611821533403653e-03, +-6.05163144924839458555e-03, +-6.03777810592327594807e-03, +-6.02048657121333555264e-03, +-5.99976928389753336873e-03, +-5.97564062999924889424e-03, +-5.94811693311943397167e-03, +-5.91721644367056848202e-03, +-5.88295932701797356923e-03, +-5.84536765053670151482e-03, +-5.80446536959165673014e-03, +-5.76027831244998057142e-03, +-5.71283416413511518916e-03, +-5.66216244923269020756e-03, +-5.60829451365809760616e-03, +-5.55126350539837404990e-03, +-5.49110435423857436155e-03, +-5.42785375048610279486e-03, +-5.36155012270514343825e-03, +-5.29223361447536504165e-03, +-5.21994606018790722329e-03, +-5.14473095989484690421e-03, +-5.06663345322490039219e-03, +-4.98570029238308044806e-03, +-4.90197981424923389521e-03, +-4.81552191159239240809e-03, +-4.72637800341784222735e-03, +-4.63460100446517250100e-03, +-4.54024529387421233589e-03, +-4.44336668303834617794e-03, +-4.34402238266374564335e-03, +-4.24227096905429278129e-03, +-4.13817234964060018387e-03, +-4.03178772777628563473e-03, +-3.92317956681902026833e-03, +-3.81241155351897623854e-03, +-3.69954856073620007989e-03, +-3.58465660950824235517e-03, +-3.46780283048990500827e-03, +-3.34905542478881141852e-03, +-3.22848362421805775910e-03, +-3.10615765099010905648e-03, +-2.98214867687515662251e-03, +-2.85652878184750828178e-03, +-2.72937091224384606111e-03, +-2.60074883845852087780e-03, +-2.47073711219897686545e-03, +-2.33941102332713016590e-03, +-2.20684655631157985653e-03, +-2.07312034631475673035e-03, +-1.93830963494213536630e-03, +-1.80249222567671618656e-03, +-1.66574643902788789573e-03, +-1.52815106741598333122e-03, +-1.38978532982251450426e-03, +-1.25072882622996486672e-03, +-1.11106149187807385498e-03, +-9.70863551362263440571e-04, +-8.30215472601808523491e-04, +-6.89197920702451245073e-04, +-5.47891711741154406080e-04, +-4.06377766498845327103e-04, +-2.64737064168374847291e-04, +-1.23050596061868546460e-04, + 1.86006806518760801038e-05, + 1.60135889158271910344e-04, + 3.01474279126209918772e-04, + 4.42535272731790253753e-04, + 5.83238510548296702242e-04, + 7.23503897278638991204e-04, + 8.63251647300782411557e-04, + 1.00240233000493386348e-03, + 1.14087691489260295227e-03, + 1.27859681641420436932e-03, + 1.41548393851902284610e-03, + 1.55146071889291931739e-03, + 1.68645017285750319601e-03, + 1.82037593690758878195e-03, + 1.95316231186109341353e-03, + 2.08473430559764265693e-03, + 2.21501767536104888362e-03, + 2.34393896960388269796e-03, + 2.47142556934688362516e-03, + 2.59740572903363739141e-03, + 2.72180861685599774502e-03, + 2.84456435452711767914e-03, + 2.96560405648055866804e-03, + 3.08485986847369889757e-03, + 3.20226500557270433653e-03, + 3.31775378949923562683e-03, + 3.43126168531712261514e-03, + 3.54272533743877921647e-03, + 3.65208260493136678895e-03, + 3.75927259610300519913e-03, + 3.86423570235000643155e-03, + 3.96691363124569706944e-03, + 4.06724943885357868856e-03, + 4.16518756124574941052e-03, + 4.26067384521043503870e-03, + 4.35365557813031326534e-03, + 4.44408151701685457530e-03, + 4.53190191668225664939e-03, + 4.61706855703673899743e-03, + 4.69953476949353052966e-03, + 4.77925546246841040365e-03, + 4.85618714595966241565e-03, + 4.93028795519530847746e-03, + 5.00151767333411288730e-03, + 5.06983775320908342660e-03, + 5.13521133810092809957e-03, + 5.19760328153088136532e-03, + 5.25698016606174298865e-03, + 5.31331032109820002030e-03, + 5.36656383967527069595e-03, + 5.41671259422796692179e-03, + 5.46373025133245135421e-03, + 5.50759228541199737789e-03, + 5.54827599139992924671e-03, + 5.58576049635388805631e-03, + 5.62002677001447251137e-03, + 5.65105763430437738060e-03, + 5.67883777176233280753e-03, + 5.70335373290816339403e-03, + 5.72459394253559995802e-03, + 5.74254870493012391924e-03, + 5.75721020800935671946e-03, + 5.76857252638474007206e-03, + 5.77663162334343931875e-03, + 5.78138535175009606049e-03, + 5.78283345386879782390e-03, + 5.78097756010611391053e-03, + 5.77582118667672138324e-03, + 5.76736973219383122768e-03, + 5.75563047318704626432e-03, + 5.74061255855102051116e-03, + 5.72232700292902695532e-03, + 5.70078667903584773713e-03, + 5.67600630892513106918e-03, + 5.64800245420722570738e-03, + 5.61679350522356971021e-03, + 5.58239966918474238289e-03, + 5.54484295727977402612e-03, + 5.50414717076463597123e-03, + 5.46033788603883952356e-03, + 5.41344243871932310347e-03, + 5.36348990672138540431e-03, + 5.31051109235732010649e-03, + 5.25453850346318130510e-03, + 5.19560633356600486132e-03, + 5.13375044110239622114e-03, + 5.06900832770268514743e-03, + 5.00141911555166893133e-03, + 4.93102352384138312158e-03, + 4.85786384432904984332e-03, + 4.78198391601513880800e-03, + 4.70342909895635295087e-03, + 4.62224624722982427999e-03, + 4.53848368106374473741e-03, + 4.45219115815146792431e-03, + 4.36341984416594753926e-03, + 4.27222228249233334368e-03, + 4.17865236319510044427e-03, + 4.08276529124071765886e-03, + 3.98461755399166870500e-03, + 3.88426688799294646953e-03, + 3.78177224506918985281e-03, + 3.67719375775360296163e-03, + 3.57059270406730406081e-03, + 3.46203147167215485522e-03, + 3.35157352141467277523e-03, + 3.23928335028530935830e-03, + 3.12522645381305575613e-03, + 3.00946928791781488297e-03, + 2.89207923024227455538e-03, + 2.77312454098672077352e-03, + 2.65267432326827179087e-03, + 2.53079848302840103302e-03, + 2.40756768851164678139e-03, + 2.28305332933951632760e-03, + 2.15732747520132111738e-03, + 2.03046283418941569954e-03, + 1.90253271079930631401e-03, + 1.77361096362036439224e-03, + 1.64377196274210417119e-03, + 1.51309054689958370071e-03, + 1.38164198038311938042e-03, + 1.24950190973654160810e-03, + 1.11674632027006139751e-03, + 9.83451492411185164075e-04, + 8.49693957919833188497e-04, + 7.15550455992367039418e-04, + 5.81097889279802068928e-04, + 4.46413279844896004802e-04, + 3.11573725084547952131e-04, + 1.76656353640993331018e-04, + 4.17382813286828151375e-05, +-9.31034328996876200512e-05, +-2.27791830921029737336e-04, +-3.62250099320780654093e-04, +-4.96401613154530668010e-04, +-6.30169979571938514672e-04, +-7.63479081274113916857e-04, +-8.96253119781942569726e-04, +-1.02841665849006422100e-03, +-1.15989466548260746100e-03, +-1.29061255608525294117e-03, +-1.42049623513107697685e-03, +-1.54947213891506270153e-03, +-1.67746727681411891310e-03, +-1.80440927254837480201e-03, +-1.93022640506252275011e-03, +-2.05484764900032337159e-03, +-2.17820271475373814299e-03, +-2.30022208806093461653e-03, +-2.42083706913298482913e-03, +-2.53997981128547666713e-03, +-2.65758335905543320934e-03, +-2.77358168577903838048e-03, +-2.88790973061320895704e-03, +-3.00050343497665914297e-03, +-3.11129977839202497697e-03, +-3.22023681370834334581e-03, +-3.32725370168476981825e-03, +-3.43229074491519740159e-03, +-3.53528942107627329461e-03, +-3.63619241547926243599e-03, +-3.73494365290821112024e-03, +-3.83148832872629279550e-03, +-3.92577293923390257396e-03, +-4.01774531126125340058e-03, +-4.10735463097804467947e-03, +-4.19455147190698693360e-03, +-4.27928782212313139899e-03, +-4.36151711062546069975e-03, +-4.44119423286594081079e-03, +-4.51827557542231091070e-03, +-4.59271903980044363808e-03, +-4.66448406535440850823e-03, +-4.73353165131090974221e-03, +-4.79982437788653917843e-03, +-4.86332642648651045092e-03, +-4.92400359897397343206e-03, +-4.98182333599925253331e-03, +-5.03675473437993799497e-03, +-5.08876856352186244387e-03, +-5.13783728087296304166e-03, +-5.18393504640126713545e-03, +-5.22703773609024553021e-03, +-5.26712295444329344635e-03, +-5.30417004599272740029e-03, +-5.33816010580571553151e-03, +-5.36907598898301533646e-03, +-5.39690231914530423041e-03, +-5.42162549590326486165e-03, +-5.44323370130771460457e-03, +-5.46171690527704530721e-03, +-5.47706686999947442440e-03, +-5.48927715330848470243e-03, +-5.49834311103008545329e-03, +-5.50426189830165689398e-03, +-5.50703246986195688040e-03, +-5.50665557931325801155e-03, +-5.50313377735658394718e-03, +-5.49647140900193838936e-03, +-5.48667460975575324578e-03, +-5.47375130078852495386e-03, +-5.45771118308641025457e-03, +-5.43856573059035668105e-03, +-5.41632818232791902330e-03, +-5.39101353354278986507e-03, +-5.36263852582782342415e-03, +-5.33122163626806137848e-03, +-5.29678306560053737545e-03, +-5.25934472539848259925e-03, +-5.21893022428794508411e-03, +-5.17556485320526133559e-03, +-5.12927556970489868793e-03, +-5.08009098132678089954e-03, +-5.02804132803355476738e-03, +-4.97315846372916019885e-03, +-4.91547583686848584689e-03, +-4.85502847017122741990e-03, +-4.79185293945155309919e-03, +-4.72598735157650148841e-03, +-4.65747132156595338576e-03, +-4.58634594884884446570e-03, +-4.51265379268859113254e-03, +-4.43643884679333078136e-03, +-4.35774651312552125521e-03, +-4.27662357492689104710e-03, +-4.19311816897408994737e-03, +-4.10727975708242813713e-03, +-4.01915909687342119000e-03, +-3.92880821182439374240e-03, +-3.83628036061678823893e-03, +-3.74163000580234744730e-03, +-3.64491278180403876011e-03, +-3.54618546227291209921e-03, +-3.44550592681680360740e-03, +-3.34293312712312645080e-03, +-3.23852705249417973515e-03, +-3.13234869481537631791e-03, +-3.02446001297665325452e-03, +-2.91492389676846486157e-03, +-2.80380413027231812501e-03, +-2.69116535476798942814e-03, +-2.57707303117848647925e-03, +-2.46159340207523572031e-03, +-2.34479345326362147856e-03, +-2.22674087497457245249e-03, +-2.10750402268079263524e-03, +-1.98715187756321907606e-03, +-1.86575400664854376166e-03, +-1.74338052264242380010e-03, +-1.62010204348048895799e-03, +-1.49598965162051219212e-03, +-1.37111485310015116836e-03, +-1.24554953638238521431e-03, +-1.11936593101341890638e-03, +-9.92636566116329244550e-04, +-8.65434228744452519431e-04, +-7.37831922117954900481e-04, +-6.09902823768643741718e-04, +-4.81720243615482051399e-04, +-3.53357581995873909833e-04, +-2.24888287676710109473e-04, +-9.63858158682636068570e-05, + 3.20764137345539367911e-05, + 1.60425058858032064824e-04, + 2.88586896482438703439e-04, + 4.16488864574161247057e-04, + 5.44058103695506324778e-04, + 6.71221998467804803826e-04, + 7.97908218864774886926e-04, + 9.24044761311549125993e-04, + 1.04955998956755358967e-03, + 1.17438267536891884947e-03, + 1.29844203880782817391e-03, + 1.42166778842579637730e-03, + 1.54399016099864027675e-03, + 1.66533996098952152137e-03, + 1.78564859964935114707e-03, + 1.90484813374091114212e-03, + 2.02287130386640369786e-03, + 2.13965157237518523517e-03, + 2.25512316083227538563e-03, + 2.36922108702373405281e-03, + 2.48188120148188241104e-03, + 2.59304022350648980672e-03, + 2.70263577666357253729e-03, + 2.81060642374125237153e-03, + 2.91689170114364185876e-03, + 3.02143215270252868399e-03, + 3.12416936288921476272e-03, + 3.22504598940713581648e-03, + 3.32400579514743541032e-03, + 3.42099367948939334788e-03, + 3.51595570892898222001e-03, + 3.60883914701814589171e-03, + 3.69959248359746136620e-03, + 3.78816546330745101967e-03, + 3.87450911336219023379e-03, + 3.95857577056929390430e-03, + 4.04031910758215120211e-03, + 4.11969415836998739677e-03, + 4.19665734289097897003e-03, + 4.27116649095604910408e-03, + 4.34318086526945621589e-03, + 4.41266118363398390095e-03, + 4.47956964030860743664e-03, + 4.54386992650717726205e-03, + 4.60552725002660520714e-03, + 4.66450835399471325227e-03, + 4.72078153472709621807e-03, + 4.77431665868354501020e-03, + 4.82508517851539756732e-03, + 4.87306014819507884311e-03, + 4.91821623721916140887e-03, + 4.96052974387923596711e-03, + 4.99997860759186524976e-03, + 5.03654242028247437629e-03, + 5.07020243681679735892e-03, + 5.10094158447498870201e-03, + 5.12874447146327485519e-03, + 5.15359739445947657999e-03, + 5.17548834518845573410e-03, + 5.19440701602455999486e-03, + 5.21034480461868027695e-03, + 5.22329481754779667568e-03, + 5.23325187298585500772e-03, + 5.24021250239507709739e-03, + 5.24417495123738995610e-03, + 5.24513917870653937486e-03, + 5.24310685648145778648e-03, + 5.23808136650251530281e-03, + 5.23006779777264278752e-03, + 5.21907294218578940437e-03, + 5.20510528938584581676e-03, + 5.18817502065979652137e-03, + 5.16829400186912500670e-03, + 5.14547577542429773745e-03, + 5.11973555130774103661e-03, + 5.09109019715092269570e-03, + 5.05955822737205133249e-03, + 5.02515979138124391917e-03, + 4.98791666086073268160e-03, + 4.94785221612767823346e-03, + 4.90499143158841868773e-03, + 4.85936086029322127783e-03, + 4.81098861760061516368e-03, + 4.75990436396146916753e-03, + 4.70613928683348472365e-03, + 4.64972608173691136918e-03, + 4.59069893246278216276e-03, + 4.52909349044612261070e-03, + 4.46494685331585636212e-03, + 4.39829754263475290049e-03, + 4.32918548084257250735e-03, + 4.25765196741618740656e-03, + 4.18373965426069652218e-03, + 4.10749252034667798605e-03, + 4.02895584560788132256e-03, + 3.94817618411542111539e-03, + 3.86520133654418484789e-03, + 3.78008032194739225507e-03, + 3.69286334885604366693e-03, + 3.60360178572117573551e-03, + 3.51234813071479813271e-03, + 3.41915598090793311503e-03, + 3.32408000084427699555e-03, + 3.22717589052724015269e-03, + 3.12850035283901645525e-03, + 3.02811106041162708680e-03, + 2.92606662196800764927e-03, + 2.82242654815364601290e-03, + 2.71725121687837328777e-03, + 2.61060183818851918036e-03, + 2.50254041868949728133e-03, + 2.39312972554039504053e-03, + 2.28243325004017514127e-03, + 2.17051517082786447205e-03, + 2.05744031671671037328e-03, + 1.94327412918531700070e-03, + 1.82808262454552442576e-03, + 1.71193235581180232437e-03, + 1.59489037429026681535e-03, + 1.47702419091290675264e-03, + 1.35840173733748205247e-03, + 1.23909132683596356558e-03, + 1.11916161499407847656e-03, + 9.98681560244074617572e-04, + 8.77720384254470167330e-04, + 7.56347532198058721681e-04, + 6.34632632921996054504e-04, + 5.12645459042746680714e-04, + 3.90455886987906247536e-04, + 2.68133857008314943106e-04, + 1.45749333184361831153e-04, + 2.33722634472747536666e-05, +-9.89274603607503039181e-05, +-2.21080042364225074413e-04, +-3.43015822447986784560e-04, +-4.64665315944092405156e-04, +-5.85959253188382740186e-04, +-7.06828618925680403524e-04, +-8.27204691540118683922e-04, +-9.47019082088787164143e-04, +-1.06620377311637771697e-03, +-1.18469115722925682696e-03, +-1.30241407540605423285e-03, +-1.41930585502448507011e-03, +-1.53530034758192469001e-03, +-1.65033196608840252578e-03, +-1.76433572211173142659e-03, +-1.87724726245334949150e-03, +-1.98900290543319513067e-03, +-2.09953967676512883930e-03, +-2.20879534500175757350e-03, +-2.31670845652815794724e-03, +-2.42321837008570468985e-03, +-2.52826529080659367574e-03, +-2.63179030373909264226e-03, +-2.73373540684600496026e-03, +-2.83404354345699518308e-03, +-2.93265863415691175817e-03, +-3.02952560809236284833e-03, +-3.12459043367923185522e-03, +-3.21780014869336387223e-03, +-3.30910288972877109082e-03, +-3.39844792100587331576e-03, +-3.48578566251492739242e-03, +-3.57106771747796791425e-03, +-3.65424689911476559614e-03, +-3.73527725669808635320e-03, +-3.81411410088312429617e-03, +-3.89071402829827646050e-03, +-3.96503494538289445737e-03, +-4.03703609145932267727e-03, +-4.10667806102655782996e-03, +-4.17392282526347826316e-03, +-4.23873375272956244564e-03, +-4.30107562925237472268e-03, +-4.36091467699083017162e-03, +-4.41821857266369143885e-03, +-4.47295646493412607514e-03, +-4.52509899094063333669e-03, +-4.57461829196504320139e-03, +-4.62148802823035640547e-03, +-4.66568339281999474449e-03, +-4.70718112471093987764e-03, +-4.74595952091446966065e-03, +-4.78199844771800587628e-03, +-4.81527935102211632201e-03, +-4.84578526576791637770e-03, +-4.87350082444968323026e-03, +-4.89841226470876054538e-03, +-4.92050743600499964486e-03, +-4.93977580536274565870e-03, +-4.95620846218847079662e-03, +-4.96979812215835037303e-03, +-4.98053913017405553570e-03, +-4.98842746238571579237e-03, +-4.99346072728172954425e-03, +-4.99563816584549461736e-03, +-4.99496065077936236831e-03, +-4.99143068479745467825e-03, +-4.98505239798852691629e-03, +-4.97583154425139829319e-03, +-4.96377549680547796446e-03, +-4.94889324277973576688e-03, +-4.93119537688388714231e-03, +-4.91069409416598247342e-03, +-4.88740318186142198853e-03, +-4.86133801033847897516e-03, +-4.83251552314631609847e-03, +-4.80095422617195580206e-03, +-4.76667417591256168535e-03, +-4.72969696687120574191e-03, +-4.69004571808321647775e-03, +-4.64774505878175377138e-03, +-4.60282111321146884114e-03, +-4.55530148459956044787e-03, +-4.50521523829377698589e-03, +-4.45259288407801132742e-03, +-4.39746635767579701487e-03, +-4.33986900145311854660e-03, +-4.27983554433203870759e-03, +-4.21740208092733371431e-03, +-4.15260604991831393240e-03, +-4.08548621166932371396e-03, +-4.01608262511158123353e-03, +-3.94443662390054836098e-03, +-3.87059079186303405321e-03, +-3.79458893774812806160e-03, +-3.71647606929711776455e-03, +-3.63629836664845860345e-03, +-3.55410315509214558630e-03, +-3.46993887719018040405e-03, +-3.38385506427993278805e-03, +-3.29590230737648436782e-03, +-3.20613222749113312843e-03, +-3.11459744538398987032e-03, +-3.02135155076756461295e-03, +-2.92644907097984593655e-03, +-2.82994543914506487339e-03, +-2.73189696184072483912e-03, +-2.63236078628936763860e-03, +-2.53139486709509815843e-03, +-2.42905793254300297890e-03, +-2.32540945048183896743e-03, +-2.22050959380982104382e-03, +-2.11441920558280097714e-03, +-2.00719976376547218355e-03, +-1.89891334564696082597e-03, +-1.78962259193952521845e-03, +-1.67939067058208314070e-03, +-1.56828124026987358701e-03, +-1.45635841373061535042e-03, +-1.34368672076823521266e-03, +-1.23033107109642224179e-03, +-1.11635671698205856534e-03, +-1.00182921572098456581e-03, +-8.86814391967279472273e-04, +-7.71378299937657582568e-04, +-6.55587185513229354222e-04, +-5.39507448258485936346e-04, +-4.23205603382631467824e-04, +-3.06748243661661022710e-04, +-1.90202001344411987527e-04, +-7.36335100648440309687e-05, + 4.28906332185422347128e-05, + 1.59303906234412831922e-04, + 2.75539899338800254799e-04, + 3.91532353363562794085e-04, + 5.07215197350502681149e-04, + 6.22522586150107753653e-04, + 7.37388937863388033329e-04, + 8.51748971105957086540e-04, + 9.65537742072175879035e-04, + 1.07869068137969592591e-03, + 1.19114363067259008272e-03, + 1.30283287896230275983e-03, + 1.41369519868671613717e-03, + 1.52366788146634829677e-03, + 1.63268877353659261353e-03, + 1.74069631083787878384e-03, + 1.84762955374296743323e-03, + 1.95342822140135439005e-03, + 2.05803272568219793037e-03, + 2.16138420469669332441e-03, + 2.26342455588016133738e-03, + 2.36409646861654226466e-03, + 2.46334345638605676718e-03, + 2.56110988841841760721e-03, + 2.65734102083372766834e-03, + 2.75198302725402016780e-03, + 2.84498302886748277024e-03, + 2.93628912392977997961e-03, + 3.02585041668512657459e-03, + 3.11361704569121855099e-03, + 3.19954021153272608058e-03, + 3.28357220390771429100e-03, + 3.36566642807112174907e-03, + 3.44577743062223634807e-03, + 3.52386092462112724549e-03, + 3.59987381401977125581e-03, + 3.67377421739513865956e-03, + 3.74552149097084462886e-03, + 3.81507625091497340475e-03, + 3.88240039490136924424e-03, + 3.94745712292331966259e-03, + 4.01021095734782184045e-03, + 4.07062776219968818631e-03, + 4.12867476166478130500e-03, + 4.18432055780340594886e-03, + 4.23753514746243783312e-03, + 4.28828993837902447406e-03, + 4.33655776446637518384e-03, + 4.38231290027339768361e-03, + 4.42553107461083304608e-03, + 4.46618948333678180557e-03, + 4.50426680129448111373e-03, + 4.53974319339683820423e-03, + 4.57260032485135199665e-03, + 4.60282137052065234983e-03, + 4.63039102341378759620e-03, + 4.65529550230404237654e-03, + 4.67752255846963938685e-03, + 4.69706148155405248112e-03, + 4.71390310454339756668e-03, + 4.72803980785840502477e-03, + 4.73946552255972292089e-03, + 4.74817573266493424267e-03, + 4.75416747657694122031e-03, + 4.75743934762336718319e-03, + 4.75799149370748075683e-03, + 4.75582561607138833149e-03, + 4.75094496717288084647e-03, + 4.74335434767782487125e-03, + 4.73306010257048929979e-03, + 4.72007011638460489966e-03, + 4.70439380755864264283e-03, + 4.68604212191906475959e-03, + 4.66502752529606660309e-03, + 4.64136399527643843388e-03, + 4.61506701209918757806e-03, + 4.58615354869955273859e-03, + 4.55464205990770056726e-03, + 4.52055247080917176061e-03, + 4.48390616427393924603e-03, + 4.44472596766223859710e-03, + 4.40303613871486330955e-03, + 4.35886235063746938639e-03, + 4.31223167638676834618e-03, + 4.26317257216925812185e-03, + 4.21171486016196257307e-03, + 4.15788971046581433411e-03, + 4.10172962230226281072e-03, + 4.04326840446501793724e-03, + 3.98254115503794432068e-03, + 3.91958424039167124125e-03, + 3.85443527347131180763e-03, + 3.78713309138849164512e-03, + 3.71771773232995421388e-03, + 3.64623041179842725945e-03, + 3.57271349819778243767e-03, + 3.49721048777782827360e-03, + 3.41976597895377260397e-03, + 3.34042564601502072266e-03, + 3.25923621223874176306e-03, + 3.17624542242462160752e-03, + 3.09150201486607309476e-03, + 3.00505569277494284652e-03, + 2.91695709517621800527e-03, + 2.82725776728985633834e-03, + 2.73601013041636529841e-03, + 2.64326745134584257038e-03, + 2.54908381130463648420e-03, + 2.45351407446147209979e-03, + 2.35661385600897553202e-03, + 2.25843948984021103410e-03, + 2.15904799583798876969e-03, + 2.05849704679780722699e-03, + 1.95684493500119767798e-03, + 1.85415053846056882350e-03, + 1.75047328685429747983e-03, + 1.64587312717267382142e-03, + 1.54041048909200266152e-03, + 1.43414625010112694974e-03, + 1.32714170039615556723e-03, + 1.21945850756623999298e-03, + 1.11115868108982397341e-03, + 1.00230453666194673813e-03, + 8.92958660373076220512e-04, + 7.83183872760047513316e-04, + 6.73043192749742938061e-04, + 5.62599801516196619360e-04, + 4.51917006271797402298e-04, + 3.41058204013367112766e-04, + 2.30086845243956402514e-04, + 1.19066397690317975016e-04, + 8.06031003876342309552e-06, +-1.02868024292534745090e-04, +-2.13655303322282262481e-04, +-3.24238352595229727994e-04, +-4.34554161172920089696e-04, +-5.44539917503692838356e-04, +-6.54133045151543304589e-04, +-7.63271238365370997651e-04, +-8.71892497466585482749e-04, +-9.79935164035776202357e-04, +-1.08733795587835245164e-03, +-1.19404000174937055881e-03, +-1.29998087581786859156e-03, +-1.40510063185121983863e-03, +-1.50933983710020702684e-03, +-1.61263960586564250761e-03, +-1.71494163272752683097e-03, +-1.81618822541869504202e-03, +-1.91632233732264294253e-03, +-2.01528759957979742429e-03, +-2.11302835278164621163e-03, +-2.20948967823741222391e-03, +-2.30461742879315041599e-03, +-2.39835825918845125734e-03, +-2.49065965593134232975e-03, +-2.58146996667703255632e-03, +-2.67073842909245186619e-03, +-2.75841519919107873438e-03, +-2.84445137912224619431e-03, +-2.92879904439931598031e-03, +-3.01141127055178960126e-03, +-3.09224215918633147174e-03, +-3.17124686344243166339e-03, +-3.24838161282851346778e-03, +-3.32360373742473678635e-03, +-3.39687169143964044424e-03, +-3.46814507610627249454e-03, +-3.53738466190720588292e-03, +-3.60455241011424683262e-03, +-3.66961149363298272039e-03, +-3.73252631713888970155e-03, +-3.79326253649527652539e-03, +-3.85178707744242114497e-03, +-3.90806815354677143659e-03, +-3.96207528340193453065e-03, +-4.01377930707108587782e-03, +-4.06315240176249869997e-03, +-4.11016809672954883115e-03, +-4.15480128738748670514e-03, +-4.19702824863931681781e-03, +-4.23682664740382061708e-03, +-4.27417555433919245378e-03, +-4.30905545475612165168e-03, +-4.34144825871471493756e-03, +-4.37133731030028924863e-03, +-4.39870739607276222544e-03, +-4.42354475268612757494e-03, +-4.44583707367407054284e-03, +-4.46557351539804588125e-03, +-4.48274470215558658998e-03, +-4.49734273044633849070e-03, +-4.50936117239380054866e-03, +-4.51879507832192439665e-03, +-4.52564097848520176248e-03, +-4.52989688395227449447e-03, +-4.53156228664297524439e-03, +-4.53063815851947795238e-03, +-4.52712694993263019272e-03, +-4.52103258712507720396e-03, +-4.51236046889318294373e-03, +-4.50111746241027566029e-03, +-4.48731189821427022685e-03, +-4.47095356436308811326e-03, +-4.45205369976202098431e-03, +-4.43062498666702171690e-03, +-4.40668154236938374585e-03, +-4.38023891006674489373e-03, +-4.35131404892644905319e-03, +-4.31992532334727567106e-03, +-4.28609249142686190431e-03, +-4.24983669264115699465e-03, +-4.21118043474420344213e-03, +-4.17014757989600526322e-03, +-4.12676333002717343063e-03, +-4.08105421144885384399e-03, +-4.03304805871769478376e-03, +-3.98277399776586060048e-03, +-3.93026242830538889012e-03, +-3.87554500551830520202e-03, +-3.81865462104316469652e-03, +-3.75962538326934676142e-03, +-3.69849259695105700083e-03, +-3.63529274215302917322e-03, +-3.57006345254048127261e-03, +-3.50284349302629844855e-03, +-3.43367273678861842368e-03, +-3.36259214167245173294e-03, +-3.28964372598887933724e-03, +-3.21487054372729570695e-03, +-3.13831665919360848840e-03, +-3.06002712109050643147e-03, +-2.98004793605501560813e-03, +-2.89842604166773779029e-03, +-2.81520927895077040931e-03, +-2.73044636437046704669e-03, +-2.64418686136011710577e-03, +-2.55648115138037068314e-03, +-2.46738040453385034864e-03, +-2.37693654975105290658e-03, +-2.28520224456495602700e-03, +-2.19223084449187820971e-03, +-2.09807637203635911904e-03, +-2.00279348533807409136e-03, +-1.90643744647894558715e-03, +-1.80906408946890644336e-03, +-1.71072978792818604712e-03, +-1.61149142248648530144e-03, +-1.51140634791550681169e-03, +-1.41053236001619538946e-03, +-1.30892766227735197690e-03, +-1.20665083232744858345e-03, +-1.10376078819640946992e-03, +-1.00031675440937460608e-03, +-8.96378227929317322395e-04, +-7.92004943969952133684e-04, +-6.87256841697829728294e-04, +-5.82194029843374478810e-04, +-4.76876752240620047432e-04, +-3.71365353315354857280e-04, +-2.65720243541443139953e-04, +-1.60001864885065504330e-04, +-5.42706562566359684624e-05, + 5.14129810098762333082e-05, + 1.56988717630401143676e-04, + 2.62396330778088919793e-04, + 3.67575738403138686013e-04, + 4.72467033447351674163e-04, + 5.77010517933939639720e-04, + 6.81146736911458490320e-04, + 7.84816512234211456633e-04, + 8.87960976159937634238e-04, + 9.90521604744005372892e-04, + 1.09244025101365264951e-03, + 1.19365917790164059384e-03, + 1.29412109092141174894e-03, + 1.39376917056518003293e-03, + 1.49254710440663968495e-03, + 1.59039911889015199951e-03, + 1.68727001078853872801e-03, + 1.78310517831170383361e-03, + 1.87785065184860474295e-03, + 1.97145312432514584547e-03, + 2.06385998116165444646e-03, + 2.15501932981150296637e-03, + 2.24488002886593339402e-03, + 2.33339171670872728634e-03, + 2.42050483970316981583e-03, + 2.50617067989698880798e-03, + 2.59034138222976727944e-03, + 2.67296998122616528970e-03, + 2.75401042716228762475e-03, + 2.83341761168887876915e-03, + 2.91114739289797088209e-03, + 2.98715661981875787653e-03, + 3.06140315632929442893e-03, + 3.13384590447068249811e-03, + 3.20444482715097822209e-03, + 3.27316097022614747175e-03, + 3.33995648394608485657e-03, + 3.40479464375383631194e-03, + 3.46763987042658736876e-03, + 3.52845774954753865424e-03, + 3.58721505029781922991e-03, + 3.64387974355847871905e-03, + 3.69842101931248078139e-03, + 3.75080930333746573671e-03, + 3.80101627318009003750e-03, + 3.84901487340377030863e-03, + 3.89477933010077409515e-03, + 3.93828516466203197577e-03, + 3.97950920679663710383e-03, + 4.01842960679405468427e-03, + 4.05502584702343085721e-03, + 4.08927875266308724772e-03, + 4.12117050165479448243e-03, + 4.15068463387839852591e-03, + 4.17780605954134933583e-03, + 4.20252106677934406803e-03, + 4.22481732846414353988e-03, + 4.24468390821542990859e-03, + 4.26211126561366546173e-03, + 4.27709126061177457440e-03, + 4.28961715714353680751e-03, + 4.29968362592737362443e-03, + 4.30728674646440722745e-03, + 4.31242400823038558866e-03, + 4.31509431106120045635e-03, + 4.31529796473259855127e-03, + 4.31303668773473300457e-03, + 4.30831360524300700093e-03, + 4.30113324628681858303e-03, + 4.29150154011852507513e-03, + 4.27942581178534283554e-03, + 4.26491477690706718290e-03, + 4.24797853566351822641e-03, + 4.22862856599543705111e-03, + 4.20687771602348218464e-03, + 4.18274019569020352044e-03, + 4.15623156763024730748e-03, + 4.12736873727475445106e-03, + 4.09616994219598982985e-03, + 4.06265474069904698046e-03, + 4.02684399966749852207e-03, + 3.98875988167053836808e-03, + 3.94842583133988254962e-03, + 3.90586656102404668894e-03, + 3.86110803572960138361e-03, + 3.81417745735749278216e-03, + 3.76510324824506480840e-03, + 3.71391503402302824294e-03, + 3.66064362579748142634e-03, + 3.60532100166869413568e-03, + 3.54798028759637515753e-03, + 3.48865573762383116702e-03, + 3.42738271347229261563e-03, + 3.36419766351780209421e-03, + 3.29913810116290494648e-03, + 3.23224258261611266038e-03, + 3.16355068409222362283e-03, + 3.09310297844691411973e-03, + 3.02094101125942446004e-03, + 2.94710727637745740354e-03, + 2.87164519093818793039e-03, + 2.79459906988119548971e-03, + 2.71601409996710457459e-03, + 2.63593631331708773413e-03, + 2.55441256048993380751e-03, + 2.47149048311133935976e-03, + 2.38721848607121494082e-03, + 2.30164570930673547527e-03, + 2.21482199918544885378e-03, + 2.12679787950668637911e-03, + 2.03762452213744876123e-03, + 1.94735371729998175613e-03, + 1.85603784352819439415e-03, + 1.76372983731039952200e-03, + 1.67048316243592642229e-03, + 1.57635177906330727939e-03, + 1.48139011252795978722e-03, + 1.38565302190747641209e-03, + 1.28919576836194387306e-03, + 1.19207398326919835826e-03, + 1.09434363617172251450e-03, + 9.96061002553666387932e-04, + 8.97282631468103723978e-04, + 7.98065313031665838489e-04, + 6.98466045805186700954e-04, + 5.98542004080726075879e-04, + 4.98350505091392156909e-04, + 3.97948976164492736543e-04, + 2.97394921836138706028e-04, + 1.96745890946085639616e-04, + 9.60594437324946328737e-05, +-4.60688105713253110850e-06, +-1.05195599015863548308e-04, +-2.05649312873547269803e-04, +-3.05910745218120614427e-04, +-4.05922771124209050102e-04, +-5.05628450670332911694e-04, +-6.04971061326233742333e-04, +-7.03894130191895397823e-04, +-8.02341466069983314836e-04, +-9.00257191353478103575e-04, +-9.97585773710441469850e-04, +-1.09427205754784526159e-03, +-1.19026129523734734011e-03, +-1.28549917808361388767e-03, +-1.37993186702002005456e-03, +-1.47350602301274868564e-03, +-1.56616883715618676436e-03, +-1.65786806044407471726e-03, +-1.74855203319811505248e-03, +-1.83816971413744510017e-03, +-1.92667070907424605244e-03, +-2.01400529921775661019e-03, +-2.10012446907152346490e-03, +-2.18497993390813667614e-03, +-2.26852416680606251351e-03, +-2.35071042523344675770e-03, +-2.43149277716405484012e-03, +-2.51082612671079579217e-03, +-2.58866623926247820323e-03, +-2.66496976610981501504e-03, +-2.73969426854743253880e-03, +-2.81279824143723829188e-03, +-2.88424113622183812475e-03, +-2.95398338337400341927e-03, +-3.02198641426984970434e-03, +-3.08821268247472897547e-03, +-3.15262568442887820136e-03, +-3.21518997952162247436e-03, +-3.27587120954407487808e-03, +-3.33463611750868180184e-03, +-3.39145256582575700330e-03, +-3.44628955382705274429e-03, +-3.49911723462676847382e-03, +-3.54990693131099601179e-03, +-3.59863115244673462817e-03, +-3.64526360690210944615e-03, +-3.68977921797001727142e-03, +-3.73215413678737884667e-03, +-3.77236575504307771953e-03, +-3.81039271696794737063e-03, +-3.84621493059991411204e-03, +-3.87981357831906903399e-03, +-3.91117112664715865095e-03, +-3.94027133530578613924e-03, +-3.96709926552936235911e-03, +-3.99164128762850064364e-03, +-4.01388508779965472173e-03, +-4.03381967417829664230e-03, +-4.05143538213234219447e-03, +-4.06672387879341342559e-03, +-4.07967816682406215351e-03, +-4.09029258741918071846e-03, +-4.09856282254066582593e-03, +-4.10448589638437531107e-03, +-4.10806017607942119269e-03, +-4.10928537161966977997e-03, +-4.10816253502826328470e-03, +-4.10469405875612397550e-03, +-4.09888367331595702275e-03, +-4.09073644415366196453e-03, +-4.08025876775947385355e-03, +-4.06745836702175275756e-03, +-4.05234428582641227623e-03, +-4.03492688290585550803e-03, +-4.01521782494141353526e-03, +-3.99323007892370650251e-03, +-3.96897790377597620148e-03, +-3.94247684124562208785e-03, +-3.91374370606971909436e-03, +-3.88279657542071584067e-03, +-3.84965477763883840226e-03, +-3.81433888025815110920e-03, +-3.77687067733369942479e-03, +-3.73727317607745312261e-03, +-3.69557058281119732435e-03, +-3.65178828824497432592e-03, +-3.60595285208962579651e-03, +-3.55809198701380119054e-03, +-3.50823454195329457322e-03, +-3.45641048478445914172e-03, +-3.40265088437114587849e-03, +-3.34698789199610203388e-03, +-3.28945472218769140865e-03, +-3.23008563295407733276e-03, +-3.16891590543550479703e-03, +-3.10598182298758417746e-03, +-3.04132064970752489380e-03, +-2.97497060841662606598e-03, +-2.90697085811037359698e-03, +-2.83736147089205630045e-03, +-2.76618340840093044491e-03, +-2.69347849775016792359e-03, +-2.61928940698839384654e-03, +-2.54365962009905433386e-03, +-2.46663341155241517058e-03, +-2.38825582042492129409e-03, +-2.30857262410112847040e-03, +-2.22763031157348617012e-03, +-2.14547605635553037887e-03, +-2.06215768902437597554e-03, +-1.97772366940784189923e-03, +-1.89222305843385276043e-03, +-1.80570548965651076455e-03, +-1.71822114047665615993e-03, +-1.62982070307368252966e-03, +-1.54055535506404249653e-03, +-1.45047672990482020075e-03, +-1.35963688705958486193e-03, +-1.26808828194214899543e-03, +-1.17588373565714085327e-03, +-1.08307640455412444898e-03, +-9.89719749612947034476e-04, +-8.95867505677916593256e-04, +-8.01573650558492470548e-04, +-7.06892374014246962534e-04, +-6.11878046641902415860e-04, +-5.16585188682274517973e-04, +-4.21068438765152331434e-04, +-3.25382522609281570492e-04, +-2.29582221697126570396e-04, +-1.33722341940000448565e-04, +-3.78576823531001234436e-05, + 5.79569962416860487149e-05, + 1.53667002468926312949e-04, + 2.49217745588539837595e-04, + 3.44554766605055051796e-04, + 4.39623769277135254159e-04, + 5.34370651012117960608e-04, + 6.28741533626295430459e-04, + 7.22682793954151111819e-04, + 8.16141094289066942359e-04, + 9.09063412638226858026e-04, + 1.00139707277458692852e-03, + 1.09308977406887886975e-03, + 1.18408962108478813154e-03, + 1.27434515292056300961e-03, + 1.36380537228036891051e-03, + 1.45241977425964634632e-03, + 1.54013837482673316033e-03, + 1.62691173898619058195e-03, + 1.71269100860800766242e-03, + 1.79742792990551444876e-03, + 1.88107488054797562099e-03, + 1.96358489639263892462e-03, + 2.04491169781978020942e-03, + 2.12500971565807118477e-03, + 2.20383411668426208024e-03, + 2.28134082868343369618e-03, + 2.35748656505591286728e-03, + 2.43222884895690980023e-03, + 2.50552603695564177905e-03, + 2.57733734220062273013e-03, + 2.64762285707839271562e-03, + 2.71634357535300218975e-03, + 2.78346141377399823244e-03, + 2.84893923314137337971e-03, + 2.91274085881481313576e-03, + 2.97483110065697737429e-03, + 3.03517577239990551941e-03, + 3.09374171042274635074e-03, + 3.15049679193164094970e-03, + 3.20540995253164491541e-03, + 3.25845120318029885659e-03, + 3.30959164651485658951e-03, + 3.35880349254337635945e-03, + 3.40606007369155918199e-03, + 3.45133585919722533919e-03, + 3.49460646884427843240e-03, + 3.53584868602997270254e-03, + 3.57504047015665300802e-03, + 3.61216096834317094977e-03, + 3.64719052644881403663e-03, + 3.68011069940423060295e-03, + 3.71090426084389433947e-03, + 3.73955521203543422501e-03, + 3.76604879010044787946e-03, + 3.79037147552388660465e-03, + 3.81251099894702218107e-03, + 3.83245634724140764663e-03, + 3.85019776886061934965e-03, + 3.86572677846735036217e-03, + 3.87903616083361702654e-03, + 3.89011997401263057497e-03, + 3.89897355178084716390e-03, + 3.90559350534943564709e-03, + 3.90997772434472940645e-03, + 3.91212537705771124658e-03, + 3.91203690996272997887e-03, + 3.90971404650655458141e-03, + 3.90515978516874822171e-03, + 3.89837839679519444422e-03, + 3.88937542120674139765e-03, + 3.87815766308545256322e-03, + 3.86473318714143513133e-03, + 3.84911131256343097898e-03, + 3.83130260675695194506e-03, + 3.81131887837403860592e-03, + 3.78917316963920574116e-03, + 3.76487974797630508064e-03, + 3.73845409694197614373e-03, + 3.70991290647096740377e-03, + 3.67927406243961268098e-03, + 3.64655663555414144908e-03, + 3.61178086957013007655e-03, + 3.57496816885076278136e-03, + 3.53614108527169294233e-03, + 3.49532330447974940585e-03, + 3.45253963151448796734e-03, + 3.40781597580096327210e-03, + 3.36117933552288828195e-03, + 3.31265778138546554757e-03, + 3.26228043977774525078e-03, + 3.21007747534444651261e-03, + 3.15608007297777824404e-03, + 3.10032041923983094425e-03, + 3.04283168322677004605e-03, + 2.98364799688597944274e-03, + 2.92280443479772233245e-03, + 2.86033699343400974954e-03, + 2.79628256990564587336e-03, + 2.73067894021140553096e-03, + 2.66356473700054630430e-03, + 2.59497942686348799513e-03, + 2.52496328716229770719e-03, + 2.45355738241618799925e-03, + 2.38080354025428783324e-03, + 2.30674432695083695896e-03, + 2.23142302255665983882e-03, + 2.15488359564151290768e-03, + 2.07717067766201215345e-03, + 1.99832953697007134966e-03, + 1.91840605247694541945e-03, + 1.83744668698823622119e-03, + 1.75549846022528331473e-03, + 1.67260892154870227308e-03, + 1.58882612239931203697e-03, + 1.50419858847373826526e-03, + 1.41877529164945908116e-03, + 1.33260562167547579916e-03, + 1.24573935764636829771e-03, + 1.15822663927488351057e-03, + 1.07011793797963318704e-03, + 9.81464027805968499546e-04, + 8.92315956194724064533e-04, + 8.02725014617197869804e-04, + 7.12742709092594579033e-04, + 6.22420730605006554577e-04, + 5.31810925436872606979e-04, + 4.40965265435949780974e-04, + 3.49935818232817224746e-04, + 2.58774717425973744146e-04, + 1.67534132751585059917e-04, + 7.62662402549235993827e-05, +-1.49768075193361299620e-05, +-1.06142911301720894524e-04, +-1.97180054818197052647e-04, +-2.88036334442900109586e-04, +-3.78659988762671830508e-04, +-4.68999428038859239934e-04, +-5.59003263548750505343e-04, +-6.48620336790735633678e-04, +-7.37799748534993023869e-04, +-8.26490887705368343190e-04, +-9.14643460074474100654e-04, +-1.00220751675647416767e-03, +-1.08913348248064457101e-03, +-1.17537218363183721542e-03, +-1.26087487603843595614e-03, +-1.34559327249569936173e-03, +-1.42947957000680455318e-03, +-1.51248647672699333688e-03, +-1.59456723859538701364e-03, +-1.67567566564024317960e-03, +-1.75576615794077609337e-03, +-1.83479373123439024051e-03, +-1.91271404215155051663e-03, +-1.98948341306622901448e-03, +-2.06505885654718109729e-03, +-2.13939809939708890443e-03, +-2.21245960626475536570e-03, +-2.28420260281900038002e-03, +-2.35458709846996828985e-03, +-2.42357390862588594968e-03, +-2.49112467647214820554e-03, +-2.55720189426249895279e-03, +-2.62176892410749236631e-03, +-2.68479001825172808662e-03, +-2.74623033882684950205e-03, +-2.80605597707006462066e-03, +-2.86423397199746590513e-03, +-2.92073232852189295164e-03, +-2.97552003500548174764e-03, +-3.02856708023718085299e-03, +-3.07984446982606822549e-03, +-3.12932424200147371596e-03, +-3.17697948281127698356e-03, +-3.22278434071057110627e-03, +-3.26671404053182311278e-03, +-3.30874489683027862494e-03, +-3.34885432659656149396e-03, +-3.38702086132979581640e-03, +-3.42322415846545938939e-03, +-3.45744501215092866347e-03, +-3.48966536336403100604e-03, +-3.51986830936835840347e-03, +-3.54803811250142776476e-03, +-3.57416020829039995585e-03, +-3.59822121289160232194e-03, +-3.62020892984994159536e-03, +-3.64011235617500532313e-03, +-3.65792168773078438943e-03, +-3.67362832393644143589e-03, +-3.68722487177608991560e-03, +-3.69870514911562918089e-03, +-3.70806418732541956396e-03, +-3.71529823320771324796e-03, +-3.72040475022829665933e-03, +-3.72338241905218391911e-03, +-3.72423113738358209715e-03, +-3.72295201911065475747e-03, +-3.71954739275624172296e-03, +-3.71402079923576107501e-03, +-3.70637698892428832029e-03, +-3.69662191803482587105e-03, +-3.68476274431051497790e-03, +-3.67080782203360296914e-03, +-3.65476669635465692756e-03, +-3.63665009694570488807e-03, +-3.61646993098150822468e-03, +-3.59423927545334974051e-03, +-3.56997236882036642416e-03, +-3.54368460200365923210e-03, +-3.51539250872874575737e-03, +-3.48511375522234101432e-03, +-3.45286712927017321387e-03, +-3.41867252864195810338e-03, +-3.38255094889135894329e-03, +-3.34452447053745815023e-03, +-3.30461624563659203332e-03, +-3.26285048375162325951e-03, +-3.21925243732817121037e-03, +-3.17384838648557959795e-03, +-3.12666562323245288482e-03, +-3.07773243511595077232e-03, +-3.02707808831462633209e-03, +-2.97473281018491211153e-03, +-2.92072777127162135427e-03, +-2.86509506679312160940e-03, +-2.80786769761221183597e-03, +-2.74907955070388763247e-03, +-2.68876537913161550372e-03, +-2.62696078154390838186e-03, +-2.56370218120280770127e-03, +-2.49902680455817757105e-03, +-2.43297265937776879124e-03, +-2.36557851244843493979e-03, +-2.29688386686014139187e-03, +-2.22692893888647245465e-03, +-2.15575463447475546355e-03, +-2.08340252536062418495e-03, +-2.00991482481939400667e-03, +-1.93533436306957584878e-03, +-1.85970456234225522789e-03, +-1.78306941163151812420e-03, +-1.70547344113878836074e-03, +-1.62696169642893568967e-03, +-1.54757971231007083503e-03, +-1.46737348645403320284e-03, +-1.38638945277216006635e-03, +-1.30467445456199375615e-03, +-1.22227571743970366350e-03, +-1.13924082207588254177e-03, +-1.05561767674710021286e-03, +-9.71454489722374482305e-04, +-8.86799741498446592036e-04, +-8.01702156900612784851e-04, +-7.16210677064451489704e-04, +-6.30374431316047391209e-04, +-5.44242708964845500752e-04, +-4.57864931026830763918e-04, +-3.71290621893513930751e-04, +-2.84569380963795102567e-04, +-1.97750854252763154373e-04, +-1.10884705997269506742e-04, +-2.40205902709113495357e-05, + 6.27918773732192452876e-05, + 1.49503148216553689897e-04, + 2.36063768629587555480e-04, + 3.22424408250847381943e-04, + 4.08535888074242200738e-04, + 4.94349208428819172911e-04, + 5.79815576835024100270e-04, + 6.64886435721643610786e-04, + 7.49513489987693693958e-04, + 8.33648734393532949913e-04, + 9.17244480766279870337e-04, + 1.00025338500262374157e-03, + 1.08262847385585773974e-03, + 1.16432317148991437694e-03, + 1.24529132578744816673e-03, + 1.32548723439501444157e-03, + 1.40486567049264701387e-03, + 1.48338190827135567480e-03, + 1.56099174810615912330e-03, + 1.63765154140913405528e-03, + 1.71331821514903869137e-03, + 1.78794929602366808354e-03, + 1.86150293427143464359e-03, + 1.93393792710878204520e-03, + 2.00521374178037978947e-03, + 2.07529053820916823889e-03, + 2.14412919123365373897e-03, + 2.21169131241997444365e-03, + 2.27793927143706215546e-03, + 2.34283621698181060769e-03, + 2.40634609724435857836e-03, + 2.46843367990040021484e-03, + 2.52906457162119062410e-03, + 2.58820523708867778964e-03, + 2.64582301750689681194e-03, + 2.70188614859793313494e-03, + 2.75636377807397716516e-03, + 2.80922598257490408261e-03, + 2.86044378406247841104e-03, + 2.90998916566214413729e-03, + 2.95783508694383865181e-03, + 3.00395549863343705108e-03, + 3.04832535674689130908e-03, + 3.09092063613944411163e-03, + 3.13171834346257340134e-03, + 3.17069652952171746399e-03, + 3.20783430102820335192e-03, + 3.24311183173923859094e-03, + 3.27651037297958976080e-03, + 3.30801226353996018562e-03, + 3.33760093894684218077e-03, + 3.36526094009848182609e-03, + 3.39097792126302451446e-03, + 3.41473865743472130771e-03, + 3.43653105104400240569e-03, + 3.45634413801872283564e-03, + 3.47416809319318680913e-03, + 3.48999423506242021850e-03, + 3.50381502987956103268e-03, + 3.51562409509444421737e-03, + 3.52541620213190926708e-03, + 3.53318727850884806152e-03, + 3.53893440928911917967e-03, + 3.54265583787610402466e-03, + 3.54435096614294726028e-03, + 3.54402035390087273917e-03, + 3.54166571770637159458e-03, + 3.53728992900847680203e-03, + 3.53089701163765857378e-03, + 3.52249213863829475218e-03, + 3.51208162844697177607e-03, + 3.49967294041929766896e-03, + 3.48527466970839335317e-03, + 3.46889654149831836577e-03, + 3.45054940459623565863e-03, + 3.43024522438756772347e-03, + 3.40799707515864217997e-03, + 3.38381913179134578146e-03, + 3.35772666083566971931e-03, + 3.32973601096507977951e-03, + 3.29986460282096893265e-03, + 3.26813091825231636506e-03, + 3.23455448895733962272e-03, + 3.19915588453362383092e-03, + 3.16195669994496055336e-03, + 3.12297954241108925363e-03, + 3.08224801772958309845e-03, + 3.03978671603739392451e-03, + 2.99562119702084100892e-03, + 2.94977797458266955549e-03, + 2.90228450097598702356e-03, + 2.85316915041365507313e-03, + 2.80246120216355544194e-03, + 2.75019082313949451285e-03, + 2.69638904999837305393e-03, + 2.64108777075355415781e-03, + 2.58431970591592842859e-03, + 2.52611838917400372689e-03, + 2.46651814762340482884e-03, + 2.40555408155839313758e-03, + 2.34326204383680314694e-03, + 2.27967861883065755005e-03, + 2.21484110097475844769e-03, + 2.14878747292579150296e-03, + 2.08155638334478173060e-03, + 2.01318712431581723840e-03, + 1.94371960841423544429e-03, + 1.87319434543773495790e-03, + 1.80165241881343461162e-03, + 1.72913546169589605814e-03, + 1.65568563276817190023e-03, + 1.58134559176179804313e-03, + 1.50615847470803379538e-03, + 1.43016786893666826216e-03, + 1.35341778783496088576e-03, + 1.27595264538327276757e-03, + 1.19781723048013573688e-03, + 1.11905668107298707052e-03, + 1.03971645810893640986e-03, + 9.59842319320685158357e-04, + 8.79480292862680045757e-04, + 7.98676650812700722817e-04, + 7.17477882554103476610e-04, + 6.35930668054020351715e-04, + 5.54081851052870642121e-04, + 4.71978412180657619888e-04, + 3.89667442014872736876e-04, + 3.07196114096923401319e-04, + 2.24611657920471623987e-04, + 1.41961331909191799819e-04, + 5.92923963973368171269e-05, +-2.33479133692958273222e-05, +-1.05912414198647058736e-04, +-1.88354001866488713528e-04, +-2.70625677966048025676e-04, +-3.52680576676401690700e-04, +-4.34471991434995103831e-04, +-5.15953401499023248805e-04, +-5.97078498380584432939e-04, +-6.77801212140594598610e-04, +-7.58075737526550121580e-04, +-8.37856559939326346609e-04, +-9.17098481214296688997e-04, +-9.95756645202195691743e-04, +-1.07378656313515804741e-03, +-1.15114413876416595180e-03, +-1.22778569325242541826e-03, +-1.30366798981191894975e-03, +-1.37874825806924973352e-03, +-1.45298421814578576985e-03, +-1.52633410443975465511e-03, +-1.59875668909689456869e-03, +-1.67021130515527735372e-03, +-1.74065786935308415041e-03, +-1.81005690458521380053e-03, +-1.87836956199671648374e-03, +-1.94555764270060572822e-03, +-2.01158361910792719829e-03, +-2.07641065585818058656e-03, +-2.14000263033844919519e-03, +-2.20232415277983682028e-03, +-2.26334058592000822788e-03, +-2.32301806422092246146e-03, +-2.38132351263152302820e-03, +-2.43822466488363524817e-03, +-2.49369008131333563458e-03, +-2.54768916619557087705e-03, +-2.60019218458394001450e-03, +-2.65117027864584945199e-03, +-2.70059548348453026811e-03, +-2.74844074243833736901e-03, +-2.79467992185021508675e-03, +-2.83928782529839322801e-03, +-2.88224020728095487592e-03, +-2.92351378634650351657e-03, +-2.96308625766492647960e-03, +-3.00093630502965393395e-03, +-3.03704361228680124254e-03, +-3.07138887418407363628e-03, +-3.10395380663392372531e-03, +-3.13472115638562150164e-03, +-3.16367471010103352980e-03, +-3.19079930282948481812e-03, +-3.21608082587721087059e-03, +-3.23950623406747337252e-03, +-3.26106355238757342555e-03, +-3.28074188201942212179e-03, +-3.29853140575076496377e-03, +-3.31442339276444199875e-03, +-3.32841020280317178778e-03, +-3.34048528970836431165e-03, +-3.35064320433112964454e-03, +-3.35887959681426418596e-03, +-3.36519121824467148246e-03, +-3.36957592167543267675e-03, +-3.37203266251754653349e-03, +-3.37256149830169856332e-03, +-3.37116358781047254292e-03, +-3.36784118958214327699e-03, +-3.36259765978729266434e-03, +-3.35543744947994172431e-03, +-3.34636610122527418040e-03, +-3.33539024510636330015e-03, +-3.32251759411259645072e-03, +-3.30775693891291596924e-03, +-3.29111814201739957125e-03, +-3.27261213133083796178e-03, +-3.25225089310266250384e-03, +-3.23004746427743008250e-03, +-3.20601592425105112044e-03, +-3.18017138603743105413e-03, +-3.15252998685158682818e-03, +-3.12310887811450286003e-03, +-3.09192621488647281444e-03, +-3.05900114473474978721e-03, +-3.02435379604281111970e-03, +-2.98800526576807482307e-03, +-2.94997760665555814816e-03, +-2.91029381391519391745e-03, +-2.86897781137080603100e-03, +-2.82605443708909163589e-03, +-2.78154942849715867623e-03, +-2.73548940699755568570e-03, +-2.68790186208995533074e-03, +-2.63881513500899191754e-03, +-2.58825840188760128782e-03, +-2.53626165645667129775e-03, +-2.48285569229048054193e-03, +-2.42807208460824822810e-03, +-2.37194317164358134745e-03, +-2.31450203559181158161e-03, +-2.25578248314654231793e-03, +-2.19581902563767547218e-03, +-2.13464685878131952071e-03, +-2.07230184205435888356e-03, +-2.00882047770541138920e-03, +-1.94423988941450141647e-03, +-1.87859780061385762441e-03, +-1.81193251248255946667e-03, +-1.74428288162779420063e-03, +-1.67568829746571096480e-03, +-1.60618865931505343768e-03, +-1.53582435321696704651e-03, +-1.46463622849387254017e-03, +-1.39266557406221786267e-03, +-1.31995409451166924308e-03, +-1.24654388596452171158e-03, +-1.17247741173051502755e-03, +-1.09779747777003140220e-03, +-1.02254720797977159512e-03, +-9.46770019316456627398e-04, +-8.70509596771090981941e-04, +-7.93809868209522859206e-04, +-7.16714979093283142790e-04, +-6.39269267095267379464e-04, +-5.61517236624901622949e-04, +-4.83503533277372383840e-04, +-4.05272918221601325187e-04, +-3.26870242541634718064e-04, +-2.48340421546139789206e-04, +-1.69728409060813500292e-04, +-9.10791717177389864102e-05, +-1.24376632583528602298e-05, + 6.61512011385834202077e-05, + 1.44642570486082041627e-04, + 2.22991683562456983764e-04, + 3.01153894413956873654e-04, + 3.79084697772648165047e-04, + 4.56739754373683643027e-04, + 5.34074916159440896482e-04, + 6.11046251354811493887e-04, + 6.87610069400060091790e-04, + 7.63722945726494719700e-04, + 8.39341746362165606193e-04, + 9.14423652352394037562e-04, + 9.88926183981333204245e-04, + 1.06280722478213824657e-03, + 1.13602504532090125416e-03, + 1.20853832674150526647e-03, + 1.28030618405801659317e-03, + 1.35128818918151915977e-03, + 1.42144439366839823308e-03, + 1.49073535117733935521e-03, + 1.55912213962240372468e-03, + 1.62656638300974010561e-03, + 1.69303027294565532589e-03, + 1.75847658980445606218e-03, + 1.82286872354303674040e-03, + 1.88617069415219075317e-03, + 1.94834717173209578771e-03, + 2.00936349618086648045e-03, + 2.06918569648611430298e-03, + 2.12778050960779879092e-03, + 2.18511539894190561298e-03, + 2.24115857235570323583e-03, + 2.29587899978361603334e-03, + 2.34924643037442331187e-03, + 2.40123140918023199666e-03, + 2.45180529337806233856e-03, + 2.50094026801512278949e-03, + 2.54860936126915377242e-03, + 2.59478645921546943742e-03, + 2.63944632009264395014e-03, + 2.68256458805902911827e-03, + 2.72411780643292029958e-03, + 2.76408343040847976832e-03, + 2.80243983924151687792e-03, + 2.83916634789766180597e-03, + 2.87424321815756868281e-03, + 2.90765166917223739917e-03, + 2.93937388746383842716e-03, + 2.96939303636573146555e-03, + 2.99769326489773184699e-03, + 3.02425971607121193627e-03, + 3.04907853462010837095e-03, + 3.07213687415372471712e-03, + 3.09342290372770093235e-03, + 3.11292581382988705480e-03, + 3.13063582177805889775e-03, + 3.14654417652693004295e-03, + 3.16064316288211652126e-03, + 3.17292610511905577922e-03, + 3.18338737000537549265e-03, + 3.19202236922536521438e-03, + 3.19882756120557767629e-03, + 3.20380045234103065510e-03, + 3.20693959762191095619e-03, + 3.20824460066048821466e-03, + 3.20771611311912148781e-03, + 3.20535583353980316201e-03, + 3.20116650557659455922e-03, + 3.19515191563226816363e-03, + 3.18731688990105815895e-03, + 3.17766729081954413250e-03, + 3.16621001292834072099e-03, + 3.15295297814715538495e-03, + 3.13790513046660092533e-03, + 3.12107643006004570677e-03, + 3.10247784681945935892e-03, + 3.08212135331927200924e-03, + 3.06001991721279766046e-03, + 3.03618749306580832173e-03, + 3.01063901363274712478e-03, + 2.98339038058057295921e-03, + 2.95445845466603060347e-03, + 2.92386104537267895939e-03, + 2.89161690001368777356e-03, + 2.85774569230700953987e-03, + 2.82226801043036334277e-03, + 2.78520534456247253682e-03, + 2.74658007391870816194e-03, + 2.70641545328861908917e-03, + 2.66473559908350773537e-03, + 2.62156547490237238143e-03, + 2.57693087662487496647e-03, + 2.53085841704014631939e-03, + 2.48337551002058860156e-03, + 2.43451035425012096355e-03, + 2.38429191651639985419e-03, + 2.33274991457697866704e-03, + 2.27991479960949847833e-03, + 2.22581773825620892956e-03, + 2.17049059427346612006e-03, + 2.11396590979692159534e-03, + 2.05627688623344091062e-03, + 1.99745736479101619609e-03, + 1.93754180665763118922e-03, + 1.87656527284175219002e-03, + 1.81456340368482097088e-03, + 1.75157239805861998823e-03, + 1.68762899225976484990e-03, + 1.62277043861255095177e-03, + 1.55703448379367948885e-03, + 1.49045934689147926804e-03, + 1.42308369721128166394e-03, + 1.35494663184088722126e-03, + 1.28608765298868091623e-03, + 1.21654664510756371255e-03, + 1.14636385181799576628e-03, + 1.07557985264340023011e-03, + 1.00423553957145047719e-03, + 9.32372093454700246948e-04, + 8.60030960264205842671e-04, + 7.87253827209889473632e-04, + 7.14082598740849215993e-04, + 6.40559372440761354631e-04, + 5.66726414830463851718e-04, + 4.92626137092837322433e-04, + 4.18301070733919581456e-04, + 3.43793843193061820010e-04, + 2.69147153417339558834e-04, + 1.94403747414189487621e-04, + 1.19606393795037383994e-04, + 4.47978593251173554416e-05, +-2.99791155070713611101e-05, +-1.04681840886644762128e-04, +-1.79267702021634553217e-04, +-2.53694183430834704039e-04, +-3.27918893156363931707e-04, +-4.01899586887169662890e-04, +-4.75594191979749616409e-04, +-5.48960831362461866741e-04, +-6.21957847309750270874e-04, +-6.94543825073334680428e-04, +-7.66677616355743358524e-04, +-8.38318362614142603174e-04, +-9.09425518181231052305e-04, +-9.79958873188954042791e-04, +-1.04987857628321295568e-03, +-1.11914515711671069299e-03, +-1.18771954860611567151e-03, +-1.25556310894265384798e-03, +-1.32263764334250685968e-03, +-1.38890542552527339500e-03, +-1.45432921890835268122e-03, +-1.51887229750536853490e-03, +-1.58249846651689705240e-03, +-1.64517208260199325476e-03, +-1.70685807381915056156e-03, +-1.76752195922558370811e-03, +-1.82712986812380161379e-03, +-1.88564855894518047276e-03, +-1.94304543775902804383e-03, +-1.99928857639786617534e-03, +-2.05434673018880555040e-03, +-2.10818935528026517312e-03, +-2.16078662555535365442e-03, +-2.21210944912246043961e-03, +-2.26212948437317816139e-03, +-2.31081915559989232653e-03, +-2.35815166816356804741e-03, +-2.40410102320373414084e-03, +-2.44864203188258338501e-03, +-2.49175032915539568928e-03, +-2.53340238705979841141e-03, +-2.57357552751657147824e-03, +-2.61224793463516640271e-03, +-2.64939866651717941329e-03, +-2.68500766655144999101e-03, +-2.71905577419492448452e-03, +-2.75152473523297344538e-03, +-2.78239721151426859513e-03, +-2.81165679015500094215e-03, +-2.83928799220713222809e-03, +-2.86527628078656016949e-03, +-2.88960806865697647852e-03, +-2.91227072526506090486e-03, +-2.93325258322398594105e-03, +-2.95254294424161442545e-03, +-2.97013208449042583406e-03, +-2.98601125941669364242e-03, +-3.00017270798633986159e-03, +-3.01260965636595103370e-03, +-3.02331632103655656429e-03, +-3.03228791133956007003e-03, +-3.03952063145331409857e-03, +-3.04501168179985596748e-03, +-3.04875925988140573583e-03, +-3.05076256054652829655e-03, +-3.05102177568631911103e-03, +-3.04953809336118561099e-03, +-3.04631369635912632385e-03, +-3.04135176018685343333e-03, +-3.03465645049527405624e-03, +-3.02623291994119940004e-03, +-3.01608730448767094895e-03, +-3.00422671914520132003e-03, +-2.99065925315701369377e-03, +-2.97539396463139928575e-03, +-2.95844087462449664011e-03, +-2.93981096067755893683e-03, +-2.91951614981275815730e-03, +-2.89756931099181044148e-03, +-2.87398424704220179990e-03, +-2.84877568605616283970e-03, +-2.82195927226750430117e-03, +-2.79355155641210087594e-03, +-2.76356998557781771697e-03, +-2.73203289255012551212e-03, +-2.69895948465983821080e-03, +-2.66436983213977395327e-03, +-2.62828485599736526648e-03, +-2.59072631541029923391e-03, +-2.55171679465334083972e-03, +-2.51127968956342670012e-03, +-2.46943919355152629105e-03, +-2.42622028316987056393e-03, +-2.38164870324227831086e-03, +-2.33575095156724138815e-03, +-2.28855426320279282948e-03, +-2.24008659434175860792e-03, +-2.19037660578759365432e-03, +-2.13945364604031535577e-03, +-2.08734773400249444888e-03, +-2.03408954131547529270e-03, +-1.97971037433622041798e-03, +-1.92424215576537916382e-03, +-1.86771740593727280343e-03, +-1.81016922378279560696e-03, +-1.75163126747638459545e-03, +-1.69213773477834518097e-03, +-1.63172334308366137785e-03, +-1.57042330918990852978e-03, +-1.50827332879462073199e-03, +-1.44530955573546056152e-03, +-1.38156858098379938318e-03, +-1.31708741140545613178e-03, +-1.25190344829938021362e-03, +-1.18605446572830376673e-03, +-1.11957858865226037894e-03, +-1.05251427087881964557e-03, +-9.84900272842268017723e-04, +-9.16775639224670039346e-04, +-8.48179676431708726506e-04, +-7.79151929936275832941e-04, +-7.09732161502877071865e-04, +-6.39960326305943926796e-04, +-5.69876549955214807899e-04, +-4.99521105441456947371e-04, +-4.28934390015275781964e-04, +-3.58156902013427212109e-04, +-2.87229217644762195236e-04, +-2.16191967749079295199e-04, +-1.45085814543370996213e-04, +-7.39514283676623567637e-05, +-2.82946444373383170840e-06, + 6.82394603388270838424e-05, + 1.39214790597688687322e-04, + 2.10056055579472498182e-04, + 2.80722892215425577894e-04, + 3.51175068097857930472e-04, + 4.21372504364276407804e-04, + 4.91275298476219653143e-04, + 5.60843746879846811494e-04, + 6.30038367535434352430e-04, + 6.98819922302998017792e-04, + 7.67149439171379990757e-04, + 8.34988234318114982448e-04, + 9.02297933988172430955e-04, + 9.69040496177550657667e-04, + 1.03517823211224553603e-03, + 1.10067382750771766003e-03, + 1.16549036359852469825e-03, + 1.22959133792568584519e-03, + 1.29294068487057216450e-03, + 1.35550279592269035112e-03, + 1.41724253967147762606e-03, + 1.47812528150976737508e-03, + 1.53811690303841180558e-03, + 1.59718382116064388891e-03, + 1.65529300685696286952e-03, + 1.71241200362764220237e-03, + 1.76850894559496454178e-03, + 1.82355257525374002750e-03, + 1.87751226086060006570e-03, + 1.93035801345242652959e-03, + 1.98206050348444977674e-03, + 2.03259107707881624474e-03, + 2.08192177187458684826e-03, + 2.13002533247049928231e-03, + 2.17687522545193749141e-03, + 2.22244565399375279199e-03, + 2.26671157203132793423e-03, + 2.30964869799124257813e-03, + 2.35123352807515510060e-03, + 2.39144334908883470295e-03, + 2.43025625080947474746e-03, + 2.46765113788514900417e-03, + 2.50360774125928499736e-03, + 2.53810662911404865891e-03, + 2.57112921732736803004e-03, + 2.60265777943738526798e-03, + 2.63267545610921865559e-03, + 2.66116626409909065240e-03, + 2.68811510471097300096e-03, + 2.71350777174133141537e-03, + 2.73733095890790929794e-03, + 2.75957226675855411477e-03, + 2.78022020905670675522e-03, + 2.79926421864012953122e-03, + 2.81669465275010289657e-03, + 2.83250279782839122292e-03, + 2.84668087377948006433e-03, + 2.85922203769641003479e-03, + 2.87012038704810915068e-03, + 2.87937096232720231986e-03, + 2.88696974915680091081e-03, + 2.89291367985583221592e-03, + 2.89720063446215116837e-03, + 2.89982944121351280883e-03, + 2.90079987648640116524e-03, + 2.90011266419314345591e-03, + 2.89776947463821947862e-03, + 2.89377292283466130279e-03, + 2.88812656628207459208e-03, + 2.88083490220782285907e-03, + 2.87190336427351573453e-03, + 2.86133831874895577796e-03, + 2.84914706015623872201e-03, + 2.83533780638680265804e-03, + 2.81991969329480843959e-03, + 2.80290276877008005807e-03, + 2.78429798629470500945e-03, + 2.76411719798695795433e-03, + 2.74237314713741920855e-03, + 2.71907946024148436046e-03, + 2.69425063853359278432e-03, + 2.66790204902807304155e-03, + 2.64004991507226990932e-03, + 2.61071130641776349285e-03, + 2.57990412881558845576e-03, + 2.54764711314187488125e-03, + 2.51395980406045370728e-03, + 2.47886254822925330629e-03, + 2.44237648205756618242e-03, + 2.40452351902155575872e-03, + 2.36532633654565121670e-03, + 2.32480836245730617881e-03, + 2.28299376102392148624e-03, + 2.23990741857956789096e-03, + 2.19557492874996457166e-03, + 2.15002257728523623811e-03, + 2.10327732650867141317e-03, + 2.05536679939101810111e-03, + 2.00631926325935171576e-03, + 1.95616361315094399245e-03, + 1.90492935482074665296e-03, + 1.85264658741337391243e-03, + 1.79934598580928591972e-03, + 1.74505878265607109780e-03, + 1.68981675009393424863e-03, + 1.63365218118834728926e-03, + 1.57659787107846988304e-03, + 1.51868709785361530318e-03, + 1.45995360316849881639e-03, + 1.40043157260870475105e-03, + 1.34015561581719584022e-03, + 1.27916074639499105850e-03, + 1.21748236158513117693e-03, + 1.15515622175421423141e-03, + 1.09221842968186999730e-03, + 1.02870540967075650360e-03, + 9.64653886488606908747e-04, + 9.00100864155625344717e-04, + 8.35083604587965547955e-04, + 7.69639606110740720837e-04, + 7.03806581852404870327e-04, + 6.37622438033560502181e-04, + 5.71125252161062339600e-04, + 5.04353251142653142593e-04, + 4.37344789331979761672e-04, + 3.70138326518233945050e-04, + 3.02772405872475636971e-04, + 2.35285631863361933882e-04, + 1.67716648154917370023e-04, + 1.00104115498995325769e-04, + 3.24866896350573601776e-05, +-3.50970007900988141157e-05, +-1.02608376270067855503e-04, +-1.70008928441366460871e-04, +-2.37260242028708613496e-04, +-3.04324016719330044459e-04, +-3.71162088955520488940e-04, +-4.37736453631852389604e-04, +-5.04009285684787491054e-04, +-5.69942961563439155249e-04, +-6.35500080568199678457e-04, +-7.00643486045153811477e-04, +-7.65336286425376288202e-04, +-8.29541876096107381675e-04, +-8.93223956092492241653e-04, +-9.56346554598112288600e-04, +-1.01887404724274391321e-03, +-1.08077117718591146113e-03, +-1.14200307497491554062e-03, +-1.20253527816616481716e-03, +-1.26233375069880002922e-03, +-1.32136490200969610419e-03, +-1.37959560587909771390e-03, +-1.43699321899669958842e-03, +-1.49352559923677944212e-03, +-1.54916112363357523669e-03, +-1.60386870604548384400e-03, +-1.65761781449959505821e-03, +-1.71037848820545417342e-03, +-1.76212135422995869009e-03, +-1.81281764382279454370e-03, +-1.86243920838466956759e-03, +-1.91095853506853020909e-03, +-1.95834876200555885878e-03, +-2.00458369314743039755e-03, +-2.04963781271666782222e-03, +-2.09348629925715234990e-03, +-2.13610503927705698904e-03, +-2.17747064047668550252e-03, +-2.21756044455409095234e-03, +-2.25635253958129250451e-03, +-2.29382577194474921237e-03, +-2.32995975784284353738e-03, +-2.36473489433514528352e-03, +-2.39813236993652442383e-03, +-2.43013417475133235504e-03, +-2.46072311014130552798e-03, +-2.48988279792284553787e-03, +-2.51759768908801960866e-03, +-2.54385307204538875167e-03, +-2.56863508037586708854e-03, +-2.59193070009968232204e-03, +-2.61372777645068558178e-03, +-2.63401502015447874783e-03, +-2.65278201320723284670e-03, +-2.67001921415216522324e-03, +-2.68571796285115840450e-03, +-2.69987048474913367627e-03, +-2.71246989462914107200e-03, +-2.72351019985639722365e-03, +-2.73298630310992796480e-03, +-2.74089400460035331406e-03, +-2.74723000377341628614e-03, +-2.75199190049820862497e-03, +-2.75517819574011687753e-03, +-2.75678829171838255668e-03, +-2.75682249154861379672e-03, +-2.75528199837085348636e-03, +-2.75216891396407340939e-03, +-2.74748623684835597061e-03, +-2.74123785987614347961e-03, +-2.73342856731443109575e-03, +-2.72406403141984849309e-03, +-2.71315080850912087457e-03, +-2.70069633452742902113e-03, +-2.68670892011764299301e-03, +-2.67119774519362050691e-03, +-2.65417285302107976847e-03, +-2.63564514380968837812e-03, +-2.61562636782076193137e-03, +-2.59412911799431541299e-03, +-2.57116682210057310998e-03, +-2.54675373442056615300e-03, +-2.52090492696093165098e-03, +-2.49363628020824292311e-03, +-2.46496447342882049614e-03, +-2.43490697451945311766e-03, +-2.40348202941552966175e-03, +-2.37070865106279527260e-03, +-2.33660660795969189057e-03, +-2.30119641227629137537e-03, +-2.26449930755836560670e-03, +-2.22653725602254669996e-03, +-2.18733292545093653547e-03, +-2.14690967569279187940e-03, +-2.10529154478122275743e-03, +-2.06250323467321427379e-03, +-2.01857009662140480036e-03, +-1.97351811618623213668e-03, +-1.92737389789730405483e-03, +-1.88016464957305564146e-03, +-1.83191816630788313451e-03, +-1.78266281413625186578e-03, +-1.73242751338296301945e-03, +-1.68124172171028180012e-03, +-1.62913541687057699184e-03, +-1.57613907917578230551e-03, +-1.52228367369270224489e-03, +-1.46760063217584650445e-03, +-1.41212183474704526358e-03, +-1.35587959133381627010e-03, +-1.29890662287597178325e-03, +-1.24123604231228925124e-03, +-1.18290133535796414613e-03, +-1.12393634108397949545e-03, +-1.06437523230972224016e-03, +-1.00425249582011886888e-03, +-9.43602912418799676629e-04, +-8.82461536828750689118e-04, +-8.20863677452122195502e-04, +-7.58844876000883323576e-04, +-6.96440887009666122730e-04, +-6.33687657243661695526e-04, +-5.70621305011907871928e-04, +-5.07278099399384235432e-04, +-4.43694439428299856887e-04, +-3.79906833162163342851e-04, +-3.15951876763069777060e-04, +-2.51866233515757136346e-04, +-1.87686612828893105692e-04, +-1.23449749226707587929e-04, +-5.91923813425564756662e-05, + 5.04876907352367874530e-06, + 6.92370181212766702379e-05, + 1.33335740678748094525e-04, + 1.97308391280935971606e-04, + 2.61118524936681541647e-04, + 3.24729817871949365607e-04, + 3.88106088187632042828e-04, + 4.51211316420591741425e-04, + 5.14009665995129438193e-04, + 5.76465503554872784643e-04, + 6.38543419161980286940e-04, + 7.00208246353774092785e-04, + 7.61425082043918786609e-04, + 8.22159306257914143483e-04, + 8.82376601691744100360e-04, + 9.42042973081658576232e-04, + 1.00112476637558055551e-03, + 1.05958868769426566188e-03, + 1.11740182207199128042e-03, + 1.17453165196615329918e-03, + 1.23094607552536169578e-03, + 1.28661342460581668880e-03, + 1.34150248252584160767e-03, + 1.39558250154863013048e-03, + 1.44882322008345787619e-03, + 1.50119487959565409141e-03, + 1.55266824121634344422e-03, + 1.60321460204141557661e-03, + 1.65280581111278590707e-03, + 1.70141428507094454904e-03, + 1.74901302347134422581e-03, + 1.79557562375571026954e-03, + 1.84107629587033070663e-03, + 1.88548987652245613779e-03, + 1.92879184306802143982e-03, + 1.97095832702225181102e-03, + 2.01196612718603342132e-03, + 2.05179272238057222588e-03, + 2.09041628378424165433e-03, + 2.12781568686330919971e-03, + 2.16397052289168034464e-03, + 2.19886111005235902402e-03, + 2.23246850411500585495e-03, + 2.26477450868369997727e-03, + 2.29576168500963484834e-03, + 2.32541336136273067009e-03, + 2.35371364195842858874e-03, + 2.38064741543364153872e-03, + 2.40620036286810995776e-03, + 2.43035896534666076563e-03, + 2.45311051105864775732e-03, + 2.47444310193039576293e-03, + 2.49434565978784222526e-03, + 2.51280793204573761265e-03, + 2.52982049692079043884e-03, + 2.54537476816590630541e-03, + 2.55946299932366090960e-03, + 2.57207828749620934228e-03, + 2.58321457663059431131e-03, + 2.59286666031753468623e-03, + 2.60103018410256332446e-03, + 2.60770164730860518412e-03, + 2.61287840436931441054e-03, + 2.61655866567281477839e-03, + 2.61874149791569560408e-03, + 2.61942682396747910170e-03, + 2.61861542224603579751e-03, + 2.61630892560461673912e-03, + 2.61250981973162573271e-03, + 2.60722144106427262261e-03, + 2.60044797421789914901e-03, + 2.59219444893257419671e-03, + 2.58246673653929684211e-03, + 2.57127154594804412449e-03, + 2.55861641916043432848e-03, + 2.54450972630984205078e-03, + 2.52896066023234862910e-03, + 2.51197923057173110040e-03, + 2.49357625742245613346e-03, + 2.47376336451454867035e-03, + 2.45255297194462698260e-03, + 2.42995828845761051989e-03, + 2.40599330328385152544e-03, + 2.38067277753669032450e-03, + 2.35401223517576205571e-03, + 2.32602795354144506468e-03, + 2.29673695346632733560e-03, + 2.26615698896941598212e-03, + 2.23430653653983570320e-03, + 2.20120478401572821497e-03, + 2.16687161906578855050e-03, + 2.13132761727950238717e-03, + 2.09459402987411226829e-03, + 2.05669277102470907798e-03, + 2.01764640482596626161e-03, + 1.97747813189227050409e-03, + 1.93621177560486024995e-03, + 1.89387176801387676663e-03, + 1.85048313540364336473e-03, + 1.80607148352974512806e-03, + 1.76066298253653116292e-03, + 1.71428435156398707023e-03, + 1.66696284305293466847e-03, + 1.61872622675783670206e-03, + 1.56960277347651289311e-03, + 1.51962123850639114868e-03, + 1.46881084483655192582e-03, + 1.41720126608627463617e-03, + 1.36482260919915132126e-03, + 1.31170539690283571681e-03, + 1.25788054994554945182e-03, + 1.20337936911878791608e-03, + 1.14823351707673366670e-03, + 1.09247499996376496584e-03, + 1.03613614885946750573e-03, + 9.79249601052817287769e-04, + 9.21848281156024094984e-04, + 8.63965382068984373391e-04, + 8.05634345805350776497e-04, + 7.46888844191288077054e-04, + 6.87762759448037191978e-04, + 6.28290164669462083795e-04, + 5.68505304205851338083e-04, + 5.08442573965285464499e-04, + 4.48136501643423001973e-04, + 3.87621726894541677056e-04, + 3.26932981452717592256e-04, + 2.66105069217038663586e-04, + 2.05172846310758418649e-04, + 1.44171201126380563911e-04, + 8.31350343675788742547e-05, + 2.20992391004467811420e-05, +-3.89013191759796718742e-05, +-9.98318224274676811183e-05, +-1.60657519939763258031e-04, +-2.21343748119307129384e-04, +-2.81855950229735626421e-04, +-3.42159696050412485968e-04, +-4.02220701448342615129e-04, +-4.62004847850846784695e-04, +-5.21478201608437975934e-04, +-5.80607033236791485534e-04, +-6.39357836527398360783e-04, +-6.97697347514598421869e-04, +-7.55592563290745562223e-04, +-8.13010760656402635231e-04, +-8.69919514596503569252e-04, +-9.26286716571595044288e-04, +-9.82080592613842522434e-04, +-1.03726972121798914454e-03, +-1.09182305101626067265e-03, +-1.14570991822856215955e-03, +-1.19890006387727231750e-03, +-1.25136365075697989814e-03, +-1.30307128015050440427e-03, +-1.35399400828092701665e-03, +-1.40410336249047434758e-03, +-1.45337135713807666729e-03, +-1.50177050920588701921e-03, +-1.54927385360641156620e-03, +-1.59585495818171090726e-03, +-1.64148793838632899543e-03, +-1.68614747164579970896e-03, +-1.72980881138278994556e-03, +-1.77244780070314389073e-03, +-1.81404088573422256521e-03, +-1.85456512860821833531e-03, +-1.89399822008349183119e-03, +-1.93231849179640994586e-03, +-1.96950492813784778720e-03, +-2.00553717774697637041e-03, +-2.04039556461697076800e-03, +-2.07406109880563802386e-03, +-2.10651548674606337030e-03, +-2.13774114115079620635e-03, +-2.16772119050517375963e-03, +-2.19643948814392904120e-03, +-2.22388062090664783907e-03, +-2.25002991736723010133e-03, +-2.27487345563314293309e-03, +-2.29839807071028278881e-03, +-2.32059136142953635965e-03, +-2.34144169693150825881e-03, +-2.36093822270602455432e-03, +-2.37907086618326232483e-03, +-2.39583034187382639194e-03, +-2.41120815605485715877e-03, +-2.42519661100030125764e-03, +-2.43778880875283833138e-03, +-2.44897865443608397581e-03, +-2.45876085910516064756e-03, +-2.46713094213460307561e-03, +-2.47408523314259810866e-03, +-2.47962087345062007909e-03, +-2.48373581707827476711e-03, +-2.48642883127294603979e-03, +-2.48769949657436095780e-03, +-2.48754820641444327964e-03, +-2.48597616625299746435e-03, +-2.48298539225010744813e-03, +-2.47857870947639034181e-03, +-2.47275974966242300529e-03, +-2.46553294848908619713e-03, +-2.45690354242066423887e-03, +-2.44687756508286339413e-03, +-2.43546184318826561266e-03, +-2.42266399201183056655e-03, +-2.40849241041931304286e-03, +-2.39295627545196452554e-03, +-2.37606553647086871789e-03, +-2.35783090886447369364e-03, +-2.33826386732362018900e-03, +-2.31737663868781000251e-03, +-2.29518219436743642001e-03, +-2.27169424234655459999e-03, +-2.24692721877107516593e-03, +-2.22089627912754614472e-03, +-2.19361728901783497453e-03, +-2.16510681453538442881e-03, +-2.13538211224875490099e-03, +-2.10446111879856838367e-03, +-2.07236244011410305002e-03, +-2.03910534025573964012e-03, +-2.00470972989070942219e-03, +-1.96919615440774254875e-03, +-1.93258578167894933507e-03, +-1.89490038947546677803e-03, +-1.85616235254462648083e-03, +-1.81639462935595909568e-03, +-1.77562074852458812169e-03, +-1.73386479491910482434e-03, +-1.69115139546278155785e-03, +-1.64750570463616328315e-03, +-1.60295338968996568633e-03, +-1.55752061557586866242e-03, +-1.51123402960583901912e-03, +-1.46412074584717846748e-03, +-1.41620832926347625658e-03, +-1.36752477961040201301e-03, +-1.31809851509572971071e-03, +-1.26795835581320162112e-03, +-1.21713350695978428199e-03, +-1.16565354184613783825e-03, +-1.11354838471016369394e-03, +-1.06084829334356697123e-03, +-1.00758384154156217620e-03, +-9.53785901385918667879e-04, +-8.99485625371226915105e-04, +-8.44714428385682711276e-04, +-7.89503969555520172287e-04, +-7.33886133964478507875e-04, +-6.77893014258843288299e-04, +-6.21556892147806690219e-04, +-5.64910219810742480866e-04, +-5.07985601222065157219e-04, +-4.50815773403514705956e-04, +-3.93433587615536740044e-04, +-3.35871990498167328609e-04, +-2.78164005172315390892e-04, +-2.20342712312250957329e-04, +-1.62441231200158043299e-04, +-1.04492700773580143945e-04, +-4.65302606765986506319e-05, + 1.14129676744331286925e-05, + 6.93038999997214335376e-05, + 1.27109508029058849467e-04, + 1.84796838327256962358e-04, + 2.42333031062709627164e-04, + 2.99685338706966609285e-04, + 3.56821144656121883639e-04, + 4.13707981761937345928e-04, + 4.70313550763611239701e-04, + 5.26605738608316954405e-04, + 5.82552636651546872429e-04, + 6.38122558725952955180e-04, + 6.93284059068853498672e-04, + 7.48005950098214232938e-04, + 8.02257320027068118913e-04, + 8.56007550306428347843e-04, + 9.09226332886875140971e-04, + 9.61883687289077828758e-04, + 1.01394997747366656139e-03, + 1.06539592850096254475e-03, + 1.11619264297115245756e-03, + 1.16631161723606104411e-03, + 1.21572475737255643845e-03, + 1.26440439490956338907e-03, + 1.31232330229981257463e-03, + 1.35945470812689692131e-03, + 1.40577231203991388428e-03, + 1.45125029940738111550e-03, + 1.49586335568145547929e-03, + 1.53958668046561540123e-03, + 1.58239600127717565045e-03, + 1.62426758699731900969e-03, + 1.66517826100116947581e-03, + 1.70510541396065628053e-03, + 1.74402701631310862347e-03, + 1.78192163038870358960e-03, + 1.81876842219015340089e-03, + 1.85454717281811399567e-03, + 1.88923828953608337507e-03, + 1.92282281646894998711e-03, + 1.95528244492883035086e-03, + 1.98659952336315047752e-03, + 2.01675706691958021854e-03, + 2.04573876662207838895e-03, + 2.07352899815367369349e-03, + 2.10011283024123633634e-03, + 2.12547603263724084119e-03, + 2.14960508369503545609e-03, + 2.17248717753304627920e-03, + 2.19411023078435168249e-03, + 2.21446288892813546861e-03, + 2.23353453219959832005e-03, + 2.25131528107543575634e-03, + 2.26779600133197476938e-03, + 2.28296830867344077709e-03, + 2.29682457292811666866e-03, + 2.30935792181020602132e-03, + 2.32056224424581451771e-03, + 2.33043219326110580616e-03, + 2.33896318843187242878e-03, + 2.34615141789296230077e-03, + 2.35199383990705723768e-03, + 2.35648818399214129982e-03, + 2.35963295160742693446e-03, + 2.36142741639763483266e-03, + 2.36187162399587079545e-03, + 2.36096639138556364801e-03, + 2.35871330582219018365e-03, + 2.35511472331569049476e-03, + 2.35017376667488861117e-03, + 2.34389432311526155553e-03, + 2.33628104143192337830e-03, + 2.32733932873959879425e-03, + 2.31707534678196646130e-03, + 2.30549600781271638028e-03, + 2.29260897005103539067e-03, + 2.27842263271448887407e-03, + 2.26294613063242897391e-03, + 2.24618932844335367563e-03, + 2.22816281437991214193e-03, + 2.20887789364531414785e-03, + 2.18834658138542404587e-03, + 2.16658159526062063169e-03, + 2.14359634762239202599e-03, + 2.11940493729897636022e-03, + 2.09402214099534654534e-03, + 2.06746340431283176509e-03, + 2.03974483239339685059e-03, + 2.01088318019464239519e-03, + 1.98089584240138030097e-03, + 1.94980084297942022308e-03, + 1.91761682437821957652e-03, + 1.88436303638870564399e-03, + 1.85005932466290553585e-03, + 1.81472611890221816218e-03, + 1.77838442072136338791e-03, + 1.74105579119516714129e-03, + 1.70276233809558063745e-03, + 1.66352670282644788877e-03, + 1.62337204706380910935e-03, + 1.58232203910926546089e-03, + 1.54040083996521471633e-03, + 1.49763308913912528489e-03, + 1.45404389018587740061e-03, + 1.40965879599663345551e-03, + 1.36450379384215388784e-03, + 1.31860529018035092276e-03, + 1.27199009523587059159e-03, + 1.22468540736182600857e-03, + 1.17671879719162628813e-03, + 1.12811819159096510083e-03, + 1.07891185741895972300e-03, + 1.02912838510792908377e-03, + 9.78796672071337260299e-04, + 9.27945905949520053434e-04, + 8.76605547702895976370e-04, + 8.24805314562447990448e-04, + 7.72575162847333337356e-04, + 7.19945270659597320352e-04, + 6.66946020465617123510e-04, + 6.13607981575178514436e-04, + 5.59961892527424567705e-04, + 5.06038643393795593145e-04, + 4.51869258009022058478e-04, + 3.97484876139576502260e-04, + 3.42916735599798760004e-04, + 2.88196154326876910479e-04, + 2.33354512423656609626e-04, + 1.78423234180534077487e-04, + 1.23433770086348173567e-04, + 6.84175788386079240409e-05, + 1.34061093633470900020e-05, +-4.15692171451308774711e-05, +-9.64770251543709412689e-05, +-1.51286002683524126340e-04, +-2.05964919142553784092e-04, +-2.60482643110675150724e-04, +-3.14808160044301459275e-04, +-3.68910589903529524333e-04, +-4.22759204688063789518e-04, +-4.76323445872630008881e-04, +-5.29572941731087281150e-04, +-5.82477524540275987987e-04, +-6.35007247653846472989e-04, +-6.87132402435543243602e-04, +-7.38823535043645019879e-04, +-7.90051463056118570549e-04, +-8.40787291927532235911e-04, +-8.91002431268342548823e-04, +-9.40668610937454570224e-04, +-9.89757896938941268347e-04, +-1.03824270711407040668e-03, +-1.08609582661974403764e-03, +-1.13329042318477575535e-03, +-1.17980006213536797732e-03, +-1.22559872118147396639e-03, +-1.27066080495571239080e-03, +-1.31496115929677771621e-03, +-1.35847508526934588474e-03, +-1.40117835291272236839e-03, +-1.44304721471052890651e-03, +-1.48405841877397026707e-03, +-1.52418922173162092390e-03, +-1.56341740131789178406e-03, +-1.60172126865418262831e-03, +-1.63907968021530041879e-03, +-1.67547204947450902382e-03, +-1.71087835822147623158e-03, +-1.74527916754618566374e-03, +-1.77865562848291466208e-03, +-1.81098949230900328755e-03, +-1.84226312049221930059e-03, +-1.87245949428157002978e-03, +-1.90156222393633397329e-03, +-1.92955555758831764739e-03, +-1.95642438973256090409e-03, +-1.98215426934193923725e-03, +-2.00673140760134708499e-03, +-2.03014268525729749126e-03, +-2.05237565957906665723e-03, +-2.07341857092785582239e-03, +-2.09326034893013391766e-03, +-2.11189061825244484699e-03, +-2.12929970397441031132e-03, +-2.14547863655709580497e-03, +-2.16041915640460824299e-03, +-2.17411371801621297953e-03, +-2.18655549372708977660e-03, +-2.19773837703605891963e-03, +-2.20765698551850719430e-03, +-2.21630666332326515741e-03, +-2.22368348325234152507e-03, +-2.22978424842263864281e-03, +-2.23460649350903971591e-03, +-2.23814848556852345751e-03, +-2.24040922444509972219e-03, +-2.24138844275575217432e-03, +-2.24108660545765600580e-03, +-2.23950490899731862252e-03, +-2.23664528004239790415e-03, +-2.23251037379732560767e-03, +-2.22710357190395455765e-03, +-2.22042897992885809519e-03, +-2.21249142443891893065e-03, +-2.20329644966735498784e-03, +-2.19285031377223701976e-03, +-2.18115998469021890940e-03, +-2.16823313558786156391e-03, +-2.15407813991372407841e-03, +-2.13870406605424102225e-03, +-2.12212067159678200237e-03, +-2.10433839720351734126e-03, +-2.08536836009985638782e-03, +-2.06522234718151120880e-03, +-2.04391280774443356502e-03, +-2.02145284584207300324e-03, +-1.99785621227463244462e-03, +-1.97313729621508525403e-03, +-1.94731111647731430260e-03, +-1.92039331243139960170e-03, +-1.89240013457138639766e-03, +-1.86334843474168982726e-03, +-1.83325565602760116347e-03, +-1.80213982231590299880e-03, +-1.77001952753231455231e-03, +-1.73691392456148648374e-03, +-1.70284271385666495340e-03, +-1.66782613174552775577e-03, +-1.63188493843921685576e-03, +-1.59504040575159230717e-03, +-1.55731430453603003801e-03, +-1.51872889184707753063e-03, +-1.47930689783463205529e-03, +-1.43907151237822393368e-03, +-1.39804637146942033893e-03, +-1.35625554334995140730e-03, +-1.31372351441438970504e-03, +-1.27047517488496053938e-03, +-1.22653580426682431471e-03, +-1.18193105659301824634e-03, +-1.13668694546695714549e-03, +-1.09082982891158691320e-03, +-1.04438639403357878127e-03, +-9.97383641512322120098e-04, +-9.49848869921641547967e-04, +-9.01809659894115857315e-04, +-8.53293858136809635351e-04, +-8.04329561308134524146e-04, +-7.54945099763940303053e-04, +-7.05169021184243009770e-04, +-6.55030074088056891990e-04, +-6.04557191246998305335e-04, +-5.53779473006872830811e-04, +-5.02726170526861184003e-04, +-4.51426668945984269337e-04, +-3.99910470486500410799e-04, +-3.48207177503949535848e-04, +-2.96346475493580014358e-04, +-2.44358116062887999707e-04, +-1.92271899880109192792e-04, +-1.40117659608033219131e-04, +-8.79252428338516013985e-05, +-3.57244950035476513677e-05, + 1.64547576285501491889e-05, + 6.85827250253236744533e-05, + 1.20629670358623862633e-04, + 1.72565926956682051847e-04, + 2.24361915197526828099e-04, + 2.75988159339660512649e-04, + 3.27415304279563739234e-04, + 3.78614132226878525450e-04, + 4.29555579287748767834e-04, + 4.80210751946913818114e-04, + 5.30550943439215389429e-04, + 5.80547650001254260735e-04, + 6.30172586994006268639e-04, + 6.79397704887282211095e-04, + 7.28195205096961932327e-04, + 7.76537555666397547385e-04, + 8.24397506782311470346e-04, + 8.71748106117578472167e-04, + 9.18562713991485446999e-04, + 9.64815018338932312708e-04, + 1.01047904948097389682e-03, + 1.05552919468725366070e-03, + 1.09994021252330666759e-03, + 1.14368724697360216180e-03, + 1.18674584133354179757e-03, + 1.22909195186185872875e-03, + 1.27070196118612760081e-03, + 1.31155269145389143971e-03, + 1.35162141722206191954e-03, + 1.39088587807745310380e-03, + 1.42932429098146206170e-03, + 1.46691536233205330891e-03, + 1.50363829973637033906e-03, + 1.53947282348746166021e-03, + 1.57439917773903939602e-03, + 1.60839814137149570566e-03, + 1.64145103854408192304e-03, + 1.67353974892666301950e-03, + 1.70464671760622052225e-03, + 1.73475496466189292762e-03, + 1.76384809440413852129e-03, + 1.79191030427224506048e-03, + 1.81892639338610754944e-03, + 1.84488177074716187820e-03, + 1.86976246308427976328e-03, + 1.89355512234033978962e-03, + 1.91624703279555906599e-03, + 1.93782611782377474016e-03, + 1.95828094627808731512e-03, + 1.97760073850255548022e-03, + 1.99577537196677290074e-03, + 2.01279538652043366379e-03, + 2.02865198926522683279e-03, + 2.04333705904144154533e-03, + 2.05684315052714027094e-03, + 2.06916349794801935486e-03, + 2.08029201839576892777e-03, + 2.09022331475368274706e-03, + 2.09895267822806817423e-03, + 2.10647609048419644576e-03, + 2.11279022538611149090e-03, + 2.11789245033947156824e-03, + 2.12178082723701432605e-03, + 2.12445411300643061461e-03, + 2.12591175976064054517e-03, + 2.12615391455073503985e-03, + 2.12518141872201785439e-03, + 2.12299580687382158026e-03, + 2.11959930542408034673e-03, + 2.11499483077969572045e-03, + 2.10918598711416641414e-03, + 2.10217706375393116602e-03, + 2.09397303217547263096e-03, + 2.08457954261486583247e-03, + 2.07400292029235070942e-03, + 2.06225016125420471461e-03, + 2.04932892783467367551e-03, + 2.03524754374076423044e-03, + 2.02001498876324889209e-03, + 2.00364089311688611111e-03, + 1.98613553141360494464e-03, + 1.96750981627234018331e-03, + 1.94777529156955181953e-03, + 1.92694412533416631859e-03, + 1.90502910229207360684e-03, + 1.88204361606385760751e-03, + 1.85800166102108787677e-03, + 1.83291782380585869562e-03, + 1.80680727451872601141e-03, + 1.77968575758040859630e-03, + 1.75156958227263453466e-03, + 1.72247561296389362258e-03, + 1.69242125902588661998e-03, + 1.66142446444668846067e-03, + 1.62950369714685090912e-03, + 1.59667793800455284220e-03, + 1.56296666959689989698e-03, + 1.52838986466322470682e-03, + 1.49296797429780258443e-03, + 1.45672191587891005325e-03, + 1.41967306074082186274e-03, + 1.38184322159656857235e-03, + 1.34325463971886609367e-03, + 1.30392997188612789518e-03, + 1.26389227710180132407e-03, + 1.22316500309457604385e-03, + 1.18177197260732505350e-03, + 1.13973736948289701074e-03, + 1.09708572455475997058e-03, + 1.05384190135080434668e-03, + 1.01003108161856368016e-03, + 9.65678750680322895046e-04, + 9.20810682626568323406e-04, + 8.75452925356471657603e-04, + 8.29631785473724093875e-04, + 7.83373813047290703040e-04, + 7.36705786244772238558e-04, + 6.89654695848395987885e-04, + 6.42247729661416769283e-04, + 5.94512256815164243616e-04, + 5.46475811984593212202e-04, + 4.98166079522630966640e-04, + 4.49610877521255665294e-04, + 4.00838141809322300816e-04, + 3.51875909896002484617e-04, + 3.02752304869100116388e-04, + 2.53495519257492917930e-04, + 2.04133798866942952959e-04, + 1.54695426598542049934e-04, + 1.05208706259043055812e-04, + 5.57019463723481029365e-05, + 6.20344400145258794332e-06, +-4.32585314102668224909e-05, +-9.26557541683200246944e-05, +-1.41960058418968396079e-04, +-1.91143354193288721741e-04, +-2.40177643395536041327e-04, +-2.89035035725425371294e-04, +-3.37687764526517215750e-04, +-3.86108202550481673879e-04, +-4.34268877629523874194e-04, +-4.82142488247218933394e-04, +-5.29701918999288495597e-04, +-5.76920255935507784832e-04, +-6.23770801774083051734e-04, +-6.70227090979901799633e-04, +-7.16262904698151416615e-04, +-7.61852285534880065317e-04, +-8.06969552176199341267e-04, +-8.51589313837822735331e-04, +-8.95686484537168122258e-04, +-9.39236297179238443025e-04, +-9.82214317449158023227e-04, +-1.02459645750355089928e-03, +-1.06635898945237213818e-03, +-1.10747855862441241769e-03, +-1.14793219660866787669e-03, +-1.18769733406468773300e-03, +-1.22675181329402055441e-03, +-1.26507390056672754976e-03, +-1.30264229819540794213e-03, +-1.33943615635037714499e-03, +-1.37543508460907315874e-03, +-1.41061916323427321250e-03, +-1.44496895417330940836e-03, +-1.47846551177379173514e-03, +-1.51109039320902033797e-03, +-1.54282566860766408127e-03, +-1.57365393088206863802e-03, +-1.60355830525010312551e-03, +-1.63252245844455485396e-03, +-1.66053060760636725206e-03, +-1.68756752885559392630e-03, +-1.71361856553621906898e-03, +-1.73866963613010581773e-03, +-1.76270724183600984401e-03, +-1.78571847380921077363e-03, +-1.80769102005840930254e-03, +-1.82861317199587238881e-03, +-1.84847383063749628497e-03, +-1.86726251244936523530e-03, +-1.88496935483824668706e-03, +-1.90158512128234106521e-03, +-1.91710120610045944671e-03, +-1.93150963885675339658e-03, +-1.94480308839885176336e-03, +-1.95697486652746934985e-03, +-1.96801893129561937881e-03, +-1.97792988993586308158e-03, +-1.98670300141425048082e-03, +-1.99433417860976971991e-03, +-2.00081999011835322613e-03, +-2.00615766168074291520e-03, +-2.01034507723373218405e-03, +-2.01338077958435448037e-03, +-2.01526397070713597648e-03, +-2.01599451166439066346e-03, +-2.01557292214997766863e-03, +-2.01400037965709585719e-03, +-2.01127871827083996512e-03, +-2.00741042708658728663e-03, +-2.00239864825537024207e-03, +-1.99624717465765773305e-03, +-1.98896044720722623214e-03, +-1.98054355178687831532e-03, +-1.97100221581815275573e-03, +-1.96034280446718981242e-03, +-1.94857231648931650270e-03, +-1.93569837971491794798e-03, +-1.92172924617953493238e-03, +-1.90667378690126333891e-03, +-1.89054148630866990580e-03, +-1.87334243632268355843e-03, +-1.85508733009632424509e-03, +-1.83578745541577732087e-03, +-1.81545468776724309642e-03, +-1.79410148307337815980e-03, +-1.77174087010420694757e-03, +-1.74838644256665020488e-03, +-1.72405235087792502863e-03, +-1.69875329362731528234e-03, +-1.67250450873173686292e-03, +-1.64532176429031608451e-03, +-1.61722134914345358134e-03, +-1.58822006314201439985e-03, +-1.55833520713242958296e-03, +-1.52758457266367842983e-03, +-1.49598643142224508110e-03, +-1.46355952440134539153e-03, +-1.43032305081079724740e-03, +-1.39629665673392786875e-03, +-1.36150042353874842389e-03, +-1.32595485604938292078e-03, +-1.28968087048560815441e-03, +-1.25269978217663175389e-03, +-1.21503329305731573931e-03, +-1.17670347895322481742e-03, +-1.13773277666287834717e-03, +-1.09814397084380963379e-03, +-1.05796018071076876506e-03, +-1.01720484655352786697e-03, +-9.75901716082224163044e-04, +-9.34074830608162560291e-04, +-8.91748511068093702332e-04, +-8.48947343900121774093e-04, +-8.05696166779400137388e-04, +-7.62020054221886175734e-04, +-7.17944303064517799773e-04, +-6.73494417830223287419e-04, +-6.28696095985875375196e-04, +-5.83575213102809943477e-04, +-5.38157807926610857671e-04, +-4.92470067366625467893e-04, +-4.46538311412741039091e-04, +-4.00388977988523500975e-04, +-3.54048607749048280420e-04, +-3.07543828832976284295e-04, +-2.60901341576534541618e-04, +-2.14147903198978289919e-04, +-1.67310312467942520764e-04, +-1.20415394353891940199e-04, +-7.34899846812865148926e-05, +-2.65609147871840793706e-05, + 2.03450038059074316498e-05, + 6.72009946930133205637e-05, + 1.13980331857172184195e-04, + 1.60656354898604009258e-04, + 2.07202484214283008147e-04, + 2.53592236118117483629e-04, + 2.99799237895086720992e-04, + 3.45797242778839468078e-04, + 3.91560144845429106229e-04, + 4.37061993814294241171e-04, + 4.82277009748485958104e-04, + 5.27179597645008367682e-04, + 5.71744361908107438623e-04, + 6.15946120696525068264e-04, + 6.59759920136990252182e-04, + 7.03161048395523806745e-04, + 7.46125049599718473056e-04, + 7.88627737602340720367e-04, + 8.30645209580345455537e-04, + 8.72153859460560415377e-04, + 9.13130391164877785494e-04, + 9.53551831667496553602e-04, + 9.93395543856891161116e-04, + 1.03263923919528978652e-03, + 1.07126099016866677127e-03, + 1.10923924252022128127e-03, + 1.14655282726058328768e-03, + 1.18318097244805918271e-03, + 1.21910331473228323099e-03, + 1.25429991065521308224e-03, + 1.28875124770248187904e-03, + 1.32243825509993726680e-03, + 1.35534231434853292934e-03, + 1.38744526949258163359e-03, + 1.41872943711487042515e-03, + 1.44917761605398002535e-03, + 1.47877309683764539099e-03, + 1.50749967082781347223e-03, + 1.53534163907186548513e-03, + 1.56228382085535594075e-03, + 1.58831156195163563510e-03, + 1.61341074256387195449e-03, + 1.63756778495518346382e-03, + 1.66076966076276837624e-03, + 1.68300389799214892943e-03, + 1.70425858768773869599e-03, + 1.72452239027620483382e-03, + 1.74378454157939760671e-03, + 1.76203485849330421936e-03, + 1.77926374433060529266e-03, + 1.79546219382350027462e-03, + 1.81062179778474288683e-03, + 1.82473474742401477189e-03, + 1.83779383831785469647e-03, + 1.84979247403080490283e-03, + 1.86072466938634346195e-03, + 1.87058505338575297924e-03, + 1.87936887177368445838e-03, + 1.88707198924914281921e-03, + 1.89369089132102150393e-03, + 1.89922268580736391258e-03, + 1.90366510397775167036e-03, + 1.90701650133855821721e-03, + 1.90927585806080512588e-03, + 1.91044277905074734968e-03, + 1.91051749366339122978e-03, + 1.90950085505942339544e-03, + 1.90739433920622124437e-03, + 1.90420004352378135701e-03, + 1.89992068517663812051e-03, + 1.89455959901305625789e-03, + 1.88812073515295573110e-03, + 1.88060865622618881600e-03, + 1.87202853426315300560e-03, + 1.86238614723965899625e-03, + 1.85168787527840192179e-03, + 1.83994069650947789270e-03, + 1.82715218259254900957e-03, + 1.81333049390355882657e-03, + 1.79848437438895314942e-03, + 1.78262314609068240993e-03, + 1.76575670334532712838e-03, + 1.74789550666099805648e-03, + 1.72905057627572287561e-03, + 1.70923348540114126287e-03, + 1.68845635315613591676e-03, + 1.66673183719381174349e-03, + 1.64407312602717807851e-03, + 1.62049393105762528852e-03, + 1.59600847831119999759e-03, + 1.57063149988747046033e-03, + 1.54437822512650262292e-03, + 1.51726437149865382714e-03, + 1.48930613522309045725e-03, + 1.46052018162035729919e-03, + 1.43092363520500552576e-03, + 1.40053406952348629723e-03, + 1.36936949674445118327e-03, + 1.33744835700646668569e-03, + 1.30478950753013271321e-03, + 1.27141221150076761358e-03, + 1.23733612672830939165e-03, + 1.20258129409077482892e-03, + 1.16716812576892663492e-03, + 1.13111739327765117337e-03, + 1.09445021530241268400e-03, + 1.05718804534711313843e-03, + 1.01935265920083785798e-03, + 9.80966142230535508365e-04, + 9.42050876507689177730e-04, + 9.02629527775573197758e-04, + 8.62725032265359496712e-04, + 8.22360583368397595437e-04, + 7.81559618172762574431e-04, + 7.40345803871171343619e-04, + 6.98743024048840326648e-04, + 6.56775364859214197573e-04, + 6.14467101094864410517e-04, + 5.71842682162310611722e-04, + 5.28926717968548746641e-04, + 4.85743964727467576921e-04, + 4.42319310694356789340e-04, + 3.98677761836690037860e-04, + 3.54844427449443563551e-04, + 3.10844505723203393555e-04, + 2.66703269273363180372e-04, + 2.22446050638747323033e-04, + 1.78098227757677587350e-04, + 1.33685209430572742549e-04, + 8.92324207763590298084e-05, + 4.47652886917426873583e-05, + 3.09227321650505732558e-07, +-4.41103764515531808835e-05, +-8.84681774910541152872e-05, +-1.32738886852529214266e-04, +-1.76897286187552060842e-04, +-2.20918242094528819363e-04, +-2.64776720409321865164e-04, +-3.08447800427395421845e-04, +-3.51906689049402091746e-04, +-3.95128734842202674043e-04, +-4.38089442007342469865e-04, +-4.80764484249080186352e-04, +-5.23129718534129112967e-04, +-5.65161198735287346670e-04, +-6.06835189151545676724e-04, +-6.48128177896318104570e-04, +-6.89016890147269131690e-04, +-7.29478301249281038503e-04, +-7.69489649664180678720e-04, +-8.09028449758908115366e-04, +-8.48072504425961999630e-04, +-8.86599917528026388626e-04, +-9.24589106160850367731e-04, +-9.62018812726749862618e-04, +-9.98868116812330619769e-04, +-1.03511644686372960081e-03, +-1.07074359165286784289e-03, +-1.10572971152834206160e-03, +-1.14005534944471237715e-03, +-1.17370144176403299122e-03, +-1.20664932882368503703e-03, +-1.23888076526462546922e-03, +-1.27037793011433868158e-03, +-1.30112343661913792969e-03, +-1.33110034181987751598e-03, +-1.36029215586637268476e-03, +-1.38868285106535536630e-03, +-1.41625687065657750174e-03, +-1.44299913731265943770e-03, +-1.46889506135814513696e-03, +-1.49393054870271117275e-03, +-1.51809200848501517356e-03, +-1.54136636042246982434e-03, +-1.56374104186323185060e-03, +-1.58520401453656292236e-03, +-1.60574377099796661295e-03, +-1.62534934076566579299e-03, +-1.64401029614518693484e-03, +-1.66171675773892622320e-03, +-1.67845939963788895466e-03, +-1.69422945429279826236e-03, +-1.70901871706225839433e-03, +-1.72281955043516879847e-03, +-1.73562488792599364622e-03, +-1.74742823764018669758e-03, +-1.75822368550844964838e-03, +-1.76800589818810072879e-03, +-1.77677012563024231892e-03, +-1.78451220331139900031e-03, +-1.79122855412879207482e-03, +-1.79691618995835998736e-03, +-1.80157271287491316247e-03, +-1.80519631603399109167e-03, +-1.80778578421531151664e-03, +-1.80934049402758445960e-03, +-1.80986041377503045595e-03, +-1.80934610298588618299e-03, +-1.80779871160341876896e-03, +-1.80521997884027364349e-03, +-1.80161223169698209157e-03, +-1.79697838314586038136e-03, +-1.79132192998154664808e-03, +-1.78464695033966652855e-03, +-1.77695810088541257706e-03, +-1.76826061367380709712e-03, +-1.75856029268379684440e-03, +-1.74786351002833607871e-03, +-1.73617720184306720613e-03, +-1.72350886385598295499e-03, +-1.70986654664103516175e-03, +-1.69525885055866825345e-03, +-1.67969492038625377826e-03, +-1.66318443964190258721e-03, +-1.64573762460525812104e-03, +-1.62736521803862185451e-03, +-1.60807848261251156753e-03, +-1.58788919403957031612e-03, +-1.56680963392096320175e-03, +-1.54485258230964710331e-03, +-1.52203130999494277119e-03, +-1.49835957051309000103e-03, +-1.47385159188855594317e-03, +-1.44852206811105200211e-03, +-1.42238615035335702781e-03, +-1.39545943793505230687e-03, +-1.36775796903791223985e-03, +-1.33929821117795126197e-03, +-1.31009705144011874209e-03, +-1.28017178648149091390e-03, +-1.24954011230838865631e-03, +-1.21822011383393023938e-03, +-1.18623025422220701106e-03, +-1.15358936402481875548e-03, +-1.12031663011664538339e-03, +-1.08643158443716956497e-03, +-1.05195409254393249660e-03, +-1.01690434198485049264e-03, +-9.81302830496187097550e-04, +-9.45170354033052825121e-04, +-9.08527994639429640512e-04, +-8.71397108164778015985e-04, +-8.33799311834413085960e-04, +-7.95756471680627718197e-04, +-7.57290689842498644137e-04, +-7.18424291740831638675e-04, +-6.79179813136611995432e-04, +-6.39579987079505734443e-04, +-5.99647730754900086352e-04, +-5.59406132236475598166e-04, +-5.18878437151933970262e-04, +-4.78088035270234697639e-04, +-4.37058447017129952060e-04, +-3.95813309927481478661e-04, +-3.54376365041849988782e-04, +-3.12771443255252100824e-04, +-2.71022451625898674193e-04, +-2.29153359651793514821e-04, +-1.87188185523051535668e-04, +-1.45150982357815703074e-04, +-1.03065824429653753224e-04, +-6.09567933943611181980e-05, +-1.88479645237432815287e-05, + 2.32366070450612883841e-05, + 6.52729000375716606440e-05, + 1.07236940739442618243e-04, + 1.49104816654926491124e-04, + 1.90852690119197040226e-04, + 2.32456811856789096653e-04, + 2.73893534477760703088e-04, + 3.15139325904901243872e-04, + 3.56170782723636393866e-04, + 3.96964643447348004834e-04, + 4.37497801690561933553e-04, + 4.77747319242539513363e-04, + 5.17690439033898983090e-04, + 5.57304597988927475152e-04, + 5.96567439756349820155e-04, + 6.35456827311364227072e-04, + 6.73950855421827322786e-04, + 7.12027862971859829694e-04, + 7.49666445135031877037e-04, + 7.86845465391861000233e-04, + 8.23544067383306889127e-04, + 8.59741686594572016369e-04, + 8.95418061862311427494e-04, + 9.30553246699131696683e-04, + 9.65127620428410772438e-04, + 9.99121899124090018587e-04, + 1.03251714634870848247e-03, + 1.06529478368399947198e-03, + 1.09743660104794104639e-03, + 1.12892476679308227140e-03, + 1.15974183757998469332e-03, + 1.18987076802038013908e-03, + 1.21929492008520171109e-03, + 1.24799807227183364583e-03, + 1.27596442852571370294e-03, + 1.30317862691138467227e-03, + 1.32962574802824510904e-03, + 1.35529132316640921890e-03, + 1.38016134219821656921e-03, + 1.40422226120109406612e-03, + 1.42746100980768492357e-03, + 1.44986499827917236088e-03, + 1.47142212429823100381e-03, + 1.49212077947745262729e-03, + 1.51194985558042080918e-03, + 1.53089875045162937886e-03, + 1.54895737365219089698e-03, + 1.56611615179862813038e-03, + 1.58236603360162059878e-03, + 1.59769849460209630194e-03, + 1.61210554160250824594e-03, + 1.62557971679072794415e-03, + 1.63811410155455141995e-03, + 1.64970231998493792151e-03, + 1.66033854206613972274e-03, + 1.67001748655128297305e-03, + 1.67873442352191011920e-03, + 1.68648517663034331823e-03, + 1.69326612502385489591e-03, + 1.69907420494976057514e-03, + 1.70390691104087862832e-03, + 1.70776229728072394785e-03, + 1.71063897764836807952e-03, + 1.71253612644269893883e-03, + 1.71345347828618104098e-03, + 1.71339132780851089409e-03, + 1.71235052901041605485e-03, + 1.71033249430839581935e-03, + 1.70733919326115121499e-03, + 1.70337315097866446277e-03, + 1.69843744621518731933e-03, + 1.69253570914738513120e-03, + 1.68567211883928003494e-03, + 1.67785140039562329257e-03, + 1.66907882180561645095e-03, + 1.65936019047902743109e-03, + 1.64870184947697967330e-03, + 1.63711067343976380412e-03, + 1.62459406421430947211e-03, + 1.61115994618396237217e-03, + 1.59681676130369741735e-03, + 1.58157346384365333700e-03, + 1.56543951484419598813e-03, + 1.54842487628618539174e-03, + 1.53054000497979212497e-03, + 1.51179584617556041562e-03, + 1.49220382690190903063e-03, + 1.47177584903268165312e-03, + 1.45052428208925355928e-03, + 1.42846195578139154199e-03, + 1.40560215229139080610e-03, + 1.38195859830608975584e-03, + 1.35754545680155853417e-03, + 1.33237731858531225151e-03, + 1.30646919360115246027e-03, + 1.27983650200173999789e-03, + 1.25249506499428768340e-03, + 1.22446109546453757271e-03, + 1.19575118838507522302e-03, + 1.16638231101316865689e-03, + 1.13637179288388632040e-03, + 1.10573731560490210422e-03, + 1.07449690245847175561e-03, + 1.04266890781677537894e-03, + 1.01027200637724160967e-03, + 9.77325182223491746580e-04, + 9.43847717718836014267e-04, + 9.09859182238561756129e-04, + 8.75379420747673811856e-04, + 8.40428542230697460044e-04, + 8.05026907980306420144e-04, + 7.69195119751593810696e-04, + 7.32954007788833667922e-04, + 6.96324618731728513937e-04, + 6.59328203408161448926e-04, + 6.21986204520240414974e-04, + 5.84320244231672147536e-04, + 5.46352111662109520517e-04, + 5.08103750297240336353e-04, + 4.69597245320941603965e-04, + 4.30854810877143471967e-04, + 3.91898777268710394022e-04, + 3.52751578100453573074e-04, + 3.13435737374358550089e-04, + 2.73973856543509894194e-04, + 2.34388601532805235282e-04, + 1.94702689733898895181e-04, + 1.54938876981224293557e-04, + 1.15119944517208389599e-04, + 7.52686859541390425104e-05, + 3.54078942394808599795e-05, +-4.43965136725644293991e-06, +-4.42511982989445055948e-05, +-8.40040336590952227153e-05, +-1.23675497166556415483e-04, +-1.63242994059274422816e-04, +-2.02684007949782501144e-04, +-2.41976113625108971150e-04, +-2.81096989783838162574e-04, +-3.20024431703046653274e-04, +-3.58736363828217243860e-04, +-3.97210852278301535575e-04, +-4.35426117259783847756e-04, +-4.73360545382079051305e-04, +-5.10992701867309432294e-04, +-5.48301342648169556804e-04, +-5.85265426346414513459e-04, +-6.21864126125226549316e-04, +-6.58076841409443590199e-04, +-6.93883209466395465582e-04, +-7.29263116841149562630e-04, +-7.64196710639690078223e-04, +-7.98664409653720487083e-04, +-8.32646915320844871987e-04, +-8.66125222514040646153e-04, +-8.99080630154340944109e-04, +-9.31494751640883481870e-04, +-9.63349525092406142567e-04, +-9.94627223394778684981e-04, +-1.02531046404839951310e-03, +-1.05538221881074458820e-03, +-1.08482582312822528441e-03, +-1.11362498535213291090e-03, +-1.14176379573408177427e-03, +-1.16922673519527877718e-03, +-1.19599868386546836010e-03, +-1.22206492938624691758e-03, +-1.24741117497479086888e-03, +-1.27202354724320165595e-03, +-1.29588860376930693416e-03, +-1.31899334041485176428e-03, +-1.34132519838702510620e-03, +-1.36287207103959304329e-03, +-1.38362231040987894090e-03, +-1.40356473348816814667e-03, +-1.42268862821608036220e-03, +-1.44098375921079607451e-03, +-1.45844037321212166396e-03, +-1.47504920424929150333e-03, +-1.49080147852505740143e-03, +-1.50568891901449236279e-03, +-1.51970374977587058263e-03, +-1.53283869997163850300e-03, +-1.54508700759743169105e-03, +-1.55644242291698388023e-03, +-1.56689921160158636589e-03, +-1.57645215757227954816e-03, +-1.58509656554349596252e-03, +-1.59282826326696629569e-03, +-1.59964360347482673595e-03, +-1.60553946552108848557e-03, +-1.61051325672077034167e-03, +-1.61456291338620840613e-03, +-1.61768690156018470419e-03, +-1.61988421744570839506e-03, +-1.62115438753249706261e-03, +-1.62149746842027214430e-03, +-1.62091404633929480651e-03, +-1.61940523636864598667e-03, +-1.61697268135293863688e-03, +-1.61361855051833538548e-03, +-1.60934553778894714506e-03, +-1.60415685980480290408e-03, +-1.59805625364277783043e-03, +-1.59104797424202554224e-03, +-1.58313679153566032841e-03, +-1.57432798729054113616e-03, +-1.56462735165729103538e-03, +-1.55404117943255706651e-03, +-1.54257626603623507200e-03, +-1.53023990320586564598e-03, +-1.51703987441107932509e-03, +-1.50298444999091796934e-03, +-1.48808238201701193738e-03, +-1.47234289888582359565e-03, +-1.45577569964323665606e-03, +-1.43839094804500198903e-03, +-1.42019926635660867151e-03, +-1.40121172889639514399e-03, +-1.38143985532579059369e-03, +-1.36089560369062070010e-03, +-1.33959136321799648049e-03, +-1.31753994687265748795e-03, +-1.29475458367754288694e-03, +-1.27124891080319826590e-03, +-1.24703696543038513624e-03, +-1.22213317639110834699e-03, +-1.19655235559304484218e-03, +-1.17030968923203648052e-03, +-1.14342072879827219220e-03, +-1.11590138188130184350e-03, +-1.08776790277930086870e-03, +-1.05903688291816215454e-03, +-1.02972524108603069419e-03, +-9.99850213489021427335e-04, +-9.69429343633939504844e-04, +-9.38480472043964680448e-04, +-9.07021725813329186133e-04, +-8.75071508006883031112e-04, +-8.42648486911279294594e-04, +-8.09771585143337466368e-04, +-7.76459968622407611070e-04, +-7.42733035413201104179e-04, +-7.08610404445038041289e-04, +-6.74111904114616314332e-04, +-6.39257560778936587825e-04, +-6.04067587144468801964e-04, +-5.68562370559859918927e-04, +-5.32762461218706014771e-04, +-4.96688560279258763987e-04, +-4.60361507907912782377e-04, +-4.23802271253376780860e-04, +-3.87031932358470730920e-04, +-3.50071676016493139785e-04, +-3.12942777579159074532e-04, +-2.75666590723110279098e-04, +-2.38264535182076194354e-04, +-2.00758084451451004676e-04, +-1.63168753473010485957e-04, +-1.25518086305888461329e-04, +-8.78276437918047763126e-05, +-5.01189912206633324926e-05, +-1.24136860045527507159e-05, + 2.52667346337536352944e-05, + 6.29007659498319457100e-05, + 1.00466947938114190518e-04, + 1.37943877556209900086e-04, + 1.75310220906359231921e-04, + 2.12544725367042178004e-04, + 2.49626231667856310695e-04, + 2.86533685900810760391e-04, + 3.23246151461219666419e-04, + 3.59742820911436455861e-04, + 3.96003027760712372068e-04, + 4.32006258154472920323e-04, + 4.67732162466665663501e-04, + 5.03160566788037619604e-04, + 5.38271484304469029561e-04, + 5.73045126558938025356e-04, + 6.07461914590199476491e-04, + 6.41502489942463185145e-04, + 6.75147725539870118862e-04, + 7.08378736419115317274e-04, + 7.41176890315008965633e-04, + 7.73523818092431607665e-04, + 8.05401424019106036527e-04, + 8.36791895873423112462e-04, + 8.67677714881635517297e-04, + 8.98041665478958536263e-04, + 9.27866844889067626453e-04, + 9.57136672516743498666e-04, + 9.85834899148405139485e-04, + 1.01394561595543404760e-03, + 1.04145326329548363296e-03, + 1.06834263930647441546e-03, + 1.09459890828899372543e-03, + 1.12020760887248218077e-03, + 1.14515466196026915839e-03, + 1.16942637844957234711e-03, + 1.19300946672199316770e-03, + 1.21589103990064808375e-03, + 1.23805862286953697812e-03, + 1.25950015905194477768e-03, + 1.28020401694373142133e-03, + 1.30015899639822005152e-03, + 1.31935433465907368637e-03, + 1.33777971213847393650e-03, + 1.35542525793661992536e-03, + 1.37228155510049436815e-03, + 1.38833964561861015856e-03, + 1.40359103514923078820e-03, + 1.41802769747961950574e-03, + 1.43164207871396926761e-03, + 1.44442710118785071390e-03, + 1.45637616710717282889e-03, + 1.46748316190982897207e-03, + 1.47774245734831524007e-03, + 1.48714891429181411860e-03, + 1.49569788524642525128e-03, + 1.50338521659217202661e-03, + 1.51020725053600747730e-03, + 1.51616082677973940986e-03, + 1.52124328390220494439e-03, + 1.52545246045525904888e-03, + 1.52878669577304190583e-03, + 1.53124483049437549141e-03, + 1.53282620679826551459e-03, + 1.53353066835256834737e-03, + 1.53335855997613302801e-03, + 1.53231072701479021855e-03, + 1.53038851443190564161e-03, + 1.52759376561413247157e-03, + 1.52392882089336643460e-03, + 1.51939651578598348275e-03, + 1.51400017895056589190e-03, + 1.50774362986558999739e-03, + 1.50063117622853013297e-03, + 1.49266761107828566796e-03, + 1.48385820964260146428e-03, + 1.47420872591265969889e-03, + 1.46372538894702294843e-03, + 1.45241489890715028306e-03, + 1.44028442282717193852e-03, + 1.42734159012037307990e-03, + 1.41359448782537428478e-03, + 1.39905165559475546354e-03, + 1.38372208042934524870e-03, + 1.36761519116132632817e-03, + 1.35074085268957954850e-03, + 1.33310935997071780372e-03, + 1.31473143176951009180e-03, + 1.29561820417240587851e-03, + 1.27578122386814139279e-03, + 1.25523244119940383980e-03, + 1.23398420298978994322e-03, + 1.21204924515017141255e-03, + 1.18944068506927815715e-03, + 1.16617201379247414916e-03, + 1.14225708799397369063e-03, + 1.11771012174662520873e-03, + 1.09254567809480241866e-03, + 1.06677866043477544145e-03, + 1.04042430370825892544e-03, + 1.01349816541371835939e-03, + 9.86016116441160682393e-04, + 9.57994331735642526242e-04, + 9.29449280794978792072e-04, + 9.00397718007248429838e-04, + 8.70856672833736898155e-04, + 8.40843439843083260109e-04, + 8.10375568602425999827e-04, + 7.79470853431471315254e-04, + 7.48147323025479091436e-04, + 7.16423229952991972615e-04, + 6.84317040034933634675e-04, + 6.51847421610750755311e-04, + 6.19033234697776140604e-04, + 5.85893520050684464551e-04, + 5.52447488126856715678e-04, + 5.18714507964034747881e-04, + 4.84714095977265707355e-04, + 4.50465904680799719868e-04, + 4.15989711342059980889e-04, + 3.81305406573980180604e-04, + 3.46432982872289069957e-04, + 3.11392523104614979499e-04, + 2.76204188957184101297e-04, + 2.40888209347176124927e-04, + 2.05464868805964193327e-04, + 1.69954495840752130374e-04, + 1.34377451281002371951e-04, + 9.87541166164100474301e-05, + 6.31048823327933465369e-05, + 2.74501362534655310964e-05, +-8.18974810873998083655e-06, +-4.37944231806596304514e-05, +-7.93435789334627901382e-05, +-1.14816954455838874283e-04, +-1.50194349489415440680e-04, +-1.85455635919215376531e-04, +-2.20580769213464333118e-04, +-2.55549799805626501933e-04, +-2.90342884412502183315e-04, +-3.24940297281641648271e-04, +-3.59322441362583172488e-04, +-3.93469859394135197499e-04, +-4.27363244902898627587e-04, +-4.60983453105939474694e-04, +-4.94311511711763339541e-04, +-5.27328631613451729448e-04, +-5.60016217467949450198e-04, +-5.92355878155555572520e-04, +-6.24329437113732110647e-04, +-6.55918942539445706461e-04, +-6.87106677454311985491e-04, +-7.17875169626881314694e-04, +-7.48207201346719435846e-04, +-7.78085819044304792189e-04, +-8.07494342752076792701e-04, +-8.36416375400828135574e-04, +-8.64835811946538645517e-04, +-8.92736848322267452678e-04, +-9.20103990210890628799e-04, +-9.46922061632605917975e-04, +-9.73176213343664533485e-04, +-9.98851931040956823177e-04, +-1.02393504336819934561e-03, +-1.04841172971923139896e-03, +-1.07226852783420443203e-03, +-1.09549234118443920144e-03, +-1.11807044614193923544e-03, +-1.13999049892964587558e-03, +-1.16124054234865384944e-03, +-1.18180901227872168710e-03, +-1.20168474394853771157e-03, +-1.22085697797251154818e-03, +-1.23931536615045907561e-03, +-1.25704997702758545543e-03, +-1.27405130121131457410e-03, +-1.29031025644257271376e-03, +-1.30581819241839158958e-03, +-1.32056689536371330701e-03, +-1.33454859234959002240e-03, +-1.34775595535592540575e-03, +-1.36018210507637331112e-03, +-1.37182061446355658269e-03, +-1.38266551201276610521e-03, +-1.39271128478253266095e-03, +-1.40195288115051316068e-03, +-1.41038571330337893055e-03, +-1.41800565945951256505e-03, +-1.42480906582346297101e-03, +-1.43079274827126803893e-03, +-1.43595399376592503145e-03, +-1.44029056150241801561e-03, +-1.44380068378189055887e-03, +-1.44648306661469805943e-03, +-1.44833689005223324210e-03, +-1.44936180824753674604e-03, +-1.44955794924493913504e-03, +-1.44892591449903443759e-03, +-1.44746677812355745846e-03, +-1.44518208587075661954e-03, +-1.44207385384213272739e-03, +-1.43814456693148930849e-03, +-1.43339717700140213338e-03, +-1.42783510079440463525e-03, +-1.42146221758030649220e-03, +-1.41428286654118624127e-03, +-1.40630184389584447259e-03, +-1.39752439976549721300e-03, +-1.38795623478277815703e-03, +-1.37760349644625219347e-03, +-1.36647277522266587767e-03, +-1.35457110039932790077e-03, +-1.34190593568940877423e-03, +-1.32848517459267919869e-03, +-1.31431713551467539529e-03, +-1.29941055664714501944e-03, +-1.28377459061317523298e-03, +-1.26741879887994307423e-03, +-1.25035314594268138870e-03, +-1.23258799328333345374e-03, +-1.21413409310764655244e-03, +-1.19500258186405750038e-03, +-1.17520497354900595698e-03, +-1.15475315280194222242e-03, +-1.13365936779458078426e-03, +-1.11193622291853085743e-03, +-1.08959667127568366092e-03, +-1.06665400697560715411e-03, +-1.04312185724514980105e-03, +-1.01901417435390105257e-03, +-9.94345227361283657413e-04, +-9.69129593689562135808e-04, +-9.43382150527953696438e-04, +-9.17118066072678981768e-04, +-8.90352790608596130796e-04, +-8.63102047436990239826e-04, +-8.35381823655337134304e-04, +-8.07208360794198893050e-04, +-7.78598145316998046898e-04, +-7.49567898987517377586e-04, +-7.20134569111909820377e-04, +-6.90315318659743713467e-04, +-6.60127516270525181372e-04, +-6.29588726151278908240e-04, +-5.98716697871097070296e-04, +-5.67529356058555788274e-04, +-5.36044790008002544103e-04, +-5.04281243200707597792e-04, +-4.72257102746954785574e-04, +-4.39990888755171366542e-04, +-4.07501243634276436468e-04, +-3.74806921335187493566e-04, +-3.41926776538259847692e-04, +-3.08879753792126179272e-04, +-2.75684876610755174881e-04, +-2.42361236534725988821e-04, +-2.08927982163283266397e-04, +-1.75404308162909107092e-04, +-1.41809444259267161117e-04, +-1.08162644218829444537e-04, +-7.44831748259327543465e-05, +-4.07903048621291604812e-05, +-7.10329409388432176530e-06, + 2.65586177250463047000e-05, + 6.01762218302914552804e-05, + 9.37303513963725428056e-05, + 1.27201892452491753700e-04, + 1.60571794759468988462e-04, + 1.93821082639647593359e-04, + 2.26930865755815396869e-04, + 2.59882349831586946780e-04, + 2.92656847307690018770e-04, + 3.25235787928080961190e-04, + 3.57600729249660839303e-04, + 3.89733367070243196494e-04, + 4.21615545768098812836e-04, + 4.53229268547830762767e-04, + 4.84556707586572316029e-04, + 5.15580214074757778309e-04, + 5.46282328146297608759e-04, + 5.76645788691256379679e-04, + 6.06653543047546025234e-04, + 6.36288756564360792091e-04, + 6.65534822032997838703e-04, + 6.94375368979479354152e-04, + 7.22794272813854533910e-04, + 7.50775663831016056536e-04, + 7.78303936058092520403e-04, + 8.05363755943419535807e-04, + 8.31940070882321368144e-04, + 8.58018117574883202973e-04, + 8.83583430211330928851e-04, + 9.08621848479962369513e-04, + 9.33119525393878300641e-04, + 9.57062934931689960998e-04, + 9.80438879488230432754e-04, + 1.00323449713107977488e-03, + 1.02543726865899926387e-03, + 1.04703502445835567626e-03, + 1.06801595115381007736e-03, + 1.08836859804968565969e-03, + 1.10808188335835252139e-03, + 1.12714510021262159095e-03, + 1.14554792245836578428e-03, + 1.16328041022489597940e-03, + 1.18033301526926739412e-03, + 1.19669658609257542788e-03, + 1.21236237282488557888e-03, + 1.22732203187633261143e-03, + 1.24156763035219172911e-03, + 1.25509165022920821282e-03, + 1.26788699229131874430e-03, + 1.27994697982256044888e-03, + 1.29126536205536050946e-03, + 1.30183631737235691941e-03, + 1.31165445626020235083e-03, + 1.32071482401390893208e-03, + 1.32901290319023448333e-03, + 1.33654461580914787205e-03, + 1.34330632530221187430e-03, + 1.34929483820697367936e-03, + 1.35450740560668671242e-03, + 1.35894172431470653187e-03, + 1.36259593780313340884e-03, + 1.36546863687537654505e-03, + 1.36755886008250635531e-03, + 1.36886609388332716047e-03, + 1.36939027254837260295e-03, + 1.36913177780802522952e-03, + 1.36809143824524986725e-03, + 1.36627052843346185988e-03, + 1.36367076782027457811e-03, + 1.36029431935798012128e-03, + 1.35614378788172988514e-03, + 1.35122221823664079472e-03, + 1.34553309315501787302e-03, + 1.33908033088521731709e-03, + 1.33186828257363392043e-03, + 1.32390172940159678815e-03, + 1.31518587947901410308e-03, + 1.30572636449661312261e-03, + 1.29552923613923372595e-03, + 1.28460096226200824743e-03, + 1.27294842283218667331e-03, + 1.26057890563882179363e-03, + 1.24750010177327374725e-03, + 1.23372010088306036796e-03, + 1.21924738620211555243e-03, + 1.20409082936042593007e-03, + 1.18825968497621972837e-03, + 1.17176358503399751995e-03, + 1.15461253305178279151e-03, + 1.13681689804116217886e-03, + 1.11838740826359175386e-03, + 1.09933514478704010865e-03, + 1.07967153484642012021e-03, + 1.05940834501207096011e-03, + 1.03855767417023879713e-03, + 1.01713194631976918542e-03, + 9.95143903189260560158e-04, + 9.72606596679090784803e-04, + 9.49533381132751461845e-04, + 9.25937905442090168628e-04, + 9.01834104991060562725e-04, + 8.77236193442972891042e-04, + 8.52158654375306323994e-04, + 8.26616232768399242931e-04, + 8.00623926351481181481e-04, + 7.74196976812098437357e-04, + 7.47350860873750573281e-04, + 7.20101281246932219647e-04, + 6.92464157459100611118e-04, + 6.64455616568401037821e-04, + 6.36091983767215129672e-04, + 6.07389772880511497576e-04, + 5.78365676764722234753e-04, + 5.49036557612754723412e-04, + 5.19419437170334677249e-04, + 4.89531486870367453512e-04, + 4.59390017889853828105e-04, + 4.29012471135610442413e-04, + 3.98416407164879030761e-04, + 3.67619496046182284588e-04, + 3.36639507166480267224e-04, + 3.05494298990473505794e-04, + 2.74201808777935912304e-04, + 2.42780042265004216643e-04, + 2.11247063315343980641e-04, + 1.79620983547136846585e-04, + 1.47919951941878261405e-04, + 1.16162144440711673481e-04, + 8.43657535348246083538e-05, + 5.25489778551051491483e-05, + 2.07300117675779430298e-05, +-1.10729650196668325771e-05, +-4.28417978320822792019e-05, +-7.45583673808965783410e-05, +-1.06204600086071425293e-04, +-1.37762478364149087246e-04, +-1.69214050874914927148e-04, +-2.00541442721614891851e-04, +-2.31726865598118244574e-04, +-2.62752627878274269604e-04, +-2.93601144640412165671e-04, +-3.24254947622835021804e-04, +-3.54696695103594577137e-04, +-3.84909181699200184275e-04, +-4.14875348077196936039e-04, +-4.44578290576414924141e-04, +-4.74001270730014352076e-04, +-5.03127724685752076780e-04, +-5.31941272518206861690e-04, +-5.60425727427743720910e-04, +-5.88565104821016545078e-04, +-6.16343631268131183359e-04, +-6.43745753330938032602e-04, +-6.70756146258231328826e-04, +-6.97359722542432612299e-04, +-7.23541640333268576586e-04, +-7.49287311703654272145e-04, +-7.74582410763238315282e-04, +-7.99412881615075860547e-04, +-8.23764946151039185139e-04, +-8.47625111681623221935e-04, +-8.70980178395970995424e-04, +-8.93817246647941095888e-04, +-9.16123724064377706680e-04, +-9.37887332471280203011e-04, +-9.59096114634606271634e-04, +-9.79738440811607448275e-04, +-9.99803015109290834847e-04, +-1.01927888164651272128e-03, +-1.03815543051633853155e-03, +-1.05642240354548912901e-03, +-1.07406989984759745557e-03, +-1.09108838116762723279e-03, +-1.10746867701414018585e-03, +-1.12320198957698577993e-03, +-1.13827989842765417428e-03, +-1.15269436499997502028e-03, +-1.16643773684832734866e-03, +-1.17950275168172556868e-03, +-1.19188254117136706138e-03, +-1.20357063452954798910e-03, +-1.21456096185834725582e-03, +-1.22484785726622159678e-03, +-1.23442606175099434812e-03, +-1.24329072584775926144e-03, +-1.25143741204040113979e-03, +-1.25886209693559965317e-03, +-1.26556117319820459269e-03, +-1.27153145124719456523e-03, +-1.27677016071131685555e-03, +-1.28127495164393639428e-03, +-1.28504389549651746975e-03, +-1.28807548585040771913e-03, +-1.29036863890675851559e-03, +-1.29192269373445381593e-03, +-1.29273741227616803182e-03, +-1.29281297911274461153e-03, +-1.29215000098622341193e-03, +-1.29074950608205050485e-03, +-1.28861294307102769788e-03, +-1.28574217991181470426e-03, +-1.28213950241485154062e-03, +-1.27780761256874805798e-03, +-1.27274962663027619951e-03, +-1.26696907297930137261e-03, +-1.26046988974006066338e-03, +-1.25325642217039056117e-03, +-1.24533341982049493464e-03, +-1.23670603346324884178e-03, +-1.22737981179783643172e-03, +-1.21736069792890478670e-03, +-1.20665502562341490217e-03, +-1.19526951534740743209e-03, +-1.18321127008547502014e-03, +-1.17048777094514431553e-03, +-1.15710687254899267061e-03, +-1.14307679821747196908e-03, +-1.12840613494519497600e-03, +-1.11310382817380736260e-03, +-1.09717917636461301072e-03, +-1.08064182537422016558e-03, +-1.06350176263660047178e-03, +-1.04576931115505939590e-03, +-1.02745512330771390092e-03, +-1.00857017447020984660e-03, +-9.89125756459348273036e-04, +-9.69133470801857087144e-04, +-9.48605221831876478482e-04, +-9.27553209621573911299e-04, +-9.05989922748946536341e-04, +-8.83928130907113245029e-04, +-8.61380877359472856523e-04, +-8.38361471245136369995e-04, +-8.14883479739194086997e-04, +-7.90960720072537894904e-04, +-7.66607251415539741463e-04, +-7.41837366630958413780e-04, +-7.16665583900111865384e-04, +-6.91106638228288503237e-04, +-6.65175472833141076361e-04, +-6.38887230421945938666e-04, +-6.12257244362626436643e-04, +-5.85301029753312320944e-04, +-5.58034274396206606862e-04, +-5.30472829680567778236e-04, +-5.02632701380270412693e-04, +-4.74530040371252698900e-04, +-4.46181133274236403283e-04, +-4.17602393028139700758e-04, +-3.88810349399469656114e-04, +-3.59821639433645487551e-04, +-3.30652997853107073409e-04, +-3.01321247408244021881e-04, +-2.71843289186502834551e-04, +-2.42236092885274642951e-04, +-2.12516687054165319707e-04, +-1.82702149312243965380e-04, +-1.52809596545888838484e-04, +-1.22856175092848034355e-04, +-9.28590509181383036126e-05, +-6.28353997874044387486e-05, +-3.28023974433953014970e-05, +-2.77720979095154411141e-06, + 2.72230169033535440140e-05, + 5.71811657920477271538e-05, + 8.70801592019578094960e-05, + 1.16902968358433966434e-04, + 1.46632623073032026736e-04, + 1.76252221389186882524e-04, + 2.05744939180186014712e-04, + 2.35094039694530468169e-04, + 2.64282883042567088867e-04, + 2.93294935619551385558e-04, + 3.22113779459532194229e-04, + 3.50723121515214011305e-04, + 3.79106802857572401221e-04, + 4.07248807791192634405e-04, + 4.35133272879688717035e-04, + 4.62744495875839806538e-04, + 4.90066944551884237959e-04, + 5.17085265424790572163e-04, + 5.43784292371653644321e-04, + 5.70149055130390425110e-04, + 5.96164787680977456552e-04, + 6.21816936502533586587e-04, + 6.47091168701626482176e-04, + 6.71973380007443560867e-04, + 6.96449702628909074476e-04, + 7.20506512970012593690e-04, + 7.44130439198579488221e-04, + 7.67308368664491478525e-04, + 7.90027455163207908972e-04, + 8.12275126040571966018e-04, + 8.34039089134997737793e-04, + 8.55307339553189088961e-04, + 8.76068166275680644713e-04, + 8.96310158588609247332e-04, + 9.16022212337969966855e-04, + 9.35193536003619163739e-04, + 9.53813656588502287864e-04, + 9.71872425321206783247e-04, + 9.89360023167912576089e-04, + 1.00626696615104373536e-03, + 1.02258411047174220705e-03, + 1.03830265743327931904e-03, + 1.05341415816306632411e-03, + 1.06791051813036243917e-03, + 1.08178400145754450255e-03, + 1.09502723502257035167e-03, + 1.10763321235048616507e-03, + 1.11959529729188916186e-03, + 1.13090722748666861440e-03, + 1.14156311761065294014e-03, + 1.15155746240435427445e-03, + 1.16088513948151006439e-03, + 1.16954141191641532681e-03, + 1.17752193060865497330e-03, + 1.18482273642408174330e-03, + 1.19144026211101582494e-03, + 1.19737133399079663347e-03, + 1.20261317342187467987e-03, + 1.20716339803685892770e-03, + 1.21102002275194891440e-03, + 1.21418146054847906831e-03, + 1.21664652302620073833e-03, + 1.21841442072828740756e-03, + 1.21948476323806070595e-03, + 1.21985755904754564205e-03, + 1.21953321519817120717e-03, + 1.21851253669401512168e-03, + 1.21679672568812116337e-03, + 1.21438738044255738029e-03, + 1.21128649406303441106e-03, + 1.20749645300896710394e-03, + 1.20302003538006298602e-03, + 1.19786040898056927312e-03, + 1.19202112916260414589e-03, + 1.18550613644981912495e-03, + 1.17831975394308238227e-03, + 1.17046668450985027511e-03, + 1.16195200775891173579e-03, + 1.15278117680258848643e-03, + 1.14296001480831705549e-03, + 1.13249471134179986558e-03, + 1.12139181850401392637e-03, + 1.10965824686446259441e-03, + 1.09730126119316579933e-03, + 1.08432847599404177941e-03, + 1.07074785084228674831e-03, + 1.05656768552886740596e-03, + 1.04179661501472100617e-03, + 1.02644360419797825434e-03, + 1.01051794249726128137e-03, + 9.94029238254327297819e-04, + 9.76987412959428496231e-04, + 9.59402695302853094836e-04, + 9.41285615056165433402e-04, + 9.22646996786851249575e-04, + 9.03497953410057892502e-04, + 8.83849879581315145925e-04, + 8.63714444933994722302e-04, + 8.43103587165879497442e-04, + 8.22029504978451252585e-04, + 8.00504650873420757484e-04, + 7.78541723810587853530e-04, + 7.56153661731407702139e-04, + 7.33353633952590140861e-04, + 7.10155033434391397620e-04, + 6.86571468927704795654e-04, + 6.62616757005092820061e-04, + 6.38304913980008450068e-04, + 6.13650147719164789327e-04, + 5.88666849352420377441e-04, + 5.63369584885875388305e-04, + 5.37773086722076747342e-04, + 5.11892245092671863312e-04, + 4.85742099408737208668e-04, + 4.59337829533421374787e-04, + 4.32694746982132956003e-04, + 4.05828286055327270860e-04, + 3.78753994909039224618e-04, + 3.51487526568311297540e-04, + 3.24044629888701042706e-04, + 2.96441140471124468109e-04, + 2.68692971535064537448e-04, + 2.40816104755891792965e-04, + 2.12826581070915530529e-04, + 1.84740491459934620937e-04, + 1.56573967705388389718e-04, + 1.28343173137436734367e-04, + 1.00064293369274724200e-04, + 7.17535270279865756201e-05, + 4.34270764862388947451e-05, + 1.51011386001131606149e-05, +-1.32081045416696524620e-05, +-4.14844948516519899375e-05, +-6.97119074558447989051e-05, +-9.78742598787180241452e-05, +-1.25955521195249200029e-04, +-1.53939721145969320030e-04, +-1.81810959208852370795e-04, +-2.09553413623342002373e-04, +-2.37151350361132772252e-04, +-2.64589132039119191708e-04, +-2.91851226768812584828e-04, +-3.18922216937715912854e-04, +-3.45786807917504923019e-04, +-3.72429836694131806071e-04, +-3.98836280414924259936e-04, +-4.24991264848284251536e-04, +-4.50880072750091832195e-04, +-4.76488152133843997395e-04, +-5.01801124438317467692e-04, +-5.26804792589028771099e-04, +-5.51485148948722817865e-04, +-5.75828383152479162180e-04, +-5.99820889823062712923e-04, +-6.23449276162207780341e-04, +-6.46700369413619538528e-04, +-6.69561224193530326286e-04, +-6.92019129684716838985e-04, +-7.14061616690151953514e-04, +-7.35676464541983651108e-04, +-7.56851707862541919249e-04, +-7.77575643173267975865e-04, +-7.97836835348055277602e-04, +-8.17624123907448297453e-04, +-8.36926629150230058478e-04, +-8.55733758119046612582e-04, +-8.74035210396826049359e-04, +-8.91820983730703649786e-04, +-9.09081379480705491225e-04, +-9.25807007889788277297e-04, +-9.41988793172909236878e-04, +-9.57617978421671824096e-04, +-9.72686130322748202653e-04, +-9.87185143686923052483e-04, +-1.00110724578650659398e-03, +-1.01444500049902323544e-03, +-1.02719131225463187161e-03, +-1.03933942978544770035e-03, +-1.05088294967471814964e-03, +-1.06181581970400955479e-03, +-1.07213234199665663482e-03, +-1.08182717595588814667e-03, +-1.09089534099611235214e-03, +-1.09933221906604130548e-03, +-1.10713355696224189685e-03, +-1.11429546843220921015e-03, +-1.12081443606577282543e-03, +-1.12668731297399537551e-03, +-1.13191132425482891832e-03, +-1.13648406824482742922e-03, +-1.14040351755644074963e-03, +-1.14366801990044438496e-03, +-1.14627629869328028812e-03, +-1.14822745344909417364e-03, +-1.14952095995648801048e-03, +-1.15015667024007182777e-03, +-1.15013481230698852258e-03, +-1.14945598967880415094e-03, +-1.14812118070920518922e-03, +-1.14613173768805766059e-03, +-1.14348938573257991221e-03, +-1.14019622146641639096e-03, +-1.13625471148757692386e-03, +-1.13166769062629166132e-03, +-1.12643835999398341310e-03, +-1.12057028482466340680e-03, +-1.11406739211015104116e-03, +-1.10693396803060797873e-03, +-1.09917465518223384131e-03, +-1.09079444960363011567e-03, +-1.08179869760285343912e-03, +-1.07219309238717466423e-03, +-1.06198367049757311231e-03, +-1.05117680805022224028e-03, +-1.03977921678728496210e-03, +-1.02779793993942468629e-03, +-1.01524034790259534006e-03, +-1.00211413373173349912e-03, +-9.88427308454093486029e-04, +-9.74188196205089573972e-04, +-9.59405429189479725879e-04, +-9.44087942471171881302e-04, +-9.28244968594481583042e-04, +-9.11886032040267347637e-04, +-8.95020943520216660794e-04, +-8.77659794112658803340e-04, +-8.59812949243432501564e-04, +-8.41491042515366753467e-04, +-8.22704969390060901480e-04, +-8.03465880725650455872e-04, +-7.83785176174564036933e-04, +-7.63674497444838786334e-04, +-7.43145721429159210325e-04, +-7.22210953206033133382e-04, +-7.00882518916405724239e-04, +-6.79172958520581071529e-04, +-6.57095018439407888011e-04, +-6.34661644084213061485e-04, +-6.11885972279487986777e-04, +-5.88781323583261557639e-04, +-5.65361194509265800601e-04, +-5.41639249655565977945e-04, +-5.17629313744230818220e-04, +-4.93345363576712316218e-04, +-4.68801519909265351684e-04, +-4.44012039254113445412e-04, +-4.18991305609581871604e-04, +-3.93753822125390276140e-04, +-3.68314202707166818418e-04, +-3.42687163565271075971e-04, +-3.16887514712763855660e-04, +-2.90930151417445159289e-04, +-2.64830045612876889462e-04, +-2.38602237273343473298e-04, +-2.12261825757707105287e-04, +-1.85823961127170580662e-04, +-1.59303835441746181271e-04, +-1.32716674040886725835e-04, +-1.06077726812662281766e-04, +-7.94022594569434886792e-05, +-5.27055447474102572785e-05, +-2.60028537974079832656e-05, + 6.90552665357526391948e-07, + 2.73594330103061967382e-05, + 5.39885733967170351332e-05, + 8.05627964425661594961e-05, + 1.07066969865010061308e-04, + 1.33486015086968664006e-04, + 1.59804915805331028064e-04, + 1.86008726516105670021e-04, + 2.12082580990773740320e-04, + 2.38011700700330354344e-04, + 2.63781403181116572490e-04, + 2.89377110338554649482e-04, + 3.14784356683413138554e-04, + 3.39988797496425883184e-04, + 3.64976216916463994978e-04, + 3.89732535947750265582e-04, + 4.14243820381606571868e-04, + 4.38496288628281076592e-04, + 4.62476319454435203307e-04, + 4.86170459622126181851e-04, + 5.09565431424569481242e-04, + 5.32648140115051980069e-04, + 5.55405681224405362376e-04, + 5.77825347763134713856e-04, + 5.99894637304163990538e-04, + 6.21601258942250942466e-04, + 6.42933140126212003714e-04, + 6.63878433360159405340e-04, + 6.84425522770043840912e-04, + 7.04563030531877763050e-04, + 7.24279823158044638691e-04, + 7.43565017638393201127e-04, + 7.62407987432378152909e-04, + 7.80798368309418419284e-04, + 7.98726064033930863682e-04, + 8.16181251892069835503e-04, + 8.33154388057122906319e-04, + 8.49636212790671986259e-04, + 8.65617755476581307410e-04, + 8.81090339485367181512e-04, + 8.96045586865937618293e-04, + 9.10475422862473118477e-04, + 9.24372080253872034986e-04, + 9.37728103513655198570e-04, + 9.50536352787640661209e-04, + 9.62790007687844002875e-04, + 9.74482570900335833865e-04, + 9.85607871605071426957e-04, + 9.96160068706062381411e-04, + 1.00613365387018584458e-03, + 1.01552345437301723939e-03, + 1.02432463575029123783e-03, + 1.03253270425362076584e-03, + 1.04014350910924206067e-03, + 1.04715324457870439731e-03, + 1.05355845182046950481e-03, + 1.05935602055159754607e-03, + 1.06454319050862085752e-03, + 1.06911755270714466277e-03, + 1.07307705049946027105e-03, + 1.07641998042986067850e-03, + 1.07914499288730056890e-03, + 1.08125109255521835092e-03, + 1.08273763865848467007e-03, + 1.08360434500746525242e-03, + 1.08385127983937892479e-03, + 1.08347886545726241128e-03, + 1.08248787766686694993e-03, + 1.08087944501203837150e-03, + 1.07865504780918649262e-03, + 1.07581651698158585126e-03, + 1.07236603269432462238e-03, + 1.06830612279092259861e-03, + 1.06363966103263283235e-03, + 1.05836986514164428132e-03, + 1.05250029464946915324e-03, + 1.04603484855193525419e-03, + 1.03897776277230035648e-03, + 1.03133360743408474848e-03, + 1.02310728394540504521e-03, + 1.01430402189651124034e-03, + 1.00492937577281401564e-03, + 9.94989221484924961370e-04, + 9.84489752718325020209e-04, + 9.73437477104688721023e-04, + 9.61839212217239581185e-04, + 9.49702081392630992861e-04, + 9.37033509381853305618e-04, + 9.23841217832837061606e-04, + 9.10133220607474814970e-04, + 8.95917818935899651529e-04, + 8.81203596410921950570e-04, + 8.65999413825665684263e-04, + 8.50314403857379305478e-04, + 8.34157965600880913111e-04, + 8.17539758954521347464e-04, + 8.00469698862303906568e-04, + 7.82957949415445273941e-04, + 7.65014917816926143072e-04, + 7.46651248212579373396e-04, + 7.27877815392361849668e-04, + 7.08705718365645193080e-04, + 6.89146273814000625765e-04, + 6.69211009425744215821e-04, + 6.48911657115913286138e-04, + 6.28260146135471188311e-04, + 6.07268596074486536641e-04, + 5.85949309762400622446e-04, + 5.64314766070410454152e-04, + 5.42377612619488803404e-04, + 5.20150658398866173708e-04, + 4.97646866298883240425e-04, + 4.74879345562723338432e-04, + 4.51861344161378882325e-04, + 4.28606241096286539726e-04, + 4.05127538634095468555e-04, + 3.81438854478096842863e-04, + 3.57553913880674515205e-04, + 3.33486541701773307050e-04, + 3.09250654417399727884e-04, + 2.84860252083193681537e-04, + 2.60329410257538723227e-04, + 2.35672271888895488046e-04, + 2.10903039172021308919e-04, + 1.86035965377764900275e-04, + 1.61085346661131244934e-04, + 1.36065513852313800395e-04, + 1.10990824235409179101e-04, + 8.58756533195474008359e-05, + 6.07343866069771497630e-05, + 3.55814113632548241332e-05, + 1.04311083936491137648e-05, +-1.47021561691009029690e-05, +-3.98040390611660384779e-05, +-6.48602280634465855726e-05, +-8.98564501522054298295e-05, +-1.14778479619700933784e-04, +-1.39612146160650535745e-04, +-1.64343342919338251907e-04, +-1.88958034493250977151e-04, +-2.13442264888526227673e-04, +-2.37782165422681623619e-04, +-2.61963962570504571396e-04, +-2.85973985747828166135e-04, +-3.09798675029788052153e-04, +-3.33424588798768176210e-04, +-3.56838411317501760876e-04, +-3.80026960223441392147e-04, +-4.02977193940015090100e-04, +-4.25676219000628282361e-04, +-4.48111297281314371974e-04, +-4.70269853137984079287e-04, +-4.92139480444267647663e-04, +-5.13707949526006615523e-04, +-5.34963213988673739162e-04, +-5.55893417433529703382e-04, +-5.76486900059300605252e-04, +-5.96732205145306224443e-04, +-6.16618085412612730242e-04, +-6.36133509259657436812e-04, +-6.55267666868877677634e-04, +-6.74009976180998601758e-04, +-6.92350088733664401595e-04, +-7.10277895361227803138e-04, +-7.27783531752448681514e-04, +-7.44857383863318112810e-04, +-7.61490093181871590539e-04, +-7.77672561841829005844e-04, +-7.93395957582958798182e-04, +-8.08651718554891877494e-04, +-8.23431557962021757127e-04, +-8.37727468546858129381e-04, +-8.51531726909685537062e-04, +-8.64836897661822056639e-04, +-8.77635837410563617207e-04, +-8.89921698573554803210e-04, +-9.01687933020594461521e-04, +-9.12928295540940920420e-04, +-9.23636847134304576554e-04, +-9.33807958123846902805e-04, +-9.43436311089422422263e-04, +-9.52516903619767376157e-04, +-9.61045050882069389411e-04, +-9.69016388007670759208e-04, +-9.76426872292704612667e-04, +-9.83272785212578647254e-04, +-9.89550734249325901482e-04, +-9.95257654530941207952e-04, +-1.00039081028195663871e-03, +-1.00494779608456845030e-03, +-1.00892653794981169979e-03, +-1.01232529419831556589e-03, +-1.01514265615029741774e-03, +-1.01737754862461565394e-03, +-1.01902923024675272530e-03, +-1.02009729356571554777e-03, +-1.02058166497997625417e-03, +-1.02048260447267446181e-03, +-1.01980070515639048741e-03, +-1.01853689262794660890e-03, +-1.01669242413375375544e-03, +-1.01426888754638775715e-03, +-1.01126820015312980997e-03, +-1.00769260725730729240e-03, +-1.00354468059351414899e-03, +-9.98827316557644555306e-04, +-9.93543734253049580854e-04, +-9.87697473353981499761e-04, +-9.81292391787839295494e-04, +-9.74332663237617449883e-04, +-9.66822774466185295462e-04, +-9.58767522464084383411e-04, +-9.50172011422648630022e-04, +-9.41041649534305781055e-04, +-9.31382145622106083493e-04, +-9.21199505600451087374e-04, +-9.10500028769397197308e-04, +-8.99290303944565551711e-04, +-8.87577205425210550085e-04, +-8.75367888802800289162e-04, +-8.62669786612691802744e-04, +-8.49490603831530729194e-04, +-8.35838313223061083780e-04, +-8.21721150535182709787e-04, +-8.07147609551117617942e-04, +-7.92126436997654084955e-04, +-7.76666627313488014232e-04, +-7.60777417280939101916e-04, +-7.44468280523723365504e-04, +-7.27748921874987655251e-04, +-7.10629271617923522104e-04, +-6.93119479603028368700e-04, +-6.75229909245266381526e-04, +-6.56971131404673501161e-04, +-6.38353918154137712354e-04, +-6.19389236437722294319e-04, +-6.00088241623651132139e-04, +-5.80462270955458170714e-04, +-5.60522836905225714695e-04, +-5.40281620432863491331e-04, +-5.19750464155060228240e-04, +-4.98941365428588355299e-04, +-4.77866469351204028841e-04, +-4.56538061684547645785e-04, +-4.34968561703376289593e-04, +-4.13170514974962768510e-04, +-3.91156586073003096314e-04, +-3.68939551230221718554e-04, +-3.46532290933948842939e-04, +-3.23947782468940600423e-04, +-3.01199092411757270073e-04, +-2.78299369081070745603e-04, +-2.55261834948078349290e-04, +-2.32099779011821834730e-04, +-2.08826549143248190420e-04, +-1.85455544402832308909e-04, +-1.62000207336008043239e-04, +-1.38474016250865456347e-04, +-1.14890477482541928256e-04, +-9.12631176487416705644e-05, +-6.76054759008182519671e-05, +-4.39310961748295172825e-05, +-2.02535194471571128164e-05, + 3.41372400124625000704e-06, + 2.70571223073466086593e-05, + 5.06631897304295544804e-05, + 7.42184743349819369285e-05, + 9.77095656468657952631e-05, + 1.21123102278798669873e-04, + 1.44445779520586308278e-04, + 1.67664356890219484351e-04, + 1.90765665640995252163e-04, + 2.13736616220833977771e-04, + 2.36564205679401197901e-04, + 2.59235525018876972973e-04, + 2.81737766484226406522e-04, + 3.04058230788827618760e-04, + 3.26184334271549601202e-04, + 3.48103615980852423070e-04, + 3.69803744682461728397e-04, + 3.91272525786277706496e-04, + 4.12497908188799451267e-04, + 4.33467991027201371770e-04, + 4.54171030341281908426e-04, + 4.74595445639567638761e-04, + 4.94729826365895158924e-04, + 5.14562938262885013335e-04, + 5.34083729628744225196e-04, + 5.53281337463915729412e-04, + 5.72145093504289737989e-04, + 5.90664530137289503671e-04, + 6.08829386198019386657e-04, + 6.26629612641936822176e-04, + 6.44055378091031721643e-04, + 6.61097074250476457111e-04, + 6.77745321192732130128e-04, + 6.93990972506254143876e-04, + 7.09825120305858456998e-04, + 7.25239100102302775876e-04, + 7.40224495528040305620e-04, + 7.54773142916835191284e-04, + 7.68877135734856572910e-04, + 7.82528828860328353779e-04, + 7.95720842710183188552e-04, + 8.08446067210845170301e-04, + 8.20697665611487049177e-04, + 8.32469078137362318050e-04, + 8.43754025481521134980e-04, + 8.54546512132969143805e-04, + 8.64840829539518206326e-04, + 8.74631559103689298733e-04, + 8.83913575010109465319e-04, + 8.92682046882942626005e-04, + 9.00932442271964615751e-04, + 9.08660528966120082696e-04, + 9.15862377133194608195e-04, + 9.22534361284796920223e-04, + 9.28673162065495115362e-04, + 9.34275767865342418421e-04, + 9.39339476254983990131e-04, + 9.43861895242741424407e-04, + 9.47840944353070817725e-04, + 9.51274855525978185397e-04, + 9.54162173837028583338e-04, + 9.56501758037713121358e-04, + 9.58292780916003973483e-04, + 9.59534729477142054460e-04, + 9.60227404944570409398e-04, + 9.60370922581348226629e-04, + 9.59965711332194985249e-04, + 9.59012513286591154055e-04, + 9.57512382963391348902e-04, + 9.55466686417531189252e-04, + 9.52877100169494421419e-04, + 9.49745609958331992936e-04, + 9.46074509319091115633e-04, + 9.41866397985661216001e-04, + 9.37124180120078799534e-04, + 9.31851062369440700205e-04, + 9.26050551751833660001e-04, + 9.19726453372463970473e-04, + 9.12882867971548752663e-04, + 9.05524189305535872827e-04, + 8.97655101363274135137e-04, + 8.89280575418887665219e-04, + 8.80405866923194158763e-04, + 8.71036512235576058406e-04, + 8.61178325198361390401e-04, + 8.50837393555776847279e-04, + 8.40020075219696923594e-04, + 8.28732994384399467708e-04, + 8.16983037492857960653e-04, + 8.04777349056774379821e-04, + 7.92123327333073561259e-04, + 7.79028619859369530695e-04, + 7.65501118851119729744e-04, + 7.51548956463218408713e-04, + 7.37180499918858086333e-04, + 7.22404346508583494919e-04, + 7.07229318462486390359e-04, + 6.91664457698695713146e-04, + 6.75719020451036778314e-04, + 6.59402471779397571228e-04, + 6.42724479965596788740e-04, + 6.25694910798709228936e-04, + 6.08323821752458095656e-04, + 5.90621456058646517734e-04, + 5.72598236680009584250e-04, + 5.54264760185757283245e-04, + 5.35631790533803520474e-04, + 5.16710252763027825043e-04, + 4.97511226599373773682e-04, + 4.78045939979498718704e-04, + 4.58325762495759227340e-04, + 4.38362198766371338136e-04, + 4.18166881734467700462e-04, + 3.97751565900299880723e-04, + 3.77128120490046988070e-04, + 3.56308522565547207937e-04, + 3.35304850078806907388e-04, + 3.14129274875331928468e-04, + 2.92794055650324276316e-04, + 2.71311530861826331624e-04, + 2.49694111604887615530e-04, + 2.27954274450881122505e-04, + 2.06104554256081410344e-04, + 1.84157536943679384566e-04, + 1.62125852263222448597e-04, + 1.40022166532036894350e-04, + 1.17859175362270858218e-04, + 9.56495963781261012088e-05, + 7.34061619272917469060e-05, + 5.11416117907757448134e-05, + 2.88686858953092775838e-05, + 6.60011703245474962544e-06, +-1.56513764112641267506e-05, +-3.78730977094623622752e-05, +-6.00523790315616779367e-05, +-8.21765886552515715992e-05, +-1.04233138151800156347e-04, +-1.26209489539367793924e-04, +-1.48093162401345972059e-04, +-1.69871740964736657117e-04, +-1.91532881135268300563e-04, +-2.13064317484699505389e-04, +-2.34453870186744113427e-04, +-2.55689451897549299090e-04, +-2.76759074576870677410e-04, +-2.97650856246099086537e-04, +-3.18353027679335392423e-04, +-3.38853939023753682018e-04, +-3.59142066345504676773e-04, +-3.79206018097636495413e-04, +-3.99034541506046805132e-04, +-4.18616528870369446116e-04, +-4.37941023775921783445e-04, +-4.56997227213373118440e-04, +-4.75774503602719464699e-04, +-4.94262386718192386383e-04, +-5.12450585510814218305e-04, +-5.30328989825377310544e-04, +-5.47887676008649280625e-04, +-5.65116912405763628310e-04, +-5.82007164741549449030e-04, +-5.98549101384425463745e-04, +-6.14733598488893004212e-04, +-6.30551745014977364258e-04, +-6.45994847621079656963e-04, +-6.61054435427856318212e-04, +-6.75722264650496957927e-04, +-6.89990323096750768871e-04, +-7.03850834528551736954e-04, +-7.17296262884492574242e-04, +-7.30319316361157646819e-04, +-7.42912951350982778652e-04, +-7.55070376234532832961e-04, +-7.66785055025333219143e-04, +-7.78050710864884066675e-04, +-7.88861329366501596444e-04, +-7.99211161806001623743e-04, +-8.09094728157404166971e-04, +-8.18506819972308029276e-04, +-8.27442503101282920627e-04, +-8.35897120255950105278e-04, +-8.43866293410389599859e-04, +-8.51345926040684010221e-04, +-8.58332205201442922232e-04, +-8.64821603438301273262e-04, +-8.70810880535423945462e-04, +-8.76297085097227715367e-04, +-8.81277555963454932789e-04, +-8.85749923457110387506e-04, +-8.89712110464565414381e-04, +-8.93162333347438598848e-04, +-8.96099102685879683565e-04, +-8.98521223852970446835e-04, +-9.00427797420107569638e-04, +-9.01818219393255059504e-04, +-9.02692181280114911909e-04, +-9.03049669988348823954e-04, +-9.02890967555027251605e-04, +-9.02216650707655248853e-04, +-9.01027590257164317372e-04, +-8.99324950323396755253e-04, +-8.97110187393653770935e-04, +-8.94385049215033777793e-04, +-8.91151573521319268802e-04, +-8.87412086595320399006e-04, +-8.83169201667640974690e-04, +-8.78425817152939884119e-04, +-8.73185114724849367231e-04, +-8.67450557230792511539e-04, +-8.61225886448070839484e-04, +-8.54515120682583636733e-04, +-8.47322552211840669678e-04, +-8.39652744573696728503e-04, +-8.31510529702644309025e-04, +-8.22901004915378340120e-04, +-8.13829529747517842198e-04, +-8.04301722643430768052e-04, +-7.94323457501185689437e-04, +-7.83900860074752763550e-04, +-7.73040304235644501474e-04, +-7.61748408096249419140e-04, +-7.50032029997244466084e-04, +-7.37898264361402087853e-04, +-7.25354437416511968473e-04, +-7.12408102789705661648e-04, +-6.99067036976015396266e-04, +-6.85339234683824977817e-04, +-6.71232904059968502400e-04, +-6.56756461797351536944e-04, +-6.41918528127957059397e-04, +-6.26727921704332315012e-04, +-6.11193654372324123199e-04, +-5.95324925838475161287e-04, +-5.79131118235020063596e-04, +-5.62621790585767769452e-04, +-5.45806673175928220784e-04, +-5.28695661829722569208e-04, +-5.11298812098492927447e-04, +-4.93626333363000229307e-04, +-4.75688582853520537230e-04, +-4.57496059590992946043e-04, +-4.39059398252854521209e-04, +-4.20389362967140572426e-04, +-4.01496841038451060622e-04, +-3.82392836609444868555e-04, +-3.63088464261537163542e-04, +-3.43594942558548969210e-04, +-3.23923587536901721236e-04, +-3.04085806146491737303e-04, +-2.84093089645560742049e-04, +-2.63957006953748822640e-04, +-2.43689197967006995066e-04, +-2.23301366838275436311e-04, +-2.02805275227777953529e-04, +-1.82212735526838365925e-04, +-1.61535604059103902281e-04, +-1.40785774263093080554e-04, +-1.19975169859954066938e-04, +-9.91157380105508263764e-05, +-7.82194424651331946842e-05, +-5.72982567107504074688e-05, +-3.63641571189655019264e-05, +-1.54291160986802106125e-05, + 5.49490474234285622543e-06, + 2.63959614233348352161e-05, + 4.72621343997122955673e-05, + 6.80815353521026694937e-05, + 8.88423139508433642357e-05, + 1.09532664592484337918e-04, + 1.30140833104319903011e-04, + 1.50655123413172910328e-04, + 1.71063904174602321451e-04, + 1.91355615359099600053e-04, + 2.11518774790675712300e-04, + 2.31541984635477411745e-04, + 2.51413937835562545462e-04, + 2.71123424484858896975e-04, + 2.90659338143525736164e-04, + 3.10010682087186043628e-04, + 3.29166575487528168323e-04, + 3.48116259520795355564e-04, + 3.66849103400749643276e-04, + 3.85354610332733758284e-04, + 4.03622423385466462271e-04, + 4.21642331277442610968e-04, + 4.39404274074367811459e-04, + 4.56898348794905137527e-04, + 4.74114814921268088160e-04, + 4.91044099811763397334e-04, + 5.07676804012220281824e-04, + 5.24003706463404693612e-04, + 5.40015769601512427185e-04, + 5.55704144348954519501e-04, + 5.71060174992583653546e-04, + 5.86075403946940813073e-04, + 6.00741576399512768568e-04, + 6.15050644835952228101e-04, + 6.28994773442125574073e-04, + 6.42566342381337704884e-04, + 6.55757951943882421396e-04, + 6.68562426566777384153e-04, + 6.80972818721725897499e-04, + 6.92982412668881352959e-04, + 7.04584728074633746646e-04, + 7.15773523491389403184e-04, + 7.26542799697492522500e-04, + 7.36886802895533226179e-04, + 7.46800027767298055768e-04, + 7.56277220383868350323e-04, + 7.65313380969130045012e-04, + 7.73903766515502376799e-04, + 7.82043893250363385782e-04, + 7.89729538951949232121e-04, + 7.96956745113565389119e-04, + 8.03721818954994393636e-04, + 8.10021335280101820522e-04, + 8.15852138179731594357e-04, + 8.21211342579053417585e-04, + 8.26096335628634381720e-04, + 8.30504777938583372936e-04, + 8.34434604655206872172e-04, + 8.37884026379746372007e-04, + 8.40851529928737925421e-04, + 8.43335878935819161471e-04, + 8.45336114294710332107e-04, + 8.46851554443294471733e-04, + 8.47881795488795693763e-04, + 8.48426711174108750049e-04, + 8.48486452685477828516e-04, + 8.48061448301770160786e-04, + 8.47152402885697889713e-04, + 8.45760297217433587059e-04, + 8.43886387171142548884e-04, + 8.41532202735059621686e-04, + 8.38699546875822229616e-04, + 8.35390494247859852379e-04, + 8.31607389748687583081e-04, + 8.27352846921140154882e-04, + 8.22629746203563960195e-04, + 8.17441233029105799972e-04, + 8.11790715775362542797e-04, + 8.05681863565683954384e-04, + 7.99118603923527101411e-04, + 7.92105120281344542502e-04, + 7.84645849345590325717e-04, + 7.76745478319420114104e-04, + 7.68408941984943219712e-04, + 7.59641419646665534519e-04, + 7.50448331938106580861e-04, + 7.40835337493533463253e-04, + 7.30808329486818254554e-04, + 7.20373432039535070703e-04, + 7.09536996500486488726e-04, + 6.98305597598893957115e-04, + 6.86686029473570981770e-04, + 6.74685301580476909020e-04, + 6.62310634481180966239e-04, + 6.49569455514414613798e-04, + 6.36469394353982704203e-04, + 6.23018278454912912898e-04, + 6.09224128391051378099e-04, + 5.95095153086705442279e-04, + 5.80639744945168250270e-04, + 5.65866474877092448525e-04, + 5.50784087231426526705e-04, + 5.35401494632215197225e-04, + 5.19727772724077859492e-04, + 5.03772154829525923431e-04, + 4.87544026521280851084e-04, + 4.71052920112772989698e-04, + 4.54308509069835603569e-04, + 4.37320602347533553267e-04, + 4.20099138654383497463e-04, + 4.02654180648284807775e-04, + 3.84995909067011564137e-04, + 3.67134616796844961539e-04, + 3.49080702882780392719e-04, + 3.30844666483778653780e-04, + 3.12437100776581622944e-04, + 2.93868686811618183737e-04, + 2.75150187324561020918e-04, + 2.56292440507140670877e-04, + 2.37306353740675621137e-04, + 2.18202897296279266356e-04, + 1.98993098004925772883e-04, + 1.79688032901358264856e-04, + 1.60298822845364506793e-04, + 1.40836626124112224753e-04, + 1.21312632039215933556e-04, + 1.01738054482220324185e-04, + 8.21241255021581603984e-05, + 6.24820888690072755080e-05, + 4.28231936363832337185e-05, + 2.31586877076589681926e-05, + 3.49981140855670628566e-06, +-1.61422089292776860909e-05, +-3.57561673710188603244e-05, +-5.53308847633998468008e-05, +-7.48552150979509803470e-05, +-9.43180518494260796856e-05, +-1.13708334285348401584e-04, +-1.33015053743449631566e-04, +-1.52227259873300292507e-04, +-1.71334066838623079324e-04, +-1.90324659476782091653e-04, +-2.09188299411965425824e-04, +-2.27914331118587613423e-04, +-2.46492187931631313944e-04, +-2.64911398000205382339e-04, +-2.83161590181416034876e-04, +-3.01232499870904074039e-04, +-3.19113974766915017931e-04, +-3.36795980564636679867e-04, +-3.54268606577632174954e-04, +-3.71522071283203947009e-04, +-3.88546727788614181063e-04, +-4.05333069215096399290e-04, +-4.21871733996659933463e-04, +-4.38153511090731847231e-04, +-4.54169345097848065496e-04, +-4.69910341287265624979e-04, +-4.85367770526103374431e-04, +-5.00533074108989832485e-04, +-5.15397868485681603760e-04, +-5.29953949884007929905e-04, +-5.44193298825634374886e-04, +-5.58108084532057653962e-04, +-5.71690669218670195068e-04, +-5.84933612274217158006e-04, +-5.97829674323603708214e-04, +-6.10371821171734304026e-04, +-6.22553227626419856781e-04, +-6.34367281197839366289e-04, +-6.45807585673186250637e-04, +-6.56867964564019149454e-04, +-6.67542464424877488548e-04, +-6.77825358041074066233e-04, +-6.87711147484166077093e-04, +-6.97194567033422758773e-04, +-7.06270585961741746359e-04, +-7.14934411184561628694e-04, +-7.23181489770394637234e-04, +-7.31007511311650994522e-04, +-7.38408410154600355381e-04, +-7.45380367487197487489e-04, +-7.51919813283889650751e-04, +-7.58023428106295344038e-04, +-7.63688144758921860430e-04, +-7.68911149799110884596e-04, +-7.73689884900469453805e-04, +-7.78022048069176852536e-04, +-7.81905594712582730464e-04, +-7.85338738559663196610e-04, +-7.88319952432907605604e-04, +-7.90847968871373333856e-04, +-7.92921780604692572579e-04, +-7.94540640877896479737e-04, +-7.95704063626980471514e-04, +-7.96411823505323844020e-04, +-7.96663955761047642458e-04, +-7.96460755965521980358e-04, +-7.95802779593343299035e-04, +-7.94690841454150087575e-04, +-7.93126014976744679770e-04, +-7.91109631346083286806e-04, +-7.88643278493758549327e-04, +-7.85728799942701674856e-04, +-7.82368293506905928061e-04, +-7.78564109847002514854e-04, +-7.74318850882812310596e-04, +-7.69635368063673682044e-04, +-7.64516760497901438909e-04, +-7.58966372942442794175e-04, +-7.52987793654077996498e-04, +-7.46584852103500504379e-04, +-7.39761616553728774091e-04, +-7.32522391504357027643e-04, +-7.24871715003236934821e-04, +-7.16814355827273216350e-04, +-7.08355310534040027645e-04, +-6.99499800386016380889e-04, +-6.90253268149437163720e-04, +-6.80621374769529714592e-04, +-6.70609995924295360266e-04, +-6.60225218458873998675e-04, +-6.49473336702642350601e-04, +-6.38360848671277059801e-04, +-6.26894452156058273537e-04, +-6.15081040702747340251e-04, +-6.02927699482527735750e-04, +-5.90441701057256335301e-04, +-5.77630501041881037026e-04, +-5.64501733666179588388e-04, +-5.51063207239021373221e-04, +-5.37322899517202385612e-04, +-5.23288952982047124961e-04, +-5.08969670026456150538e-04, +-4.94373508055059602412e-04, +-4.79509074500653401096e-04, +-4.64385121759629336102e-04, +-4.49010542049456493497e-04, +-4.33394362191214064118e-04, +-4.17545738320244637712e-04, +-4.01473950527997305165e-04, +-3.85188397438232619108e-04, +-3.68698590720627130540e-04, +-3.52014149545262831995e-04, +-3.35144794980849110039e-04, +-3.18100344340219566650e-04, +-3.00890705476273645578e-04, +-2.83525871031688149124e-04, +-2.66015912645737500133e-04, +-2.48370975121568597112e-04, +-2.30601270557308229850e-04, +-2.12717072444391431304e-04, +-1.94728709736517952358e-04, +-1.76646560892675731939e-04, +-1.58481047897534086224e-04, +-1.40242630262970099540e-04, +-1.21941799013744982391e-04, +-1.03589070661107662103e-04, +-8.51949811676530225713e-05, +-6.67700799069139572109e-05, +-4.83249236211274086098e-05, +-2.98700703807564870525e-05, +-1.14160735488978414020e-05, + 7.02652424554682768497e-06, + 2.54471971228236679705e-05, + 4.38354419518023738413e-05, + 6.21807843308446069313e-05, + 8.04727845460066358498e-05, + 9.87010435040899136066e-05, + 1.16855208636383958460e-04, + 1.34924979770344443406e-04, + 1.52900114965400754944e-04, + 1.70770436309920342057e-04, + 1.88525835675920134431e-04, + 2.06156280428297997024e-04, + 2.23651819085366783272e-04, + 2.41002586927498689160e-04, + 2.58198811550729352172e-04, + 2.75230818362170949389e-04, + 2.92089036014278136209e-04, + 3.08764001774616207285e-04, + 3.25246366828520531121e-04, + 3.41526901511388200801e-04, + 3.57596500467790591720e-04, + 3.73446187734516289129e-04, + 3.89067121744707245228e-04, + 4.04450600250306482528e-04, + 4.19588065160076859831e-04, + 4.34471107290538996557e-04, + 4.49091471027067759818e-04, + 4.63441058892829452643e-04, + 4.77511936022862045707e-04, + 4.91296334540600198627e-04, + 5.04786657835014449663e-04, + 5.17975484735516645760e-04, + 5.30855573582563605717e-04, + 5.43419866191619145568e-04, + 5.55661491708522902247e-04, + 5.67573770353875343975e-04, + 5.79150217054632036016e-04, + 5.90384544960849454512e-04, + 6.01270668845691608206e-04, + 6.11802708386863214850e-04, + 6.21974991327834889066e-04, + 6.31782056516764687314e-04, + 6.41218656822146407942e-04, + 6.50279761923036299723e-04, + 6.58960560972716405566e-04, + 6.67256465134287500389e-04, + 6.75163109986891556320e-04, + 6.82676357801303567048e-04, + 6.89792299683732634992e-04, + 6.96507257586713749917e-04, + 7.02817786186088130918e-04, + 7.08720674623126924326e-04, + 7.14212948110944231481e-04, + 7.19291869404349885550e-04, + 7.23954940132546750399e-04, + 7.28199901993943090293e-04, + 7.32024737812592227876e-04, + 7.35427672455747746989e-04, + 7.38407173612188813538e-04, + 7.40961952430967151807e-04, + 7.43090964020374881993e-04, + 7.44793407806954867699e-04, + 7.46068727754538611394e-04, + 7.46916612443245453087e-04, + 7.47336995008605268868e-04, + 7.47330052940939869310e-04, + 7.46896207745253873714e-04, + 7.46036124461981245935e-04, + 7.44750711048991790794e-04, + 7.43041117625342466269e-04, + 7.40908735577333176642e-04, + 7.38355196527534156196e-04, + 7.35382371167495095879e-04, + 7.31992367954923252131e-04, + 7.28187531676248857131e-04, + 7.23970441875473923535e-04, + 7.19343911150391139564e-04, + 7.14310983317213688513e-04, + 7.08874931444885593435e-04, + 7.03039255760210023485e-04, + 6.96807681425207193181e-04, + 6.90184156188062745106e-04, + 6.83172847909139504749e-04, + 6.75778141963576887280e-04, + 6.68004638522109246875e-04, + 6.59857149711750939035e-04, + 6.51340696658104286593e-04, + 6.42460506411091959722e-04, + 6.33222008755997788076e-04, + 6.23630832911684193816e-04, + 6.13692804118148903594e-04, + 6.03413940115261806379e-04, + 5.92800447514970491047e-04, + 5.81858718069071527597e-04, + 5.70595324834820847096e-04, + 5.59017018240628819903e-04, + 5.47130722054300845832e-04, + 5.34943529255999883701e-04, + 5.22462697818653785606e-04, + 5.09695646398130772746e-04, + 4.96649949935782969619e-04, + 4.83333335176001986210e-04, + 4.69753676101234622468e-04, + 4.55918989287601634543e-04, + 4.41837429183325480515e-04, + 4.27517283312972833521e-04, + 4.12966967410454712222e-04, + 3.98195020483432121378e-04, + 3.83210099812103391695e-04, + 3.68020975885298450622e-04, + 3.52636527276817995143e-04, + 3.37065735465011645077e-04, + 3.21317679598622223548e-04, + 3.05401531211941905386e-04, + 2.89326548892257452619e-04, + 2.73102072902946376928e-04, + 2.56737519764977252090e-04, + 2.40242376800225943771e-04, + 2.23626196639659541874e-04, + 2.06898591699577582680e-04, + 1.90069228629096543095e-04, + 1.73147822732087712776e-04, + 1.56144132366777384441e-04, + 1.39067953326214697627e-04, + 1.21929113202958933396e-04, + 1.04737465740963099658e-04, + 8.75028851780528622514e-05, + 7.02352605825545112366e-05, + 5.29444901866215451251e-05, + 3.56404757200933205497e-05, + 1.83331167478597644273e-05, + 1.03230501413102183826e-06, +-1.62520812034707693762e-05, +-3.35101827263670735968e-05, +-5.07321650911279374628e-05, +-6.79082241459080256747e-05, +-8.50285916240537564164e-05, +-1.02083540691677796268e-04, +-1.19063391466316483881e-04, +-1.35958516502816118129e-04, +-1.52759346244455719837e-04, +-1.69456374435215186046e-04, +-1.86040163490673691061e-04, +-2.02501349824351403305e-04, +-2.18830649126511295058e-04, +-2.35018861592449355329e-04, +-2.51056877097335180617e-04, +-2.66935680314695194647e-04, +-2.82646355775669996281e-04, +-2.98180092866208153266e-04, +-3.13528190759385430846e-04, +-3.28682063280201183005e-04, +-3.43633243699864576997e-04, +-3.58373389457262059472e-04, +-3.72894286804705877604e-04, +-3.87187855375492433196e-04, +-4.01246152670716468933e-04, +-4.15061378462855390652e-04, +-4.28625879113702864826e-04, +-4.41932151804175915588e-04, +-4.54972848673900734286e-04, +-4.67740780867979507370e-04, +-4.80228922488919207114e-04, +-4.92430414451660788955e-04, +-5.04338568239140645766e-04, +-5.15946869556969272587e-04, +-5.27248981884690759263e-04, +-5.38238749922089398589e-04, +-5.48910202928370723023e-04, +-5.59257557952611700225e-04, +-5.69275222953672071884e-04, +-5.78957799807889249809e-04, +-5.88300087202963859455e-04, +-5.97297083416476414473e-04, +-6.05943988977575135647e-04, +-6.14236209210458085871e-04, +-6.22169356658183671412e-04, +-6.29739253385739618761e-04, +-6.36941933161007476510e-04, +-6.43773643512582892379e-04, +-6.50230847663354235948e-04, +-6.56310226338886878658e-04, +-6.62008679449682451920e-04, +-6.67323327646487897066e-04, +-6.72251513747878452071e-04, +-6.76790804039441285488e-04, +-6.80938989443917279398e-04, +-6.84694086561815564058e-04, +-6.88054338581924984468e-04, +-6.91018216061473023945e-04, +-6.93584417575499262779e-04, +-6.95751870235252118692e-04, +-6.97519730075439408322e-04, +-6.98887382310238512544e-04, +-6.99854441458020392307e-04, +-7.00420751334910186674e-04, +-7.00586384917250637808e-04, +-7.00351644073214348388e-04, +-6.99717059163839283017e-04, +-6.98683388513845408767e-04, +-6.97251617752650001102e-04, +-6.95422959026119487901e-04, +-6.93198850079607088379e-04, +-6.90580953212918528285e-04, +-6.87571154107985264316e-04, +-6.84171560529966103770e-04, +-6.80384500902708982788e-04, +-6.76212522759481789864e-04, +-6.71658391069967749057e-04, +-6.66725086444653041590e-04, +-6.61415803217692819561e-04, +-6.55733947409528573555e-04, +-6.49683134570482436268e-04, +-6.43267187506764773208e-04, +-6.36490133890204668257e-04, +-6.29356203753268024677e-04, +-6.21869826870875635171e-04, +-6.14035630030630393862e-04, +-6.05858434193134814082e-04, +-5.97343251544118505024e-04, +-5.88495282440187417530e-04, +-5.79319912250014150239e-04, +-5.69822708092951237674e-04, +-5.60009415476908612407e-04, +-5.49885954837576801033e-04, +-5.39458417981255439720e-04, +-5.28733064433041348440e-04, +-5.17716317692869828875e-04, +-5.06414761401502129881e-04, +-4.94835135418839880059e-04, +-4.82984331816689843164e-04, +-4.70869390788640387446e-04, +-4.58497496479242630431e-04, +-4.45875972735065601461e-04, +-4.33012278780107377589e-04, +-4.19914004818108983763e-04, +-4.06588867564375744564e-04, +-3.93044705709642795341e-04, +-3.79289475318866453699e-04, +-3.65331245167339706530e-04, +-3.51178192017081926713e-04, +-3.36838595836177763076e-04, +-3.22320834963867378347e-04, +-3.07633381224204521288e-04, +-2.92784794991132475261e-04, +-2.77783720207839526437e-04, +-2.62638879363297228237e-04, +-2.47359068428886473296e-04, +-2.31953151758071922503e-04, +-2.16430056951960250863e-04, +-2.00798769693994654060e-04, +-1.85068328556394910873e-04, +-1.69247819781622929874e-04, +-1.53346372041766269151e-04, +-1.37373151178878973033e-04, +-1.21337354929306262606e-04, +-1.05248207635004573535e-04, +-8.91149549450086627062e-05, +-7.29468585098004703403e-05, +-5.67531906719987081617e-05, +-4.05432291561632574743e-05, +-2.43262517606341878125e-05, +-8.11153105499568761387e-06, + 8.09167091459697115441e-06, + 2.42741079085157292628e-05, + 4.04265547626939556413e-05, + 5.65398126401744739798e-05, + 7.26047142624750100346e-05, + 8.86121291176844783554e-05, + 1.04552968642355261246e-04, + 1.20418191374254643930e-04, + 1.36198808073058146538e-04, + 1.51885886806070295480e-04, + 1.67470557996213817529e-04, + 1.82944019429153478633e-04, + 1.98297541217112740890e-04, + 2.13522470716304618504e-04, + 2.28610237395321440291e-04, + 2.43552357651734171758e-04, + 2.58340439574197757323e-04, + 2.72966187647394017187e-04, + 2.87421407397178490465e-04, + 3.01698009973331443285e-04, + 3.15788016667368121211e-04, + 3.29683563362888126455e-04, + 3.43376904915868638030e-04, + 3.56860419462906380220e-04, + 3.70126612654194222032e-04, + 3.83168121809794538692e-04, + 3.95977719996309473864e-04, + 4.08548320021925631847e-04, + 4.20872978347595460679e-04, + 4.32944898912126369117e-04, + 4.44757436869292204114e-04, + 4.56304102234621905294e-04, + 4.67578563440100960016e-04, + 4.78574650794741016362e-04, + 4.89286359849140845869e-04, + 4.99707854662346487480e-04, + 5.09833470968881633315e-04, + 5.19657719244667921921e-04, + 5.29175287669990585850e-04, + 5.38381044987819995518e-04, + 5.47270043256114818893e-04, + 5.55837520492576445640e-04, + 5.64078903210458873843e-04, + 5.71989808844079565542e-04, + 5.79566048062779125977e-04, + 5.86803626972093816082e-04, + 5.93698749201003678558e-04, + 6.00247817874220647612e-04, + 6.06447437468376929041e-04, + 6.12294415551340506093e-04, + 6.17785764403646210467e-04, + 6.22918702521296861058e-04, + 6.27690655999173577340e-04, + 6.32099259794388049390e-04, + 6.36142358868971454465e-04, + 6.39818009211379277838e-04, + 6.43124478736333145788e-04, + 6.46060248062606972720e-04, + 6.48624011168465121509e-04, + 6.50814675924448241516e-04, + 6.52631364503392400953e-04, + 6.54073413667472913086e-04, + 6.55140374932347883084e-04, + 6.55832014608344012786e-04, + 6.56148313718822465482e-04, + 6.56089467795875169558e-04, + 6.55655886553618491575e-04, + 6.54848193439355763003e-04, + 6.53667225063030848942e-04, + 6.52114030505376840972e-04, + 6.50189870505314443556e-04, + 6.47896216527166549613e-04, + 6.45234749708334539252e-04, + 6.42207359688187111660e-04, + 6.38816143318927205305e-04, + 6.35063403259281166260e-04, + 6.30951646451974345643e-04, + 6.26483582485939526248e-04, + 6.21662121844317769152e-04, + 6.16490374039393236767e-04, + 6.10971645635609837167e-04, + 6.05109438161931267354e-04, + 5.98907445914837149696e-04, + 5.92369553653347702404e-04, + 5.85499834187430895707e-04, + 5.78302545861415578064e-04, + 5.70782129933787834436e-04, + 5.62943207855098252772e-04, + 5.54790578445580164282e-04, + 5.46329214974210436787e-04, + 5.37564262140980504354e-04, + 5.28501032964188142450e-04, + 5.19145005574684313687e-04, + 5.09501819918850898904e-04, + 4.99577274372495932532e-04, + 4.89377322267549059315e-04, + 4.78908068333559408525e-04, + 4.68175765056459951968e-04, + 4.57186808956279780707e-04, + 4.45947736786433599192e-04, + 4.34465221656520647706e-04, + 4.22746069081200064391e-04, + 4.10797212957284853512e-04, + 3.98625711471500149014e-04, + 3.86238742941308148531e-04, + 3.73643601591243563771e-04, + 3.60847693267234983453e-04, + 3.47858531091431943082e-04, + 3.34683731060088070306e-04, + 3.21331007586994784036e-04, + 3.07808168995286370300e-04, + 2.94123112959944975862e-04, + 2.80283821903894213648e-04, + 2.66298358350258257497e-04, + 2.52174860233517097834e-04, + 2.37921536172264099776e-04, + 2.23546660706324561889e-04, + 2.09058569500978578149e-04, + 1.94465654521075659777e-04, + 1.79776359177804124882e-04, + 1.64999173451064800808e-04, + 1.50142628989783814353e-04, + 1.35215294193867887652e-04, + 1.20225769279667712834e-04, + 1.05182681332417253214e-04, + 9.00946793482652321869e-05, + 7.49704292687580406678e-05, + 5.98186090107322883933e-05, + 4.46479034941903122767e-05, + 2.94669996713655661538e-05, + 1.42845815595480592387e-05, +-8.90674719386678467731e-07, +-1.60501058898957495679e-05, +-3.11850664615309880164e-05, +-4.62869336522098696559e-05, +-6.13471122938098376541e-05, +-7.63570397170260420881e-05, +-9.13081906125804212970e-05, +-1.06192081866257116186e-04, +-1.21000277364919335359e-04, +-1.35724392770807756941e-04, +-1.50356100261421840461e-04, +-1.64887133232308251375e-04, +-1.79309290960107407722e-04, +-1.93614443223211164184e-04, +-2.07794534877538741033e-04, +-2.21841590384600493343e-04, +-2.35747718289653712892e-04, +-2.49505115647181735690e-04, +-2.63106072391320949463e-04, +-2.76542975648779115836e-04, +-2.89808313991833633137e-04, +-3.02894681629039077587e-04, +-3.15794782531314804225e-04, +-3.28501434491123775472e-04, +-3.41007573112413263187e-04, +-3.53306255729321028528e-04, +-3.65390665251150495701e-04, +-3.77254113931894290764e-04, +-3.88890047061697880296e-04, +-4.00292046578829127310e-04, +-4.11453834599746401911e-04, +-4.22369276865425247180e-04, +-4.33032386102221345144e-04, +-4.43437325295184645198e-04, +-4.53578410872218030017e-04, +-4.63450115797292723756e-04, +-4.73047072571043994947e-04, +-4.82364076137125729737e-04, +-4.91396086692756878071e-04, +-5.00138232402001195638e-04, +-5.08585812010168398199e-04, +-5.16734297358173813065e-04, +-5.24579335795330296312e-04, +-5.32116752489386786451e-04, +-5.39342552632568559418e-04, +-5.46252923542469171619e-04, +-5.52844236656707828902e-04, +-5.59113049420296060084e-04, +-5.65056107064770439183e-04, +-5.70670344278172711819e-04, +-5.75952886765007470403e-04, +-5.80901052695480778210e-04, +-5.85512354043150645873e-04, +-5.89784497810519033403e-04, +-5.93715387141844816964e-04, +-5.97303122322707935599e-04, +-6.00546001665863931999e-04, +-6.03442522282995321911e-04, +-6.05991380742033013650e-04, +-6.08191473609774341941e-04, +-6.10041897879654818233e-04, +-6.11541951284462828586e-04, +-6.12691132494012132698e-04, +-6.13489141197734759101e-04, +-6.13935878072276153793e-04, +-6.14031444634213687678e-04, +-6.13776142978129783147e-04, +-6.13170475400273522204e-04, +-6.12215143908160716602e-04, +-6.10911049616502535922e-04, +-6.09259292029921744813e-04, +-6.07261168212986615807e-04, +-6.04918171848152540562e-04, +-6.02231992182249067230e-04, +-5.99204512862249404591e-04, +-5.95837810661095862788e-04, +-5.92134154094380829765e-04, +-5.88096001928879556775e-04, +-5.83726001583780864344e-04, +-5.79026987425731846405e-04, +-5.74001978958720709967e-04, +-5.68654178909981699100e-04, +-5.62986971213088379512e-04, +-5.57003918889516810679e-04, +-5.50708761829973685031e-04, +-5.44105414476881875038e-04, +-5.37197963409420707961e-04, +-5.29990664832675931022e-04, +-5.22487941972209408471e-04, +-5.14694382376049554099e-04, +-5.06614735125277882745e-04, +-4.98253907955200866543e-04, +-4.89616964288741747524e-04, +-4.80709120183835873340e-04, +-4.71535741196723874168e-04, +-4.62102339162885156296e-04, +-4.52414568897704873120e-04, +-4.42478224818736978665e-04, +-4.32299237491589249602e-04, +-4.21883670101533790608e-04, +-4.11237714852763253538e-04, +-4.00367689297795705319e-04, +-3.89280032598777342174e-04, +-3.77981301723072956981e-04, +-3.66478167575481482855e-04, +-3.54777411069201974430e-04, +-3.42885919137923399647e-04, +-3.30810680691371770349e-04, +-3.18558782516682129776e-04, +-3.06137405127995278469e-04, +-2.93553818566704544622e-04, +-2.80815378154804305266e-04, +-2.67929520203833435379e-04, +-2.54903757681815789065e-04, +-2.41745675840952941541e-04, +-2.28462927808299829519e-04, +-2.15063230142214405812e-04, +-2.01554358357060797247e-04, +-1.87944142418778622041e-04, +-1.74240462213917245062e-04, +-1.60451242994757493389e-04, +-1.46584450803131455471e-04, +-1.32648087875677540707e-04, +-1.18650188032929176604e-04, +-1.04598812055253963184e-04, +-9.05020430478532816746e-05, +-7.63679817980816182978e-05, +-6.22047421270673621006e-05, +-4.80204462387773454404e-05, +-3.38232200690939612160e-05, +-1.96211886373398563383e-05, +-5.42247140324502025757e-06, + 8.76482236824777340069e-06, + 2.29325982315957407963e-05, + 3.70727811720706265371e-05, + 5.11773202013517019616e-05, + 6.52381929346686494130e-05, + 7.92474101469974555583e-05, + 9.31970203054730103771e-05, + 1.07079114075787359224e-04, + 1.20885828799772198955e-04, + 1.34609352941733671338e-04, + 1.48241930501015857979e-04, + 1.61775865388299365999e-04, + 1.75203525763176128777e-04, + 1.88517348330553255508e-04, + 2.01709842593477496403e-04, + 2.14773595059988993677e-04, + 2.27701273401630213721e-04, + 2.40485630561381157630e-04, + 2.53119508808481513077e-04, + 2.65595843738193170946e-04, + 2.77907668214037251522e-04, + 2.90048116250403941428e-04, + 3.02010426833358551230e-04, + 3.13787947677527593714e-04, + 3.25374138916987524356e-04, + 3.36762576728041407650e-04, + 3.47946956882078583737e-04, + 3.58921098226289516687e-04, + 3.69678946090518610861e-04, + 3.80214575618283698918e-04, + 3.90522195020292855420e-04, + 4.00596148748304063669e-04, + 4.10430920588102858375e-04, + 4.20021136669482232032e-04, + 4.29361568391889935302e-04, + 4.38447135263920031219e-04, + 4.47272907655273392787e-04, + 4.55834109459644649508e-04, + 4.64126120667108176508e-04, + 4.72144479844627002613e-04, + 4.79884886523366084934e-04, + 4.87343203491520887780e-04, + 4.94515458991510439488e-04, + 5.01397848820237619291e-04, + 5.07986738331495536053e-04, + 5.14278664339342934768e-04, + 5.20270336921509223872e-04, + 5.25958641121905003633e-04, + 5.31340638551345634602e-04, + 5.36413568885707545825e-04, + 5.41174851260732862543e-04, + 5.45622085562818821651e-04, + 5.49753053615153054572e-04, + 5.53565720258578693874e-04, + 5.57058234326825011708e-04, + 5.60228929515402870182e-04, + 5.63076325144043553055e-04, + 5.65599126812190268823e-04, + 5.67796226947321581655e-04, + 5.69666705245914757952e-04, + 5.71209829006884771928e-04, + 5.72425053357448988464e-04, + 5.73312021371367866798e-04, + 5.73870564079618605650e-04, + 5.74100700373610150010e-04, + 5.74002636801101105701e-04, + 5.73576767255045208427e-04, + 5.72823672555648950346e-04, + 5.71744119926011510821e-04, + 5.70339062361724402107e-04, + 5.68609637894926635629e-04, + 5.66557168753326501759e-04, + 5.64183160414795923689e-04, + 5.61489300558173053124e-04, + 5.58477457910976646596e-04, + 5.55149680994817618443e-04, + 5.51508196769305851677e-04, + 5.47555409175347492477e-04, + 5.43293897578766660054e-04, + 5.38726415115223450716e-04, + 5.33855886937539434942e-04, + 5.28685408366441232306e-04, + 5.23218242945951541104e-04, + 5.17457820404608101993e-04, + 5.11407734523782039546e-04, + 5.05071740914395756958e-04, + 4.98453754703430222672e-04, + 4.91557848131608235084e-04, + 4.84388248063773933609e-04, + 4.76949333413366201133e-04, + 4.69245632482725018135e-04, + 4.61281820220592905877e-04, + 4.53062715398815335326e-04, + 4.44593277709539084434e-04, + 4.35878604784927761902e-04, + 4.26923929141124992512e-04, + 4.17734615048157432570e-04, + 4.08316155327850989487e-04, + 3.98674168081502775223e-04, + 3.88814393349325734903e-04, + 3.78742689703628627584e-04, + 3.68465030777748246259e-04, + 3.57987501732803619064e-04, + 3.47316295664270213630e-04, + 3.36457709950689946247e-04, + 3.25418142546407844398e-04, + 3.14204088220705103369e-04, + 3.02822134745452705828e-04, + 2.91278959033536570707e-04, + 2.79581323230313654512e-04, + 2.67736070760376913824e-04, + 2.55750122331942382741e-04, + 2.43630471901182189993e-04, + 2.31384182598852114476e-04, + 2.19018382621588081956e-04, + 2.06540261090263434262e-04, + 1.93957063877727543073e-04, + 1.81276089408560325388e-04, + 1.68504684432981764438e-04, + 1.55650239777576011087e-04, + 1.42720186075200863515e-04, + 1.29721989476556069784e-04, + 1.16663147345869003713e-04, + 1.03551183943265592683e-04, + 9.03936460960799980377e-05, + 7.71980988618959664254e-05, + 6.39721211855788279756e-05, + 5.07233015529098420324e-05, + 3.74592336431094660547e-05, + 2.41875119832061500670e-05, + 1.09157276060909018059e-05, +-2.34853628469845146187e-06, +-1.55977086414162786562e-05, +-2.88242348869596923613e-05, +-4.20205812159120831802e-05, +-5.51792388792400324794e-05, +-6.82927284502260999177e-05, +-8.13536040692178018903e-05, +-9.43544576647877523837e-05, +-1.07287923148899612901e-04, +-1.20146680583802623705e-04, +-1.32923460318065689029e-04, +-1.45611047089732014966e-04, +-1.58202284094046845058e-04, +-1.70690077013562770646e-04, +-1.83067398008342023790e-04, +-1.95327289664015750449e-04, +-2.07462868895485753841e-04, +-2.19467330804082712487e-04, +-2.31333952486024421909e-04, +-2.43056096790058889963e-04, +-2.54627216022116969682e-04, +-2.66040855595085605489e-04, +-2.77290657621565787404e-04, +-2.88370364447411301270e-04, +-2.99273822124557198864e-04, +-3.09994983820817795236e-04, +-3.20527913164946520654e-04, +-3.30866787525005792182e-04, +-3.41005901218438382556e-04, +-3.50939668651816677209e-04, +-3.60662627388737895996e-04, +-3.70169441144112937835e-04, +-3.79454902703223032924e-04, +-3.88513936763931614412e-04, +-3.97341602700649319281e-04, +-4.05933097248160023023e-04, +-4.14283757104453339952e-04, +-4.22389061450620915700e-04, +-4.30244634386746675411e-04, +-4.37846247282407585646e-04, +-4.45189821040535387009e-04, +-4.52271428273436375180e-04, +-4.59087295389815042927e-04, +-4.65633804591701605784e-04, +-4.71907495780237373154e-04, +-4.77905068369312367293e-04, +-4.83623383006156549232e-04, +-4.89059463197895642403e-04, +-4.94210496843377989837e-04, +-4.99073837669386272294e-04, +-5.03647006570560255671e-04, +-5.07927692852353862910e-04, +-5.11913755376417790866e-04, +-5.15603223607854132746e-04, +-5.18994298563852079348e-04, +-5.22085353663235022734e-04, +-5.24874935476607245785e-04, +-5.27361764376676599858e-04, +-5.29544735088589781265e-04, +-5.31422917139951151225e-04, +-5.32995555210500379477e-04, +-5.34262069381259826692e-04, +-5.35222055283147762558e-04, +-5.35875284145083223553e-04, +-5.36221702741643767819e-04, +-5.36261433240417940797e-04, +-5.35994772949250210085e-04, +-5.35422193963616460319e-04, +-5.34544342714442298307e-04, +-5.33362039416725316164e-04, +-5.31876277419383609174e-04, +-5.30088222456788840664e-04, +-5.27999211802546121117e-04, +-5.25610753326072018335e-04, +-5.22924524452632929344e-04, +-5.19942371027533258195e-04, +-5.16666306085201390737e-04, +-5.13098508523981305419e-04, +-5.09241321687478316720e-04, +-5.05097251853375752567e-04, +-5.00668966630677097357e-04, +-4.95959293266389714822e-04, +-4.90971216862717439386e-04, +-4.85707878505841088215e-04, +-4.80172573307527546498e-04, +-4.74368748360683557905e-04, +-4.68300000610171580050e-04, +-4.61970074640185440762e-04, +-4.55382860379525326953e-04, +-4.48542390726171106338e-04, +-4.41452839092643458969e-04, +-4.34118516873516094388e-04, +-4.26543870836773282920e-04, +-4.18733480440457346301e-04, +-4.10692055076295619871e-04, +-4.02424431241824444132e-04, +-3.93935569642999588221e-04, +-3.85230552228620710866e-04, +-3.76314579158696684014e-04, +-3.67192965708273077411e-04, +-3.57871139108791979765e-04, +-3.48354635328699147479e-04, +-3.38649095795268096840e-04, +-3.28760264059559039092e-04, +-3.18693982406488616858e-04, +-3.08456188411998706057e-04, +-2.98052911449364968648e-04, +-2.87490269146621982028e-04, +-2.76774463797361711895e-04, +-2.65911778726769776858e-04, +-2.54908574615198501266e-04, +-2.43771285781356852364e-04, +-2.32506416427293309719e-04, +-2.21120536847362134797e-04, +-2.09620279603374160817e-04, +-1.98012335668160057052e-04, +-1.86303450539779524029e-04, +-1.74500420328618278693e-04, +-1.62610087819718690657e-04, +-1.50639338512448478849e-04, +-1.38595096639894068595e-04, +-1.26484321170500490497e-04, +-1.14314001793776732867e-04, +-1.02091154892787922296e-04, +-8.98228195055708475902e-05, +-7.75160532779040826849e-05, +-6.51779284095440432020e-05, +-5.28155275965366106071e-05, +-4.04359399717151504088e-05, +-2.80462570457926562079e-05, +-1.56535686513557642486e-05, +-3.26495889210444343624e-06, + 9.11249790054165639743e-06, + 2.14717412006368892899e-05, + 3.38057283092167403242e-05, + 4.61074383610954739352e-05, + 5.83698763150761234034e-05, + 7.05860769251900996464e-05, + 8.27491086907310743719e-05, + 9.48520777828465352357e-05, + 1.06888131945465347230e-04, + 1.18850464368359115953e-04, + 1.30732317530151336904e-04, + 1.42526987009093485245e-04, + 1.54227825259548495572e-04, + 1.65828245351846937858e-04, + 1.77321724673696056200e-04, + 1.88701808590856294186e-04, + 1.99962114065118143997e-04, + 2.11096333227541019164e-04, + 2.22098236904959408719e-04, + 2.32961678097786452921e-04, + 2.43680595407194330610e-04, + 2.54249016409682922994e-04, + 2.64661060977358164950e-04, + 2.74910944541823074223e-04, + 2.84992981300038268795e-04, + 2.94901587360451048966e-04, + 3.04631283827309126255e-04, + 3.14176699821949083694e-04, + 3.23532575438972966244e-04, + 3.32693764636005074025e-04, + 3.41655238055194434080e-04, + 3.50412085775090025464e-04, + 3.58959519991325229707e-04, + 3.67292877624660627292e-04, + 3.75407622854972045263e-04, + 3.83299349579812611254e-04, + 3.90963783796212480549e-04, + 3.98396785904493201929e-04, + 4.05594352932717237652e-04, + 4.12552620680778098922e-04, + 4.19267865782840679426e-04, + 4.25736507687102228546e-04, + 4.31955110551815945567e-04, + 4.37920385056580596227e-04, + 4.43629190127953329428e-04, + 4.49078534578485372587e-04, + 4.54265578658337963736e-04, + 4.59187635518681089644e-04, + 4.63842172586124870497e-04, + 4.68226812847528570376e-04, + 4.72339336044462119145e-04, + 4.76177679776842175188e-04, + 4.79739940515123866431e-04, + 4.83024374520600813590e-04, + 4.86029398673382302676e-04, + 4.88753591207665154424e-04, + 4.91195692353966193756e-04, + 4.93354604888095117816e-04, + 4.95229394586578497428e-04, + 4.96819290588439285358e-04, + 4.98123685663175381003e-04, + 4.99142136384935733613e-04, + 4.99874363212820149900e-04, + 5.00320250477433235529e-04, + 5.00479846273746572204e-04, + 5.00353362260458648866e-04, + 4.99941173366037620342e-04, + 4.99243817401748952133e-04, + 4.98261994581954289173e-04, + 4.96996566952077824426e-04, + 4.95448557724650537858e-04, + 4.93619150523917594661e-04, + 4.91509688539529211379e-04, + 4.89121673589913252660e-04, + 4.86456765095920123584e-04, + 4.83516778965485997076e-04, + 4.80303686389979968101e-04, + 4.76819612553058206749e-04, + 4.73066835252845254919e-04, + 4.69047783438315086732e-04, + 4.64765035660812749103e-04, + 4.60221318441676426666e-04, + 4.55419504556999951966e-04, + 4.50362611240582178668e-04, + 4.45053798306218380970e-04, + 4.39496366190426988700e-04, + 4.33693753916839246001e-04, + 4.27649536983611762604e-04, + 4.21367425174935209421e-04, + 4.14851260298147500507e-04, + 4.08105013847745185657e-04, + 4.01132784597763502807e-04, + 3.93938796123864838888e-04, + 3.86527394256778707507e-04, + 3.78903044468504332596e-04, + 3.71070329192896123955e-04, + 3.63033945082216335121e-04, + 3.54798700201316714441e-04, + 3.46369511160995113223e-04, + 3.37751400192573319938e-04, + 3.28949492164903488020e-04, + 3.19969011546054665687e-04, + 3.10815279311211242839e-04, + 3.01493709798685276691e-04, + 2.92009807515892561881e-04, + 2.82369163897162314333e-04, + 2.72577454015293597824e-04, + 2.62640433248783711044e-04, + 2.52563933906683622723e-04, + 2.42353861813065601894e-04, + 2.32016192853029426611e-04, + 2.21556969482438587647e-04, + 2.10982297203188133052e-04, + 2.00298341006229532702e-04, + 1.89511321784351343799e-04, + 1.78627512716812605594e-04, + 1.67653235627924536433e-04, + 1.56594857321689550278e-04, + 1.45458785894609618538e-04, + 1.34251467028869596798e-04, + 1.22979380267843285647e-04, + 1.11649035276331349935e-04, + 1.00266968087514806969e-04, + 8.88397373387060364193e-05, + 7.73739204984463118959e-05, + 6.58761100865689746284e-05, + 5.43529098898822812845e-05, + 4.28109311752722368678e-05, + 3.12567889026958147750e-05, + 1.96970979400246795697e-05, + 8.13846928198325526361e-06, +-3.41249372467339250558e-06, +-1.49491991475911624329e-05, +-2.64650702247123145554e-05, +-3.79535491074849259605e-05, +-4.94081005893409459882e-05, +-6.08222158171220890705e-05, +-7.21894159836215413640e-05, +-8.35032559989468706153e-05, +-9.47573281387071252556e-05, +-1.05945265666950816461e-04, +-1.17060746431808460001e-04, +-1.28097496431813168485e-04, +-1.39049293350893167628e-04, +-1.49909970060043025702e-04, +-1.60673418083712545501e-04, +-1.71333591028951604061e-04, +-1.81884507975470710237e-04, +-1.92320256824521286943e-04, +-2.02634997604990462535e-04, +-2.12822965734663506043e-04, +-2.22878475234921188562e-04, +-2.32795921897065518930e-04, +-2.42569786398529724757e-04, +-2.52194637367171917153e-04, +-2.61665134392132306407e-04, +-2.70976030979354039815e-04, +-2.80122177450312201570e-04, +-2.89098523782284854127e-04, +-2.97900122388595328931e-04, +-3.06522130837423188374e-04, +-3.14959814507391293315e-04, +-3.23208549178839786662e-04, +-3.31263823559207256243e-04, +-3.39121241741069823911e-04, +-3.46776525591634588071e-04, +-3.54225517072336341072e-04, +-3.61464180487291921601e-04, +-3.68488604659406027153e-04, +-3.75295005032959282966e-04, +-3.81879725701552677659e-04, +-3.88239241360328717068e-04, +-3.94370159181469716065e-04, +-4.00269220611873847385e-04, +-4.05933303092217750898e-04, +-4.11359421696386878559e-04, +-4.16544730690475114351e-04, +-4.21486525010528862399e-04, +-4.26182241658291949011e-04, +-4.30629461014228067349e-04, +-4.34825908067166936634e-04, +-4.38769453559957806933e-04, +-4.42458115050543214063e-04, +-4.45890057887998378632e-04, +-4.49063596103017892164e-04, +-4.51977193212385814410e-04, +-4.54629462937196024159e-04, +-4.57019169834384534831e-04, +-4.59145229841358777558e-04, +-4.61006710733478388374e-04, +-4.62602832494264496789e-04, +-4.63932967598159218692e-04, +-4.64996641205815024796e-04, +-4.65793531271870616534e-04, +-4.66323468565258629059e-04, +-4.66586436602117857111e-04, +-4.66582571491450407916e-04, +-4.66312161693693675614e-04, +-4.65775647692456124232e-04, +-4.64973621579678497197e-04, +-4.63906826554567289656e-04, +-4.62576156336664179227e-04, +-4.60982654493493390190e-04, +-4.59127513683252981222e-04, +-4.57012074813076816290e-04, +-4.54637826113443851636e-04, +-4.52006402129344277314e-04, +-4.49119582628882253825e-04, +-4.45979291430018782647e-04, +-4.42587595146185029237e-04, +-4.38946701851662950556e-04, +-4.35058959667485500768e-04, +-4.30926855268744430933e-04, +-4.26553012314354973531e-04, +-4.21940189800147375659e-04, +-4.17091280336356255796e-04, +-4.12009308350574096971e-04, +-4.06697428217259312686e-04, +-4.01158922314968034977e-04, +-3.95397199012481159307e-04, +-3.89415790585079821338e-04, +-3.83218351062148158623e-04, +-3.76808654007610018769e-04, +-3.70190590234281159936e-04, +-3.63368165453703019507e-04, +-3.56345497862799480068e-04, +-3.49126815668818354065e-04, +-3.41716454554033186291e-04, +-3.34118855081727756696e-04, +-3.26338560045002091647e-04, +-3.18380211759965842631e-04, +-3.10248549305032668161e-04, +-3.01948405707699765559e-04, +-2.93484705080720911091e-04, +-2.84862459709394287826e-04, +-2.76086767091391477574e-04, +-2.67162806931154044997e-04, +-2.58095838090502502794e-04, +-2.48891195497272449746e-04, +-2.39554287013787821662e-04, +-2.30090590267009276020e-04, +-2.20505649442205787147e-04, +-2.10805072042026829309e-04, +-2.00994525612865481291e-04, +-1.91079734440417233063e-04, +-1.81066476216359793653e-04, +-1.70960578678090068449e-04, +-1.60767916223468677233e-04, +-1.50494406502535882537e-04, +-1.40146006988172149195e-04, +-1.29728711527686151094e-04, +-1.19248546877326160043e-04, +-1.08711569221710101099e-04, +-9.81238606801850763708e-05, +-8.74915258021262919313e-05, +-7.68206880531919903462e-05, +-6.61174862945537560044e-05, +-5.53880712571479811158e-05, +-4.46386020128183616507e-05, +-3.38752424447514053707e-05, +-2.31041577187158825475e-05, +-1.23315107575055638581e-05, +-1.56345872044351334759e-06, + 9.19385051001696058297e-06, + 1.99342818325943639068e-05, + 3.06517164204148291097e-05, + 4.13400552010434981019e-05, + 5.19932223217173526989e-05, + 6.26051685973046974495e-05, + 7.31698749393950269174e-05, + 8.36813557645763278318e-05, + 9.41336623796225205937e-05, + 1.04520886342181746720e-04, + 1.14837162794693847952e-04, + 1.25076673769810187576e-04, + 1.35233651465430277944e-04, + 1.45302381487516881669e-04, + 1.55277206058868723132e-04, + 1.65152527192051468401e-04, + 1.74922809824715685349e-04, + 1.84582584915542787917e-04, + 1.94126452499097224393e-04, + 2.03549084697879242812e-04, + 2.12845228689902707473e-04, + 2.22009709630148407153e-04, + 2.31037433524272298050e-04, + 2.39923390052979132632e-04, + 2.48662655345496428575e-04, + 2.57250394700618317985e-04, + 2.65681865253823213443e-04, + 2.73952418588994082733e-04, + 2.82057503293309968541e-04, + 2.89992667453910593113e-04, + 2.97753561094963236852e-04, + 3.05335938553796587460e-04, + 3.12735660794901402029e-04, + 3.19948697660284706902e-04, + 3.26971130055313046695e-04, + 3.33799152068596993118e-04, + 3.40429073024882096823e-04, + 3.46857319469846304971e-04, + 3.53080437085642826617e-04, + 3.59095092536410422437e-04, + 3.64898075242447582529e-04, + 3.70486299082366027022e-04, + 3.75856804022209637847e-04, + 3.81006757670713364344e-04, + 3.85933456759954328450e-04, + 3.90634328550441736316e-04, + 3.95106932160183021464e-04, + 3.99348959816850238372e-04, + 4.03358238032495769118e-04, + 4.07132728700219297200e-04, + 4.10670530112230828569e-04, + 4.13969877898831897789e-04, + 4.17029145887845879240e-04, + 4.19846846884104163249e-04, + 4.22421633368623200468e-04, + 4.24752298117164013222e-04, + 4.26837774737901984833e-04, + 4.28677138127993610176e-04, + 4.30269604848864133020e-04, + 4.31614533420087809028e-04, + 4.32711424531789182885e-04, + 4.33559921175517891476e-04, + 4.34159808693626808693e-04, + 4.34511014747204218304e-04, + 4.34613609202668001435e-04, + 4.34467803937177638515e-04, + 4.34073952563060591527e-04, + 4.33432550071505902529e-04, + 4.32544232395796221600e-04, + 4.31409775894451988712e-04, + 4.30030096754630268997e-04, + 4.28406250316232413682e-04, + 4.26539430317180844748e-04, + 4.24430968060405871753e-04, + 4.22082331503046044325e-04, + 4.19495124268545250320e-04, + 4.16671084582238100344e-04, + 4.13612084131137220516e-04, + 4.10320126848655590979e-04, + 4.06797347625035990524e-04, + 4.03046010944322816681e-04, + 3.99068509448671923049e-04, + 3.94867362431040608978e-04, + 3.90445214257016648927e-04, + 3.85804832716899566078e-04, + 3.80949107308997192770e-04, + 3.75881047455209468464e-04, + 3.70603780649984598967e-04, + 3.65120550543784417111e-04, + 3.59434714962230262691e-04, + 3.53549743862119564622e-04, + 3.47469217225564457226e-04, + 3.41196822893517369337e-04, + 3.34736354339987610389e-04, + 3.28091708388290057355e-04, + 3.21266882870694259894e-04, + 3.14265974232871717151e-04, + 3.07093175084575183576e-04, + 2.99752771698005490968e-04, + 2.92249141455357803153e-04, + 2.84586750247056946388e-04, + 2.76770149822231086197e-04, + 2.68803975092983104406e-04, + 2.60692941394056651970e-04, + 2.52441841699531203946e-04, + 2.44055543798067387786e-04, + 2.35538987428655314377e-04, + 2.26897181378157982660e-04, + 2.18135200542623168421e-04, + 2.09258182954089169475e-04, + 2.00271326774336208163e-04, + 1.91179887257744631369e-04, + 1.81989173684729625387e-04, + 1.72704546267654705490e-04, + 1.63331413031008576943e-04, + 1.53875226667652081989e-04, + 1.44341481372964688425e-04, + 1.34735709658744315766e-04, + 1.25063479148570258709e-04, + 1.15330389356819486019e-04, + 1.05542068452749301325e-04, + 9.57041700118449787478e-05, + 8.58223697561741577077e-05, + 7.59023622856443207175e-05, + 6.59498578020433471767e-05, + 5.59705788277444033440e-05, + 4.59702569209572621425e-05, + 3.59546293894085665843e-05, + 2.59294360043086512160e-05, + 1.59004157166498285290e-05, + 5.87330337721188446920e-06, +-4.14617353701999446564e-06, +-1.41522981889934754151e-05, +-2.41393676379234885633e-05, +-3.41016960841382575317e-05, +-4.40336181005696522257e-05, +-5.39294918490548975433e-05, +-6.37837022796263207513e-05, +-7.35906643109786139231e-05, +-8.33448259903158111123e-05, +-9.30406716307915674464e-05, +-1.02672724924753142484e-04, +-1.12235552031169472749e-04, +-1.21723764635187306645e-04, +-1.31132022978417295961e-04, +-1.40455038858246640358e-04, +-1.49687578594178148693e-04, +-1.58824465959857513524e-04, +-1.67860585079007983188e-04, +-1.76790883283683004619e-04, +-1.85610373933242124578e-04, +-1.94314139192479492721e-04, +-2.02897332767363176810e-04, +-2.11355182596845939808e-04, +-2.19682993499378809155e-04, +-2.27876149772357342645e-04, +-2.35930117743474312237e-04, +-2.43840448272265441099e-04, +-2.51602779200596157229e-04, +-2.59212837750722130490e-04, +-2.66666442869611193447e-04, +-2.73959507518241514052e-04, +-2.81088040904634635809e-04, +-2.88048150659414798139e-04, +-2.94836044952623201488e-04, +-3.01448034550882504670e-04, +-3.07880534813461108779e-04, +-3.14130067626494494971e-04, +-3.20193263274004568698e-04, +-3.26066862245033475126e-04, +-3.31747716975704792786e-04, +-3.37232793525372445079e-04, +-3.42519173185958092365e-04, +-3.47604054023637506869e-04, +-3.52484752352054538874e-04, +-3.57158704136308719976e-04, +-3.61623466326981902238e-04, +-3.65876718123521590606e-04, +-3.69916262166333537249e-04, +-3.73740025656983437721e-04, +-3.77346061405942046450e-04, +-3.80732548807360233426e-04, +-3.83897794740389560527e-04, +-3.86840234396619738182e-04, +-3.89558432033239830650e-04, +-3.92051081651568350539e-04, +-3.94317007600659507997e-04, +-3.96355165105705619343e-04, +-3.98164640721032441449e-04, +-3.99744652707502629626e-04, +-4.01094551334191251613e-04, +-4.02213819104267004522e-04, +-4.03102070904986001763e-04, +-4.03759054081854400035e-04, +-4.04184648436960245865e-04, +-4.04378866151571740410e-04, +-4.04341851633132352058e-04, +-4.04073881286819201839e-04, +-4.03575363211878201074e-04, +-4.02846836823000703422e-04, +-4.01888972397027575446e-04, +-4.00702570545332346658e-04, +-3.99288561612268872933e-04, +-3.97648005000088408580e-04, +-3.95782088420835174210e-04, +-3.93692127075682019467e-04, +-3.91379562762282434078e-04, +-3.88845962910724810089e-04, +-3.86093019548719798301e-04, +-3.83122548196679628581e-04, +-3.79936486693416947905e-04, +-3.76536893953195608929e-04, +-3.72925948654929972394e-04, +-3.69105947864348422904e-04, +-3.65079305589995940784e-04, +-3.60848551273959680056e-04, +-3.56416328218264332091e-04, +-3.51785391947902702746e-04, +-3.46958608511509539966e-04, +-3.41938952720719716982e-04, +-3.36729506329282559166e-04, +-3.31333456153044218079e-04, +-3.25754092131937047095e-04, +-3.19994805335147892728e-04, +-3.14059085910667681873e-04, +-3.07950520980461819095e-04, +-3.01672792482518580589e-04, +-2.95229674961088311026e-04, +-2.88625033306340523283e-04, +-2.81862820445018204176e-04, +-2.74947074983157644778e-04, +-2.67881918802505628041e-04, +-2.60671554611964777660e-04, +-2.53320263455520278562e-04, +-2.45832402178220821125e-04, +-2.38212400851451575621e-04, +-2.30464760159363048859e-04, +-2.22594048747734558165e-04, +-2.14604900536931233329e-04, +-2.06502012000535557258e-04, +-1.98290139411133950476e-04, +-1.89974096055152907262e-04, +-1.81558749417992085131e-04, +-1.73049018341384308823e-04, +-1.64449870154523194316e-04, +-1.55766317780646929318e-04, +-1.47003416820761271481e-04, +-1.38166262616194393661e-04, +-1.29259987291687318631e-04, +-1.20289756780731966232e-04, +-1.11260767834878675090e-04, +-1.02178245018739763763e-04, +-9.30474376924268498914e-05, +-8.38736169831565017523e-05, +-7.46620727477739890053e-05, +-6.54181105279376081448e-05, +-5.61470484997162090244e-05, +-4.68542144193485576007e-05, +-3.75449425669173780990e-05, +-2.82245706896867571811e-05, +-1.88984369468525752515e-05, +-9.57187685745089512619e-06, +-2.50220253166946479370e-07, + 9.06121176221840221013e-06, + 1.83571098449908816895e-05, + 2.76321794336816537255e-05, + 3.68811437592135666556e-05, + 4.60987468417495339684e-05, + 5.52797564722329147621e-05, + 6.44189671769343854841e-05, + 7.35112031636342259672e-05, + 8.25513212473374231003e-05, + 9.15342137542006137590e-05, + 1.00454811401901069581e-04, + 1.09308086154850524381e-04, + 1.18089054052647829071e-04, + 1.26792778010161884652e-04, + 1.35414370587798690198e-04, + 1.43948996730092746744e-04, + 1.52391876471503188604e-04, + 1.60738287607595838752e-04, + 1.68983568330243670531e-04, + 1.77123119825359898573e-04, + 1.85152408831718565856e-04, + 1.93066970159443514676e-04, + 2.00862409166768096517e-04, + 2.08534404193699878438e-04, + 2.16078708951240975071e-04, + 2.23491154864851335540e-04, + 2.30767653370864866047e-04, + 2.37904198164594560738e-04, + 2.44896867398899378224e-04, + 2.51741825832007637496e-04, + 2.58435326923423880699e-04, + 2.64973714876783311267e-04, + 2.71353426628539464403e-04, + 2.77570993781410069266e-04, + 2.83623044481539374282e-04, + 2.89506305238360116608e-04, + 2.95217602686185913181e-04, + 3.00753865286583336493e-04, + 3.06112124970612023683e-04, + 3.11289518720129045667e-04, + 3.16283290087134808400e-04, + 3.21090790650627329848e-04, + 3.25709481409937177433e-04, + 3.30136934114071980105e-04, + 3.34370832526131541752e-04, + 3.38408973622323120626e-04, + 3.42249268724889273759e-04, + 3.45889744568388601224e-04, + 3.49328544298793523294e-04, + 3.52563928404906736999e-04, + 3.55594275581636054019e-04, + 3.58418083524750480211e-04, + 3.61033969656628290525e-04, + 3.63440671782813055999e-04, + 3.65637048678958849739e-04, + 3.67622080607960151355e-04, + 3.69394869767037141092e-04, + 3.70954640664598411879e-04, + 3.72300740426744327174e-04, + 3.73432639033317674820e-04, + 3.74349929483439925783e-04, + 3.75052327890526104696e-04, + 3.75539673506779519020e-04, + 3.75811928677284036969e-04, + 3.75869178723718091930e-04, + 3.75711631757917824750e-04, + 3.75339618425418329768e-04, + 3.74753591579224973156e-04, + 3.73954125884068270050e-04, + 3.72941917351453974382e-04, + 3.71717782805840797795e-04, + 3.70282659282345936666e-04, + 3.68637603356378044158e-04, + 3.66783790405674587840e-04, + 3.64722513805233164354e-04, + 3.62455184055677408564e-04, + 3.59983327845599923502e-04, + 3.57308587048594551976e-04, + 3.54432717655444305162e-04, + 3.51357588642338164626e-04, + 3.48085180775715128960e-04, + 3.44617585354531092562e-04, + 3.40957002890739319448e-04, + 3.37105741728795874762e-04, + 3.33066216605056779430e-04, + 3.28840947147959132123e-04, + 3.24432556319903108322e-04, + 3.19843768801808070543e-04, + 3.15077409321264686852e-04, + 3.10136400925462669617e-04, + 3.05023763199732222788e-04, + 2.99742610432934862910e-04, + 2.94296149730754368415e-04, + 2.88687679078032178367e-04, + 2.82920585351309613817e-04, + 2.76998342282779573022e-04, + 2.70924508376842870794e-04, + 2.64702724780600893301e-04, + 2.58336713109347953805e-04, + 2.51830273228646013463e-04, + 2.45187280994006067195e-04, + 2.38411685949818300109e-04, + 2.31507508988586837694e-04, + 2.24478839972069534785e-04, + 2.17329835315641735263e-04, + 2.10064715537319865631e-04, + 2.02687762772885523210e-04, + 1.95203318258571319535e-04, + 1.87615779782783292061e-04, + 1.79929599108352478208e-04, + 1.72149279366823641443e-04, + 1.64279372426300712944e-04, + 1.56324476234388271998e-04, + 1.48289232137772291394e-04, + 1.40178322180001724197e-04, + 1.31996466379041452969e-04, + 1.23748419986174359531e-04, + 1.15438970727843310919e-04, + 1.07072936032028641199e-04, + 9.86551602407646912674e-05, + 9.01905118104061922493e-05, + 8.16838805012586526922e-05, + 7.31401745581928999611e-05, + 6.45643178838649969007e-05, + 5.59612472061890399498e-05, + 4.73359092415654616050e-05, + 3.86932578557977460893e-05, + 3.00382512239181022112e-05, + 2.13758489908508619718e-05, + 1.27110094344164514346e-05, + 4.04868663231493498654e-06, +-4.60617236531486804862e-06, +-1.32486303560268950814e-05, +-2.18737627965935988274e-05, +-3.04766606039162663141e-05, +-3.90524329440386771335e-05, +-4.75962100075382721592e-05, +-5.61031457698656416577e-05, +-6.45684207347658160750e-05, +-7.29872446596370569490e-05, +-8.13548592609855323026e-05, +-8.96665408985710283294e-05, +-9.79176032367135154100e-05, +-1.06103399881264301701e-04, +-1.14219326990759500518e-04, +-1.22260825860294306986e-04, +-1.30223385476667787367e-04, +-1.38102545043372279022e-04, +-1.45893896474014590726e-04, +-1.53593086852781251627e-04, +-1.61195820860575358014e-04, +-1.68697863165478154166e-04, +-1.76095040776206332271e-04, +-1.83383245357263575124e-04, +-1.90558435504502971490e-04, +-1.97616638979844499871e-04, +-2.04553954903916496199e-04, +-2.11366555905413412665e-04, +-2.18050690225988521003e-04, +-2.24602683779532712486e-04, +-2.31018942164689760873e-04, +-2.37295952629612913335e-04, +-2.43430285987647672136e-04, +-2.49418598483226250720e-04, +-2.55257633606716517576e-04, +-2.60944223857345624935e-04, +-2.66475292453244793581e-04, +-2.71847854987617462523e-04, +-2.77059021030343338027e-04, +-2.82105995673898740650e-04, +-2.86986081022970918215e-04, +-2.91696677626899613517e-04, +-2.96235285854203533526e-04, +-3.00599507208460371525e-04, +-3.04787045584920001685e-04, +-3.08795708467034170797e-04, +-3.12623408062509989137e-04, +-3.16268162378132073644e-04, +-3.19728096232883450198e-04, +-3.23001442208842737963e-04, +-3.26086541539376013193e-04, +-3.28981844934199483665e-04, +-3.31685913340901627425e-04, +-3.34197418642568527033e-04, +-3.36515144291180958672e-04, +-3.38637985876496302052e-04, +-3.40564951630163302489e-04, +-3.42295162864854200010e-04, +-3.43827854348234302102e-04, +-3.45162374611635318009e-04, +-3.46298186193322516443e-04, +-3.47234865816296292464e-04, +-3.47972104500599249514e-04, +-3.48509707610135627091e-04, +-3.48847594834057013122e-04, +-3.48985800102794084098e-04, +-3.48924471438857429929e-04, +-3.48663870742568846994e-04, +-3.48204373512918418428e-04, +-3.47546468503779780370e-04, +-3.46690757315755763122e-04, +-3.45637953923957387536e-04, +-3.44388884142068690732e-04, +-3.42944485023055438931e-04, +-3.41305804196959756622e-04, +-3.39473999146208769290e-04, +-3.37450336418937347962e-04, +-3.35236190780833392174e-04, +-3.32833044306071442267e-04, +-3.30242485407915102851e-04, +-3.27466207809625300430e-04, +-3.24506009456285323105e-04, +-3.21363791368333459424e-04, +-3.18041556437396186544e-04, +-3.14541408165269157499e-04, +-3.10865549346798478083e-04, +-3.07016280697481171256e-04, +-3.02995999426636253033e-04, +-2.98807197757022834691e-04, +-2.94452461391812403239e-04, +-2.89934467929851976634e-04, +-2.85255985230187464677e-04, +-2.80419869726833046429e-04, +-2.75429064694814387804e-04, +-2.70286598468527671825e-04, +-2.64995582613490349589e-04, +-2.59559210052583209764e-04, +-2.53980753147903693268e-04, +-2.48263561739382960028e-04, +-2.42411061141333119629e-04, +-2.36426750098121530837e-04, +-2.30314198700187072744e-04, +-2.24077046261636817458e-04, +-2.17718999160677065480e-04, +-2.11243828644175747709e-04, +-2.04655368597559766909e-04, +-1.97957513281590559125e-04, +-1.91154215037028974876e-04, +-1.84249481958865466954e-04, +-1.77247375541147338725e-04, +-1.70152008294119155233e-04, +-1.62967541334830558729e-04, +-1.55698181952718529668e-04, +-1.48348181151564014997e-04, +-1.40921831169260738459e-04, +-1.33423462976836989169e-04, +-1.25857443758204442640e-04, +-1.18228174371988047249e-04, +-1.10540086797179302569e-04, +-1.02797641563733886216e-04, +-9.50053251698690202779e-05, +-8.71676474874451848130e-05, +-7.92891391569480421435e-05, +-7.13743489735723545724e-05, +-6.34278412659133373520e-05, +-5.54541932687728470635e-05, +-4.74579924915896622650e-05, +-3.94438340839858202430e-05, +-3.14163182000519927554e-05, +-2.33800473626161515084e-05, +-1.53396238292672757364e-05, +-7.29964696164099043725e-06, + 7.35289400800058785423e-07, + 8.76059956072690135676e-06, + 1.67717085752691440334e-05, + 2.47640548591994233581e-05, + 3.27330927774992179306e-05, + 4.06742952258349121995e-05, + 4.85831561974826067188e-05, + 5.64551933352481954465e-05, + 6.42859504669411802903e-05, + 7.20710001229515570022e-05, + 7.98059460346407204163e-05, + 8.74864256117493171517e-05, + 9.51081123980788522947e-05, + 1.02666718503417308400e-04, + 1.10157997010735983186e-04, + 1.17577744357177826798e-04, + 1.24921802687524364020e-04, + 1.32186062178827283932e-04, + 1.39366463334907178051e-04, + 1.46458999249442900882e-04, + 1.53459717836390693510e-04, + 1.60364724026482917364e-04, + 1.67170181928681389327e-04, + 1.73872316955147449263e-04, + 1.80467417908883949636e-04, + 1.86951839032647022755e-04, + 1.93322002018104301428e-04, + 1.99574397974115166953e-04, + 2.05705589353056221948e-04, + 2.11712211834139661399e-04, + 2.17590976162706123713e-04, + 2.23338669944412427466e-04, + 2.28952159393546036611e-04, + 2.34428391034224761335e-04, + 2.39764393353856245438e-04, + 2.44957278407680664051e-04, + 2.50004243373813900102e-04, + 2.54902572057763023537e-04, + 2.59649636345685814673e-04, + 2.64242897605613895860e-04, + 2.68679908035895302198e-04, + 2.72958311960145715448e-04, + 2.77075847068031439532e-04, + 2.81030345601230668959e-04, + 2.84819735483968607473e-04, + 2.88442041397530505187e-04, + 2.91895385798214199429e-04, + 2.95177989878195508062e-04, + 2.98288174468830185292e-04, + 3.01224360885935828203e-04, + 3.03985071716642170879e-04, + 3.06568931547421675947e-04, + 3.08974667632958628800e-04, + 3.11201110505533425424e-04, + 3.13247194524650732217e-04, + 3.15111958366658898717e-04, + 3.16794545454155058485e-04, + 3.18294204324996645328e-04, + 3.19610288940773337035e-04, + 3.20742258934658165670e-04, + 3.21689679798506877016e-04, + 3.22452223009245763068e-04, + 3.23029666094488715922e-04, + 3.23421892637434677410e-04, + 3.23628892221117367076e-04, + 3.23650760312099662532e-04, + 3.23487698083753741091e-04, + 3.23140012179301756075e-04, + 3.22608114414811391040e-04, + 3.21892521422396742613e-04, + 3.20993854233888264126e-04, + 3.19912837805281418183e-04, + 3.18650300482314343883e-04, + 3.17207173407532596471e-04, + 3.15584489869251980446e-04, + 3.13783384592866167444e-04, + 3.11805092974967040537e-04, + 3.09650950260776226895e-04, + 3.07322390665431383582e-04, + 3.04820946439691672133e-04, + 3.02148246880660359404e-04, + 2.99306017288154683001e-04, + 2.96296077867383965149e-04, + 2.93120342578621461815e-04, + 2.89780817934593706246e-04, + 2.86279601746334145390e-04, + 2.82618881818277357942e-04, + 2.78800934593397952560e-04, + 2.74828123749229578238e-04, + 2.70702898745622138645e-04, + 2.66427793325122298871e-04, + 2.62005423966893218578e-04, + 2.57438488295109720125e-04, + 2.52729763442789332178e-04, + 2.47882104372053313750e-04, + 2.42898442151831685893e-04, + 2.37781782193984719039e-04, + 2.32535202449068816293e-04, + 2.27161851562591142212e-04, + 2.21664946993031298540e-04, + 2.16047773092666164701e-04, + 2.10313679152429068835e-04, + 2.04466077411766494580e-04, + 1.98508441034933119868e-04, + 1.92444302054725852134e-04, + 1.86277249284949120503e-04, + 1.80010926202826978225e-04, + 1.73649028802625680088e-04, + 1.67195303421656588962e-04, + 1.60653544540157914395e-04, + 1.54027592556047951671e-04, + 1.47321331536073504842e-04, + 1.40538686944578018788e-04, + 1.33683623351231527059e-04, + 1.26760142119053490503e-04, + 1.19772279074078399062e-04, + 1.12724102158015825103e-04, + 1.05619709065267838215e-04, + 9.84632248656736166819e-05, + 9.12587996143574470059e-05, + 8.40106059500621168935e-05, + 7.67228366833554533723e-05, + 6.93997023760999396736e-05, + 6.20454289135817277541e-05, + 5.46642550706949160956e-05, + 4.72604300735806080519e-05, + 3.98382111581210927170e-05, + 3.24018611266886229260e-05, + 2.49556459045488985800e-05, + 1.75038320973170900537e-05, + 1.00506845508623119789e-05, + 2.60046391505357440467e-06, +-4.84257578724628453024e-06, +-1.22741895846601957513e-05, +-1.96901439736055691699e-05, +-2.70862193254132534745e-05, +-3.44582122826427863452e-05, +-4.18019381432365520865e-05, +-4.91132332314092313582e-05, +-5.63879572535800466628e-05, +-6.36219956382819091861e-05, +-7.08112618586212363026e-05, +-7.79516997359988795179e-05, +-8.50392857237956806661e-05, +-9.20700311697229486791e-05, +-9.90399845556698052700e-05, +-1.05945233713539423387e-04, +-1.12781908016172197095e-04, +-1.19546180541878292172e-04, +-1.26234270211473149090e-04, +-1.32842443896610563079e-04, +-1.39367018498237036110e-04, +-1.45804362994017441780e-04, +-1.52150900453594729216e-04, +-1.58403110020568740251e-04, +-1.64557528860099149893e-04, +-1.70610754071058763354e-04, +-1.76559444561685330907e-04, +-1.82400322887701021131e-04, +-1.88130177051889265882e-04, +-1.93745862264151107917e-04, +-1.99244302661073536273e-04, +-2.04622492984076230016e-04, +-2.09877500215226739464e-04, +-2.15006465169834002022e-04, +-2.20006604044963781320e-04, +-2.24875209923037860070e-04, +-2.29609654229712996506e-04, +-2.34207388145253733377e-04, +-2.38665943968643126617e-04, +-2.42982936433764040154e-04, +-2.47156063976803242084e-04, +-2.51183109954370624526e-04, +-2.55061943811678553534e-04, +-2.58790522200035065601e-04, +-2.62366890043213652015e-04, +-2.65789181552087544740e-04, +-2.69055621187019552206e-04, +-2.72164524567514133028e-04, +-2.75114299328679378503e-04, +-2.77903445924066144594e-04, +-2.80530558374482365432e-04, +-2.82994324962458426113e-04, +-2.85293528871928667081e-04, +-2.87427048772961131386e-04, +-2.89393859351164052952e-04, +-2.91193031781574363133e-04, +-2.92823734146810019888e-04, +-2.94285231799317132436e-04, +-2.95576887667566815150e-04, +-2.96698162506095247833e-04, +-2.97648615089306386138e-04, +-2.98427902348986473068e-04, +-2.99035779455541356198e-04, +-2.99472099842951298022e-04, +-2.99736815177487569105e-04, +-2.99829975270314748326e-04, +-2.99751727934055112266e-04, +-2.99502318783477473017e-04, +-2.99082090980496079820e-04, +-2.98491484923676638277e-04, +-2.97731037882504939382e-04, +-2.96801383576682481068e-04, +-2.95703251700761983022e-04, +-2.94437467394450386442e-04, +-2.93004950658959568456e-04, +-2.91406715719765864719e-04, +-2.89643870336288734163e-04, +-2.87717615058818976508e-04, +-2.85629242433306474672e-04, +-2.83380136154447051858e-04, +-2.80971770167645455707e-04, +-2.78405707720416845195e-04, +-2.75683600363831927699e-04, +-2.72807186904635450876e-04, +-2.69778292308697948982e-04, +-2.66598826556476689500e-04, +-2.63270783451207898707e-04, +-2.59796239380568065765e-04, +-2.56177352032518543517e-04, +-2.52416359066249054721e-04, +-2.48515576738865041385e-04, +-2.44477398488780056640e-04, +-2.40304293476628925757e-04, +-2.35998805084586303973e-04, +-2.31563549375006809058e-04, +-2.27001213509300385799e-04, +-2.22314554128057417478e-04, +-2.17506395693240964359e-04, +-2.12579628793644199699e-04, +-2.07537208414486720482e-04, +-2.02382152172165928486e-04, +-1.97117538515386705664e-04, +-1.91746504893500153760e-04, +-1.86272245893312135556e-04, +-1.80698011345398386069e-04, +-1.75027104401053194751e-04, +-1.69262879581007170742e-04, +-1.63408740797064619410e-04, +-1.57468139347822794899e-04, +-1.51444571889650255424e-04, +-1.45341578384115073432e-04, +-1.39162740023062326405e-04, +-1.32911677132557424445e-04, +-1.26592047056915218929e-04, +-1.20207542024052590340e-04, +-1.13761886993405384643e-04, +-1.07258837487659783316e-04, +-1.00702177409562164813e-04, +-9.40957168450681270561e-05, +-8.74432898541086471968e-05, +-8.07487522502475194583e-05, +-7.40159793705156095938e-05, +-6.72488638367082234085e-05, +-6.04513133094537063756e-05, +-5.36272482362472248819e-05, +-4.67805995949890251378e-05, +-3.99153066340006816592e-05, +-3.30353146100565781473e-05, +-2.61445725256313035213e-05, +-1.92470308666743191849e-05, +-1.23466393421882220175e-05, +-5.44734462700067394256e-06, + 1.44691189122907742152e-06, + 8.33219635915731991185e-06, + 1.52045846980238205263e-05, + 2.20601648356691710140e-05, + 2.88950389290342959231e-05, + 3.57053255759800123258e-05, + 4.24871620149298346875e-05, + 4.92367063114172048323e-05, + 5.59501395300588034607e-05, + 6.26236678908249482520e-05, + 6.92535249083772849656e-05, + 7.58359735132689484916e-05, + 8.23673081538160148027e-05, + 8.88438568774603065845e-05, + 9.52619833904571407419e-05, + 1.01618089094736445996e-04, + 1.07908615100796547912e-04, + 1.14130044215511548540e-04, + 1.20278902903740668169e-04, + 1.26351763222651335486e-04, + 1.32345244727680633103e-04, + 1.38256016349078191072e-04, + 1.44080798237992946907e-04, + 1.49816363581082602745e-04, + 1.55459540382645440516e-04, + 1.61007213213293658063e-04, + 1.66456324924208517568e-04, + 1.71803878326033914858e-04, + 1.77046937831481864629e-04, + 1.82182631060826721089e-04, + 1.87208150409221387497e-04, + 1.92120754575244299164e-04, + 1.96917770049651416229e-04, + 2.01596592563618655673e-04, + 2.06154688495617809162e-04, + 2.10589596236331749735e-04, + 2.14898927510659952262e-04, + 2.19080368656271521873e-04, + 2.23131681857964108947e-04, + 2.27050706337181441982e-04, + 2.30835359496065032096e-04, + 2.34483638015429345178e-04, + 2.37993618906142247269e-04, + 2.41363460513226320541e-04, + 2.44591403472347386668e-04, + 2.47675771618061590050e-04, + 2.50614972843412405108e-04, + 2.53407499910435565511e-04, + 2.56051931211167507936e-04, + 2.58546931478778998018e-04, + 2.60891252448485638522e-04, + 2.63083733467921166392e-04, + 2.65123302056677822517e-04, + 2.67008974414759331969e-04, + 2.68739855879716155965e-04, + 2.70315141332255878728e-04, + 2.71734115550168267312e-04, + 2.72996153510415167677e-04, + 2.74100720639277955180e-04, + 2.75047373010480411190e-04, + 2.75835757491237044091e-04, + 2.76465611836200725413e-04, + 2.76936764729322759931e-04, + 2.77249135773662686282e-04, + 2.77402735429210095530e-04, + 2.77397664898823418430e-04, + 2.77234115962408846773e-04, + 2.76912370759493020253e-04, + 2.76432801520381165802e-04, + 2.75795870246112379866e-04, + 2.75002128337457571201e-04, + 2.74052216173225097421e-04, + 2.72946862638190302849e-04, + 2.71686884600967171015e-04, + 2.70273186342183185330e-04, + 2.68706758933346897579e-04, + 2.66988679566817544743e-04, + 2.65120110837324977557e-04, + 2.63102299975484803154e-04, + 2.60936578033862389640e-04, + 2.58624359026030797588e-04, + 2.56167139019227189586e-04, + 2.53566495181161690939e-04, + 2.50824084781579728989e-04, + 2.47941644149205875185e-04, + 2.44920987584716133307e-04, + 2.41764006230414186041e-04, + 2.38472666897310341073e-04, + 2.35049010850323818796e-04, + 2.31495152552345612000e-04, + 2.27813278367987374863e-04, + 2.24005645227630785727e-04, + 2.20074579252881860408e-04, + 2.16022474343967573742e-04, + 2.11851790730109416395e-04, + 2.07565053483680750195e-04, + 2.03164850999056984188e-04, + 1.98653833437066455227e-04, + 1.94034711135973993255e-04, + 1.89310252989946878202e-04, + 1.84483284795969022882e-04, + 1.79556687570185045640e-04, + 1.74533395834689777828e-04, + 1.69416395875703968332e-04, + 1.64208723974330704888e-04, + 1.58913464610781706397e-04, + 1.53533748643116163459e-04, + 1.48072751461745600373e-04, + 1.42533691120615488420e-04, + 1.36919826446232244851e-04, + 1.31234455125635378044e-04, + 1.25480911774428335794e-04, + 1.19662565986003067314e-04, + 1.13782820363092171140e-04, + 1.07845108532812357350e-04, + 1.01852893146268084785e-04, + 9.58096638640913071758e-05, + 8.97189353288038125020e-05, + 8.35842451253892703041e-05, + 7.74091517311708171871e-05, + 7.11972324561945549498e-05, + 6.49520813753084395436e-05, + 5.86773072531284785184e-05, + 5.23765314630894333252e-05, + 4.60533859017605735615e-05, + 3.97115108997169615726e-05, + 3.33545531299399012877e-05, + 2.69861635152601212417e-05, + 2.06099951357281601966e-05, + 1.42297011374239464445e-05, + 7.84893264358421670118e-06, + 1.47133666946563786569e-06, +-4.89944595795788563131e-06, +-1.12597826742650033679e-05, +-1.76060512446440944824e-05, +-2.39346418225641322213e-05, +-3.02419589988916038355e-05, +-3.65244238402926538526e-05, +-4.27784759157675114065e-05, +-4.90005753101717809908e-05, +-5.51872046235883968062e-05, +-6.13348709554239443801e-05, +-6.74401078721121943153e-05, +-7.34994773573187349476e-05, +-7.95095717435526355005e-05, +-8.54670156241022589347e-05, +-9.13684677442247916886e-05, +-9.72106228705329827259e-05, +-1.02990213637535249144e-04, +-1.08704012370301582183e-04, +-1.14348832882239030933e-04, +-1.19921532246967561266e-04, +-1.25419012543391523258e-04, +-1.30838222572801670578e-04, +-1.36176159547326554701e-04, +-1.41429870748598893225e-04, +-1.46596455155808636037e-04, +-1.51673065042229072161e-04, +-1.56656907539345593332e-04, +-1.61545246167741111346e-04, +-1.66335402333829893021e-04, +-1.71024756791804714243e-04, +-1.75610751069764359483e-04, +-1.80090888859417295109e-04, +-1.84462737368601463689e-04, +-1.88723928635743296543e-04, +-1.92872160805764557030e-04, +-1.96905199366593993164e-04, +-2.00820878345682555252e-04, +-2.04617101465884017146e-04, +-2.08291843260079455108e-04, +-2.11843150143963964045e-04, +-2.15269141446432097026e-04, +-2.18568010397017243587e-04, +-2.21738025069880467571e-04, +-2.24777529283855221449e-04, +-2.27684943458087584887e-04, +-2.30458765422837560640e-04, +-2.33097571185028482272e-04, +-2.35600015648165144258e-04, +-2.37964833286258476731e-04, +-2.40190838771433997885e-04, +-2.42276927554912959329e-04, +-2.44222076401095133848e-04, +-2.46025343874493635128e-04, +-2.47685870779298261159e-04, +-2.49202880551373695713e-04, +-2.50575679602528446788e-04, +-2.51803657616905742379e-04, +-2.52886287799411761581e-04, +-2.53823127076041447393e-04, +-2.54613816246114423730e-04, +-2.55258080086343225150e-04, +-2.55755727406747662873e-04, +-2.56106651058446010017e-04, +-2.56310827893362850466e-04, +-2.56368318675959138472e-04, +-2.56279267947061176278e-04, +-2.56043903839951736412e-04, +-2.55662537848869153827e-04, +-2.55135564550115290575e-04, +-2.54463461275976690883e-04, +-2.53646787741720056760e-04, +-2.52686185625914012682e-04, +-2.51582378104383988602e-04, +-2.50336169338122934043e-04, +-2.48948443915500688007e-04, +-2.47420166249151312829e-04, +-2.45752379927938354159e-04, +-2.43946207024417992780e-04, +-2.42002847358256754223e-04, +-2.39923577716073371238e-04, +-2.37709751028206703414e-04, +-2.35362795502931025464e-04, +-2.32884213718665853896e-04, +-2.30275581674753719499e-04, +-2.27538547801391219296e-04, +-2.24674831929338742875e-04, +-2.21686224220039661921e-04, +-2.18574584056813192318e-04, +-2.15341838897799910417e-04, +-2.11989983091363462259e-04, +-2.08521076654672306251e-04, +-2.04937244016203435910e-04, +-2.01240672722932391033e-04, +-1.97433612112999371446e-04, +-1.93518371954601639930e-04, +-1.89497321052062165161e-04, +-1.85372885819735596941e-04, +-1.81147548824731936421e-04, +-1.76823847299330738289e-04, +-1.72404371623836980172e-04, +-1.67891763780981287087e-04, +-1.63288715782630906338e-04, +-1.58597968069809712021e-04, +-1.53822307886959517469e-04, +-1.48964567631409072149e-04, +-1.44027623179032189917e-04, +-1.39014392187015984161e-04, +-1.33927832374908250841e-04, +-1.28770939784726684953e-04, +-1.23546747021317972074e-04, +-1.18258321473934703560e-04, +-1.12908763520077224328e-04, +-1.07501204712651167732e-04, +-1.02038805951497883089e-04, +-9.65247556403633775101e-05, +-9.09622678303766927241e-05, +-8.53545803511158610944e-05, +-7.97049529303493834971e-05, +-7.40166653035361572950e-05, +-6.82930153141845771095e-05, +-6.25373170061634808944e-05, +-5.67528987090696620090e-05, +-5.09431011177533815009e-05, +-4.51112753671087087165e-05, +-3.92607811032360062451e-05, +-3.33949845520835634973e-05, +-2.75172565866769451451e-05, +-2.16309707940438413821e-05, +-1.57395015429393948119e-05, +-9.84622205347808669251e-06, +-3.95450246978667291299e-06, + 1.93229206330573338499e-06, + 7.81080331823583281971e-06, + 1.36776818965353001598e-05, + 1.95295891331412940274e-05, + 2.53631989924010254722e-05, + 3.11751999544031924995e-05, + 3.69622968907776241966e-05, + 4.27212129288199275452e-05, + 4.84486913029018664584e-05, + 5.41414971921248957621e-05, + 5.97964195431813658947e-05, + 6.54102728773860912868e-05, + 7.09798990809431715968e-05, + 7.65021691772440931741e-05, + 8.19739850804731076412e-05, + 8.73922813293384121618e-05, + 9.27540268000407564604e-05, + 9.80562263975138116018e-05, + 1.03295922723993288585e-04, + 1.08470197723987624161e-04, + 1.13576174304741347185e-04, + 1.18611017931288513657e-04, + 1.23571938195231626964e-04, + 1.28456190356295279348e-04, + 1.33261076856053907241e-04, + 1.37983948802590338087e-04, + 1.42622207425680382412e-04, + 1.47173305501465306920e-04, + 1.51634748745910018621e-04, + 1.56004097176282787189e-04, + 1.60278966439910032374e-04, + 1.64457029109492771420e-04, + 1.68536015944279398771e-04, + 1.72513717116415843562e-04, + 1.76387983401819222569e-04, + 1.80156727334917880767e-04, + 1.83817924326707803767e-04, + 1.87369613745391966429e-04, + 1.90809899959169668648e-04, + 1.94136953340610880553e-04, + 1.97349011231975375721e-04, + 2.00444378871088047271e-04, + 2.03421430277243321921e-04, + 2.06278609096683117384e-04, + 2.09014429407214987486e-04, + 2.11627476481567565469e-04, + 2.14116407509085294883e-04, + 2.16479952275410651545e-04, + 2.18716913799805800578e-04, + 2.20826168929834235413e-04, + 2.22806668893034610273e-04, + 2.24657439805431047601e-04, + 2.26377583136560162113e-04, + 2.27966276130837073623e-04, + 2.29422772185062839910e-04, + 2.30746401181916479780e-04, + 2.31936569779289853983e-04, + 2.32992761655362052436e-04, + 2.33914537709302807530e-04, + 2.34701536217598021733e-04, + 2.35353472945890507175e-04, + 2.35870141216392695174e-04, + 2.36251411930833043378e-04, + 2.36497233549024313271e-04, + 2.36607632023086867507e-04, + 2.36582710687435922303e-04, + 2.36422650104641229310e-04, + 2.36127707867309972372e-04, + 2.35698218356151145605e-04, + 2.35134592454421556497e-04, + 2.34437317218964954776e-04, + 2.33606955508089235429e-04, + 2.32644145566544174094e-04, + 2.31549600567894977307e-04, + 2.30324108114598991807e-04, + 2.28968529696129264976e-04, + 2.27483800105504667616e-04, + 2.25870926814611687646e-04, + 2.24130989308722247937e-04, + 2.22265138380645918331e-04, + 2.20274595384963348642e-04, + 2.18160651452820167134e-04, + 2.15924666667776987477e-04, + 2.13568069203236673070e-04, + 2.11092354421993914264e-04, + 2.08499083938437130724e-04, + 2.05789884644064712763e-04, + 2.02966447696813575728e-04, + 2.00030527474900313590e-04, + 1.96983940495784002342e-04, + 1.93828564300923292208e-04, + 1.90566336307002704526e-04, + 1.87199252624317116680e-04, + 1.83729366843086441233e-04, + 1.80158788788307001969e-04, + 1.76489683244053914514e-04, + 1.72724268647881387890e-04, + 1.68864815756162396296e-04, + 1.64913646281104273863e-04, + 1.60873131500388584026e-04, + 1.56745690840089552413e-04, + 1.52533790431842698147e-04, + 1.48239941645072722306e-04, + 1.43866699595155821557e-04, + 1.39416661628403223006e-04, + 1.34892465784759241557e-04, + 1.30296789239119602255e-04, + 1.25632346722192602372e-04, + 1.20901888921826961877e-04, + 1.16108200865747232967e-04, + 1.11254100286645201583e-04, + 1.06342435970584441723e-04, + 1.01376086089681932472e-04, + 9.63579565200426416864e-05, + 9.12909791459249860338e-05, + 8.61781101511258242455e-05, + 8.10223282985787361839e-05, + 7.58266331991632841188e-05, + 7.05940435707285904570e-05, + 6.53275954883418709775e-05, + 6.00303406267707601431e-05, + 5.47053444962296712734e-05, + 4.93556846723300390086e-05, + 4.39844490214451387493e-05, + 3.85947339222574980089e-05, + 3.31896424847004075168e-05, + 2.77722827672396915886e-05, + 2.23457659935181742969e-05, + 1.69132047694604267319e-05, + 1.14777113016647637858e-05, + 6.04239561835710224983e-06, + 6.10363793728645020518e-07, +-4.81528382325380808311e-06, +-1.02314543745700456363e-05, +-1.56350642523847494154e-05, +-2.10230408508807413534e-05, +-2.63923243095009231191e-05, +-3.17398692468697033722e-05, +-3.70626464842205185883e-05, +-4.23576447574330595914e-05, +-4.76218724167029767991e-05, +-5.28523591128858801825e-05, +-5.80461574695681123935e-05, +-6.32003447399251964056e-05, +-6.83120244474383017403e-05, +-7.33783280095512028618e-05, +-7.83964163433584703636e-05, +-8.33634814524302451963e-05, +-8.82767479938875655916e-05, +-9.31334748248567243206e-05, +-9.79309565274441714503e-05, +-1.02666524911384672157e-04, +-1.07337550493532478228e-04, +-1.11941443953376520482e-04, +-1.16475657563775984358e-04, +-1.20937686596131455368e-04, +-1.25325070699215711592e-04, +-1.29635395250910385187e-04, +-1.33866292682098157263e-04, +-1.38015443772047713324e-04, +-1.42080578914434722728e-04, +-1.46059479353512834980e-04, +-1.49949978389612786304e-04, +-1.53749962553389324382e-04, +-1.57457372748113794830e-04, +-1.61070205359542604606e-04, +-1.64586513332575895248e-04, +-1.68004407214276350055e-04, +-1.71322056162632199933e-04, +-1.74537688920543577207e-04, +-1.77649594754509306677e-04, +-1.80656124357563160031e-04, +-1.83555690715879498342e-04, +-1.86346769938744346575e-04, +-1.89027902051352861886e-04, +-1.91597691750067656950e-04, +-1.94054809119746906601e-04, +-1.96397990312779409513e-04, +-1.98626038189485975725e-04, +-2.00737822919565348781e-04, +-2.02732282544295099209e-04, +-2.04608423499208415697e-04, +-2.06365321097002875567e-04, +-2.08002119970448036889e-04, +-2.09518034475094608749e-04, +-2.10912349051600370295e-04, +-2.12184418547517878980e-04, +-2.13333668498409933503e-04, +-2.14359595368183043079e-04, +-2.15261766748550323726e-04, +-2.16039821517564244657e-04, +-2.16693469957175179064e-04, +-2.17222493829804320963e-04, +-2.17626746413933055187e-04, +-2.17906152498744288149e-04, +-2.18060708337866669768e-04, +-2.18090481562302831997e-04, +-2.17995611052633665597e-04, +-2.17776306770636030692e-04, +-2.17432849550450564774e-04, +-2.16965590849471163170e-04, +-2.16374952459152508069e-04, +-2.15661426175948502115e-04, +-2.14825573432618965528e-04, +-2.13868024890168464437e-04, +-2.12789479990694880424e-04, +-2.11590706471458399373e-04, +-2.10272539840493795068e-04, +-2.08835882814101080193e-04, +-2.07281704716627822619e-04, +-2.05611040842872101015e-04, +-2.03824991783563389154e-04, +-2.01924722714337458607e-04, +-1.99911462648656409243e-04, +-1.97786503655151527006e-04, +-1.95551200039875640226e-04, +-1.93206967493983087581e-04, +-1.90755282207361699176e-04, +-1.88197679948765912066e-04, +-1.85535755113050746619e-04, +-1.82771159736013454056e-04, +-1.79905602477525801202e-04, +-1.76940847573584393148e-04, +-1.73878713757827938272e-04, +-1.70721073153264649115e-04, +-1.67469850134842302650e-04, +-1.64127020163558210364e-04, +-1.60694608592805399886e-04, +-1.57174689447680583382e-04, +-1.53569384177978999996e-04, +-1.49880860385627755508e-04, +-1.46111330527314676282e-04, +-1.42263050593096474329e-04, +-1.38338318761709250845e-04, +-1.34339474033567067698e-04, +-1.30268894841948973309e-04, +-1.26128997643502378410e-04, +-1.21922235488716284571e-04, +-1.17651096573263047097e-04, +-1.13318102771055339347e-04, +-1.08925808149881126548e-04, +-1.04476797470485840437e-04, +-9.99736846699831026861e-05, +-9.54191113304803323683e-05, +-9.08157451338251561638e-05, +-8.61662783033089883962e-05, +-8.14734260333982814777e-05, +-7.67399249081906023075e-05, +-7.19685313096766739269e-05, +-6.71620198166663929249e-05, +-6.23231815953190427171e-05, +-5.74548227822070198159e-05, +-5.25597628608498169912e-05, +-4.76408330326411294346e-05, +-4.27008745831808004092e-05, +-3.77427372447754268139e-05, +-3.27692775562946159791e-05, +-2.77833572210794834225e-05, +-2.27878414640919380344e-05, +-1.77855973889981053694e-05, +-1.27794923363028358154e-05, +-7.77239224340285758588e-06, +-2.76716000750597664943e-06, + 2.23334614765047225155e-06, + 7.22627430035223622482e-06, + 1.22087804538059595082e-05, + 1.71780301524608407758e-05, + 2.21312000908374962855e-05, + 2.70654797139531880809e-05, + 3.19780728084379127691e-05, + 3.68661990834432147361e-05, + 4.17270957404514982554e-05, + 4.65580190311022323554e-05, + 5.13562458021581016814e-05, + 5.61190750267443480906e-05, + 6.08438293210010258259e-05, + 6.55278564453003783789e-05, + 7.01685307891888973997e-05, + 7.47632548392249471477e-05, + 7.93094606288941272312e-05, + 8.38046111697948801871e-05, + 8.82462018632895745093e-05, + 9.26317618918994384889e-05, + 9.69588555895161487196e-05, + 1.01225083789883730243e-04, + 1.05428085152447302661e-04, + 1.09565537464902931428e-04, + 1.13635158921721518338e-04, + 1.17634709377956067329e-04, + 1.21561991577586462265e-04, + 1.25414852355879225454e-04, + 1.29191183814908515468e-04, + 1.32888924471751327088e-04, + 1.36506060378661892669e-04, + 1.40040626214685270945e-04, + 1.43490706347988396978e-04, + 1.46854435868515841024e-04, + 1.50130001590280805039e-04, + 1.53315643022813413417e-04, + 1.56409653311238074644e-04, + 1.59410380144482617453e-04, + 1.62316226631138655961e-04, + 1.65125652142516246785e-04, + 1.67837173122445686060e-04, + 1.70449363863413175593e-04, + 1.72960857248622345769e-04, + 1.75370345459602272869e-04, + 1.77676580649003228304e-04, + 1.79878375578234217958e-04, + 1.81974604219625616178e-04, + 1.83964202322818494873e-04, + 1.85846167945095638082e-04, + 1.87619561945405119441e-04, + 1.89283508441830545512e-04, + 1.90837195232300557094e-04, + 1.92279874178338393460e-04, + 1.93610861551680866121e-04, + 1.94829538343613950903e-04, + 1.95935350536894948301e-04, + 1.96927809340166344414e-04, + 1.97806491384736336846e-04, + 1.98571038883713909618e-04, + 1.99221159753417060602e-04, + 1.99756627697045236825e-04, + 2.00177282250609553729e-04, + 2.00483028791162594395e-04, + 2.00673838507340500988e-04, + 2.00749748332303471193e-04, + 2.00710860839155866373e-04, + 2.00557344098951099076e-04, + 2.00289431501410645185e-04, + 1.99907421538506638011e-04, + 1.99411677551082736374e-04, + 1.98802627438700833676e-04, + 1.98080763332926219986e-04, + 1.97246641234288935590e-04, + 1.96300880613169869337e-04, + 1.95244163974890567017e-04, + 1.94077236389296096204e-04, + 1.92800904985150346445e-04, + 1.91416038409673633282e-04, + 1.89923566253578820747e-04, + 1.88324478441976569726e-04, + 1.86619824591544307586e-04, + 1.84810713334366470651e-04, + 1.82898311608877559096e-04, + 1.80883843918355590027e-04, + 1.78768591557429662019e-04, + 1.76553891807085754475e-04, + 1.74241137098672801628e-04, + 1.71831774147425040116e-04, + 1.69327303056034789413e-04, + 1.66729276388829827970e-04, + 1.64039298217118011776e-04, + 1.61259023136285878450e-04, + 1.58390155255254730902e-04, + 1.55434447158867309821e-04, + 1.52393698843932419136e-04, + 1.49269756629439789971e-04, + 1.46064512041690788922e-04, + 1.42779900675020699667e-04, + 1.39417901028690864249e-04, + 1.35980533320795114868e-04, + 1.32469858279776427946e-04, + 1.28887975914319409792e-04, + 1.25237024262341641208e-04, + 1.21519178119826532425e-04, + 1.17736647750260424580e-04, + 1.13891677575382762027e-04, + 1.09986544848155620062e-04, + 1.06023558308557749072e-04, + 1.02005056823126766924e-04, + 9.79334080089949563690e-05, + 9.38110068432369283674e-05, + 8.96402742583390368340e-05, + 8.54236557246172082802e-05, + 8.11636198204074375134e-05, + 7.68626567908638934834e-05, + 7.25232770962033334184e-05, + 6.81480099502408253210e-05, + 6.37394018500648417607e-05, + 5.93000150977037791236e-05, + 5.48324263146410183461e-05, + 5.03392249500377099197e-05, + 4.58230117835234620669e-05, + 4.12863974234202202882e-05, + 3.67320008012637997784e-05, + 3.21624476634885960824e-05, + 2.75803690611435845046e-05, + 2.29883998385047982199e-05, + 1.83891771214516705382e-05, + 1.37853388064824855514e-05, + 9.17952205116795011679e-06, + 4.57436176706797238011e-06, +-2.75108842579818438910e-08, +-4.62346999106136241029e-06, +-9.21089638641225220430e-06, +-1.37871791373255400920e-05, +-1.83497170273250301319e-05, +-2.28959200315399970119e-05, +-2.74232107835103849100e-05, +-3.19290260328724777978e-05, +-3.64108180931019818124e-05, +-4.08660562784996536732e-05, +-4.52922283295994015603e-05, +-4.96868418262625327142e-05, +-5.40474255875064181487e-05, +-5.83715310574944550438e-05, +-6.26567336767544860471e-05, +-6.69006342379224212954e-05, +-7.11008602252454944507e-05, +-7.52550671370984356097e-05, +-7.93609397907785223342e-05, +-8.34161936088556751033e-05, +-8.74185758863736857033e-05, +-9.13658670381457783342e-05, +-9.52558818255899069152e-05, +-9.90864705622930764172e-05, +-1.02855520297645628824e-04, +-1.06560955978024466816e-04, +-1.10200741584761408303e-04, +-1.13772881248329986426e-04, +-1.17275420338133038616e-04, +-1.20706446527301793710e-04, +-1.24064090831927222123e-04, +-1.27346528624161774851e-04, +-1.30551980618646957209e-04, +-1.33678713831734421146e-04, +-1.36725042512981202628e-04, +-1.39689329048471762296e-04, +-1.42569984835333479116e-04, +-1.45365471127236698399e-04, +-1.48074299850179806918e-04, +-1.50695034388278933371e-04, +-1.53226290339108047649e-04, +-1.55666736238194213047e-04, +-1.58015094252302533938e-04, +-1.60270140841145748061e-04, +-1.62430707387187727537e-04, +-1.64495680793215953231e-04, +-1.66464004047380415832e-04, +-1.68334676755447923760e-04, +-1.70106755639931378401e-04, +-1.71779355005955645377e-04, +-1.73351647173555225515e-04, +-1.74822862876237544423e-04, +-1.76192291625613234839e-04, +-1.77459282041936094012e-04, +-1.78623242150403258857e-04, +-1.79683639643093680336e-04, +-1.80640002106423656165e-04, +-1.81491917214075620078e-04, +-1.82239032885274609931e-04, +-1.82881057408414176473e-04, +-1.83417759529990343371e-04, +-1.83848968508822530749e-04, +-1.84174574135603265346e-04, +-1.84394526717789769034e-04, +-1.84508837029895376297e-04, +-1.84517576229257786137e-04, +-1.84420875737372863242e-04, +-1.84218927086907938075e-04, +-1.83911981734526851434e-04, +-1.83500350839676173650e-04, +-1.82984405009505745514e-04, +-1.82364574010110863959e-04, +-1.81641346444305146679e-04, +-1.80815269396154251801e-04, +-1.79886948042512636280e-04, +-1.78857045231831964091e-04, +-1.77726281030521376285e-04, +-1.76495432237164907125e-04, +-1.75165331864910952826e-04, +-1.73736868592374774480e-04, +-1.72210986183407241141e-04, +-1.70588682876102914121e-04, +-1.68871010741435372948e-04, +-1.67059075011932430324e-04, +-1.65154033380787864348e-04, +-1.63157095271909268353e-04, +-1.61069521081280296517e-04, +-1.58892621390163224591e-04, +-1.56627756150609387950e-04, +-1.54276333843780973348e-04, +-1.51839810611594959108e-04, +-1.49319689362255997572e-04, +-1.46717518850139323847e-04, +-1.44034892730693565204e-04, +-1.41273448590855218087e-04, +-1.38434866955593221692e-04, +-1.35520870271185604229e-04, +-1.32533221865797814620e-04, +-1.29473724888089073738e-04, +-1.26344221224348324251e-04, +-1.23146590394907499066e-04, +-1.19882748430450496667e-04, +-1.16554646728892494570e-04, +-1.13164270893511021972e-04, +-1.09713639553016026698e-04, +-1.06204803164258788938e-04, +-1.02639842798286093709e-04, +-9.90208689104574309690e-05, +-9.53500200953488063907e-05, +-9.16294618271747146219e-05, +-8.78613851864693950078e-05, +-8.40480055737724741525e-05, +-8.01915614110729224086e-05, +-7.62943128317693849017e-05, +-7.23585403599120898779e-05, +-6.83865435794958062077e-05, +-6.43806397945781601344e-05, +-6.03431626810021750013e-05, +-5.62764609305052045107e-05, +-5.21828968880001095782e-05, +-4.80648451828273766406e-05, +-4.39246913547101223052e-05, +-3.97648304753519063080e-05, +-3.55876657662771198705e-05, +-3.13956072138546100360e-05, +-2.71910701822341436737e-05, +-2.29764740250598643260e-05, +-1.87542406966089186175e-05, +-1.45267933633486321363e-05, +-1.02965550165577958658e-05, +-6.06594708686369126855e-06, +-1.83738806147565725218e-06, + 2.38670789508730654728e-06, + 6.60393231605029799332e-06, + 1.08118838022856526365e-05, + 1.50081693864890804819e-05, + 1.91904058907051211296e-05, + 2.33562212764937420536e-05, + 2.75032559869653701879e-05, + 3.16291642799266015692e-05, + 3.57316155513857358346e-05, + 3.98082956486727347189e-05, + 4.38569081724363369137e-05, + 4.78751757667874686011e-05, + 5.18608413968659121744e-05, + 5.58116696131162758521e-05, + 5.97254478015662288413e-05, + 6.35999874194105038012e-05, + 6.74331252152119678313e-05, + 7.12227244330430300963e-05, + 7.49666759998972407220e-05, + 7.86628996957159043685e-05, + 8.23093453053795327638e-05, + 8.59039937520326019873e-05, + 8.94448582111133600001e-05, + 9.29299852044797151680e-05, + 9.63574556740282402905e-05, + 9.97253860342133961791e-05, + 1.03031929202938195831e-04, + 1.06275275610134644190e-04, + 1.09453654183648506066e-04, + 1.12565333311777745389e-04, + 1.15608621781949924361e-04, + 1.18581869695136337068e-04, + 1.21483469355360853659e-04, + 1.24311856133939833708e-04, + 1.27065509307947152248e-04, + 1.29742952872464735155e-04, + 1.32342756326188934566e-04, + 1.34863535429971070998e-04, + 1.37303952937931089294e-04, + 1.39662719300668973499e-04, + 1.41938593340331764125e-04, + 1.44130382897093850406e-04, + 1.46236945446754414840e-04, + 1.48257188689131702477e-04, + 1.50190071106954631209e-04, + 1.52034602494970392606e-04, + 1.53789844459004473734e-04, + 1.55454910884727745025e-04, + 1.57028968375900465160e-04, + 1.58511236661886526942e-04, + 1.59900988974221943979e-04, + 1.61197552392132844234e-04, + 1.62400308156727989691e-04, + 1.63508691953843704383e-04, + 1.64522194165353128834e-04, + 1.65440360088857943638e-04, + 1.66262790125675229700e-04, + 1.66989139937054223255e-04, + 1.67619120568575667371e-04, + 1.68152498542703266729e-04, + 1.68589095919475644722e-04, + 1.68928790325348127024e-04, + 1.69171514950206333802e-04, + 1.69317258512600938907e-04, + 1.69366065193253035638e-04, + 1.69318034536926169398e-04, + 1.69173321322751827635e-04, + 1.68932135403124315375e-04, + 1.68594741511303550284e-04, + 1.68161459037872361389e-04, + 1.67632661776220571190e-04, + 1.67008777637239416583e-04, + 1.66290288333431385444e-04, + 1.65477729032657161099e-04, + 1.64571687981757684184e-04, + 1.63572806100295385775e-04, + 1.62481776544717680536e-04, + 1.61299344243187993495e-04, + 1.60026305401423106544e-04, + 1.58663506979840374144e-04, + 1.57211846142359855600e-04, + 1.55672269677209203047e-04, + 1.54045773390101885464e-04, + 1.52333401470171580496e-04, + 1.50536245829059009979e-04, + 1.48655445413586417922e-04, + 1.46692185492392439651e-04, + 1.44647696917026745639e-04, + 1.42523255357962074646e-04, + 1.40320180515933701443e-04, + 1.38039835309150310440e-04, + 1.35683625036847225554e-04, + 1.33252996519696450227e-04, + 1.30749437217595669385e-04, + 1.28174474325369749201e-04, + 1.25529673846935238340e-04, + 1.22816639648479919303e-04, + 1.20037012491233243219e-04, + 1.17192469044403129027e-04, + 1.14284720878873418933e-04, + 1.11315513442261188005e-04, + 1.08286625015946468605e-04, + 1.05199865654693577497e-04, + 1.02057076109495512093e-04, + 9.88601267342783304043e-05, + 9.56109163771139760083e-05, + 9.23113712565947120868e-05, + 8.89634438240340108539e-05, + 8.55691116121616991534e-05, + 8.21303760709912982884e-05, + 7.86492613915423208508e-05, + 7.51278133181146123365e-05, + 7.15680979497604612561e-05, + 6.79722005317787153359e-05, + 6.43422242377698607113e-05, + 6.06802889430856936094e-05, + 5.69885299903377532185e-05, + 5.32690969476886882583e-05, + 4.95241523606481209006e-05, + 4.57558704980855863662e-05, + 4.19664360932403064002e-05, + 3.81580430803206248217e-05, + 3.43328933276007924294e-05, + 3.04931953676192458200e-05, + 2.66411631252087834044e-05, + 2.27790146442161646153e-05, + 1.89089708134602095535e-05, + 1.50332540927946444229e-05, + 1.11540872399499682495e-05, + 7.27369203889113503421e-06, + 3.39428803041684083773e-06, +-4.81908754276311450070e-07, +-4.35268705634372629675e-06, +-8.21584164763919663841e-06, +-1.20691745839433958802e-05, +-1.59104964523640528653e-05, +-1.97376276122016780436e-05, +-2.35483994285795049709e-05, +-2.73406554981410021381e-05, +-3.11122528661240456025e-05, +-3.48610632341272955897e-05, +-3.85849741578888450833e-05, +-4.22818902344056668941e-05, +-4.59497342777289552842e-05, +-4.95864484827761740015e-05, +-5.31899955765110986849e-05, +-5.67583599558492673393e-05, +-6.02895488116546415976e-05, +-6.37815932381954160072e-05, +-6.72325493274930760176e-05, +-7.06404992478322041284e-05, +-7.40035523060039669620e-05, +-7.73198459925695190907e-05, +-8.05875470096189763401e-05, +-8.38048522804609266092e-05, +-8.69699899406400548209e-05, +-9.00812203098600702616e-05, +-9.31368368441220313616e-05, +-9.61351670676795016460e-05, +-9.90745734842556015267e-05, +-1.01953454467028386448e-04, +-1.04770245126946709891e-04, +-1.07523418158803123158e-04, +-1.10211484664747875421e-04, +-1.12832994954700652560e-04, +-1.15386539323270961746e-04, +-1.17870748802769852344e-04, +-1.20284295891912211356e-04, +-1.22625895259826191760e-04, +-1.24894304424997594233e-04, +-1.27088324408796619729e-04, +-1.29206800363245279464e-04, +-1.31248622172700554062e-04, +-1.33212725029144128013e-04, +-1.35098089980784487676e-04, +-1.36903744453693149413e-04, +-1.38628762746211502523e-04, +-1.40272266495882424152e-04, +-1.41833425118677113443e-04, +-1.43311456220300168993e-04, +-1.44705625979375639015e-04, +-1.46015249502334635862e-04, +-1.47239691149835216733e-04, +-1.48378364834568840904e-04, +-1.49430734290319368980e-04, +-1.50396313312156941142e-04, +-1.51274665967682871333e-04, +-1.52065406779206268055e-04, +-1.52768200876835928996e-04, +-1.53382764122401261215e-04, +-1.53908863204188484618e-04, +-1.54346315702462519998e-04, +-1.54694990125800718034e-04, +-1.54954805918226855375e-04, +-1.55125733437199472397e-04, +-1.55207793902502094903e-04, +-1.55201059316101394776e-04, +-1.55105652353058453673e-04, +-1.54921746223595071862e-04, +-1.54649564506431944988e-04, +-1.54289380953534071422e-04, +-1.53841519266410082720e-04, +-1.53306352844135500117e-04, +-1.52684304503277075687e-04, +-1.51975846169923051046e-04, +-1.51181498544025521777e-04, +-1.50301830736287767064e-04, +-1.49337459877842251886e-04, +-1.48289050702975444508e-04, +-1.47157315105178143448e-04, +-1.45943011666808031192e-04, +-1.44646945162670226758e-04, +-1.43269966037836245969e-04, +-1.41812969860030777154e-04, +-1.40276896746939125880e-04, +-1.38662730768791489120e-04, +-1.36971499326602120161e-04, +-1.35204272506452450198e-04, +-1.33362162410215011723e-04, +-1.31446322463141056745e-04, +-1.29457946698729233501e-04, +-1.27398269021328599442e-04, +-1.25268562446894228622e-04, +-1.23070138322430765393e-04, +-1.20804345524507650679e-04, +-1.18472569637393813956e-04, +-1.16076232111318126267e-04, +-1.13616789401283968986e-04, +-1.11095732087066782702e-04, +-1.08514583974842290402e-04, +-1.05874901181016539101e-04, +-1.03178271198800118515e-04, +-1.00426311948084758256e-04, +-9.76206708091875252457e-05, +-9.47630236410444991074e-05, +-9.18550737843973141112e-05, +-8.88985510506610496001e-05, +-8.58952106969416680562e-05, +-8.28468323879038561972e-05, +-7.97552191450655496591e-05, +-7.66221962841397250411e-05, +-7.34496103410512394703e-05, +-7.02393279872563352237e-05, +-6.69932349350013444994e-05, +-6.37132348331598941495e-05, +-6.04012481542852742197e-05, +-5.70592110735821189476e-05, +-5.36890743402856300114e-05, +-5.02928021423770289528e-05, +-4.68723709650220007926e-05, +-4.34297684435565900540e-05, +-3.99669922116305890969e-05, +-3.64860487451815660126e-05, +-3.29889522029066755543e-05, +-2.94777232639011821304e-05, +-2.59543879631318446101e-05, +-2.24209765254152845900e-05, +-1.88795221985704670439e-05, +-1.53320600864227232015e-05, +-1.17806259822765688943e-05, +-8.22725520364250435790e-06, +-4.67398142876525914271e-06, +-1.12283553561652046528e-06, + 2.42415555586849744280e-06, + 5.96497003777039182297e-06, + 9.49759236367494958416e-06, + 1.30200143930290886731e-05, + 1.65302365297154976124e-05, + 2.00262688542018995176e-05, + 2.35061322486258601641e-05, + 2.69678595141725338990e-05, + 3.04094964801652475677e-05, + 3.38291031041225136330e-05, + 3.72247545623280811614e-05, + 4.05945423301795488562e-05, + 4.39365752517605946421e-05, + 4.72489805980300616090e-05, + 5.05299051130391751476e-05, + 5.37775160475925401854e-05, + 5.69900021797799109010e-05, + 6.01655748218186950589e-05, + 6.33024688126045798455e-05, + 6.63989434955355209119e-05, + 6.94532836809095877094e-05, + 7.24638005925247566689e-05, + 7.54288327978053365708e-05, + 7.83467471210983574734e-05, + 8.12159395395303644084e-05, + 8.40348360609798490086e-05, + 8.68018935836787020261e-05, + 8.95156007369763171777e-05, + 9.21744787028109000904e-05, + 9.47770820174428766953e-05, + 9.73219993530192951838e-05, + 9.98078542785484291089e-05, + 1.02233305999877626346e-04, + 1.04597050078279252879e-04, + 1.06897819127260571481e-04, + 1.09134383487232477302e-04, + 1.11305551877675454743e-04, + 1.13410172026465080842e-04, + 1.15447131276023696555e-04, + 1.17415357165986388734e-04, + 1.19313817992076323833e-04, + 1.21141523340904152650e-04, + 1.22897524600417128735e-04, + 1.24580915445738179192e-04, + 1.26190832300148298968e-04, + 1.27726454771003749460e-04, + 1.29187006060312931576e-04, + 1.30571753349855405749e-04, + 1.31880008160592337128e-04, + 1.33111126686225034448e-04, + 1.34264510100741093525e-04, + 1.35339604839805301758e-04, + 1.36335902855876962966e-04, + 1.37252941846921911991e-04, + 1.38090305458667854995e-04, + 1.38847623460269244903e-04, + 1.39524571893355508502e-04, + 1.40120873194398874121e-04, + 1.40636296290376592178e-04, + 1.41070656667688923902e-04, + 1.41423816414358241448e-04, + 1.41695684235501812628e-04, + 1.41886215442108465281e-04, + 1.41995411913169058797e-04, + 1.42023322031210527672e-04, + 1.41970040591311803596e-04, + 1.41835708683687403576e-04, + 1.41620513549942957229e-04, + 1.41324688413120390503e-04, + 1.40948512281664279549e-04, + 1.40492309727460512516e-04, + 1.39956450638105661232e-04, + 1.39341349943586742142e-04, + 1.38647467317560966387e-04, + 1.37875306853443076616e-04, + 1.37025416715516460461e-04, + 1.36098388765306077238e-04, + 1.35094858163456845238e-04, + 1.34015502947381628333e-04, + 1.32861043584951986655e-04, + 1.31632242504520034906e-04, + 1.30329903601576123319e-04, + 1.28954871722338328469e-04, + 1.27508032124644551074e-04, + 1.25990309916430414392e-04, + 1.24402669472184333093e-04, + 1.22746113827731657530e-04, + 1.21021684053717931608e-04, + 1.19230458608205958028e-04, + 1.17373552668725822899e-04, + 1.15452117444264388342e-04, + 1.13467339467561269067e-04, + 1.11420439868162524316e-04, + 1.09312673626677319912e-04, + 1.07145328810660439892e-04, + 1.04919725792656324940e-04, + 1.02637216450778944853e-04, + 1.00299183352382616555e-04, + 9.79070389212828459625e-05, + 9.54622245890343021661e-05, + 9.29662099307709859563e-05, + 9.04204917861251337118e-05, + 8.78265933657491361646e-05, + 8.51860633439697795440e-05, + 8.25004749381152567740e-05, + 7.97714249750583101993e-05, + 7.70005329455285302594e-05, + 7.41894400467507647698e-05, + 7.13398082139749418204e-05, + 6.84533191414649809991e-05, + 6.55316732935233309948e-05, + 6.25765889061299349127e-05, + 5.95898009797798930746e-05, + 5.65730602641084840982e-05, + 5.35281322348962640303e-05, + 5.04567960640498228923e-05, + 4.73608435831570034977e-05, + 4.42420782412198123029e-05, + 4.11023140571756856096e-05, + 3.79433745677702796120e-05, + 3.47670917715006306549e-05, + 3.15753050690913554294e-05, + 2.83698602012252819608e-05, + 2.51526081840889388815e-05, + 2.19254042433976171740e-05, + 1.86901067473987712679e-05, + 1.54485761396172072233e-05, + 1.22026738718400676369e-05, + 8.95426133799693216720e-06, + 5.70519880953679468414e-06, + 2.45734437291689684403e-06, +-7.87447130237725029692e-07, +-4.02732515958524032887e-06, +-7.26044452868275316679e-06, +-1.04849664530539972413e-05, +-1.36990595931614081774e-05, +-1.69009010916851591059e-05, +-2.00886776045228981175e-05, +-2.32605863249292218813e-05, +-2.64148360002174825494e-05, +-2.95496479404527710906e-05, +-3.26632570185692985083e-05, +-3.57539126613519710695e-05, +-3.88198798307268989525e-05, +-4.18594399948131874701e-05, +-4.48708920881937505377e-05, +-4.78525534608703297839e-05, +-5.08027608153759224091e-05, +-5.37198711315230623370e-05, +-5.66022625782771395811e-05, +-5.94483354122496957970e-05, +-6.22565128623159649065e-05, +-6.50252419998696961625e-05, +-6.77529945942363268996e-05, +-7.04382679527763058127e-05, +-7.30795857452109842494e-05, +-7.56754988117607863083e-05, +-7.82245859545587472750e-05, +-8.07254547120429588646e-05, +-8.31767421157772956445e-05, +-8.55771154294189502010e-05, +-8.79252728693081722763e-05, +-9.02199443063830727177e-05, +-9.24598919490082272500e-05, +-9.46439110063570436353e-05, +-9.67708303319964480843e-05, +-9.88395130473318793462e-05, +-1.00848857144579225412e-04, +-1.02797796068976429913e-04, +-1.04685299279854606281e-04, +-1.06510372790377650341e-04, +-1.08272059685596318680e-04, +-1.09969440618577611341e-04, +-1.11601634284353844629e-04, +-1.13167797871448837341e-04, +-1.14667127490753893888e-04, +-1.16098858581540945157e-04, +-1.17462266294409572748e-04, +-1.18756665850985608014e-04, +-1.19981412880174577386e-04, +-1.21135903730876983027e-04, +-1.22219575760907419324e-04, +-1.23231907602096356184e-04, +-1.24172419401388892416e-04, +-1.25040673037858960726e-04, +-1.25836272315542666532e-04, +-1.26558863132016492748e-04, +-1.27208133622654898272e-04, +-1.27783814280521123164e-04, +-1.28285678051853307665e-04, +-1.28713540407127574909e-04, +-1.29067259387689078475e-04, +-1.29346735627960067851e-04, +-1.29551912353247712954e-04, +-1.29682775353174970954e-04, +-1.29739352930806405104e-04, +-1.29721715827507011074e-04, +-1.29629977123626777182e-04, +-1.29464292115094922872e-04, +-1.29224858166029714888e-04, +-1.28911914537480141833e-04, +-1.28525742192432532911e-04, +-1.28066663577224341096e-04, +-1.27535042379524224485e-04, +-1.26931283263051979506e-04, +-1.26255831579210470172e-04, +-1.25509173055851516688e-04, +-1.24691833463355639632e-04, +-1.23804378258269496800e-04, +-1.22847412204727150179e-04, +-1.21821578973907172273e-04, +-1.20727560721779606824e-04, +-1.19566077645420637825e-04, +-1.18337887518172143108e-04, +-1.17043785203959168793e-04, +-1.15684602151032309364e-04, +-1.14261205865508758540e-04, +-1.12774499364983135674e-04, +-1.11225420612612888125e-04, +-1.09614941931962398339e-04, +-1.07944069403014051949e-04, +-1.06213842239701207601e-04, +-1.04425332149347485926e-04, +-1.02579642674402744655e-04, +-1.00677908516879591628e-04, +-9.87212948458993696643e-05, +-9.67109965887680804323e-05, +-9.46482377060114694195e-05, +-9.25342704508053923206e-05, +-9.03703746132478017740e-05, +-8.81578567499270010759e-05, +-8.58980493992450127834e-05, +-8.35923102829684219880e-05, +-8.12420214944795825900e-05, +-7.88485886742140853296e-05, +-7.64134401727725140778e-05, +-7.39380262022039087908e-05, +-7.14238179759623244237e-05, +-6.88723068380450985934e-05, +-6.62850033818259808810e-05, +-6.36634365591029851607e-05, +-6.10091527798890391780e-05, +-5.83237150034378014633e-05, +-5.56087018211295729380e-05, +-5.28657065316302825957e-05, +-5.00963362089557252181e-05, +-4.73022107639477868909e-05, +-4.44849619997154997839e-05, +-4.16462326615831018211e-05, +-3.87876754821360727392e-05, +-3.59109522218197118487e-05, +-3.30177327057781363410e-05, +-3.01096938573906879706e-05, +-2.71885187291101264469e-05, +-2.42558955311136346803e-05, +-2.13135166584285751863e-05, +-1.83630777169545625609e-05, +-1.54062765490442216251e-05, +-1.24448122591593738538e-05, +-9.48038424016769929749e-06, +-6.51469120083589183379e-06, +-3.54943019507466532529e-06, +-5.86295653488527638405e-07, + 2.37302158221821148760e-06, + 5.32683522143069861928e-06, + 8.27346448286191381023e-06, + 1.12112350482972268184e-05, + 1.41384800113054187414e-05, + 1.70535408203802065375e-05, + 1.99547682159801403000e-05, + 2.28405231609389523773e-05, + 2.57091777637233010942e-05, + 2.85591161940189065772e-05, + 3.13887355901324983888e-05, + 3.41964469577007317870e-05, + 3.69806760592044563105e-05, + 3.97398642937916670619e-05, + 4.24724695669193537460e-05, + 4.51769671493239000906e-05, + 4.78518505248824157702e-05, + 5.04956322267979359933e-05, + 5.31068446617757945380e-05, + 5.56840409216389250861e-05, + 5.82257955819805972353e-05, + 6.07307054873712566403e-05, + 6.31973905227825399032e-05, + 6.56244943706810369847e-05, + 6.80106852534736013504e-05, + 7.03546566608603151554e-05, + 7.26551280617074665301e-05, + 7.49108456000490471188e-05, + 7.71205827748727728481e-05, + 7.92831411032435707121e-05, + 8.13973507665162628304e-05, + 8.34620712392105025155e-05, + 8.54761919002437216665e-05, + 8.74386326261934136023e-05, + 8.93483443662723540333e-05, + 9.12043096987145523709e-05, + 9.30055433682796324664e-05, + 9.47510928045935062712e-05, + 9.64400386210567564342e-05, + 9.80714950940618610149e-05, + 9.96446106222721028753e-05, + 1.01158568165728382656e-04, + 1.02612585664560169562e-04, + 1.04005916437090132763e-04, + 1.05337849557132784027e-04, + 1.06607710210300974068e-04, + 1.07814860029146553436e-04, + 1.08958697406971076818e-04, + 1.10038657790159221262e-04, + 1.11054213948895991334e-04, + 1.12004876226144938888e-04, + 1.12890192764771252285e-04, + 1.13709749712725811358e-04, + 1.14463171406168479332e-04, + 1.15150120530503418228e-04, + 1.15770298259229445850e-04, + 1.16323444370574466855e-04, + 1.16809337341866760875e-04, + 1.17227794421640891544e-04, + 1.17578671679441387104e-04, + 1.17861864033347977262e-04, + 1.18077305255228525620e-04, + 1.18224967953752292129e-04, + 1.18304863535199995448e-04, + 1.18317042142129913288e-04, + 1.18261592569961779611e-04, + 1.18138642161559509242e-04, + 1.17948356679904758004e-04, + 1.17690940158963789036e-04, + 1.17366634732863803995e-04, + 1.16975720443508680781e-04, + 1.16518515026772340008e-04, + 1.15995373677425865329e-04, + 1.15406688792958039944e-04, + 1.14752889696471350382e-04, + 1.14034442338837080757e-04, + 1.13251848980312161972e-04, + 1.12405647851827392831e-04, + 1.11496412796171015655e-04, + 1.10524752889300383963e-04, + 1.09491312042027578609e-04, + 1.08396768582333136470e-04, + 1.07241834818576963558e-04, + 1.06027256583881440439e-04, + 1.04753812761974128402e-04, + 1.03422314794789343279e-04, + 1.02033606172135439690e-04, + 1.00588561903744460506e-04, + 9.90880879740364323887e-05, + 9.75331207799133901139e-05, + 9.59246265519796495209e-05, + 9.42636007594733522788e-05, + 9.25510674993434647893e-05, + 9.07880788697715116788e-05, + 8.89757143285934223474e-05, + 8.71150800369563193095e-05, + 8.52073081886286283915e-05, + 8.32535563253643403313e-05, + 8.12550066387327429764e-05, + 7.92128652588326546708e-05, + 7.71283615303221291911e-05, + 7.50027472761658441352e-05, + 7.28372960496142743273e-05, + 7.06333023747593316630e-05, + 6.83920809761930819422e-05, + 6.61149659981945323883e-05, + 6.38033102139136647918e-05, + 6.14584842250172271472e-05, + 5.90818756522692805321e-05, + 5.66748883175234417645e-05, + 5.42389414176053005876e-05, + 5.17754686905652722838e-05, + 4.92859175748246270223e-05, + 4.67717483616246192265e-05, + 4.42344333413538523341e-05, + 4.16754559442534589821e-05, + 3.90963098759170062319e-05, + 3.64984982481686095644e-05, + 3.38835327057898264913e-05, + 3.12529325496060770987e-05, + 2.86082238564397440281e-05, + 2.59509385964386121227e-05, + 2.32826137482886975970e-05, + 2.06047904128203539622e-05, + 1.79190129255183850797e-05, + 1.52268279684512867372e-05, + 1.25297836820848089342e-05, + 9.82942877762201860177e-06, + 7.12731165015420239825e-06, + 4.42497949335259697511e-06, + 1.72397741607120027234e-06, +-9.74152438591300545820e-07, +-3.66787177127622279055e-06, +-6.35564700089772787053e-06, +-9.03595013522811150888e-06, +-1.17072596370426850940e-05, +-1.43680612853348429033e-05, +-1.70168490311088741731e-05, +-1.96521258473063757481e-05, +-2.22724045722929874815e-05, +-2.48762087465587318491e-05, +-2.74620734420669071810e-05, +-3.00285460838262985587e-05, +-3.25741872632199556503e-05, +-3.50975715426378017596e-05, +-3.75972882509638620259e-05, +-4.00719422694826037015e-05, +-4.25201548077314798470e-05, +-4.49405641689601653135e-05, +-4.73318265046533437649e-05, +-4.96926165577844057412e-05, +-5.20216283943892467806e-05, +-5.43175761229789356922e-05, +-5.65791946015099025133e-05, +-5.88052401314395777510e-05, +-6.09944911385232351646e-05, +-6.31457488399748983641e-05, +-6.52578378976302012505e-05, +-6.73296070567570273304e-05, +-6.93599297701697614779e-05, +-7.13477048073084426077e-05, +-7.32918568479592438987e-05, +-7.51913370602950043584e-05, +-7.70451236629288198831e-05, +-7.88522224706823078241e-05, +-8.06116674237784532151e-05, +-8.23225211001796784195e-05, +-8.39838752108034195757e-05, +-8.55948510773545134279e-05, +-8.71546000925265052688e-05, +-8.86623041623341395616e-05, +-9.01171761303480768493e-05, +-9.15184601836167176863e-05, +-9.28654322400672107207e-05, +-9.41574003171887131567e-05, +-9.53937048818311668537e-05, +-9.65737191809003779359e-05, +-9.76968495528504664652e-05, +-9.87625357197741252134e-05, +-9.97702510599723062104e-05, +-1.00719502860870411881e-04, +-1.01609832552167786510e-04, +-1.02440815919101530407e-04, +-1.03212063295764626164e-04, +-1.03923219738351186561e-04, +-1.04573965178293452004e-04, +-1.05164014555214358751e-04, +-1.05693117929663829482e-04, +-1.06161060575574886056e-04, +-1.06567663052451822372e-04, +-1.06912781257252219227e-04, +-1.07196306455972030416e-04, +-1.07418165294943403058e-04, +-1.07578319791868081681e-04, +-1.07676767306620711079e-04, +-1.07713540491867520218e-04, +-1.07688707223558459772e-04, +-1.07602370511359431062e-04, +-1.07454668389108225495e-04, +-1.07245773785382550523e-04, +-1.06975894374283873184e-04, +-1.06645272406552399651e-04, +-1.06254184521135326192e-04, +-1.05802941537346746376e-04, +-1.05291888227765690245e-04, +-1.04721403072029775822e-04, +-1.04091897991691806000e-04, +-1.03403818066321226388e-04, +-1.02657641231036926891e-04, +-1.01853877955673766901e-04, +-1.00993070905791316192e-04, +-1.00075794585747357554e-04, +-9.91026549640561086902e-05, +-9.80742890812979042133e-05, +-9.69913646407931124161e-05, +-9.58545795823286168359e-05, +-9.46646616391909589408e-05, +-9.34223678787874924024e-05, +-9.21284842271553308570e-05, +-9.07838249776128224534e-05, +-8.93892322839143330148e-05, +-8.79455756381782092872e-05, +-8.64537513339248380991e-05, +-8.49146819145573397919e-05, +-8.33293156075965769404e-05, +-8.16986257450709826454e-05, +-8.00236101703410545325e-05, +-7.83052906317712431187e-05, +-7.65447121635933332108e-05, +-7.47429424543394473968e-05, +-7.29010712032219468804e-05, +-7.10202094648487806125e-05, +-6.91014889826641889262e-05, +-6.71460615115136803116e-05, +-6.51550981297363063834e-05, +-6.31297885411947681941e-05, +-6.10713403676550390092e-05, +-5.89809784319366008933e-05, +-5.68599440322564117804e-05, +-5.47094942081945308492e-05, +-5.25309009987145816302e-05, +-5.03254506926742041614e-05, +-4.80944430722666716100e-05, +-4.58391906498364391982e-05, +-4.35610178985148694948e-05, +-4.12612604771267081670e-05, +-3.89412644498179452723e-05, +-3.66023855008608539076e-05, +-3.42459881450970870078e-05, +-3.18734449344449372976e-05, +-2.94861356610133087193e-05, +-2.70854465571730438690e-05, +-2.46727694931252419688e-05, +-2.22495011724306296223e-05, +-1.98170423258837072170e-05, +-1.73767969043094321503e-05, +-1.49301712706606661907e-05, +-1.24785733919144050828e-05, +-1.00234120312237155384e-05, +-7.56609594078786384176e-06, +-5.10803305590721484829e-06, +-2.65062969064796876903e-06, +-1.95289735662093879841e-07, + 2.25658614149781538763e-06, + 4.70360129302714707189e-06, + 7.14436388406460956736e-06, + 9.57748768197934699769e-06, + 1.20015928413035928855e-05, + 1.44153066838678001481e-05, + 1.68172644736985684973e-05, + 1.92061101862432256275e-05, + 2.15804972714890652230e-05, + 2.39390894105489946330e-05, + 2.62805612652901807722e-05, + 2.86035992205861757688e-05, + 3.09069021187789754650e-05, + 3.31891819859409621185e-05, + 3.54491647495335673412e-05, + 3.76855909470640991661e-05, + 3.98972164253476286417e-05, + 4.20828130299881090571e-05, + 4.42411692846974037292e-05, + 4.63710910600786401664e-05, + 4.84714022315057565344e-05, + 5.05409453257393869504e-05, + 5.25785821559190830470e-05, + 5.45831944446160030582e-05, + 5.65536844345369244078e-05, + 5.84889754866179482624e-05, + 6.03880126651817544857e-05, + 6.22497633097759614507e-05, + 6.40732175934516200036e-05, + 6.58573890671531589130e-05, + 6.76013151899331594073e-05, + 6.93040578447094631495e-05, + 7.09647038392890094557e-05, + 7.25823653923957063478e-05, + 7.41561806044386303671e-05, + 7.56853139127996218504e-05, + 7.71689565313425266486e-05, + 7.86063268739927838722e-05, + 7.99966709621114031078e-05, + 8.13392628154750729503e-05, + 8.26334048266602784602e-05, + 8.38784281186408519097e-05, + 8.50736928854174478216e-05, + 8.62185887155113381969e-05, + 8.73125348981630282396e-05, + 8.83549807120687932067e-05, + 8.93454056965571380595e-05, + 9.02833199050315720431e-05, + 9.11682641405671851135e-05, + 9.19998101735852404819e-05, + 9.27775609414710033911e-05, + 9.35011507300643465376e-05, + 9.41702453369411529019e-05, + 9.47845422164207620109e-05, + 9.53437706062401266714e-05, + 9.58476916358535753569e-05, + 9.62960984163175226676e-05, + 9.66888161117409645909e-05, + 9.70257019922829883106e-05, + 9.73066454687029886274e-05, + 9.75315681084497403076e-05, + 9.77004236333403651774e-05, + 9.78131978988259413559e-05, + 9.78699088548996316969e-05, + 9.78706064886931931908e-05, + 9.78153727488194655671e-05, + 9.77043214515344428731e-05, + 9.75375981687954049385e-05, + 9.73153800983090819503e-05, + 9.70378759156690566361e-05, + 9.67053256086932366224e-05, + 9.63180002940841964183e-05, + 9.58762020165379531865e-05, + 9.53802635304530459226e-05, + 9.48305480643773406665e-05, + 9.42274490683603826915e-05, + 9.35713899443812172551e-05, + 9.28628237600275093996e-05, + 9.21022329456168908045e-05, + 9.12901289749561102105e-05, + 9.04270520299548278501e-05, + 8.95135706492842500494e-05, + 8.85502813613394572714e-05, + 8.75378083017155033231e-05, + 8.64768028154355933648e-05, + 8.53679430442136669664e-05, + 8.42119334989644183860e-05, + 8.30095046178623384566e-05, + 8.17614123102081163550e-05, + 8.04684374863896741690e-05, + 7.91313855742244295563e-05, + 7.77510860219827716839e-05, + 7.63283917883946329882e-05, + 7.48641788199511630389e-05, + 7.33593455158201108654e-05, + 7.18148121806984416748e-05, + 7.02315204659344010599e-05, + 6.86104327992547092423e-05, + 6.69525318034425696596e-05, + 6.52588197043136263292e-05, + 6.35303177283451494866e-05, + 6.17680654903193261922e-05, + 5.99731203713451578997e-05, + 5.81465568876299857470e-05, + 5.62894660503753302872e-05, + 5.44029547171763266846e-05, + 5.24881449353098910931e-05, + 5.05461732772982176055e-05, + 4.85781901691450268576e-05, + 4.65853592116120024023e-05, + 4.45688564950032751967e-05, + 4.25298699077687427554e-05, + 4.04695984393985014349e-05, + 3.83892514779906950887e-05, + 3.62900481029001826128e-05, + 3.41732163729119983926e-05, + 3.20399926102781816627e-05, + 2.98916206811338720545e-05, + 2.77293512726352792174e-05, + 2.55544411672685861127e-05, + 2.33681525147488944956e-05, + 2.11717521018997930282e-05, + 1.89665106210108342917e-05, + 1.67537019369919437987e-05, + 1.45346023538229485151e-05, + 1.23104898806885715561e-05, + 1.00826434982246897416e-05, + 7.85234242529587054475e-06, + 5.62086538672328424332e-06, + 3.38948988238076994443e-06, + 1.15949145807567223944e-06, +-1.06785702137072707871e-06, +-3.29128609643022805093e-06, +-5.50953043415126442282e-06, +-7.72132954601048490098e-06, +-9.92542850192639466761e-06, +-1.21205786400318798465e-05, +-1.43055382718054505098e-05, +-1.64790733821644087950e-05, +-1.86399583241264707630e-05, +-2.07869765076501085866e-05, +-2.29189210822677048591e-05, +-2.50345956131302830444e-05, +-2.71328147500858357817e-05, +-2.92124048894140672726e-05, +-3.12722048278788822620e-05, +-3.33110664086613662642e-05, +-3.53278551589146714283e-05, +-3.73214509185134290983e-05, +-3.92907484596808479252e-05, +-4.12346580971520483842e-05, +-4.31521062885095992652e-05, +-4.50420362244331414815e-05, +-4.69034084084459727392e-05, +-4.87352012259119438489e-05, +-5.05364115019466182167e-05, +-5.23060550479419978189e-05, +-5.40431671964060976313e-05, +-5.57468033238534737064e-05, +-5.74160393614016982132e-05, +-5.90499722928839986262e-05, +-6.06477206401485110371e-05, +-6.22084249353098108415e-05, +-6.37312481796986922324e-05, +-6.52153762892660273948e-05, +-6.66600185262068023343e-05, +-6.80644079165767824100e-05, +-6.94278016536845402323e-05, +-7.07494814870478466295e-05, +-7.20287540967148501693e-05, +-7.32649514527553767347e-05, +-7.44574311597405420022e-05, +-7.56055767860350496235e-05, +-7.67087981777354925789e-05, +-7.77665317570998471846e-05, +-7.87782408053171710489e-05, +-7.97434157294830232507e-05, +-8.06615743136474125027e-05, +-8.15322619538178135472e-05, +-8.23550518768057822480e-05, +-8.31295453428154712148e-05, +-8.38553718316820378541e-05, +-8.45321892126865308053e-05, +-8.51596838978487685485e-05, +-8.57375709786715794677e-05, +-8.62655943462551288645e-05, +-8.67435267947428979536e-05, +-8.71711701080811815620e-05, +-8.75483551300409708427e-05, +-8.78749418175082112241e-05, +-8.81508192770273922871e-05, +-8.83759057846058285928e-05, +-8.85501487887902459777e-05, +-8.86735248970403253620e-05, +-8.87460398454319876341e-05, +-8.87677284517321478442e-05, +-8.87386545518955844984e-05, +-8.86589109200488812183e-05, +-8.85286191720270214433e-05, +-8.83479296525471903935e-05, +-8.81170213061050432417e-05, +-8.78361015316937552991e-05, +-8.75054060214538136477e-05, +-8.71251985833677709175e-05, +-8.66957709481281274576e-05, +-8.62174425603089747113e-05, +-8.56905603539940554595e-05, +-8.51154985129900034952e-05, +-8.44926582158212472655e-05, +-8.38224673656400427703e-05, +-8.31053803052506274724e-05, +-8.23418775174244912257e-05, +-8.15324653107033707304e-05, +-8.06776754908900028181e-05, +-7.97780650184373106007e-05, +-7.88342156519530526523e-05, +-7.78467335780445683635e-05, +-7.68162490277368720107e-05, +-7.57434158797055202611e-05, +-7.46289112505573565791e-05, +-7.34734350724463647960e-05, +-7.22777096582538457334e-05, +-7.10424792545960120905e-05, +-6.97685095829731762810e-05, +-6.84565873693016984378e-05, +-6.71075198621341007877e-05, +-6.57221343398554209113e-05, +-6.43012776071557890780e-05, +-6.28458154810835923102e-05, +-6.13566322669881414808e-05, +-5.98346302246723383829e-05, +-5.82807290250536745514e-05, +-5.66958651977116231350e-05, +-5.50809915695821473340e-05, +-5.34370766951852471703e-05, +-5.17651042787056485015e-05, +-5.00660725882709159050e-05, +-4.83409938627764752253e-05, +-4.65908937116066385552e-05, +-4.48168105076074261466e-05, +-4.30197947736637000340e-05, +-4.12009085632678118496e-05, +-3.93612248353795128467e-05, +-3.75018268240328908462e-05, +-3.56238074029696449125e-05, +-3.37282684457607440684e-05, +-3.18163201816986404395e-05, +-2.98890805479001212680e-05, +-2.79476745379709999822e-05, +-2.59932335476144176260e-05, +-2.40268947175631300377e-05, +-2.20498002742151532848e-05, +-2.00630968683545589837e-05, +-1.80679349123383810435e-05, +-1.60654679161321810180e-05, +-1.40568518225757011658e-05, +-1.20432443422608051199e-05, +-1.00258042884029404491e-05, +-8.00569091208727099719e-06, +-5.98406323826935972361e-06, +-3.96207940290984570201e-06, +-1.94089599162064887166e-06, + 7.83326198005747898907e-08, + 2.09445492257301924948e-06, + 4.10632292949940006763e-06, + 6.11279282652582891513e-06, + 8.11272562092629197044e-06, + 1.01049877857409114437e-05, + 1.20884519001330790116e-05, + 1.40619972852336154977e-05, + 1.60245106352098204275e-05, + 1.79748866431337342073e-05, + 1.99120286213276946629e-05, + 2.18348491158356895975e-05, + 2.37422705146771266798e-05, + 2.56332256495490372664e-05, + 2.75066583906145059298e-05, + 2.93615242341154332678e-05, + 3.11967908823933051383e-05, + 3.30114388160605143471e-05, + 3.48044618580061525877e-05, + 3.65748677288642252687e-05, + 3.83216785937263849210e-05, + 4.00439315997342949434e-05, + 4.17406794042833988461e-05, + 4.34109906935455636926e-05, + 4.50539506910283595867e-05, + 4.66686616558951677231e-05, + 4.82542433707754188257e-05, + 4.98098336188025105076e-05, + 5.13345886496223527710e-05, + 5.28276836341212981227e-05, + 5.42883131076322484254e-05, + 5.57156914013806444015e-05, + 5.71090530619421132309e-05, + 5.84676532584898041777e-05, + 5.97907681776162523235e-05, + 6.10776954055230943694e-05, + 6.23277542973780997616e-05, + 6.35402863336491786732e-05, + 6.47146554632286333470e-05, + 6.58502484331734486145e-05, + 6.69464751048926757886e-05, + 6.80027687566194964435e-05, + 6.90185863720170044832e-05, + 6.99934089147837939756e-05, + 7.09267415890902172158e-05, + 7.18181140857647161381e-05, + 7.26670808140748066949e-05, + 7.34732211190075503587e-05, + 7.42361394839436268501e-05, + 7.49554657186243128170e-05, + 7.56308551323502581193e-05, + 7.62619886923002242643e-05, + 7.68485731669290054405e-05, + 7.73903412543740319013e-05, + 7.78870516958209856877e-05, + 7.83384893737935715909e-05, + 7.87444653953147782324e-05, + 7.91048171599420551657e-05, + 7.94194084126392720741e-05, + 7.96881292814878859675e-05, + 7.99108963002358391528e-05, + 8.00876524156968731425e-05, + 8.02183669800153831232e-05, + 8.03030357278285665534e-05, + 8.03416807383593541874e-05, + 8.03343503824849146247e-05, + 8.02811192548356472283e-05, + 8.01820880909844978159e-05, + 8.00373836697980867074e-05, + 7.98471587010282266798e-05, + 7.96115916982296047740e-05, + 7.93308868371003252356e-05, + 7.90052737993477842459e-05, + 7.86350076021916034787e-05, + 7.82203684136235352425e-05, + 7.77616613535522615110e-05, + 7.72592162809664708160e-05, + 7.67133875672632579209e-05, + 7.61245538558890809302e-05, + 7.54931178084552014299e-05, + 7.48195058374859282803e-05, + 7.41041678259918263445e-05, + 7.33475768340236086891e-05, + 7.25502287924132663235e-05, + 7.17126421838883761507e-05, + 7.08353577117746115253e-05, + 6.99189379564657824580e-05, + 6.89639670199154882456e-05, + 6.79710501583437364317e-05, + 6.69408134033987737470e-05, + 6.58739031720058094803e-05, + 6.47709858651478100500e-05, + 6.36327474558071720916e-05, + 6.24598930663620521917e-05, + 6.12531465356429315541e-05, + 6.00132499759513726788e-05, + 5.87409633202952744489e-05, + 5.74370638601181475024e-05, + 5.61023457738005077431e-05, + 5.47376196462178894200e-05, + 5.33437119796454611961e-05, + 5.19214646963013157221e-05, + 5.04717346328268796885e-05, + 4.89953930270064014403e-05, + 4.74933249970308410371e-05, + 4.59664290136169696407e-05, + 4.44156163652937726011e-05, + 4.28418106171734954413e-05, + 4.12459470635278838894e-05, + 3.96289721744912600845e-05, + 3.79918430372181689441e-05, + 3.63355267918223325723e-05, + 3.46610000624296407993e-05, + 3.29692483836776077948e-05, + 3.12612656229971128227e-05, + 2.95380533990134290555e-05, + 2.78006204964105713487e-05, + 2.60499822775738051233e-05, + 2.42871600914147949164e-05, + 2.25131806796356132906e-05, + 2.07290755808621738894e-05, + 1.89358805329046950760e-05, + 1.71346348735776756247e-05, + 1.53263809403626031776e-05, + 1.35121634692837809516e-05, + 1.16930289933384643446e-05, + 9.87002524082706459254e-06, + 8.04420053392769432833e-06, + 6.21660318786371497718e-06, + 4.38828091098144307670e-06, + 2.56028020614524101076e-06, + 7.33645773704159215729e-07, +-1.09058008356538882663e-06, +-2.91135805322907028961e-06, +-4.72765240333595687151e-06, +-6.53843156959771685090e-06, +-8.34266873927393720254e-06, +-1.01393424314343474083e-05, +-1.19274370732709349764e-05, +-1.37059435721405858846e-05, +-1.54738598829871196378e-05, +-1.72301915709141233841e-05, +-1.89739523684456172069e-05, +-2.07041647273114594839e-05, +-2.24198603643615891102e-05, +-2.41200808013344202745e-05, +-2.58038778981763044563e-05, +-2.74703143796157200874e-05, +-2.91184643547017321143e-05, +-3.07474138290197399233e-05, +-3.23562612093023567895e-05, +-3.39441178001584614038e-05, +-3.55101082926439871944e-05, +-3.70533712444301888567e-05, +-3.85730595512544287501e-05, +-4.00683409094500665032e-05, +-4.15383982693033816007e-05, +-4.29824302789406134098e-05, +-4.43996517185575042359e-05, +-4.57892939247349858053e-05, +-4.71506052046175686584e-05, +-4.84828512397324982693e-05, +-4.97853154792346060619e-05, +-5.10572995223683090350e-05, +-5.22981234899434565362e-05, +-5.35071263846277400461e-05, +-5.46836664398836234187e-05, +-5.58271214573224499331e-05, +-5.69368891323614851295e-05, +-5.80123873679696164230e-05, +-5.90530545763586015842e-05, +-6.00583499684634902521e-05, +-6.10277538310640554767e-05, +-6.19607677914099007560e-05, +-6.28569150692159534649e-05, +-6.37157407158944321529e-05, +-6.45368118409359687801e-05, +-6.53197178252850279385e-05, +-6.60640705216541051321e-05, +-6.67695044416362863812e-05, +-6.74356769295752540719e-05, +-6.80622683230799142623e-05, +-6.86489821001279852154e-05, +-6.91955450126904592642e-05, +-6.97017072068230802637e-05, +-7.01672423291767658176e-05, +-7.05919476198861947256e-05, +-7.09756439918057140982e-05, +-7.13181760960681986961e-05, +-7.16194123739501793333e-05, +-7.18792450950348377767e-05, +-7.20975903816736135316e-05, +-7.22743882197516537879e-05, +-7.24096024557741556067e-05, +-7.25032207802958942548e-05, +-7.25552546977243766621e-05, +-7.25657394825357868065e-05, +-7.25347341219498558274e-05, +-7.24623212451169996162e-05, +-7.23486070388806753713e-05, +-7.21937211501822589683e-05, +-7.19978165751875085875e-05, +-7.17610695352167158104e-05, +-7.14836793395702676862e-05, +-7.11658682353526731877e-05, +-7.08078812443949090743e-05, +-7.04099859873934258306e-05, +-6.99724724953850081566e-05, +-6.94956530086853716552e-05, +-6.89798617634244460098e-05, +-6.84254547658288183589e-05, +-6.78328095543798148277e-05, +-6.72023249500277669805e-05, +-6.65344207946062419579e-05, +-6.58295376776219041525e-05, +-6.50881366515859591205e-05, +-6.43106989360903185575e-05, +-6.34977256107851671055e-05, +-6.26497372974739176162e-05, +-6.17672738315155477485e-05, +-6.08508939227416309091e-05, +-5.99011748060970076221e-05, +-5.89187118822223946605e-05, +-5.79041183481987132707e-05, +-5.68580248186811984187e-05, +-5.57810789376551931251e-05, +-5.46739449810503702100e-05, +-5.35373034504554770174e-05, +-5.23718506581807131213e-05, +-5.11782983039181917171e-05, +-4.99573730432570882465e-05, +-4.87098160483125057073e-05, +-4.74363825607329001348e-05, +-4.61378414373535389293e-05, +-4.48149746887680454615e-05, +-4.34685770110934173059e-05, +-4.20994553112074291123e-05, +-4.07084282257405295205e-05, +-3.92963256341110296946e-05, +-3.78639881658720183844e-05, +-3.64122667027106395048e-05, +-3.49420218753273198247e-05, +-3.34541235555410240970e-05, +-3.19494503438986083817e-05, +-3.04288890530928917170e-05, +-2.88933341874874255505e-05, +-2.73436874190750308462e-05, +-2.57808570601205806739e-05, +-2.42057575328682884756e-05, +-2.26193088365677101494e-05, +-2.10224360121490399698e-05, +-1.94160686048590696543e-05, +-1.78011401251455341182e-05, +-1.61785875081583371295e-05, +-1.45493505721038791060e-05, +-1.29143714758213699049e-05, +-1.12745941758700444585e-05, +-9.63096388344320252515e-06, +-7.98442652142029617504e-06, +-6.33592818186786765829e-06, +-4.68641458429933138496e-06, +-3.03683053500296397801e-06, +-1.38811938774586377356e-06, + 2.58777493839178202322e-07, + 1.90292127187864929960e-06, + 3.54337616759140759028e-06, + 5.17920999202801067562e-06, + 6.80949467391633912354e-06, + 8.43330678431570807498e-06, + 1.00497280577839181130e-05, + 1.16578459097642718917e-05, + 1.32567539499020862689e-05, + 1.48455524910031115056e-05, + 1.64233490533491062295e-05, + 1.79892588640891236808e-05, + 1.95424053514245014756e-05, + 2.10819206333345681716e-05, + 2.26069460005168742459e-05, + 2.41166323933478058403e-05, + 2.56101408725446344061e-05, + 2.70866430832949805965e-05, + 2.85453217125733007859e-05, + 2.99853709394462142215e-05, + 3.14059968780488809876e-05, + 3.28064180130436779592e-05, + 3.41858656273021432946e-05, + 3.55435842215810670545e-05, + 3.68788319259649065773e-05, + 3.81908809028492260114e-05, + 3.94790177412656769699e-05, + 4.07425438422898093392e-05, + 4.19807757953880351259e-05, + 4.31930457454549954818e-05, + 4.43787017503647075972e-05, + 4.55371081288425238044e-05, + 4.66676457984745168698e-05, + 4.77697126036755268658e-05, + 4.88427236334443488387e-05, + 4.98861115287400902485e-05, + 5.08993267793200968442e-05, + 5.18818380098863440766e-05, + 5.28331322553930322872e-05, + 5.37527152253746494555e-05, + 5.46401115571613411491e-05, + 5.54948650578534959663e-05, + 5.63165389349345359561e-05, + 5.71047160154089449252e-05, + 5.78589989533570669814e-05, + 5.85790104258065492428e-05, + 5.92643933168274041653e-05, + 5.99148108897627355894e-05, + 6.05299469475165509511e-05, + 6.11095059808236870788e-05, + 6.16532133044444885040e-05, + 6.21608151812043867963e-05, + 6.26320789338565816822e-05, + 6.30667930446937390586e-05, + 6.34647672428986905826e-05, + 6.38258325795768347542e-05, + 6.41498414904665125455e-05, + 6.44366678463023396118e-05, + 6.46862069908247323737e-05, + 6.48983757664325786518e-05, + 6.50731125274843654437e-05, + 6.52103771412599882238e-05, + 6.53101509766035163464e-05, + 6.53724368802683817540e-05, + 6.53972591410049980528e-05, + 6.53846634414262362599e-05, + 6.53347167976985163280e-05, + 6.52475074871135241571e-05, + 6.51231449636010796761e-05, + 6.49617597612497395644e-05, + 6.47635033859116657304e-05, + 6.45285481949697814485e-05, + 6.42570872653582068207e-05, + 6.39493342499302042841e-05, + 6.36055232222692201391e-05, + 6.32259085100558739911e-05, + 6.28107645171077595475e-05, + 6.23603855342008971162e-05, + 6.18750855388094879363e-05, + 6.13551979838913776489e-05, + 6.08010755758598702586e-05, + 6.02130900418846006969e-05, + 5.95916318866736676439e-05, + 5.89371101388912814706e-05, + 5.82499520873748857785e-05, + 5.75306030073172492193e-05, + 5.67795258765894393974e-05, + 5.59972010823701890950e-05, + 5.51841261183018495025e-05, + 5.43408152723015371618e-05, + 5.34677993052802834643e-05, + 5.25656251209348160261e-05, + 5.16348554268246720794e-05, + 5.06760683869446402865e-05, + 4.96898572660009552938e-05, + 4.86768300656121986501e-05, + 4.76376091526542401900e-05, + 4.65728308799746458426e-05, + 4.54831451997094723732e-05, + 4.43692152694205702067e-05, + 4.32317170513272638010e-05, + 4.20713389048248215750e-05, + 4.08887811725691820543e-05, + 3.96847557603624830438e-05, + 3.84599857110910642592e-05, + 3.72152047729705208619e-05, + 3.59511569623536525052e-05, + 3.46685961213579385467e-05, + 3.33682854705920874040e-05, + 3.20509971572010551400e-05, + 3.07175117985585750834e-05, + 2.93686180218123159854e-05, + 2.80051119996170835922e-05, + 2.66277969822622470077e-05, + 2.52374828265144898710e-05, + 2.38349855214322459531e-05, + 2.24211267114313739257e-05, + 2.09967332168798777813e-05, + 1.95626365525002586521e-05, + 1.81196724438590493929e-05, + 1.66686803422232323734e-05, + 1.52105029380648706125e-05, + 1.37459856734939339152e-05, + 1.22759762539012447631e-05, + 1.08013241590919135580e-05, + 9.32288015419072379738e-06, + 7.84149580059962841079e-06, + 6.35802296728773956217e-06, + 4.87331334269314813773e-06, + 3.38821794751525819401e-06, + 1.90358664867536025810e-06, + 4.20267674722007678397e-07, +-1.06089286704349063181e-06, +-2.53905147144755971960e-06, +-4.01336771405853671665e-06, +-5.48300472726051319248e-06, +-6.94712967353908428204e-06, +-8.40491421565995491089e-06, +-9.85553498354600196257e-06, +-1.12981740375379932287e-05, +-1.27320193278005813889e-05, +-1.41562651496129757108e-05, +-1.55701125942935366840e-05, +-1.69727699954863943171e-05, +-1.83634533706132413357e-05, +-1.97413868571768872317e-05, +-2.11058031437259111299e-05, +-2.24559438952188090413e-05, +-2.37910601725753876787e-05, +-2.51104128461361075818e-05, +-2.64132730028669993332e-05, +-2.76989223470385161768e-05, +-2.89666535941785825052e-05, +-3.02157708580817170672e-05, +-3.14455900306639634365e-05, +-3.26554391544575276863e-05, +-3.38446587875432448227e-05, +-3.50126023607246299988e-05, +-3.61586365267507298072e-05, +-3.72821415014014433467e-05, +-3.83825113962520523994e-05, +-3.94591545429407643156e-05, +-4.05114938087662831479e-05, +-4.15389669034495396562e-05, +-4.25410266768976613630e-05, +-4.35171414078138610380e-05, +-4.44667950830035220650e-05, +-4.53894876672311637202e-05, +-4.62847353634881464551e-05, +-4.71520708635396170122e-05, +-4.79910435886203451676e-05, +-4.88012199201597561809e-05, +-4.95821834204167205301e-05, +-5.03335350429265633945e-05, +-5.10548933326265304408e-05, +-5.17458946156012646414e-05, +-5.24061931783268363742e-05, +-5.30354614363393909939e-05, +-5.36333900922485962647e-05, +-5.41996882830139510762e-05, +-5.47340837164388594079e-05, +-5.52363227967925824054e-05, +-5.57061707395272917836e-05, +-5.61434116750343203787e-05, +-5.65478487413978341881e-05, +-5.69193041661166998697e-05, +-5.72576193367504884379e-05, +-5.75626548604881785863e-05, +-5.78342906126072504132e-05, +-5.80724257738199440486e-05, +-5.82769788565022921634e-05, +-5.84478877198096668589e-05, +-5.85851095736871960683e-05, +-5.86886209717912786239e-05, +-5.87584177933450407718e-05, +-5.87945152139549069526e-05, +-5.87969476654236840492e-05, +-5.87657687846015756232e-05, +-5.87010513513210692091e-05, +-5.86028872154704082165e-05, +-5.84713872132640056231e-05, +-5.83066810727762474998e-05, +-5.81089173088098371331e-05, +-5.78782631071765932274e-05, +-5.76149041984740298956e-05, +-5.73190447214473209757e-05, +-5.69909070760322414208e-05, +-5.66307317661793541358e-05, +-5.62387772325672526141e-05, +-5.58153196753171827195e-05, +-5.53606528668218819548e-05, +-5.48750879548260181830e-05, +-5.43589532558681387997e-05, +-5.38125940392313040217e-05, +-5.32363723015430049873e-05, +-5.26306665321520585781e-05, +-5.19958714694554905247e-05, +-5.13323978483126871185e-05, +-5.06406721387124545189e-05, +-4.99211362758563274877e-05, +-4.91742473818266735545e-05, +-4.84004774790149961978e-05, +-4.76003131954764758258e-05, +-4.67742554624208601633e-05, +-4.59228192039893781543e-05, +-4.50465330195347888644e-05, +-4.41459388585886764659e-05, +-4.32215916887159588432e-05, +-4.22740591564579529368e-05, +-4.13039212415705373426e-05, +-4.03117699047655450996e-05, +-3.92982087291690829157e-05, +-3.82638525557110084044e-05, +-3.72093271126660717248e-05, +-3.61352686395672686765e-05, +-3.50423235057168379857e-05, +-3.39311478235224090556e-05, +-3.28024070568877919004e-05, +-3.16567756248915059525e-05, +-3.04949365009877199171e-05, +-2.93175808079664161425e-05, +-2.81254074089120697057e-05, +-2.69191224944017248270e-05, +-2.56994391661852553642e-05, +-2.44670770175918836234e-05, +-2.32227617109122020126e-05, +-2.19672245519847623529e-05, +-2.07012020622797709220e-05, +-1.94254355486677272565e-05, +-1.81406706711849960521e-05, +-1.68476570089850853130e-05, +-1.55471476247899104671e-05, +-1.42398986280482303988e-05, +-1.29266687370718316063e-05, +-1.16082188403988693324e-05, +-1.02853115576371897586e-05, +-8.95871080003975092416e-06, +-7.62918133106494951846e-06, +-6.29748832717637000583e-06, +-4.96439693911456911849e-06, +-3.63067185393867396159e-06, +-2.29707685802459498842e-06, +-9.64374401315848450426e-07, + 3.66674836944231519952e-07, + 1.69531238074935703441e-06, + 3.02078238789119312040e-06, + 4.34233207830084875904e-06, + 5.65921215992918806928e-06, + 6.97067725192901449440e-06, + 8.27598630488246552004e-06, + 9.57440301788133736832e-06, + 1.08651962521827093731e-05, + 1.21476404412087555200e-05, + 1.34210159967052598768e-05, + 1.46846097107889237831e-05, + 1.59377151536783862637e-05, + 1.71796330668853545218e-05, + 1.84096717516477081152e-05, + 1.96271474523901250152e-05, + 2.08313847350004374291e-05, + 2.20217168597138741371e-05, + 2.31974861483999769760e-05, + 2.43580443460485478093e-05, + 2.55027529762765186715e-05, + 2.66309836906033699266e-05, + 2.77421186114023531077e-05, + 2.88355506682450058473e-05, + 2.99106839275143976181e-05, + 3.09669339150908589178e-05, + 3.20037279319387916966e-05, + 3.30205053624261607144e-05, + 3.40167179752114232517e-05, + 3.49918302165381128787e-05, + 3.59453194957816331854e-05, + 3.68766764630972321086e-05, + 3.77854052790209193153e-05, + 3.86710238758958244651e-05, + 3.95330642109541764121e-05, + 4.03710725109682755916e-05, + 4.11846095083103026020e-05, + 4.19732506683146705116e-05, + 4.27365864078233130617e-05, + 4.34742223048040452049e-05, + 4.41857792989385563150e-05, + 4.48708938830692915926e-05, + 4.55292182854370863364e-05, + 4.61604206425851002231e-05, + 4.67641851628709925696e-05, + 4.73402122805066265026e-05, + 4.78882188000329483382e-05, + 4.84079380311931386409e-05, + 4.88991199141192096943e-05, + 4.93615311347864993397e-05, + 4.97949552306842973051e-05, + 5.01991926866579958816e-05, + 5.05740610208843503087e-05, + 5.09193948609473228035e-05, + 5.12350460099867614349e-05, + 5.15208835028994156444e-05, + 5.17767936525754493993e-05, + 5.20026800861617919140e-05, + 5.21984637713472843972e-05, + 5.23640830326715540628e-05, + 5.24994935578649676486e-05, + 5.26046683942319904669e-05, + 5.26795979350977647813e-05, + 5.27242898963412381865e-05, + 5.27387692830453080699e-05, + 5.27230783462991780706e-05, + 5.26772765301947225270e-05, + 5.26014404090633305310e-05, + 5.24956636150047901762e-05, + 5.23600567557668073533e-05, + 5.21947473230388830738e-05, + 5.19998795912271193358e-05, + 5.17756145067857189357e-05, + 5.15221295681833840827e-05, + 5.12396186965899134232e-05, + 5.09282920973702621955e-05, + 5.05883761124873977634e-05, + 5.02201130639010932745e-05, + 4.98237610880825857601e-05, + 4.93995939617437136368e-05, + 4.89479009189001211121e-05, + 4.84689864593871208814e-05, + 4.79631701489468674927e-05, + 4.74307864110306472431e-05, + 4.68721843104290958456e-05, + 4.62877273288830334104e-05, + 4.56777931328110654310e-05, + 4.50427733333015571236e-05, + 4.43830732385187975314e-05, + 4.36991115986785094998e-05, + 4.29913203437512904219e-05, + 4.22601443140560245420e-05, + 4.15060409839102542823e-05, + 4.07294801785067884332e-05, + 3.99309437841909614544e-05, + 3.91109254523149503578e-05, + 3.82699302968499331071e-05, + 3.74084745859401725113e-05, + 3.65270854275851831246e-05, + 3.56263004496409294844e-05, + 3.47066674743320204575e-05, + 3.37687441874715604177e-05, + 3.28130978025864834921e-05, + 3.18403047201496259048e-05, + 3.08509501821220885999e-05, + 2.98456279220141111716e-05, + 2.88249398106583463292e-05, + 2.77894954979411405727e-05, + 2.67399120506568739174e-05, + 2.56768135867345998077e-05, + 2.46008309060387078085e-05, + 2.35126011179608967452e-05, + 2.24127672660373206972e-05, + 2.13019779497730199318e-05, + 2.01808869439458528371e-05, + 1.90501528155745074983e-05, + 1.79104385387887921337e-05, + 1.67624111078244624493e-05, + 1.56067411483699600464e-05, + 1.44441025274743162915e-05, + 1.32751719622829946729e-05, + 1.21006286277736464400e-05, + 1.09211537637588811984e-05, + 9.73743028136644528262e-06, + 8.55014236922561691437e-06, + 7.35997509958635033394e-06, + 6.16761403459692181825e-06, + 4.97374483296533837542e-06, + 3.77905285722950647743e-06, + 2.58422278186008839003e-06, + 1.38993820241930683239e-06, + 1.96881245997903772338e-07, +-9.94267816848598569217e-07, +-2.18283095844447963890e-06, +-3.36813277840069707876e-06, +-4.54950088586700000424e-06, +-5.72626627941386950107e-06, +-6.89776372433048807836e-06, +-8.06333212712694707145e-06, +-9.22231490703067589279e-06, +-1.03740603642693244191e-05, +-1.15179220449344173161e-05, +-1.26532591022196861730e-05, +-1.37794366538495711072e-05, +-1.48958261354584999990e-05, +-1.60018056497799296184e-05, +-1.70967603114136951952e-05, +-1.81800825869820380861e-05, +-1.92511726305242952264e-05, +-2.03094386138927829864e-05, +-2.13542970520092069756e-05, +-2.23851731227873900821e-05, +-2.34015009815511875976e-05, +-2.44027240697762211102e-05, +-2.53882954179860686225e-05, +-2.63576779426533689202e-05, +-2.73103447369098503218e-05, +-2.82457793549575378290e-05, +-2.91634760899918437553e-05, +-3.00629402455041167019e-05, +-3.09436883998153130820e-05, +-3.18052486637019455554e-05, +-3.26471609309779970515e-05, +-3.34689771219005548241e-05, +-3.42702614192727262341e-05, +-3.50505904971203557973e-05, +-3.58095537418260222574e-05, +-3.65467534655933827146e-05, +-3.72618051121717498101e-05, +-3.79543374546707974228e-05, +-3.86239927854306394216e-05, +-3.92704270978131317837e-05, +-3.98933102598363287456e-05, +-4.04923261795653974715e-05, +-4.10671729621785269976e-05, +-4.16175630586323642046e-05, +-4.21432234058559141441e-05, +-4.26438955584067616068e-05, +-4.31193358115292238756e-05, +-4.35693153155569312869e-05, +-4.39936201816156069303e-05, +-4.43920515785651946397e-05, +-4.47644258211561343495e-05, +-4.51105744493632472049e-05, +-4.54303442988531914885e-05, +-4.57235975625737596506e-05, +-4.59902118434391446694e-05, +-4.62300801980975147932e-05, +-4.64431111717703053654e-05, +-4.66292288241590738816e-05, +-4.67883727464197082162e-05, +-4.69204980692097139592e-05, +-4.70255754618213880035e-05, +-4.71035911224101212042e-05, +-4.71545467593474220552e-05, +-4.71784595637180143891e-05, +-4.71753621729942670049e-05, +-4.71453026259235373810e-05, +-4.70883443086696765927e-05, +-4.70045658922535814004e-05, +-4.68940612613444625227e-05, +-4.67569394344568726790e-05, +-4.65933244756150703129e-05, +-4.64033553975471216042e-05, +-4.61871860564808808737e-05, +-4.59449850386188616159e-05, +-4.56769355383655138421e-05, +-4.53832352283949652812e-05, +-4.50640961216473178623e-05, +-4.47197444253447825278e-05, +-4.43504203871267281252e-05, +-4.39563781334040550529e-05, +-4.35378855000395927045e-05, +-4.30952238554646824297e-05, +-4.26286879163457669119e-05, +-4.21385855559199974771e-05, +-4.16252376051221437895e-05, +-4.10889776466288376587e-05, +-4.05301518019508379771e-05, +-3.99491185117068837215e-05, +-3.93462483092169100062e-05, +-3.87219235875561562329e-05, +-3.80765383602142771309e-05, +-3.74104980155082837679e-05, +-3.67242190649002693526e-05, +-3.60181288853753334362e-05, +-3.52926654560366292231e-05, +-3.45482770890794257056e-05, +-3.37854221553090375610e-05, +-3.30045688043594255523e-05, +-3.22061946798075831645e-05, +-3.13907866293216945321e-05, +-3.05588404100427330412e-05, +-2.97108603893675688823e-05, +-2.88473592413132615716e-05, +-2.79688576386454084658e-05, +-2.70758839409515568225e-05, +-2.61689738788582883049e-05, +-2.52486702345479146949e-05, +-2.43155225188067227653e-05, +-2.33700866447662229544e-05, +-2.24129245985293835562e-05, +-2.14446041069073238181e-05, +-2.04656983024178883341e-05, +-1.94767853857754148804e-05, +-1.84784482860567825561e-05, +-1.74712743187444023349e-05, +-1.64558548418461311194e-05, +-1.54327849102923173909e-05, +-1.44026629288111792759e-05, +-1.33660903034842037365e-05, +-1.23236710921832843933e-05, +-1.12760116540923691986e-05, +-1.02237202985157386555e-05, +-9.16740693317562989567e-06, +-8.10768271220163393815e-06, +-7.04515968401436206049e-06, +-5.98045043930514029506e-06, +-4.91416775931360371891e-06, +-3.84692426460422025455e-06, +-2.77933206454218416435e-06, +-1.71200240766848139346e-06, +-6.45545333172962557628e-07, + 4.19430676336646794336e-07, + 1.48231904057302648397e-06, + 2.54251542561663930372e-06, + 3.59941808609308168670e-06, + 4.65242820524958869112e-06, + 5.70095023278988534811e-06, + 6.74439222023971488674e-06, + 7.78216615367016922942e-06, + 8.81368828359270617260e-06, + 9.83837945182666922020e-06, + 1.08556654151943217460e-05, + 1.18649771658138885200e-05, + 1.28657512478499302136e-05, + 1.38574300705307268156e-05, + 1.48394622172600090695e-05, + 1.58113027506664198453e-05, + 1.67724135133877546580e-05, + 1.77222634244721200859e-05, + 1.86603287711980042802e-05, + 1.95860934961685117974e-05, + 2.04990494795206747223e-05, + 2.13986968160965711628e-05, + 2.22845440874262652991e-05, + 2.31561086283755511721e-05, + 2.40129167883148332595e-05, + 2.48545041866689361690e-05, + 2.56804159627113593367e-05, + 2.64902070194693860814e-05, + 2.72834422616106000525e-05, + 2.80596968271851059942e-05, + 2.88185563131008925446e-05, + 2.95596169942142674564e-05, + 3.02824860359208226652e-05, + 3.09867817001359949951e-05, + 3.16721335445593264431e-05, + 3.23381826151192079948e-05, + 3.29845816314999765108e-05, + 3.36109951656569510029e-05, + 3.42170998132293449818e-05, + 3.48025843577636647915e-05, + 3.53671499276745119299e-05, + 3.59105101458437678133e-05, + 3.64323912718148200060e-05, + 3.69325323364901809465e-05, + 3.74106852692794952407e-05, + 3.78666150176288244058e-05, + 3.83000996588942581029e-05, + 3.87109305044850893402e-05, + 3.90989121962477274223e-05, + 3.94638627950426708552e-05, + 3.98056138614771284553e-05, + 4.01240105287611420687e-05, + 4.04189115676629857573e-05, + 4.06901894435291198787e-05, + 4.09377303653654542282e-05, + 4.11614343269538722871e-05, + 4.13612151399990495742e-05, + 4.15370004592994877942e-05, + 4.16887317999427647820e-05, + 4.18163645465287068582e-05, + 4.19198679544291165572e-05, + 4.19992251430971813499e-05, + 4.20544330814450761122e-05, + 4.20855025653108131916e-05, + 4.20924581870419940027e-05, + 4.20753382972270773108e-05, + 4.20341949586107831312e-05, + 4.19690938922323789214e-05, + 4.18801144158325268558e-05, + 4.17673493745770476031e-05, + 4.16309050641507942731e-05, + 4.14709011462787672121e-05, + 4.12874705567371297560e-05, + 4.10807594059191025335e-05, + 4.08509268720259451839e-05, + 4.05981450869582284656e-05, + 4.03225990149817188125e-05, + 4.00244863242588127953e-05, + 3.97040172513205211744e-05, + 3.93614144585763300172e-05, + 3.89969128849576671548e-05, + 3.86107595897814662080e-05, + 3.82032135899500682069e-05, + 3.77745456905820574433e-05, + 3.73250383091862464823e-05, + 3.68549852934909236125e-05, + 3.63646917330434846769e-05, + 3.58544737646997589589e-05, + 3.53246583721261741586e-05, + 3.47755831794332366546e-05, + 3.42075962390870128276e-05, + 3.36210558142060423280e-05, + 3.30163301553966777682e-05, + 3.23937972722568060207e-05, + 3.17538446996900900290e-05, + 3.10968692591733985816e-05, + 3.04232768151230764501e-05, + 2.97334820265093258108e-05, + 2.90279080938678783936e-05, + 2.83069865018621188567e-05, + 2.75711567575615524813e-05, + 2.68208661245598943643e-05, + 2.60565693531506030998e-05, + 2.52787284066631597003e-05, + 2.44878121841591343355e-05, + 2.36842962396411912224e-05, + 2.28686624979444416434e-05, + 2.20413989674784742564e-05, + 2.12029994499905229957e-05, + 2.03539632475213441687e-05, + 1.94947948667270345394e-05, + 1.86260037207404863615e-05, + 1.77481038287503190129e-05, + 1.68616135134610017573e-05, + 1.59670550966399525954e-05, + 1.50649545929016600080e-05, + 1.41558414019059438765e-05, + 1.32402479991802029098e-05, + 1.23187096257152244321e-05, + 1.13917639765278494500e-05, + 1.04599508883682767454e-05, + 9.52381202675309655368e-06, + 8.58389057250431938178e-06, + 7.64073090797513138387e-06, + 6.69487830314289765184e-06, + 5.74687860175188295145e-06, + 4.79727790767192774363e-06, + 3.84662227168647334824e-06, + 2.89545737884364760088e-06, + 1.94432823658253304009e-06, + 9.93778863798429985474e-07, + 4.43519810261418219453e-08, +-9.03411298083134494987e-07, +-1.84897177381668332505e-06, +-2.79179246581568572222e-06, +-3.73133891666547724968e-06, +-4.66707949352351104895e-06, +-5.59848568756837193684e-06, +-6.52503241114909488603e-06, +-7.44619829242155147390e-06, +-8.36146596735429801020e-06, +-9.27032236890755496482e-06, +-1.01722590132379665735e-05, +-1.10667722827682534897e-05, +-1.19533637059645449316e-05, +-1.28315402336673929602e-05, +-1.37008145118236726118e-05, +-1.45607051504696124636e-05, +-1.54107369888173211751e-05, +-1.62504413562997488372e-05, +-1.70793563294315240981e-05, +-1.78970269843458541098e-05, +-1.87030056448704560027e-05, +-1.94968521260079873374e-05, +-2.02781339726898497515e-05, +-2.10464266936743830125e-05, +-2.18013139904647730040e-05, +-2.25423879811231864039e-05, +-2.32692494188629845134e-05, +-2.39815079053020545374e-05, +-2.46787820982652636209e-05, +-2.53606999140241696946e-05, +-2.60268987238786572637e-05, +-2.66770255449520642306e-05, +-2.73107372251350898203e-05, +-2.79277006220566396152e-05, +-2.85275927760007770367e-05, +-2.91101010766786506953e-05, +-2.96749234237720292370e-05, +-3.02217683811674436194e-05, +-3.07503553247967688486e-05, +-3.12604145840304585829e-05, +-3.17516875765274536082e-05, +-3.22239269364954619744e-05, +-3.26768966362916865294e-05, +-3.31103721013135404044e-05, +-3.35241403181086740208e-05, +-3.39179999356772221173e-05, +-3.42917613599035768068e-05, +-3.46452468410814200988e-05, +-3.49782905544949971623e-05, +-3.52907386740210617191e-05, +-3.55824494387227893157e-05, +-3.58532932124095292024e-05, +-3.61031525361412189944e-05, +-3.63319221736595660043e-05, +-3.65395091497331203439e-05, +-3.67258327814061905970e-05, +-3.68908247021470958485e-05, +-3.70344288788946495372e-05, +-3.71566016220048470271e-05, +-3.72573115881061459097e-05, +-3.73365397758733679086e-05, +-3.73942795147359094356e-05, +-3.74305364465390174970e-05, +-3.74453285001817191228e-05, +-3.74386858592581299020e-05, +-3.74106509227334344111e-05, +-3.73612782586900054964e-05, +-3.72906345511812774523e-05, +-3.71987985402384284698e-05, +-3.70858609550741078051e-05, +-3.69519244405358592356e-05, +-3.67971034768620346741e-05, +-3.66215242927991649845e-05, +-3.64253247721413610217e-05, +-3.62086543537608289011e-05, +-3.59716739251909398806e-05, +-3.57145557098436036985e-05, +-3.54374831479307815388e-05, +-3.51406507711717790501e-05, +-3.48242640713705212661e-05, +-3.44885393629439755150e-05, +-3.41337036395026344345e-05, +-3.37599944245618602615e-05, +-3.33676596164906268116e-05, +-3.29569573277930418366e-05, +-3.25281557188254321234e-05, +-3.20815328260544299979e-05, +-3.16173763849646847373e-05, +-3.11359836477270585640e-05, +-3.06376611957413178553e-05, +-3.01227247471705252121e-05, +-2.95914989595860117668e-05, +-2.90443172278450244467e-05, +-2.84815214773259415084e-05, +-2.79034619526477284249e-05, +-2.73104970020026914545e-05, +-2.67029928572347473455e-05, +-2.60813234097965965382e-05, +-2.54458699827217350983e-05, +-2.47970210987495716533e-05, +-2.41351722447432573014e-05, +-2.34607256325420285845e-05, +-2.27740899563922217575e-05, +-2.20756801471030884767e-05, +-2.13659171230650388217e-05, +-2.06452275383031910749e-05, +-1.99140435276834237366e-05, +-1.91728024494465332597e-05, +-1.84219466252117046706e-05, +-1.76619230776150628139e-05, +-1.68931832657115450086e-05, +-1.61161828183312975558e-05, +-1.53313812655206427630e-05, +-1.45392417682358304494e-05, +-1.37402308464459345215e-05, +-1.29348181058055242533e-05, +-1.21234759630454037166e-05, +-1.13066793702690812049e-05, +-1.04849055382779459772e-05, +-9.65863365911334948940e-06, +-8.82834462796514155621e-06, +-7.99452076460905629502e-06, +-7.15764553453369098759e-06, +-6.31820326991743474922e-06, +-5.47667889061570897704e-06, +-4.63355762531863929758e-06, +-3.78932473303858924915e-06, +-2.94446522508681059839e-06, +-2.09946358769777104725e-06, +-1.25480350545903780141e-06, +-4.10967585703884757521e-07, + 4.31562915977009008788e-07, + 1.27230836894944277571e-06, + 2.11079103932071460005e-06, + 2.94653536014252898618e-06, + 3.77906819987967961097e-06, + 4.60791912899369108820e-06, + 5.43262068449194016279e-06, + 6.25270863229422647450e-06, + 7.06772222727031654239e-06, + 7.87720447080152108251e-06, + 8.68070236573491179038e-06, + 9.47776716855934883059e-06, + 1.02679546387046329188e-05, + 1.10508252847855289948e-05, + 1.18259446076950094435e-05, + 1.25928833403731488022e-05, + 1.33512176841488130493e-05, + 1.41005295415132480126e-05, + 1.48404067452006041290e-05, + 1.55704432834508311935e-05, + 1.62902395213322402135e-05, + 1.69994024180030318645e-05, + 1.76975457398040286305e-05, + 1.83842902690431043002e-05, + 1.90592640083929755197e-05, + 1.97221023807678906147e-05, + 2.03724484245830909945e-05, + 2.10099529842914574005e-05, + 2.16342748960969371002e-05, + 2.22450811687472009364e-05, + 2.28420471593103576108e-05, + 2.34248567438443574510e-05, + 2.39932024828722749476e-05, + 2.45467857815675249479e-05, + 2.50853170445967065243e-05, + 2.56085158254919929746e-05, + 2.61161109705264067420e-05, + 2.66078407569898643540e-05, + 2.70834530258070006151e-05, + 2.75427053084297310910e-05, + 2.79853649479419435960e-05, + 2.84112092143175989727e-05, + 2.88200254137772721131e-05, + 2.92116109921902309310e-05, + 2.95857736324748295058e-05, + 2.99423313459514552895e-05, + 3.02811125576063902359e-05, + 3.06019561852344731414e-05, + 3.09047117124088772445e-05, + 3.11892392552770306917e-05, + 3.14554096231257185974e-05, + 3.17031043727105386106e-05, + 3.19322158563235434462e-05, + 3.21426472635838068469e-05, + 3.23343126569389799764e-05, + 3.25071370008686157485e-05, + 3.26610561847839823827e-05, + 3.27960170396232209987e-05, + 3.29119773481435616428e-05, + 3.30089058489176179569e-05, + 3.30867822340391137381e-05, + 3.31455971405566354542e-05, + 3.31853521356474453628e-05, + 3.32060596955532425618e-05, + 3.32077431783010264656e-05, + 3.31904367902360999997e-05, + 3.31541855463981258254e-05, + 3.30990452247738323123e-05, + 3.30250823144645263966e-05, + 3.29323739578086778848e-05, + 3.28210078865044069620e-05, + 3.26910823517787598727e-05, + 3.25427060486570274289e-05, + 3.23759980343831654933e-05, + 3.21910876410516532862e-05, + 3.19881143825098785360e-05, + 3.17672278555962777865e-05, + 3.15285876357804020743e-05, + 3.12723631672755098660e-05, + 3.09987336476968641276e-05, + 3.07078879073422307631e-05, + 3.04000242831731254834e-05, + 3.00753504875796523151e-05, + 2.97340834720133863225e-05, + 2.93764492855759244065e-05, + 2.90026829286541534467e-05, + 2.86130282016945522135e-05, + 2.82077375492130921937e-05, + 2.77870718991382409868e-05, + 2.73513004975885902525e-05, + 2.69007007391876059731e-05, + 2.64355579930219527422e-05, + 2.59561654243505824063e-05, + 2.54628238121749757804e-05, + 2.49558413627831115046e-05, + 2.44355335193822060570e-05, + 2.39022227679302646662e-05, + 2.33562384393019751726e-05, + 2.27979165078862079359e-05, + 2.22275993867542926926e-05, + 2.16456357195166269815e-05, + 2.10523801689935258924e-05, + 2.04481932028270123260e-05, + 1.98334408761695914203e-05, + 1.92084946115600319473e-05, + 1.85737309761447836221e-05, + 1.79295314563576179442e-05, + 1.72762822302007563351e-05, + 1.66143739372523043473e-05, + 1.59442014465590105223e-05, + 1.52661636225209913461e-05, + 1.45806630889290942863e-05, + 1.38881059912848947536e-05, + 1.31889017575441241904e-05, + 1.24834628574239182218e-05, + 1.17722045604144076358e-05, + 1.10555446926362083376e-05, + 1.03339033926850970682e-05, + 9.60770286660610835401e-06, + 8.87736714213917295769e-06, + 8.14332182237846214528e-06, + 7.40599383898811708220e-06, + 6.66581120511662847053e-06, + 5.92320276815220692627e-06, + 5.17859796246125674333e-06, + 4.43242656225190390784e-06, + 3.68511843470406844027e-06, + 2.93710329350725519965e-06, + 2.18881045294667824256e-06, + 1.44066858267776568184e-06, + 6.93105463328498643878e-07, +-5.34522569318000109946e-08, +-7.98579304717572919173e-07, +-1.54185202251970832288e-06, +-2.28284860840320051088e-06, +-3.02114935421031389665e-06, +-3.75633688210878496775e-06, +-4.48799637936313885382e-06, +-5.21571583119760455970e-06, +-5.93908625161027179838e-06, +-6.65770191203593872154e-06, +-7.37116056769570928293e-06, +-8.07906368153382318078e-06, +-8.78101664560747212731e-06, +-9.47662899980729766419e-06, +-1.01655146477980716876e-05, +-1.08472920700360401147e-05, +-1.15215845337792326716e-05, +-1.21880202999511892778e-05, +-1.28462328267551614196e-05, +-1.34958609699263177819e-05, +-1.41365491795134746316e-05, +-1.47679476930840737262e-05, +-1.53897127252478330606e-05, +-1.60015066533978296873e-05, +-1.66029981995690071228e-05, +-1.71938626083174473280e-05, +-1.77737818205255124692e-05, +-1.83424446430409821820e-05, +-1.88995469140607142496e-05, +-1.94447916641716418988e-05, +-1.99778892729651633619e-05, +-2.04985576211432968317e-05, +-2.10065222380378098066e-05, +-2.15015164444660525898e-05, +-2.19832814908509086081e-05, +-2.24515666905336362430e-05, +-2.29061295482131846272e-05, +-2.33467358834453286897e-05, +-2.37731599491474201167e-05, +-2.41851845450333852378e-05, +-2.45826011259452240434e-05, +-2.49652099050124548756e-05, +-2.53328199515970210081e-05, +-2.56852492839710685329e-05, +-2.60223249566979663422e-05, +-2.63438831426579298076e-05, +-2.66497692096954663589e-05, +-2.69398377918485816931e-05, +-2.72139528551308018016e-05, +-2.74719877578380960005e-05, +-2.77138253053556592794e-05, +-2.79393577994475523249e-05, +-2.81484870820020636713e-05, +-2.83411245732301139656e-05, +-2.85171913042964311541e-05, +-2.86766179443786176822e-05, +-2.88193448221488309965e-05, +-2.89453219416760952935e-05, +-2.90545089927504981216e-05, +-2.91468753556345132793e-05, +-2.92224001002483448552e-05, +-2.92810719798009543599e-05, +-2.93228894188808181459e-05, +-2.93478604960236810328e-05, +-2.93560029207774113129e-05, +-2.93473440052880433669e-05, +-2.93219206304335843936e-05, +-2.92797792065350247323e-05, +-2.92209756286776301080e-05, +-2.91455752266783351279e-05, +-2.90536527097378728982e-05, +-2.89452921058199178666e-05, +-2.88205866958015281636e-05, +-2.86796389424427922371e-05, +-2.85225604142267152093e-05, +-2.83494717041206751521e-05, +-2.81605023433202391432e-05, +-2.79557907100283667510e-05, +-2.77354839333381227289e-05, +-2.74997377922758771290e-05, +-2.72487166100799959093e-05, +-2.69825931437795252883e-05, +-2.67015484691465684885e-05, +-2.64057718610977712947e-05, +-2.60954606696212069907e-05, +-2.57708201913090847589e-05, +-2.54320635365780473264e-05, +-2.50794114926622185510e-05, +-2.47130923824611631432e-05, +-2.43333419193429083098e-05, +-2.39404030579782670638e-05, +-2.35345258413101434184e-05, +-2.31159672437494752078e-05, +-2.26849910106949353332e-05, +-2.22418674944758635930e-05, +-2.17868734868193039472e-05, +-2.13202920479438652059e-05, +-2.08424123323838041491e-05, +-2.03535294116561999106e-05, +-1.98539440938636343103e-05, +-1.93439627403565497755e-05, +-1.88238970795673100412e-05, +-1.82940640181116715769e-05, +-1.77547854492869263538e-05, +-1.72063880590754648210e-05, +-1.66492031297704090782e-05, +-1.60835663413408166554e-05, +-1.55098175706546329380e-05, +-1.49283006886787883053e-05, +-1.43393633557766034665e-05, +-1.37433568152237134072e-05, +-1.31406356850657396885e-05, +-1.25315577484303698698e-05, +-1.19164837424470248790e-05, +-1.12957771458482026110e-05, +-1.06698039654265613285e-05, +-1.00389325214426427445e-05, +-9.40353323211844157182e-06, +-8.76397839734067131087e-06, +-8.12064198169950727862e-06, +-7.47389939698852350989e-06, +-6.82412728429159437049e-06, +-6.17170329578283326645e-06, +-5.51700587636662085001e-06, +-4.86041404527424057491e-06, +-4.20230717776569626185e-06, +-3.54306478703081491720e-06, +-2.88306630643768218789e-06, +-2.22269087224340068095e-06, +-1.56231710689249263685e-06, +-9.02322903026265212716e-07, +-2.43085208325657879777e-07, + 4.15020188692070241853e-07, + 1.07161887179235378480e-06, + 1.72633800896124487047e-06, + 2.37880656301163715107e-06, + 3.02865550076134820403e-06, + 3.67551800066570465779e-06, + 4.31902965876675653769e-06, + 4.95882869287509108695e-06, + 5.59455614484735050385e-06, + 6.22585608085616216224e-06, + 6.85237578953995891761e-06, + 7.47376597792307623553e-06, + 8.08968096499781815715e-06, + 8.69977887286206749402e-06, + 9.30372181530736666231e-06, + 9.90117608375414723029e-06, + 1.04918123304324667667e-05, + 1.10753057487085165546e-05, + 1.16513362504588705059e-05, + 1.22195886403962862164e-05, + 1.27797527872529815987e-05, + 1.33315237917292095805e-05, + 1.38746021511168710365e-05, + 1.44086939205101016335e-05, + 1.49335108705172178858e-05, + 1.54487706413894936150e-05, + 1.59541968934863105428e-05, + 1.64495194539962877323e-05, + 1.69344744598370269687e-05, + 1.74088044966656047203e-05, + 1.78722587339096677364e-05, + 1.83245930557734450217e-05, + 1.87655701881329496747e-05, + 1.91949598212630230727e-05, + 1.96125387283323720589e-05, + 2.00180908796079946171e-05, + 2.04114075523055411008e-05, + 2.07922874360462036562e-05, + 2.11605367338478548244e-05, + 2.15159692586163032817e-05, + 2.18584065250839677179e-05, + 2.21876778371520620508e-05, + 2.25036203706003066312e-05, + 2.28060792511126929382e-05, + 2.30949076276010261842e-05, + 2.33699667407799707231e-05, + 2.36311259869688547377e-05, + 2.38782629770920889936e-05, + 2.41112635908534832393e-05, + 2.43300220260626135784e-05, + 2.45344408430947687194e-05, + 2.47244310044678461521e-05, + 2.48999119095234487111e-05, + 2.50608114242014547006e-05, + 2.52070659059005263759e-05, + 2.53386202234201725390e-05, + 2.54554277719819088525e-05, + 2.55574504833309083937e-05, + 2.56446588309218829473e-05, + 2.57170318301951886415e-05, + 2.57745570339536455825e-05, + 2.58172305228509982138e-05, + 2.58450568910080320990e-05, + 2.58580492267732674574e-05, + 2.58562290886494391582e-05, + 2.58396264764083687885e-05, + 2.58082797974207070447e-05, + 2.57622358282285832381e-05, + 2.57015496713930713401e-05, + 2.56262847076503301675e-05, + 2.55365125434126198959e-05, + 2.54323129536535378888e-05, + 2.53137738202205607126e-05, + 2.51809910656159463322e-05, + 2.50340685822968625073e-05, + 2.48731181575412977117e-05, + 2.46982593939325721589e-05, + 2.45096196255167505238e-05, + 2.43073338296873121584e-05, + 2.40915445348619378086e-05, + 2.38624017240045997246e-05, + 2.36200627340624288075e-05, + 2.33646921513807236321e-05, + 2.30964617031644264128e-05, + 2.28155501450558444859e-05, + 2.25221431449012520778e-05, + 2.22164331627798575491e-05, + 2.18986193273720365431e-05, + 2.15689073087443379398e-05, + 2.12275091876318188378e-05, + 2.08746433212990305033e-05, + 2.05105342060640502609e-05, + 2.01354123365703269947e-05, + 1.97495140618939641253e-05, + 1.93530814385750261550e-05, + 1.89463620806633047968e-05, + 1.85296090068704985814e-05, + 1.81030804849221997979e-05, + 1.76670398732044751401e-05, + 1.72217554598013985296e-05, + 1.67675002990209279609e-05, + 1.63045520455078192621e-05, + 1.58331927860449225669e-05, + 1.53537088691371193265e-05, + 1.48663907324963997689e-05, + 1.43715327285100159978e-05, + 1.38694329478100649496e-05, + 1.33603930410508834665e-05, + 1.28447180389832295180e-05, + 1.23227161709552708244e-05, + 1.17946986819301291035e-05, + 1.12609796481351171312e-05, + 1.07218757914499571946e-05, + 1.01777062926427738516e-05, + 9.62879260356504592831e-06, + 9.07545825840731586903e-06, + 8.51802868414534395823e-06, + 7.95683101026131923061e-06, + 7.39219387787010935662e-06, + 6.82444724835357750922e-06, + 6.25392221161505916386e-06, + 5.68095079406488222078e-06, + 5.10586576644759276318e-06, + 4.52900045162168937197e-06, + 3.95068853240210902949e-06, + 3.37126385957580590002e-06, + 2.79106026020026960787e-06, + 2.21041134629440781136e-06, + 1.62965032403097053739e-06, + 1.04910980353893797621e-06, + 4.69121609423969816268e-07, +-1.09983407885784446779e-07, +-6.87875559861819363080e-07, +-1.26422650655941540912e-06, +-1.83870944215866707785e-06, +-2.41099927925814251037e-06, +-2.98077283181781552669e-06, +-3.54770899664894408157e-06, +-4.11148893334953399492e-06, +-4.67179624258384839990e-06, +-5.22831714261491216074e-06, +-5.78074064397335153019e-06, +-6.32875872218480591626e-06, +-6.87206648846043886310e-06, +-7.41036235823793521568e-06, +-7.94334821749933495355e-06, +-8.47072958676628828367e-06, +-8.99221578268483114820e-06, +-9.50752007711151433478e-06, +-1.00163598536144939110e-05, +-1.05184567613050262248e-05, +-1.10135368659148606880e-05, +-1.15013307980458232298e-05, +-1.19815738984936175071e-05, +-1.24540063605928145280e-05, +-1.29183733694884611521e-05, +-1.33744252382685912655e-05, +-1.38219175408834683421e-05, +-1.42606112417824770782e-05, +-1.46902728222004355977e-05, +-1.51106744030272206920e-05, +-1.55215938641985491263e-05, +-1.59228149605396966692e-05, +-1.63141274340170367916e-05, +-1.66953271223259263928e-05, +-1.70662160637601778752e-05, +-1.74266025983238355662e-05, +-1.77763014650210005691e-05, +-1.81151338952815387428e-05, +-1.84429277024754141470e-05, +-1.87595173674722256573e-05, +-1.90647441202047199617e-05, +-1.93584560171974732774e-05, +-1.96405080150238890778e-05, +-1.99107620396580777466e-05, +-2.01690870516893970240e-05, +-2.04153591073708575137e-05, +-2.06494614154744169461e-05, +-2.08712843899290058163e-05, +-2.10807256982194106203e-05, +-2.12776903055268819069e-05, +-2.14620905145943367527e-05, +-2.16338460013017256061e-05, +-2.17928838459405791773e-05, +-2.19391385601769272338e-05, +-2.20725521096971615139e-05, +-2.21930739325313472097e-05, +-2.23006609530529530257e-05, +-2.23952775916547660337e-05, +-2.24768957701059413827e-05, +-2.25454949125917081373e-05, +-2.26010619424491719610e-05, +-2.26435912746056351556e-05, +-2.26730848037337861828e-05, +-2.26895518881395304210e-05, +-2.26930093293992605151e-05, +-2.26834813477678370105e-05, +-2.26609995533789395977e-05, +-2.26256029132635929800e-05, +-2.25773377142134946906e-05, +-2.25162575215193229503e-05, +-2.24424231336153037980e-05, +-2.23559025326656501465e-05, +-2.22567708311276078921e-05, +-2.21451102143313804113e-05, +-2.20210098791169147888e-05, +-2.18845659685713447666e-05, +-2.17358815029120373732e-05, +-2.15750663065627956596e-05, +-2.14022369314727249265e-05, +-2.12175165767294450026e-05, +-2.10210350045200421447e-05, +-2.08129284524956139116e-05, +-2.05933395425968121279e-05, +-2.03624171863999439073e-05, +-2.01203164870448847703e-05, +-1.98671986378080534994e-05, +-1.96032308173856533286e-05, +-1.93285860819534852074e-05, +-1.90434432540722883950e-05, +-1.87479868085084750535e-05, +-1.84424067550420635135e-05, +-1.81268985183354106028e-05, +-1.78016628149372209476e-05, +-1.74669055274989030828e-05, +-1.71228375762811146975e-05, +-1.67696747880257406472e-05, +-1.64076377622852373006e-05, +-1.60369517352758793533e-05, +-1.56578464413495735093e-05, +-1.52705559721640566414e-05, +-1.48753186336378656238e-05, +-1.44723768007754817841e-05, +-1.40619767704562352530e-05, +-1.36443686122615369144e-05, +-1.32198060174485617084e-05, +-1.27885461461470160532e-05, +-1.23508494728771689751e-05, +-1.19069796304737485969e-05, +-1.14572032525241123438e-05, +-1.10017898143939981797e-05, +-1.05410114729497751473e-05, +-1.00751429050663908628e-05, +-9.60446114501671036024e-06, +-9.12924542083821511740e-06, +-8.64977698977298705156e-06, +-8.16633897287741896158e-06, +-7.67921618889827246499e-06, +-7.18869498751202211574e-06, +-6.69506308202449553879e-06, +-6.19860938162804727016e-06, +-5.69962382331348281457e-06, +-5.19839720353396213883e-06, +-4.69522100971802372742e-06, +-4.19038725172889743185e-06, +-3.68418829336696433132e-06, +-3.17691668401197745318e-06, +-2.66886499050160637978e-06, +-2.16032562934221739981e-06, +-1.65159069934772865291e-06, +-1.14295181480165719692e-06, +-6.34699939237223993940e-07, +-1.27125219930865964068e-07, + 3.79483176804446976763e-07, + 8.84837229415048084051e-07, + 1.38865022392344135295e-06, + 1.89063691565660948537e-06, + 2.39051368980350543056e-06, + 2.88799872070356053645e-06, + 3.38281212979515968504e-06, + 3.87467614211226955731e-06, + 4.36331524126018218350e-06, + 4.84845632277730857507e-06, + 5.32982884579943108584e-06, + 5.80716498294156890627e-06, + 6.28019976832197123205e-06, + 6.74867124362975824505e-06, + 7.21232060217923931738e-06, + 7.67089233085512087109e-06, + 8.12413434987819258522e-06, + 8.57179815031460507597e-06, + 9.01363892925431026452e-06, + 9.44941572258580350576e-06, + 9.87889153529582866875e-06, + 1.03018334692242354077e-05, + 1.07180128482058532928e-05, + 1.11272053405328737749e-05, + 1.15291910786727369798e-05, + 1.19237547761785921742e-05, + 1.23106858417307881825e-05, + 1.26897784902497355293e-05, + 1.30608318510224895531e-05, + 1.34236500727868487704e-05, + 1.37780424257190294344e-05, + 1.41238234002725815088e-05, + 1.44608128028181916441e-05, + 1.47888358480361837552e-05, + 1.51077232480150609343e-05, + 1.54173112980111264947e-05, + 1.57174419588311981054e-05, + 1.60079629357866409767e-05, + 1.62887277541956994331e-05, + 1.65595958313870623361e-05, + 1.68204325451708860712e-05, + 1.70711092987549151222e-05, + 1.73115035820617087312e-05, + 1.75414990294297246641e-05, + 1.77609854736682751155e-05, + 1.79698589964435695681e-05, + 1.81680219749743536840e-05, + 1.83553831250179843454e-05, + 1.85318575401295563383e-05, + 1.86973667271814836071e-05, + 1.88518386381246428555e-05, + 1.89952076979892261869e-05, + 1.91274148291101984921e-05, + 1.92484074715740798728e-05, + 1.93581395998826688587e-05, + 1.94565717358317040323e-05, + 1.95436709576050705363e-05, + 1.96194109050871230563e-05, + 1.96837717813977941246e-05, + 1.97367403506575926565e-05, + 1.97783099319904582180e-05, + 1.98084803897790467670e-05, + 1.98272581201802304074e-05, + 1.98346560339216278375e-05, + 1.98306935353937785049e-05, + 1.98153964980584857704e-05, + 1.97887972361948640476e-05, + 1.97509344730071558156e-05, + 1.97018533051198989033e-05, + 1.96416051634883520843e-05, + 1.95702477707543367439e-05, + 1.94878450950789703635e-05, + 1.93944673004863832040e-05, + 1.92901906937534684103e-05, + 1.91750976678850051373e-05, + 1.90492766422124609142e-05, + 1.89128219991563888266e-05, + 1.87658340176993620855e-05, + 1.86084188036114926950e-05, + 1.84406882164763881947e-05, + 1.82627597935659933724e-05, + 1.80747566706147357355e-05, + 1.78768074995447826664e-05, + 1.76690463631958512617e-05, + 1.74516126871156478269e-05, + 1.72246511484645271060e-05, + 1.69883115820999146554e-05, + 1.67427488838910094079e-05, + 1.64881229113318102759e-05, + 1.62245983815127213317e-05, + 1.59523447665149745417e-05, + 1.56715361862937387256e-05, + 1.53823512991161662699e-05, + 1.50849731896229228884e-05, + 1.47795892545813357618e-05, + 1.44663910864051258596e-05, + 1.41455743545015973133e-05, + 1.38173386845338111450e-05, + 1.34818875356564122405e-05, + 1.31394280758153236577e-05, + 1.27901710551714238936e-05, + 1.24343306777357970924e-05, + 1.20721244712898652016e-05, + 1.17037731556691947766e-05, + 1.13295005094903200078e-05, + 1.09495332354001166718e-05, + 1.05641008239284915968e-05, + 1.01734354160254741075e-05, + 9.77777166436417707733e-06, + 9.37734659349238440105e-06, + 8.97239945891504566951e-06, + 8.56317160519109046130e-06, + 8.14990632312829315351e-06, + 7.73284870615977176810e-06, + 7.31224550598672419900e-06, + 6.88834498757161637657e-06, + 6.46139678356662984916e-06, + 6.03165174826215254474e-06, + 5.59936181114026503485e-06, + 5.16477983011814751843e-06, + 4.72815944456637594131e-06, + 4.28975492818819883339e-06, + 3.84982104183822503198e-06, + 3.40861288638080421604e-06, + 2.96638575565200338164e-06, + 2.52339498962473315831e-06, + 2.07989582785497810255e-06, + 1.63614326329362652845e-06, + 1.19239189654723987055e-06, + 7.48895790669445095407e-07, + 3.05908326571625776241e-07, +-1.36317940881114572753e-07, +-5.77531425986414698518e-07, +-1.01748165446873717438e-06, +-1.45591940480376818372e-06, +-1.89259684853121109570e-06, +-2.32726768946181945073e-06, +-2.75968730172187791391e-06, +-3.18961286654260444098e-06, +-3.61680350772475395115e-06, +-4.04102042570235190153e-06, +-4.46202703013145677961e-06, +-4.87958907093086315863e-06, +-5.29347476770270431638e-06, +-5.70345493746202430210e-06, +-6.10930312060542652779e-06, +-6.51079570505022606116e-06, +-6.90771204847647766264e-06, +-7.29983459860577372710e-06, +-7.68694901145177016447e-06, +-8.06884426747877637565e-06, +-8.44531278560606176982e-06, +-8.81615053499690261524e-06, +-9.18115714457292360416e-06, +-9.54013601019537525608e-06, +-9.89289439945689410725e-06, +-1.02392435540285157503e-05, +-1.05789987895082151180e-05, +-1.09119795927181496489e-05, +-1.12380097164049367058e-05, +-1.15569172712818179387e-05, +-1.18685348153817650919e-05, +-1.21726994406635834228e-05, +-1.24692528568320288901e-05, +-1.27580414723287455134e-05, +-1.30389164724542902805e-05, +-1.33117338945781214641e-05, +-1.35763547004100975057e-05, +-1.38326448452840637915e-05, +-1.40804753444306167702e-05, +-1.43197223362026314689e-05, +-1.45502671422277009592e-05, +-1.47719963244507672032e-05, +-1.49848017390525759050e-05, +-1.51885805872105738001e-05, +-1.53832354626835289546e-05, +-1.55686743961984593867e-05, +-1.57448108966214301034e-05, +-1.59115639888950593595e-05, +-1.60688582487281346781e-05, +-1.62166238340240249699e-05, +-1.63547965130369332254e-05, +-1.64833176892467266300e-05, +-1.66021344229449986304e-05, +-1.67111994495269690472e-05, +-1.68104711944856884120e-05, +-1.68999137851070388113e-05, +-1.69794970588658022861e-05, +-1.70491965685248872658e-05, +-1.71089935839418872147e-05, +-1.71588750905891277256e-05, +-1.71988337847946457871e-05, +-1.72288680657142012447e-05, +-1.72489820240458028352e-05, +-1.72591854275000641512e-05, +-1.72594937030417242213e-05, +-1.72499279159197036566e-05, +-1.72305147455039143491e-05, +-1.72012864579503712398e-05, +-1.71622808757165273689e-05, +-1.71135413439511928759e-05, +-1.70551166937853976150e-05, +-1.69870612025510246137e-05, +-1.69094345509577617692e-05, +-1.68223017772587667151e-05, +-1.67257332284380452606e-05, +-1.66198045084538685654e-05, +-1.65045964235747666643e-05, +-1.63801949248439752678e-05, +-1.62466910477154159362e-05, +-1.61041808488969476394e-05, +-1.59527653404471681951e-05, +-1.57925504211673684571e-05, +-1.56236468053350227754e-05, +-1.54461699488246402123e-05, +-1.52602399726646910730e-05, +-1.50659815840795875837e-05, +-1.48635239950677219589e-05, +-1.46530008385678102385e-05, +-1.44345500822663306819e-05, +-1.42083139401014696147e-05, +-1.39744387815186386459e-05, +-1.37330750385350818741e-05, +-1.34843771106714372927e-05, +-1.32285032678095108182e-05, +-1.29656155510367461763e-05, +-1.26958796715383549959e-05, +-1.24194649075998671690e-05, +-1.21365439997829936740e-05, +-1.18472930443392576808e-05, +-1.15518913849262173693e-05, +-1.12505215026924608397e-05, +-1.09433689047985292748e-05, +-1.06306220114370569618e-05, +-1.03124720414310326811e-05, +-9.98911289646390806746e-06, +-9.66074104402634771841e-06, +-9.32755539913410898457e-06, +-8.98975720490331666607e-06, +-8.64754991204318386249e-06, +-8.30113905734212395051e-06, +-7.95073214121866026069e-06, +-7.59653850440942178638e-06, +-7.23876920386707314615e-06, +-6.87763688794204854321e-06, +-6.51335567091628095621e-06, +-6.14614100697516552689e-06, +-5.77620956367455239778e-06, +-5.40377909498920278296e-06, +-5.02906831401159492038e-06, +-4.65229676537581108160e-06, +-4.27368469748049481391e-06, +-3.89345293458471427688e-06, +-3.51182274885061115744e-06, +-3.12901573240642411555e-06, +-2.74525366950255710500e-06, +-2.36075840884032086628e-06, +-1.97575173612730443720e-06, +-1.59045524696390774673e-06, +-1.20509022010166682739e-06, +-8.19877491164466545524e-07, +-4.35037326897878480005e-07, +-5.07893000186937941852e-08, + 3.32647835264701963937e-07, + 7.15056266991011401958e-07, + 1.09621924837422310365e-06, + 1.47592121985241872538e-06, + 1.85394793018892599705e-06, + 2.23008655655825313813e-06, + 2.60412582354907889203e-06, + 2.97585612102449336496e-06, + 3.34506962075543128396e-06, + 3.71156039179419859137e-06, + 4.07512451449323400283e-06, + 4.43556019312523663384e-06, + 4.79266786703672172316e-06, + 5.14625032027519291555e-06, + 5.49611278963019283487e-06, + 5.84206307102959016220e-06, + 6.18391162423353208402e-06, + 6.52147167576954129561e-06, + 6.85455932005260181654e-06, + 7.18299361864097611125e-06, + 7.50659669756249047314e-06, + 7.82519384267587422464e-06, + 8.13861359300433846395e-06, + 8.44668783199705641891e-06, + 8.74925187666988167100e-06, + 9.04614456457850991435e-06, + 9.33720833857896873390e-06, + 9.62228932933213677251e-06, + 9.90123743550565465295e-06, + 1.01739064016425803086e-05, + 1.04401538936425447330e-05, + 1.06998415718315421479e-05, + 1.09528351615697443715e-05, + 1.11990045213757959499e-05, + 1.14382237085241558977e-05, + 1.16703710420870291280e-05, + 1.18953291633899048006e-05, + 1.21129850938512417829e-05, + 1.23232302901790470909e-05, + 1.25259606968983349296e-05, + 1.27210767961849803022e-05, + 1.29084836549834598316e-05, + 1.30880909693871328668e-05, + 1.32598131062616946208e-05, + 1.34235691420937951136e-05, + 1.35792828990487302932e-05, + 1.37268829782224906786e-05, + 1.38663027900751689578e-05, + 1.39974805820346134686e-05, + 1.41203594632604494623e-05, + 1.42348874265606466504e-05, + 1.43410173674542311574e-05, + 1.44387071003753392044e-05, + 1.45279193720158173131e-05, + 1.46086218718049036649e-05, + 1.46807872395258838879e-05, + 1.47443930700731856367e-05, + 1.47994219153501084768e-05, + 1.48458612833167961215e-05, + 1.48837036341919119975e-05, + 1.49129463738179148723e-05, + 1.49335918441997313264e-05, + 1.49456473112284446691e-05, + 1.49491249496032089275e-05, + 1.49440418249668886146e-05, + 1.49304198732706183515e-05, + 1.49082858773864185118e-05, + 1.48776714409868946381e-05, + 1.48386129597128356167e-05, + 1.47911515896521751179e-05, + 1.47353332131532132959e-05, + 1.46712084019985736114e-05, + 1.45988323779665271851e-05, + 1.45182649708080687578e-05, + 1.44295705736699748613e-05, + 1.43328180959947710691e-05, + 1.42280809139304630388e-05, + 1.41154368182840922366e-05, + 1.39949679600544020416e-05, + 1.38667607935803263323e-05, + 1.37309060173433526632e-05, + 1.35874985124628946476e-05, + 1.34366372789253006354e-05, + 1.32784253695879846650e-05, + 1.31129698220019766261e-05, + 1.29403815880963342583e-05, + 1.27607754617702922906e-05, + 1.25742700044388885011e-05, + 1.23809874685797173814e-05, + 1.21810537193292244224e-05, + 1.19745981541777892090e-05, + 1.17617536208142295677e-05, + 1.15426563331714449024e-05, + 1.13174457857225807409e-05, + 1.10862646660882621001e-05, + 1.08492587659991565309e-05, + 1.06065768906759967075e-05, + 1.03583707666798818434e-05, + 1.01047949482890619580e-05, + 9.84600672246289829138e-06, + 9.58216601244215827264e-06, + 9.31343528005553203603e-06, + 9.03997942678299933766e-06, + 8.76196569363900174996e-06, + 8.47956355993590845071e-06, + 8.19294464098436757177e-06, + 7.90228258480172436834e-06, + 7.60775296787702002085e-06, + 7.30953319006439522813e-06, + 7.00780236866348362574e-06, + 6.70274123175005229701e-06, + 6.39453201082003652993e-06, + 6.08335833281021253502e-06, + 5.76940511155902288967e-06, + 5.45285843877125582177e-06, + 5.13390547455034551393e-06, + 4.81273433756231556671e-06, + 4.48953399489534794848e-06, + 4.16449415167896653590e-06, + 3.83780514052692429906e-06, + 3.50965781086775528301e-06, + 3.18024341822695296120e-06, + 2.84975351352448496748e-06, + 2.51837983245139741199e-06, + 2.18631418498888039782e-06, + 1.85374834513309478132e-06, + 1.52087394088868180660e-06, + 1.18788234459368242750e-06, + 8.54964563638969000998e-07, + 5.22311131639455979077e-07, + 1.90112000130503982774e-07, +-1.41443569165127144841e-07, +-4.72167111427258322109e-07, +-8.01871065130554529929e-07, +-1.13036887767394417904e-06, +-1.45747511019990077643e-06, +-1.78300554152943349745e-06, +-2.10677727116673305869e-06, +-2.42860882131162050769e-06, +-2.74832023782412414206e-06, +-3.06573319008543263771e-06, +-3.38067106969957008626e-06, +-3.69295908798608184869e-06, +-4.00242437219907550613e-06, +-4.30889606043524369669e-06, +-4.61220539516788939752e-06, +-4.91218581536073784053e-06, +-5.20867304711107137976e-06, +-5.50150519277325040547e-06, +-5.79052281851486924603e-06, +-6.07556904025867903059e-06, +-6.35648960796446912367e-06, +-6.63313298820617108662e-06, +-6.90535044500056127508e-06, +-7.17299611884493175119e-06, +-7.43592710392244173663e-06, +-7.69400352343472750019e-06, +-7.94708860302274787185e-06, +-8.19504874223798014101e-06, +-8.43775358402712548757e-06, +-8.67507608219503231826e-06, +-8.90689256681143526513e-06, +-9.13308280752864666172e-06, +-9.35353007477842320907e-06, +-9.56812119881768913406e-06, +-9.77674662659346799308e-06, +-9.97930047640225587741e-06, +-1.01756805903098395061e-05, +-1.03657885843171664226e-05, +-1.05495298962378540402e-05, +-1.07268138312754163948e-05, +-1.08975536052689632541e-05, +-1.10616663855950794401e-05, +-1.12190733297047288709e-05, +-1.13696996212789541697e-05, +-1.15134745039878948566e-05, +-1.16503313128391599354e-05, +-1.17802075031027646805e-05, +-1.19030446768033701643e-05, +-1.20187886067651972661e-05, +-1.21273892582080803395e-05, +-1.22288008078826377517e-05, +-1.23229816607413100770e-05, +-1.24098944641409426887e-05, +-1.24895061195742445941e-05, +-1.25617877919291833080e-05, +-1.26267149162764970278e-05, +-1.26842672021870910226e-05, +-1.27344286355826809563e-05, +-1.27771874781232745640e-05, +-1.28125362641396452218e-05, +-1.28404717951158474197e-05, +-1.28609951317310474550e-05, +-1.28741115834723465414e-05, +-1.28798306958283372134e-05, +-1.28781662350772487912e-05, +-1.28691361706835918807e-05, +-1.28527626553190634970e-05, +-1.28290720025245128650e-05, +-1.27980946620313942489e-05, +-1.27598651927620886218e-05, +-1.27144222335301226119e-05, +-1.26618084714623414664e-05, +-1.26020706081659076143e-05, +-1.25352593236666657602e-05, +-1.24614292381415428035e-05, +-1.23806388714751623682e-05, +-1.22929506006672047076e-05, +-1.21984306151204884824e-05, +-1.20971488698402506546e-05, +-1.19891790365764339750e-05, +-1.18745984529418113659e-05, +-1.17534880695398776456e-05, +-1.16259323951374368445e-05, +-1.14920194399183685165e-05, +-1.13518406568538079223e-05, +-1.12054908812311493295e-05, +-1.10530682683752438347e-05, +-1.08946742296059593923e-05, +-1.07304133664714714479e-05, +-1.05603934032992665185e-05, +-1.03847251181075779763e-05, +-1.02035222719208779302e-05, +-1.00169015365332405226e-05, +-9.82498242076738657132e-06, +-9.62788719526892533595e-06, +-9.42574081589087935042e-06, +-9.21867084571004267567e-06, +-9.00680737572287916197e-06, +-8.79028294427637022824e-06, +-8.56923245527351259271e-06, +-8.34379309521075756921e-06, +-8.11410424909460554577e-06, +-7.88030741528924488369e-06, +-7.64254611934633504094e-06, +-7.40096582686917382960e-06, +-7.15571385546351836380e-06, +-6.90693928582781290984e-06, +-6.65479287203611895166e-06, +-6.39942695106712918212e-06, +-6.14099535163319854876e-06, +-5.87965330236342373891e-06, +-5.61555733939511250274e-06, +-5.34886521342830269742e-06, +-5.07973579629795705422e-06, +-4.80832898711880610677e-06, +-4.53480561805786592893e-06, +-4.25932735978965902460e-06, +-3.98205662668941065763e-06, +-3.70315648181929639785e-06, +-3.42279054176300851270e-06, +-3.14112288136435437299e-06, +-2.85831793842106375632e-06, +-2.57454041839861196264e-06, +-2.28995519920570692832e-06, +-2.00472723609599568439e-06, +-1.71902146674648263972e-06, +-1.43300271656756140053e-06, +-1.14683560429862268911e-06, +-8.60684447942252036623e-07, +-5.74713171094427766504e-07, +-2.89085209713597664617e-07, +-3.96341939478251296110e-09, + 2.80490016808534609067e-07, + 5.64113679962953421250e-07, + 8.46747006173344896037e-07, + 1.12823037680340410583e-06, + 1.40840520793811109215e-06, + 1.68711403904242672689e-06, + 1.96420062076637285675e-06, + 2.23951000184795544334e-06, + 2.51288861506598641053e-06, + 2.78418436219555765417e-06, + 3.05324669791958273155e-06, + 3.31992671265051673821e-06, + 3.58407721421717316118e-06, + 3.84555280837218626654e-06, + 4.10420997807660228022e-06, + 4.35990716151877168199e-06, + 4.61250482882560770565e-06, + 4.86186555742507531383e-06, + 5.10785410601973079235e-06, + 5.35033748713194356707e-06, + 5.58918503818238221671e-06, + 5.82426849106429956731e-06, + 6.05546204017706400874e-06, + 6.28264240888338113098e-06, + 6.50568891435568739365e-06, + 6.72448353077756515444e-06, + 6.93891095087089373919e-06, + 7.14885864570919282062e-06, + 7.35421692279753319929e-06, + 7.55487898238148465092e-06, + 7.75074097196019129528e-06, + 7.94170203897623056888e-06, + 8.12766438165342534124e-06, + 8.30853329796486298722e-06, + 8.48421723269773222391e-06, + 8.65462782259947107971e-06, + 8.81967993958106861606e-06, + 8.97929173195711876623e-06, + 9.13338466370594821242e-06, + 9.28188355172597093559e-06, + 9.42471660107943996656e-06, + 9.56181543820204782021e-06, + 9.69311514206661032516e-06, + 9.81855427328706617540e-06, + 9.93807490115107773816e-06, + 1.00516226285705943843e-05, + 1.01591466149406832020e-05, + 1.02605995968987750983e-05, + 1.03559379069769316912e-05, + 1.04451214901417424743e-05, + 1.05281139182170699055e-05, + 1.06048824021864677416e-05, + 1.06753978023731855288e-05, + 1.07396346364968783339e-05, + 1.07975710856074994448e-05, + 1.08491889978979006982e-05, + 1.08944738903980051003e-05, + 1.09334149485546700144e-05, + 1.09660050237023010909e-05, + 1.09922406284309627094e-05, + 1.10121219298593066863e-05, + 1.10256527408215773174e-05, + 1.10328405089781558080e-05, + 1.10336963038616736523e-05, + 1.10282348018699333952e-05, + 1.10164742692203395746e-05, + 1.09984365428796701980e-05, + 1.09741470094854162102e-05, + 1.09436345822753026573e-05, + 1.09069316760433128688e-05, + 1.08640741801411637853e-05, + 1.08151014295454121441e-05, + 1.07600561740116316219e-05, + 1.06989845453377939037e-05, + 1.06319360227604537122e-05, + 1.05589633965072819227e-05, + 1.04801227295333686110e-05, + 1.03954733174649689091e-05, + 1.03050776467800735478e-05, + 1.02090013512532056038e-05, + 1.01073131666939828753e-05, + 1.00000848840093901980e-05, + 9.88739130062094606394e-06, + 9.76931017026862892453e-06, + 9.64592215123430269373e-06, + 9.51731075301832287069e-06, + 9.38356228150362642153e-06, + 9.24476578264260636546e-06, + 9.10101298470273608427e-06, + 8.95239823910756736568e-06, + 8.79901845991063759865e-06, + 8.64097306194044156673e-06, + 8.47836389765517216299e-06, + 8.31129519274676613631e-06, + 8.13987348053439576051e-06, + 7.96420753518800302127e-06, + 7.78440830382320983472e-06, + 7.60058883750940706770e-06, + 7.41286422123340111201e-06, + 7.22135150286187937354e-06, + 7.02616962114339291517e-06, + 6.82743933279976089379e-06, + 6.62528313874512338812e-06, + 6.41982520947684842004e-06, + 6.21119130968985121773e-06, + 5.99950872215320453294e-06, + 5.78490617089735561883e-06, + 5.56751374375751685266e-06, + 5.34746281431924760940e-06, + 5.12488596331278031701e-06, + 4.89991689950258687289e-06, + 4.67269038011961418454e-06, + 4.44334213087987709952e-06, + 4.21200876564441589159e-06, + 3.97882770575729567648e-06, + 3.74393709911667144121e-06, + 3.50747573902317319374e-06, + 3.26958298285330172902e-06, + 3.03039867060520659957e-06, + 2.79006304336402052000e-06, + 2.54871666173396763366e-06, + 2.30650032428370582201e-06, + 2.06355498605534895103e-06, + 1.82002167717590069487e-06, + 1.57604142162576490206e-06, + 1.33175515621080687286e-06, + 1.08730364977607694810e-06, + 8.42827422715224723608e-07, + 5.98466666817798730862e-07, + 3.54361165500383015065e-07, + 1.10650214466601145526e-07, +-1.32527457159341769654e-07, +-3.75033765181279387019e-07, +-6.16731348117982223764e-07, +-8.57483644384870604974e-07, +-1.09715496882697242401e-06, +-1.33561058856459451812e-06, +-1.57271679809768592289e-06, +-1.80834099364739390638e-06, +-2.04235174667385346287e-06, +-2.27461887654183985059e-06, +-2.50501352229047160599e-06, +-2.73340821346838846000e-06, +-2.95967693999581947631e-06, +-3.18369522101568454449e-06, +-3.40534017269651038867e-06, +-3.62449057495060442016e-06, +-3.84102693703176620771e-06, +-4.05483156197683158547e-06, +-4.26578860985994465493e-06, +-4.47378415981817885059e-06, +-4.67870627082610431870e-06, +-4.88044504117963632650e-06, +-5.07889266666103897304e-06, +-5.27394349735436316360e-06, +-5.46549409308178958515e-06, +-5.65344327743282125745e-06, +-5.83769219035584263823e-06, +-6.01814433929215356056e-06, +-6.19470564881734900520e-06, +-6.36728450877158616566e-06, +-6.53579182085452806356e-06, +-6.70014104365581900433e-06, +-6.86024823610766216613e-06, +-7.01603209933177423939e-06, +-7.16741401686316151218e-06, +-7.31431809323110943569e-06, +-7.45667119087909145226e-06, +-7.59440296540647431485e-06, +-7.72744589911581192265e-06, +-7.85573533285050310242e-06, +-7.97920949610866873263e-06, +-8.09780953542020220872e-06, +-8.21147954097478835185e-06, +-8.32016657148992507269e-06, +-8.42382067730890197923e-06, +-8.52239492171977940256e-06, +-8.61584540048746502295e-06, +-8.70413125959197291938e-06, +-8.78721471116717128705e-06, +-8.86506104763514668932e-06, +-8.93763865403249516855e-06, +-9.00491901852594998912e-06, +-9.06687674111571462719e-06, +-9.12348954052592163661e-06, +-9.17473825928260702616e-06, +-9.22060686698159047512e-06, +-9.26108246174664932824e-06, +-9.29615526988461694400e-06, +-9.32581864373973304274e-06, +-9.35006905775386307602e-06, +-9.36890610273917822759e-06, +-9.38233247837104300938e-06, +-9.39035398390946727946e-06, +-9.39297950715976480397e-06, +-9.39022101168187463889e-06, +-9.38209352226113891724e-06, +-9.36861510865258015606e-06, +-9.34980686761262702199e-06, +-9.32569290323271860845e-06, +-9.29630030559048952147e-06, +-9.26165912773481235900e-06, +-9.22180236102228707016e-06, +-9.17676590882337654416e-06, +-9.12658855861738727770e-06, +-9.07131195249644772880e-06, +-9.01098055609939421230e-06, +-8.94564162599733138977e-06, +-8.87534517555361527068e-06, +-8.80014393928162666969e-06, +-8.72009333572471611652e-06, +-8.63525142888329921994e-06, +-8.54567888821502508222e-06, +-8.45143894723457394103e-06, +-8.35259736074052112995e-06, +-8.24922236069722452712e-06, +-8.14138461080064133836e-06, +-8.02915715975743407074e-06, +-7.91261539330765898304e-06, +-7.79183698502164539547e-06, +-7.66690184590263985908e-06, +-7.53789207282747358732e-06, +-7.40489189585616646447e-06, +-7.26798762444797763775e-06, +-7.12726759261192169612e-06, +-6.98282210303029636403e-06, +-6.83474337018834747465e-06, +-6.68312546254524426573e-06, +-6.52806424378415029071e-06, +-6.36965731317252602944e-06, +-6.20800394507595081702e-06, +-6.04320502765754885186e-06, +-5.87536300080224453186e-06, +-5.70458179330339185380e-06, +-5.53096675935019674964e-06, +-5.35462461435186519118e-06, +-5.17566337014321141424e-06, +-4.99419226960263364762e-06, +-4.81032172072758387396e-06, +-4.62416323020455543279e-06, +-4.43582933651357265599e-06, +-4.24543354260686772332e-06, +-4.05309024820171368161e-06, +-3.85891468172737918331e-06, +-3.66302283196632931856e-06, +-3.46553137942988627687e-06, +-3.26655762750855510455e-06, +-3.06621943343732231445e-06, +-2.86463513911618343607e-06, +-2.66192350182618693409e-06, +-2.45820362488117562057e-06, +-2.25359488825541727446e-06, +-2.04821687922720013799e-06, +-1.84218932307831247064e-06, +-1.63563201388926604866e-06, +-1.42866474546994879804e-06, +-1.22140724246515182631e-06, +-1.01397909167432569799e-06, +-8.06499673625078029042e-07, +-5.99088094436327444290e-07, +-3.91863118017023242330e-07, +-1.84943098628889751524e-07, + 2.15540861419684426667e-08, + 2.27511101966967466315e-07, + 4.32811223880043209387e-07, + 6.37338401859019189379e-07, + 8.40977325854192905002e-07, + 1.04361349022508806704e-06, + 1.24513325755019998089e-06, + 1.44542392177450216890e-06, + 1.64437377065950114052e-06, + 1.84187214750444789869e-06, + 2.03780951209777257423e-06, + 2.23207750087511452161e-06, + 2.42456898624406490649e-06, + 2.61517813504639618351e-06, + 2.80380046612576570131e-06, + 2.99033290696995661509e-06, + 3.17467384939732300976e-06, + 3.35672320425774437633e-06, + 3.53638245511906924553e-06, + 3.71355471091059317744e-06, + 3.88814475749635763264e-06, + 4.06005910814819412596e-06, + 4.22920605290116388692e-06, + 4.39549570675089384069e-06, + 4.55884005668278723919e-06, + 4.71915300750006533998e-06, + 4.87635042643024103849e-06, + 5.03035018648692755928e-06, + 5.18107220856522701196e-06, + 5.32843850224952383525e-06, + 5.47237320531358473132e-06, + 5.61280262189333594894e-06, + 5.74965525931381193962e-06, + 5.88286186355211838841e-06, + 6.01235545332134090329e-06, + 6.13807135275468517243e-06, + 6.25994722267931996977e-06, + 6.37792309046513804878e-06, + 6.49194137843068450202e-06, + 6.60194693079779326846e-06, + 6.70788703918137587323e-06, + 6.80971146660357458814e-06, + 6.90737247002230281208e-06, + 7.00082482136491290685e-06, + 7.09002582705877526905e-06, + 7.17493534605098864026e-06, + 7.25551580631220637360e-06, + 7.33173221981546288786e-06, + 7.40355219598984530240e-06, + 7.47094595364170035832e-06, + 7.53388633134188754210e-06, + 7.59234879627670417821e-06, + 7.64631145156141268828e-06, + 7.69575504201604814413e-06, + 7.74066295840411851953e-06, + 7.78102124013589340075e-06, + 7.81681857643788967132e-06, + 7.84804630599365161535e-06, + 7.87469841505748138885e-06, + 7.89677153404848565748e-06, + 7.91426493262873480251e-06, + 7.92718051327426929855e-06, + 7.93552280334505359466e-06, + 7.93929894566308982874e-06, + 7.93851868760764620798e-06, + 7.93319436873791183408e-06, + 7.92334090695392168925e-06, + 7.90897578320756958670e-06, + 7.89011902477623500857e-06, + 7.86679318711244252764e-06, + 7.83902333428366876954e-06, + 7.80683701801724535304e-06, + 7.77026425536612447970e-06, + 7.72933750501182780370e-06, + 7.68409164222195630977e-06, + 7.63456393248006921998e-06, + 7.58079400380666152174e-06, + 7.52282381779056517397e-06, + 7.46069763935092151688e-06, + 7.39446200525034590259e-06, + 7.32416569138081104189e-06, + 7.24985967884426853560e-06, + 7.17159711885090219710e-06, + 7.08943329645732147265e-06, + 7.00342559317115033967e-06, + 6.91363344844324002262e-06, + 6.82011832007511287137e-06, + 6.72294364356627759040e-06, + 6.62217479042785679954e-06, + 6.51787902548926013278e-06, + 6.41012546322492830867e-06, + 6.29898502313035979733e-06, + 6.18453038417209923617e-06, + 6.06683593834504205765e-06, + 5.94597774336311937993e-06, + 5.82203347451249516448e-06, + 5.69508237570125013232e-06, + 5.56520520973042217313e-06, + 5.43248420782122392469e-06, + 5.29700301842786852943e-06, + 5.15884665536775968036e-06, + 5.01810144530070211867e-06, + 4.87485497458916059279e-06, + 4.72919603557198831207e-06, + 4.58121457228396545999e-06, + 4.43100162565413800605e-06, + 4.27864927821586065842e-06, + 4.12425059836174341351e-06, + 3.96789958417691884638e-06, + 3.80969110688415655311e-06, + 3.64972085393445999985e-06, + 3.48808527177698559195e-06, + 3.32488150834214283460e-06, + 3.16020735527182339492e-06, + 2.99416118993082249565e-06, + 2.82684191723347329501e-06, + 2.65834891131958394095e-06, + 2.48878195711375767025e-06, + 2.31824119180212634826e-06, + 2.14682704626095390252e-06, + 1.97464018646858031233e-06, + 1.80178145494066620423e-06, + 1.62835181221444846777e-06, + 1.45445227842166370380e-06, + 1.28018387498127474226e-06, + 1.10564756644572971662e-06, + 9.30944202533528893967e-07, + 7.56174460383558706575e-07, + 5.81438787057772137935e-07, + 4.06837342332995493781e-07, + 2.32469941807973572217e-07, + 5.84360003605464838908e-08, +-1.15165524016196481795e-07, +-2.88236185961157478515e-07, +-4.60678108053030918551e-07, +-6.32394035641693353382e-07, +-8.03287391175248576365e-07, +-9.73262327992278866677e-07, +-1.14222378354964966348e-06, +-1.31007753205661820651e-06, +-1.47673023648642007660e-06, +-1.64208949993695062100e-06, +-1.80606391631259277593e-06, +-1.96856312029973079598e-06, +-2.12949783660893906853e-06, +-2.28877992845738131554e-06, +-2.44632244526540991875e-06, +-2.60203966954189995785e-06, +-2.75584716293343213363e-06, +-2.90766181141288047594e-06, +-3.05740186958367351418e-06, +-3.20498700407640839933e-06, +-3.35033833601523650274e-06, +-3.49337848253191377853e-06, +-3.63403159730610840275e-06, +-3.77222341011111343188e-06, +-3.90788126534447433042e-06, +-4.04093415952591392912e-06, +-4.17131277773873497690e-06, +-4.29894952900307645335e-06, +-4.42377858055843327302e-06, +-4.54573589104088312044e-06, +-4.66475924253666648223e-06, +-4.78078827150107880212e-06, +-4.89376449852186315914e-06, +-5.00363135691748540988e-06, +-5.11033422015512990528e-06, +-5.21382042807596778544e-06, +-5.31403931191554123584e-06, +-5.41094221810950165016e-06, +-5.50448253087047069913e-06, +-5.59461569353127499173e-06, +-5.68129922864175650784e-06, +-5.76449275681243674909e-06, +-5.84415801429719277657e-06, +-5.92025886930820698860e-06, +-5.99276133705720719759e-06, +-6.06163359351762427620e-06, +-6.12684598790327211872e-06, +-6.18837105385967135374e-06, +-6.24618351936512419082e-06, +-6.30026031533919750782e-06, +-6.35058058295712848316e-06, +-6.39712567966953613306e-06, +-6.43987918392721429004e-06, +-6.47882689861198942782e-06, +-6.51395685317499943250e-06, +-6.54525930448471249620e-06, +-6.57272673638766514792e-06, +-6.59635385798559469776e-06, +-6.61613760063350534395e-06, +-6.63207711366379757420e-06, +-6.64417375884241211495e-06, +-6.65243110356349872368e-06, +-6.65685491279031274194e-06, +-6.65745313974966963219e-06, +-6.65423591538958656902e-06, +-6.64721553660889651050e-06, +-6.63640645326926765439e-06, +-6.62182525400028480084e-06, +-6.60349065080916732668e-06, +-6.58142346250719060277e-06, +-6.55564659696565526196e-06, +-6.52618503221475609801e-06, +-6.49306579639951552747e-06, +-6.45631794660739462695e-06, +-6.41597254658263945040e-06, +-6.37206264334415081952e-06, +-6.32462324272206488792e-06, +-6.27369128383118030161e-06, +-6.21930561249836743221e-06, +-6.16150695366234792122e-06, +-6.10033788276449535378e-06, +-6.03584279615001515287e-06, +-5.96806788049923278545e-06, +-5.89706108130940631553e-06, +-5.82287207044756658384e-06, +-5.74555221279694319542e-06, +-5.66515453201526036843e-06, +-5.58173367543274885226e-06, +-5.49534587810695348729e-06, +-5.40604892606070708310e-06, +-5.31390211872570004752e-06, +-5.21896623061564390400e-06, +-5.12130347225329365013e-06, +-5.02097745037598523939e-06, +-4.91805312744465109411e-06, +-4.81259678048159588907e-06, +-4.70467595926274513780e-06, +-4.59435944389046620792e-06, +-4.48171720177175865495e-06, +-4.36682034403174463086e-06, +-4.24974108138584086476e-06, +-4.13055267949739200956e-06, +-4.00932941385171509125e-06, +-3.88614652417032873467e-06, +-3.76108016839454787432e-06, +-3.63420737626596489757e-06, +-3.50560600253174686132e-06, +-3.37535467980288975763e-06, +-3.24353277109359282678e-06, +-3.11022032207008786392e-06, +-2.97549801303766165317e-06, +-2.83944711069247344591e-06, +-2.70214941967136185736e-06, +-2.56368723392205452038e-06, +-2.42414328792700028154e-06, +-2.28360070780758763959e-06, +-2.14214296233768618929e-06, +-1.99985381389505311643e-06, +-1.85681726937918172971e-06, +-1.71311753112369806511e-06, +-1.56883894783374962087e-06, +-1.42406596557164193617e-06, +-1.27888307882598605392e-06, +-1.13337478168536349648e-06, +-9.87625519151570836163e-07, +-8.41719638613064665786e-07, +-6.95741341511352204364e-07, +-5.49774635225687810111e-07, +-4.03903285203652358387e-07, +-2.58210767364619000791e-07, +-1.12780220802875344963e-07, + 3.23055991830684097878e-08, + 1.76964367708724778855e-07, + 3.21114236543438189078e-07, + 4.64673879946063572873e-07, + 6.07562540071123210426e-07, + 7.49700071920371749061e-07, + 8.91006987815025860095e-07, + 1.03140450136427425456e-06, + 1.17081457090602433941e-06, + 1.30915994239623084851e-06, + 1.44636419172353368897e-06, + 1.58235176642631552541e-06, + 1.71704802678972351765e-06, + 1.85037928630060069746e-06, + 1.98227285143870244472e-06, + 2.11265706078306988520e-06, + 2.24146132341246485419e-06, + 2.36861615658157347906e-06, + 2.49405322264845444755e-06, + 2.61770536524023275885e-06, + 2.73950664463357572141e-06, + 2.85939237233350266468e-06, + 2.97729914483249884479e-06, + 3.09316487653266211920e-06, + 3.20692883181446816197e-06, + 3.31853165623432036477e-06, + 3.42791540683944990220e-06, + 3.53502358157950725138e-06, + 3.63980114780429875857e-06, + 3.74219456983363037592e-06, + 3.84215183558227767505e-06, + 3.93962248223251686305e-06, + 4.03455762093816806731e-06, + 4.12690996055009787897e-06, + 4.21663383035196559137e-06, + 4.30368520179581453395e-06, + 4.38802170922777651609e-06, + 4.46960266959470585012e-06, + 4.54838910112321163730e-06, + 4.62434374096319227585e-06, + 4.69743106178853688561e-06, + 4.76761728734836138144e-06, + 4.83487040696272629773e-06, + 4.89916018895741111830e-06, + 4.96045819303296106926e-06, + 5.01873778156387963061e-06, + 5.07397412982442447456e-06, + 5.12614423513811590729e-06, + 5.17522692494871317675e-06, + 5.22120286381103742548e-06, + 5.26405455930064433061e-06, + 5.30376636684197204255e-06, + 5.34032449345513637005e-06, + 5.37371700042290210606e-06, + 5.40393380487774409700e-06, + 5.43096668031327048978e-06, + 5.45480925602115842708e-06, + 5.47545701545760188074e-06, + 5.49290729354319507956e-06, + 5.50715927290080433390e-06, + 5.51821397903640711657e-06, + 5.52607427446940615412e-06, + 5.53074485181774806004e-06, + 5.53223222584567817618e-06, + 5.53054472448127380454e-06, + 5.52569247881201016526e-06, + 5.51768741206704879188e-06, + 5.50654322759543274221e-06, + 5.49227539585013617960e-06, + 5.47490114038823605808e-06, + 5.45443942289814534188e-06, + 5.43091092726536726806e-06, + 5.40433804268870449940e-06, + 5.37474484585942960917e-06, + 5.34215708221641970028e-06, + 5.30660214629070434828e-06, + 5.26810906115345203946e-06, + 5.22670845698185819179e-06, + 5.18243254875779933987e-06, + 5.13531511311474995156e-06, + 5.08539146434873193589e-06, + 5.03269842960957088606e-06, + 4.97727432328926165021e-06, + 4.91915892062447536855e-06, + 4.85839343053077035771e-06, + 4.79502046768650205761e-06, + 4.72908402388465426040e-06, + 4.66062943867137881228e-06, + 4.58970336929019699759e-06, + 4.51635375995152054556e-06, + 4.44062981044616933641e-06, + 4.36258194412544737627e-06, + 4.28226177526485068410e-06, + 4.19972207583456497138e-06, + 4.11501674169647542961e-06, + 4.02820075825028238263e-06, + 3.93933016554731602391e-06, + 3.84846202289762216335e-06, + 3.75565437298938188386e-06, + 3.66096620554404999308e-06, + 3.56445742052937107578e-06, + 3.46618879095310788465e-06, + 3.36622192525887642755e-06, + 3.26461922935039320666e-06, + 3.16144386826273460570e-06, + 3.05675972750716587302e-06, + 2.95063137411155366322e-06, + 2.84312401738004221383e-06, + 2.73430346939548900412e-06, + 2.62423610528835733665e-06, + 2.51298882329570483720e-06, + 2.40062900463402164141e-06, + 2.28722447320975292833e-06, + 2.17284345519123839340e-06, + 2.05755453846596430753e-06, + 1.94142663200690945903e-06, + 1.82452892517181498007e-06, + 1.70693084695912356741e-06, + 1.58870202524435859482e-06, + 1.46991224602059460634e-06, + 1.35063141266662197534e-06, + 1.23092950526634752769e-06, + 1.11087654000282617921e-06, + 9.90542528650260827215e-07, + 8.69997438187136635693e-07, + 7.49311150553558232788e-07, + 6.28553422575956171735e-07, + 5.07793846080199777306e-07, + 3.87101808219950752071e-07, + 2.66546452036637359768e-07, + 1.46196637279211919523e-07, + 2.61209014996513097622e-08, +-9.36125785480710641559e-08, +-2.12936025188332329408e-07, +-3.31782097760571907408e-07, +-4.50083930191668236211e-07, +-5.67775168183275709294e-07, +-6.84790005993688176635e-07, +-8.01063222793833814618e-07, +-9.16530218579230311038e-07, +-1.03112704961422672079e-06, +-1.14479046339492176093e-06, +-1.25745793310772014899e-06, +-1.36906769156673085052e-06, +-1.47955876461155409369e-06, +-1.58887100394770566988e-06, +-1.69694511941227368702e-06, +-1.80372271064780189541e-06, +-1.90914629816775581196e-06, +-2.01315935379763895325e-06, +-2.11570633047440601331e-06, +-2.21673269139235624129e-06, +-2.31618493847693730396e-06, +-2.41401064017204397923e-06, +-2.51015845853012064279e-06, +-2.60457817558802397410e-06, +-2.69722071901685094830e-06, +-2.78803818703287373008e-06, +-2.87698387255719700099e-06, +-2.96401228661247619401e-06, +-3.04907918094525491427e-06, +-3.13214156986324088414e-06, +-3.21315775127703456810e-06, +-3.29208732693637732224e-06, +-3.36889122185290401895e-06, +-3.44353170289642487268e-06, +-3.51597239656325077098e-06, +-3.58617830590191733468e-06, +-3.65411582659302460743e-06, +-3.71975276217506551713e-06, +-3.78305833841012117849e-06, +-3.84400321678365093078e-06, +-3.90255950713312254181e-06, +-3.95870077940074512301e-06, +-4.01240207450610770714e-06, +-4.06363991433488812364e-06, +-4.11239231084125285599e-06, +-4.15863877425935865654e-06, +-4.20236032042448446743e-06, +-4.24353947720017342875e-06, +-4.28216029001119185047e-06, +-4.31820832648155806497e-06, +-4.35167068017766995946e-06, +-4.38253597345699451516e-06, +-4.41079435942349164690e-06, +-4.43643752299069560910e-06, +-4.45945868105587513408e-06, +-4.47985258178600159821e-06, +-4.49761550302029909350e-06, +-4.51274524979143300062e-06, +-4.52524115097084023650e-06, +-4.53510405504175193850e-06, +-4.54233632500539397060e-06, +-4.54694183242584894293e-06, +-4.54892595061959283142e-06, +-4.54829554699628510261e-06, +-4.54505897455774022598e-06, +-4.53922606256257512138e-06, +-4.53080810636444806448e-06, +-4.51981785643228738179e-06, +-4.50626950656128519675e-06, +-4.49017868128402610519e-06, +-4.47156242249136545128e-06, +-4.45043917527324955132e-06, +-4.42682877299008102390e-06, +-4.40075242158549665903e-06, +-4.37223268315208425070e-06, +-4.34129345876175116439e-06, +-4.30795997057291989114e-06, +-4.27225874322715952063e-06, +-4.23421758454818478526e-06, +-4.19386556555651685739e-06, +-4.15123299981356679695e-06, +-4.10635142210863573125e-06, +-4.05925356650451797034e-06, +-4.00997334375461245165e-06, +-3.95854581810788347368e-06, +-3.90500718351647261954e-06, +-3.84939473926163028560e-06, +-3.79174686501394100978e-06, +-3.73210299534384178129e-06, +-3.67050359369971365087e-06, +-3.60699012586834896589e-06, +-3.54160503293725947090e-06, +-3.47439170377438781006e-06, +-3.40539444704242567051e-06, +-3.33465846276757226665e-06, +-3.26222981347759901722e-06, +-3.18815539492950643052e-06, +-3.11248290644416109035e-06, +-3.03526082086643820009e-06, +-2.95653835416947222251e-06, +-2.87636543472176765438e-06, +-2.79479267223601303066e-06, +-2.71187132641859964837e-06, +-2.62765327533899515464e-06, +-2.54219098353815390706e-06, +-2.45553746989530186833e-06, +-2.36774627527249690158e-06, +-2.27887142995641191922e-06, +-2.18896742091688744107e-06, +-2.09808915890182256402e-06, +-2.00629194538800892082e-06, +-1.91363143940754862785e-06, +-1.82016362426948875164e-06, +-1.72594477419635162234e-06, +-1.63103142089514905451e-06, +-1.53548032008255493308e-06, +-1.43934841798375985031e-06, +-1.34269281782482158857e-06, +-1.24557074633660619018e-06, +-1.14803952029313359972e-06, +-1.05015651309915032019e-06, +-9.51979121449571438300e-07, +-8.53564732078559276071e-07, +-7.54970688617303580583e-07, +-6.56254258580785667422e-07, +-5.57472600498841932364e-07, +-4.58682731214803567250e-07, +-3.59941493366721268602e-07, +-2.61305523070885236846e-07, +-1.62831217825798099669e-07, +-6.45747046531622918148e-08, + 3.34081915028460607542e-08, + 1.31061979105115269233e-07, + 2.28331531061093047517e-07, + 3.25162115452506418290e-07, + 4.21499425940175324931e-07, + 5.17289611827256223732e-07, + 6.12479307764515172907e-07, + 7.07015663081470306902e-07, + 8.00846370727535963142e-07, + 8.93919695807548723643e-07, + 9.86184503696360592316e-07, + 1.07759028771747680805e-06, + 1.16808719637099324993e-06, + 1.25762606009643313325e-06, + 1.34615841755636422783e-06, + 1.43363654142701431353e-06, + 1.52001346368244521319e-06, + 1.60524300035914707475e-06, + 1.68927977578831839769e-06, + 1.77207924628335479643e-06, + 1.85359772327053896192e-06, + 1.93379239585117203927e-06, + 2.01262135278386203690e-06, + 2.09004360387575857427e-06, + 2.16601910077334100819e-06, + 2.24050875713967010219e-06, + 2.31347446821209968128e-06, + 2.38487912972836386475e-06, + 2.45468665621208123303e-06, + 2.52286199861151334042e-06, + 2.58937116127982583862e-06, + 2.65418121829169547439e-06, + 2.71726032908779813765e-06, + 2.77857775344037205028e-06, + 2.83810386573328862561e-06, + 2.89581016855032907358e-06, + 2.95166930556685687487e-06, + 3.00565507373729543829e-06, + 3.05774243477661226693e-06, + 3.10790752592901346437e-06, + 3.15612767002082679062e-06, + 3.20238138479374552623e-06, + 3.24664839151536307337e-06, + 3.28890962286420223838e-06, + 3.32914723008697677049e-06, + 3.36734458942622126102e-06, + 3.40348630781685071737e-06, + 3.43755822785064014868e-06, + 3.46954743200808672055e-06, + 3.49944224615744907365e-06, + 3.52723224232133607687e-06, + 3.55290824071145572597e-06, + 3.57646231103275916171e-06, + 3.59788777305844983311e-06, + 3.61717919647792329573e-06, + 3.63433240001992844556e-06, + 3.64934444985388431064e-06, + 3.66221365727246736405e-06, + 3.67293957565916496310e-06, + 3.68152299674478401627e-06, + 3.68796594615754264255e-06, + 3.69227167827109476069e-06, + 3.69444467035641090999e-06, + 3.69449061604251067923e-06, + 3.69241641809255407447e-06, + 3.68823018050121809172e-06, + 3.68194119992049474706e-06, + 3.67355995642082701168e-06, + 3.66309810359520425440e-06, + 3.65056845801397982505e-06, + 3.63598498803867909083e-06, + 3.61936280200335549955e-06, + 3.60071813577239656246e-06, + 3.58006833968386969076e-06, + 3.55743186488838466342e-06, + 3.53282824909282608752e-06, + 3.50627810171953317514e-06, + 3.47780308849131654283e-06, + 3.44742591545312398587e-06, + 3.41517031244148100487e-06, + 3.38106101601311265410e-06, + 3.34512375184437054455e-06, + 3.30738521661340731931e-06, + 3.26787305937770838069e-06, + 3.22661586245842979003e-06, + 3.18364312184520498148e-06, + 3.13898522713461071050e-06, + 3.09267344101413714559e-06, + 3.04473987830630518563e-06, + 2.99521748458606001315e-06, + 2.94414001438530427212e-06, + 2.89154200899865406331e-06, + 2.83745877390457421898e-06, + 2.78192635581631105178e-06, + 2.72498151937718603862e-06, + 2.66666172351495323772e-06, + 2.60700509747023960325e-06, + 2.54605041651313995614e-06, + 2.48383707736592921508e-06, + 2.42040507334248784649e-06, + 2.35579496922448726218e-06, + 2.29004787588705505843e-06, + 2.22320542469039954603e-06, + 2.15530974165298533032e-06, + 2.08640342142196774357e-06, + 2.01652950105673072815e-06, + 1.94573143364140580303e-06, + 1.87405306174228235695e-06, + 1.80153859072609659169e-06, + 1.72823256195534356335e-06, + 1.65417982587563572154e-06, + 1.57942551501363361584e-06, + 1.50401501689824875799e-06, + 1.42799394692362609795e-06, + 1.35140812116891807883e-06, + 1.27430352919099175392e-06, + 1.19672630680600165567e-06, + 1.11872270887555548908e-06, + 1.04033908211438514454e-06, + 9.61621837932593595614e-07, + 8.82617425331797973857e-07, + 8.03372303868260350135e-07, + 7.23932916698523442543e-07, + 6.44345663725568065214e-07, + 5.64656874857124303848e-07, + 4.84912783394116915736e-07, + 4.05159499563223062539e-07, + 3.25442984208674460614e-07, + 2.45809022658112731786e-07, + 1.66303198777160306628e-07, + 8.69708692272027903669e-08, + 7.85713794072117322522e-09, +-7.09931691716676215865e-08, +-1.49535529268482347680e-07, +-2.27725747365171486868e-07, +-3.05519980848837318375e-07, +-3.82874763706501346521e-07, +-4.59747030453731194650e-07, +-5.36094139750675601478e-07, +-6.11873897692766847291e-07, +-6.87044580763594041777e-07, +-7.61564958437679165913e-07, +-8.35394315421141605512e-07, +-9.08492473518483241836e-07, +-9.80819813113976304058e-07, +-1.05233729425625164956e-06, +-1.12300647733612530584e-06, +-1.19278954334437999738e-06, +-1.26164931370253481165e-06, +-1.32954926965386881663e-06, +-1.39645357120588546386e-06, +-1.46232707561449405058e-06, +-1.52713535540064995902e-06, +-1.59084471589067184708e-06, +-1.65342221227063001310e-06, +-1.71483566614886781052e-06, +-1.77505368161545113680e-06, +-1.83404566079325564072e-06, +-1.89178181887221348355e-06, +-1.94823319862069280282e-06, +-2.00337168436514229084e-06, +-2.05717001543450264187e-06, +-2.10960179906117775394e-06, +-2.16064152273371070425e-06, +-2.21026456599565581941e-06, +-2.25844721168562965249e-06, +-2.30516665661384152826e-06, +-2.35040102167078548251e-06, +-2.39412936136406383631e-06, +-2.43633167277975945574e-06, +-2.47698890396499016471e-06, +-2.51608296172876497540e-06, +-2.55359671885850362846e-06, +-2.58951402074998920553e-06, +-2.62381969144887382413e-06, +-2.65649953910217082780e-06, +-2.68754036081854804860e-06, +-2.71692994693660306132e-06, +-2.74465708470059315127e-06, +-2.77071156134348277634e-06, +-2.79508416657755373943e-06, +-2.81776669449305452715e-06, +-2.83875194486578497579e-06, +-2.85803372387518624004e-06, +-2.87560684423360267943e-06, +-2.89146712472987382482e-06, +-2.90561138918856466730e-06, +-2.91803746484780862573e-06, +-2.92874418015865453993e-06, +-2.93773136200894074995e-06, +-2.94499983237584587605e-06, +-2.95055140441023676853e-06, +-2.95438887795761926909e-06, +-2.95651603451999344031e-06, +-2.95693763166347438543e-06, +-2.95565939687693110985e-06, +-2.95268802088687215850e-06, +-2.94803115043462330338e-06, +-2.94169738052167357241e-06, +-2.93369624612953431959e-06, +-2.92403821342084482528e-06, +-2.91273467042851974806e-06, +-2.89979791724021359437e-06, +-2.88524115568552475564e-06, +-2.86907847853367548813e-06, +-2.85132485820962740443e-06, +-2.83199613503694229294e-06, +-2.81110900501579379722e-06, +-2.78868100714493697984e-06, +-2.76473051029656053377e-06, +-2.73927669965326065288e-06, +-2.71233956271653185119e-06, +-2.68393987489646478775e-06, +-2.65409918469246439721e-06, +-2.62283979847510613493e-06, +-2.59018476487935021233e-06, +-2.55615785881960940799e-06, +-2.52078356513729817673e-06, +-2.48408706189168983184e-06, +-2.44609420330517115589e-06, +-2.40683150237354884389e-06, +-2.36632611315396292482e-06, +-2.32460581274025857810e-06, +-2.28169898293852692147e-06, +-2.23763459165468254892e-06, +-2.19244217400458949748e-06, +-2.14615181316064773556e-06, +-2.09879412094551363500e-06, +-2.05040021818578316432e-06, +-2.00100171483782110160e-06, +-1.95063068989816435785e-06, +-1.89931967111113481318e-06, +-1.84710161448549238660e-06, +-1.79400988363453340540e-06, +-1.74007822895002694472e-06, +-1.68534076662445773069e-06, +-1.62983195753369262521e-06, +-1.57358658599301992021e-06, +-1.51663973839943020132e-06, +-1.45902678177302702247e-06, +-1.40078334221047426768e-06, +-1.34194528326338093541e-06, +-1.28254868425455118572e-06, +-1.22262981854484770803e-06, +-1.16222513176453179750e-06, +-1.10137122001903489497e-06, +-1.04010480808683832089e-06, +-9.78462727617415689625e-07, +-9.16481895344879420621e-07, +-8.54199291329082445989e-07, +-7.91651937236919995967e-07, +-7.28876874676428218509e-07, +-6.65911143596146899220e-07, +-6.02791760762178925358e-07, +-5.39555698325257482511e-07, +-4.76239862490052774988e-07, +-4.12881072298987595103e-07, +-3.49516038541690854304e-07, +-2.86181342804064272744e-07, +-2.22913416666661733927e-07, +-1.59748521064022687018e-07, +-9.67227258185584328684e-08, +-3.38718893582766938970e-08, + 2.87683613695412570172e-08, + 9.11626507777930940099e-08, + 1.53275874301229528026e-07, + 2.15073217829609376242e-07, + 2.76520176901766833620e-07, + 3.37582575650052953442e-07, + 3.98226585485819280378e-07, + 4.58418743513730979390e-07, + 5.18125970668006750755e-07, + 5.77315589558766536398e-07, + 6.35955342019936643428e-07, + 6.94013406349350241498e-07, + 7.51458414232049067549e-07, + 8.08259467337988365555e-07, + 8.64386153585596963575e-07, + 9.19808563062980821321e-07, + 9.74497303597860849836e-07, + 1.02842351597027310336e-06, + 1.08155888875847427063e-06, + 1.13387567281072351305e-06, + 1.18534669533762647095e-06, + 1.23594537361629275206e-06, + 1.28564572830046089292e-06, + 1.33442239633006842733e-06, + 1.38225064343414957853e-06, + 1.42910637622117390762e-06, + 1.47496615385122660710e-06, + 1.51980719928470874307e-06, + 1.56360741010246000211e-06, + 1.60634536889251227715e-06, + 1.64800035319896004223e-06, + 1.68855234502865835288e-06, + 1.72798203991181336901e-06, + 1.76627085551270775016e-06, + 1.80340093978719079100e-06, + 1.83935517868373362992e-06, + 1.87411720338522404077e-06, + 1.90767139708889131071e-06, + 1.94000290132205409853e-06, + 1.97109762179168084047e-06, + 2.00094223376600235736e-06, + 2.02952418698673586018e-06, + 2.05683171011063731075e-06, + 2.08285381467995650348e-06, + 2.10758029862004405122e-06, + 2.13100174926526816907e-06, + 2.15310954591206726866e-06, + 2.17389586189977999014e-06, + 2.19335366621972616361e-06, + 2.21147672465324978376e-06, + 2.22825960043981455305e-06, + 2.24369765447650766928e-06, + 2.25778704505024781826e-06, + 2.27052472710528124541e-06, + 2.28190845104710389511e-06, + 2.29193676108612702237e-06, + 2.30060899312292095007e-06, + 2.30792527217872156528e-06, + 2.31388650937382493307e-06, + 2.31849439845752497517e-06, + 2.32175141189321189097e-06, + 2.32366079650259840000e-06, + 2.32422656867321367902e-06, + 2.32345350913359285878e-06, + 2.32134715730082542021e-06, + 2.31791380520532445909e-06, + 2.31316049099797609704e-06, + 2.30709499204498586449e-06, + 2.29972581761599807363e-06, + 2.29106220117129925082e-06, + 2.28111409225408822216e-06, + 2.26989214799404362660e-06, + 2.25740772422860767231e-06, + 2.24367286624860951035e-06, + 2.22870029917506208745e-06, + 2.21250341797413235839e-06, + 2.19509627711749353150e-06, + 2.17649357989546114511e-06, + 2.15671066739044013289e-06, + 2.13576350711850353347e-06, + 2.11366868134673037600e-06, + 2.09044337509497678252e-06, + 2.06610536382953460056e-06, + 2.04067300085759004675e-06, + 2.01416520443082648289e-06, + 1.98660144456682630719e-06, + 1.95800172959701842290e-06, + 1.92838659245047678824e-06, + 1.89777707668168250577e-06, + 1.86619472225263513379e-06, + 1.83366155107768614062e-06, + 1.80020005234090271963e-06, + 1.76583316759495554916e-06, + 1.73058427565218490126e-06, + 1.69447717727606724807e-06, + 1.65753607968390744685e-06, + 1.61978558087014416989e-06, + 1.58125065376022968674e-06, + 1.54195663020503578884e-06, + 1.50192918482580689152e-06, + 1.46119431871970167741e-06, + 1.41977834303604934816e-06, + 1.37770786243346328062e-06, + 1.33500975842797161234e-06, + 1.29171117264239797330e-06, + 1.24783948996719974604e-06, + 1.20342232164300215316e-06, + 1.15848748827509167059e-06, + 1.11306300279010028919e-06, + 1.06717705334514073476e-06, + 1.02085798619962035772e-06, + 9.74134288559960768089e-07, + 9.27034571407410057516e-07, + 8.79587552319131062115e-07, + 8.31822038292692897728e-07, + 7.83766908584062082816e-07, + 7.35451097569259232492e-07, + 6.86903577639007368221e-07, + 6.38153342137989641187e-07, + 5.89229388356360835835e-07, + 5.40160700585000643775e-07, + 4.90976233243457187642e-07, + 4.41704894091038422500e-07, + 3.92375527528903780770e-07, + 3.43016898004928283419e-07, + 2.93657673529008577219e-07, + 2.44326409308779522962e-07, + 1.95051531514807551777e-07, + 1.45861321184445247206e-07, + 9.67838982725986303713e-08, + 4.78472058599844523217e-08, +-9.21005474744702503668e-10, +-4.94931931086882342167e-08, +-9.78420376464564573501e-08, +-1.45940458001584575920e-07, +-1.93761626279445676683e-07, +-2.41278982453654766505e-07, +-2.88466248828108414775e-07, +-3.35297444276962340684e-07, +-3.81746898255006320598e-07, +-4.27789264571066302430e-07, +-4.73399534917222114972e-07, +-5.18553052146814792709e-07, +-5.63225523294378261140e-07, +-6.07393032330819015965e-07, +-6.51032052647343771201e-07, +-6.94119459261828810033e-07, +-7.36632540741495661135e-07, +-7.78549010835974351873e-07, +-8.19847019815002990540e-07, +-8.60505165505228740834e-07, +-9.00502504020766893004e-07, +-9.39818560182277438796e-07, +-9.78433337620207624330e-07, +-1.01632732855600549368e-06, +-1.05348152325874204263e-06, +-1.08987741917143933322e-06, +-1.12549702970306422209e-06, +-1.16032289268355194760e-06, +-1.19433807847637408471e-06, +-1.22752619774656060195e-06, +-1.25987140888039317136e-06, +-1.29135842505383920910e-06, +-1.32197252094692572073e-06, +-1.35169953910148305289e-06, +-1.38052589591981443812e-06, +-1.40843858730261145449e-06, +-1.43542519392307942238e-06, +-1.46147388613708025001e-06, +-1.48657342852669403075e-06, +-1.51071318407641715728e-06, +-1.53388311798088013959e-06, +-1.55607380108330755062e-06, +-1.57727641294412167073e-06, +-1.59748274453934551225e-06, +-1.61668520058867329841e-06, +-1.63487680151331660552e-06, +-1.65205118502362447400e-06, +-1.66820260733800235944e-06, +-1.68332594403215350657e-06, +-1.69741669052133461662e-06, +-1.71047096217573973425e-06, +-1.72248549407075639464e-06, +-1.73345764037363372509e-06, +-1.74338537336835821088e-06, +-1.75226728212076132235e-06, +-1.76010257078606954751e-06, +-1.76689105656130685063e-06, +-1.77263316728519251133e-06, +-1.77732993868832065915e-06, +-1.78098301129675234904e-06, +-1.78359462699196298197e-06, +-1.78516762523086079262e-06, +-1.78570543892935940332e-06, +-1.78521209001314350987e-06, +-1.78369218463975973750e-06, +-1.78115090809610287207e-06, +-1.77759401937562411090e-06, +-1.77302784543973451412e-06, +-1.76745927516809092517e-06, +-1.76089575300256703723e-06, +-1.75334527228990434716e-06, +-1.74481636832821328595e-06, +-1.73531811112254267233e-06, +-1.72486009785515407010e-06, +-1.71345244507588775535e-06, +-1.70110578061850780769e-06, +-1.68783123524888313502e-06, +-1.67364043405101201273e-06, +-1.65854548755706267844e-06, +-1.64255898262770882562e-06, +-1.62569397308913031908e-06, +-1.60796397013341495032e-06, +-1.58938293248850158598e-06, +-1.56996525636511224694e-06, +-1.54972576518680987152e-06, +-1.52867969911091771475e-06, +-1.50684270434656038082e-06, +-1.48423082227753830000e-06, +-1.46086047839705183582e-06, +-1.43674847106163933866e-06, +-1.41191196007170637922e-06, +-1.38636845508614875617e-06, +-1.36013580387858669546e-06, +-1.33323218044282189100e-06, +-1.30567607295518684662e-06, +-1.27748627160150214245e-06, +-1.24868185627640912946e-06, +-1.21928218416289764874e-06, +-1.18930687719987378282e-06, +-1.15877580944566389195e-06, +-1.12770909434537172875e-06, +-1.09612707191003274157e-06, +-1.06405029581553169958e-06, +-1.03149952042926247822e-06, +-9.98495687772529807701e-07, +-9.65059914426676481838e-07, +-9.31213478390952664649e-07, +-8.96977805900184483883e-07, +-8.62374458209779445916e-07, +-8.27425118357190793336e-07, +-7.92151577906262162004e-07, +-7.56575723683538659993e-07, +-7.20719524513991164460e-07, +-6.84605017964106205270e-07, +-6.48254297100182736997e-07, +-6.11689497269627655389e-07, +-5.74932782912928941364e-07, +-5.38006334414506664360e-07, +-5.00932334998829214645e-07, +-4.63732957681074963406e-07, +-4.26430352278680451037e-07, +-3.89046632491231587593e-07, +-3.51603863057291967577e-07, +-3.14124046993758822385e-07, +-2.76629112926271202933e-07, +-2.39140902517306048575e-07, +-2.01681157999109538668e-07, +-1.64271509818435231461e-07, +-1.26933464399964462611e-07, +-8.96883920351864315859e-08, +-5.25575149034115698627e-08, +-1.55618952314867990895e-08, + 2.12775764013299585065e-08, + 5.79401926069906488081e-08, + 9.44054405745448819568e-08, + 1.30653013292186337421e-07, + 1.66662820599558795692e-07, + 2.02415000063943526019e-07, + 2.37889927675723810546e-07, + 2.73068228356823773127e-07, + 3.07930786275391611075e-07, + 3.42458754964303537689e-07, + 3.76633567235821728614e-07, + 4.10436944888391124100e-07, + 4.43850908200505621429e-07, + 4.76857785206895217304e-07, + 5.09440220752432540740e-07, + 5.41581185319310635908e-07, + 5.73263983623200237778e-07, + 6.04472262974243596559e-07, + 6.35190021398912689916e-07, + 6.65401615518975020092e-07, + 6.95091768183470321082e-07, + 7.24245575851318119156e-07, + 7.52848515719723294374e-07, + 7.80886452596346764020e-07, + 8.08345645511779781934e-07, + 8.35212754069576196438e-07, + 8.61474844531168266227e-07, + 8.87119395633187721666e-07, + 9.12134304134851931249e-07, + 9.36507890093278214952e-07, + 9.60228901864740647514e-07, + 9.83286520829949339681e-07, + 1.00567036584242141413e-06, + 1.02737049739676264377e-06, + 1.04837742151761943520e-06, + 1.06868209336723852610e-06, + 1.08827592057027628516e-06, + 1.10715076625582966250e-06, + 1.12529895181575091329e-06, + 1.14271325937887085896e-06, + 1.15938693400089711674e-06, + 1.17531368556989454737e-06, + 1.19048769042744956491e-06, + 1.20490359270577919489e-06, + 1.21855650538120670311e-06, + 1.23144201104462276445e-06, + 1.24355616238968221938e-06, + 1.25489548241968085992e-06, + 1.26545696437420174112e-06, + 1.27523807137680262633e-06, + 1.28423673580516101703e-06, + 1.29245135838526580120e-06, + 1.29988080701139087871e-06, + 1.30652441529377014066e-06, + 1.31238198083599927004e-06, + 1.31745376324439163689e-06, + 1.32174048187173134272e-06, + 1.32524331329766233412e-06, + 1.32796388854876269223e-06, + 1.32990429006080199844e-06, + 1.33106704838625078829e-06, + 1.33145513865011407038e-06, + 1.33107197675730615317e-06, + 1.32992141535492971224e-06, + 1.32800773955295289713e-06, + 1.32533566240690744947e-06, + 1.32191032016635722368e-06, + 1.31773726729301165080e-06, + 1.31282247125248552902e-06, + 1.30717230708382066220e-06, + 1.30079355175099455860e-06, + 1.29369337828076866856e-06, + 1.28587934969133494247e-06, + 1.27735941271630673508e-06, + 1.26814189132872078392e-06, + 1.25823548006989592576e-06, + 1.24764923718779050332e-06, + 1.23639257759010710187e-06, + 1.22447526561697376243e-06, + 1.21190740763842257076e-06, + 1.19869944448191002670e-06, + 1.18486214369488304102e-06, + 1.17040659164850020835e-06, + 1.15534418548697581979e-06, + 1.13968662492878543633e-06, + 1.12344590392501977927e-06, + 1.10663430218058598693e-06, + 1.08926437654394660522e-06, + 1.07134895227114512445e-06, + 1.05290111416989715657e-06, + 1.03393419762981751439e-06, + 1.01446177954410255975e-06, + 9.94497669129371662775e-07, + 9.74055898649058925340e-07, + 9.53150714046586472362e-07, + 9.31796565494312280840e-07, + 9.10008097864302267693e-07, + 8.87800141127001133190e-07, + 8.65187700683895514984e-07, + 8.42185947640272748656e-07, + 8.18810209024182236434e-07, + 7.95075957957726542799e-07, + 7.70998803786799171281e-07, + 7.46594482175384812077e-07, + 7.21878845170593542560e-07, + 6.96867851244202251346e-07, + 6.71577555317616239466e-07, + 6.46024098775229858276e-07, + 6.20223699473059009471e-07, + 5.94192641748351015229e-07, + 5.67947266436226132378e-07, + 5.41503960899324198661e-07, + 5.14879149076390935720e-07, + 4.88089281555710163631e-07, + 4.61150825679230424805e-07, + 4.34080255683209686411e-07, + 4.06894042881135298369e-07, + 3.79608645894640438035e-07, + 3.52240500938070933540e-07, + 3.24806012162310247429e-07, + 2.97321542063398880870e-07, + 2.69803401961428131034e-07, + 2.42267842555118836346e-07, + 2.14731044557422131870e-07, + 1.87209109417413194962e-07, + 1.59718050133666455064e-07, + 1.32273782164225461408e-07, + 1.04892114438199221113e-07, + 7.75887404739308462697e-08, + 5.03792296086632588358e-08, + 2.32790183440865896232e-08, +-3.69659818658931578941e-09, +-3.05324746267394544896e-08, +-5.72136236741530471848e-08, +-8.37252242245850243792e-08, +-1.10052629376678321428e-07, +-1.36181374294073481367e-07, +-1.62097183920627326452e-07, +-1.87785980544769814165e-07, +-2.13233891209139598521e-07, +-2.38427254961746979659e-07, +-2.63352629945029146904e-07, +-2.87996800319276546365e-07, +-3.12346783017024135980e-07, +-3.36389834325182185351e-07, +-3.60113456291384048568e-07, +-3.83505402952390790727e-07, +-4.06553686380447893525e-07, +-4.29246582545680592520e-07, +-4.51572636991498591533e-07, +-4.73520670320518712649e-07, +-4.95079783488583814637e-07, +-5.16239362904583738092e-07, +-5.36989085333807117288e-07, +-5.57318922603415019422e-07, +-5.77219146106557435187e-07, +-5.96680331105458410703e-07, +-6.15693360830245960493e-07, +-6.34249430372643094367e-07, +-6.52340050373084766760e-07, +-6.69957050499727724785e-07, +-6.87092582718938420602e-07, +-7.03739124355339611445e-07, +-7.19889480941261699077e-07, +-7.35536788854606509566e-07, +-7.50674517744575483077e-07, +-7.65296472744807734602e-07, +-7.79396796473609713033e-07, +-7.92969970821073911788e-07, +-8.06010818523039620686e-07, +-8.18514504521946435161e-07, +-8.30476537114796092696e-07, +-8.41892768888536356313e-07, +-8.52759397443332283837e-07, +-8.63072965904298430121e-07, +-8.72830363222411219091e-07, +-8.82028824265426919197e-07, +-8.90665929699767875244e-07, +-8.98739605664438117104e-07, +-9.06248123238310469019e-07, +-9.13190097701748130089e-07, +-9.19564487594497149126e-07, +-9.25370593571038710503e-07, +-9.30608057055225739965e-07, +-9.35276858695977623270e-07, +-9.39377316625935791305e-07, +-9.42910084525095898317e-07, +-9.45876149491550481034e-07, +-9.48276829721570430580e-07, +-9.50113772001370499672e-07, +-9.51388949013003911569e-07, +-9.52104656456936804630e-07, +-9.52263509993941125969e-07, +-9.51868442009069101583e-07, +-9.50922698200532126112e-07, +-9.49429833996434605628e-07, +-9.47393710802382531800e-07, +-9.44818492083089586131e-07, +-9.41708639281177158997e-07, +-9.38068907576461653450e-07, +-9.33904341489098676729e-07, +-9.29220270330045943147e-07, +-9.24022303502344510841e-07, +-9.18316325656801089995e-07, +-9.12108491705894399878e-07, +-9.05405221699414408662e-07, +-8.98213195565829804566e-07, +-8.90539347723179252958e-07, +-8.82390861563444624379e-07, +-8.73775163814392542299e-07, +-8.64699918782943232475e-07, +-8.55173022484167478071e-07, +-8.45202596660064471297e-07, +-8.34796982692334232859e-07, +-8.23964735413379340429e-07, +-8.12714616819815811869e-07, +-8.01055589692947371830e-07, +-7.88996811130245460602e-07, +-7.76547625992668790471e-07, +-7.63717560271924312522e-07, +-7.50516314382267606353e-07, +-7.36953756381291203872e-07, +-7.23039915124214685738e-07, +-7.08784973356202141615e-07, +-6.94199260747239361661e-07, +-6.79293246874135843310e-07, +-6.64077534154205262483e-07, +-6.48562850735273878957e-07, +-6.32760043346189360169e-07, +-6.16680070113397994562e-07, +-6.00333993346826913225e-07, +-5.83732972300828602773e-07, +-5.66888255913847209443e-07, +-5.49811175532121660261e-07, +-5.32513137621453772346e-07, +-5.15005616471779758539e-07, +-4.97300146899023921939e-07, +-4.79408316948729425562e-07, +-4.61341760605933600647e-07, +-4.43112150515734081304e-07, +-4.24731190718963677602e-07, +-4.06210609407354576801e-07, +-3.87562151702548692569e-07, +-3.68797572463265930466e-07, +-3.49928629124907727258e-07, +-3.30967074575835952180e-07, +-3.11924650074512148172e-07, +-2.92813078211650909737e-07, +-2.73644055921480525304e-07, +-2.54429247546160283934e-07, +-2.35180277957349847825e-07, +-2.15908725738868123295e-07, +-1.96626116434371227810e-07, +-1.77343915863602168094e-07, +-1.58073523511642661593e-07, +-1.38826265993976471359e-07, +-1.19613390601659479034e-07, +-1.00446058929897965640e-07, +-8.13353405935726935918e-08, +-6.22922070331324441674e-08, +-4.33275254142092293362e-08, +-2.44520526242285169324e-08, + 0 /* Need a final zero coefficient */ + diff --git a/libk3b/plugin/libsamplerate/mid_qual_coeffs.h b/libk3b/plugin/libsamplerate/mid_qual_coeffs.h new file mode 100644 index 0000000..7bf47df --- /dev/null +++ b/libk3b/plugin/libsamplerate/mid_qual_coeffs.h @@ -0,0 +1,5315 @@ +/* +** Copyright (C) 2002,2003 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** 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, write to the Free Software +** Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + + +/* +** f = make_filter (19, 128, 100.2) ; +** Pass band width : 0.0039063 (should be 0.0039062) +** Stop band atten. : 100.35 dB +** -3dB band width : 0.665 +** half length : 5285 +** increment : 128 +*/ + + 9.20381425342432724079e-01, + 9.20302993473144703707e-01, + 9.20067721990720843728e-01, + 9.19675683262634269255e-01, + 9.19126997871811179941e-01, + 9.18421834572361261984e-01, + 9.17560410227629907887e-01, + 9.16542989730570578644e-01, + 9.15369885906517022356e-01, + 9.14041459398341027409e-01, + 9.12558118534084750095e-01, + 9.10920319177104365060e-01, + 9.09128564558774221460e-01, + 9.07183405093831884969e-01, + 9.05085438178449441793e-01, + 9.02835307971073142141e-01, + 9.00433705156164609917e-01, + 8.97881366690907456451e-01, + 8.95179075534992096941e-01, + 8.92327660363587904513e-01, + 8.89327995263616055688e-01, + 8.86180999413433867495e-01, + 8.82887636746086057471e-01, + 8.79448915596223401714e-01, + 8.75865888330860098421e-01, + 8.72139650964099621966e-01, + 8.68271342755988384532e-01, + 8.64262145795659297853e-01, + 8.60113284568922442652e-01, + 8.55826025510500576488e-01, + 8.51401676541053253899e-01, + 8.46841586589208494829e-01, + 8.42147145098761318316e-01, + 8.37319781521271289115e-01, + 8.32360964794223279206e-01, + 8.27272202804994805092e-01, + 8.22055041840814237908e-01, + 8.16711066024966680921e-01, + 8.11241896739414047879e-01, + 8.05649192034131989004e-01, + 7.99934646023336304310e-01, + 7.94099988268876399999e-01, + 7.88146983151028934778e-01, + 7.82077429226948894758e-01, + 7.75893158577014574462e-01, + 7.69596036139359007677e-01, + 7.63187959032822549332e-01, + 7.56670855868614267159e-01, + 7.50046686050942712498e-01, + 7.43317439066910390366e-01, + 7.36485133765944488538e-01, + 7.29551817629036647439e-01, + 7.22519566028118842560e-01, + 7.15390481475825179558e-01, + 7.08166692865972891013e-01, + 7.00850354705043199210e-01, + 6.93443646334978125445e-01, + 6.85948771147587565977e-01, + 6.78367955790895149626e-01, + 6.70703449367723969488e-01, + 6.62957522626846706970e-01, + 6.55132467147013564102e-01, + 6.47230594514182855370e-01, + 6.39254235492288658271e-01, + 6.31205739187853498429e-01, + 6.23087472208794013184e-01, + 6.14901817817740559136e-01, + 6.06651175080214377644e-01, + 5.98337958007979286990e-01, + 5.89964594697926170141e-01, + 5.81533526466822769940e-01, + 5.73047206982255086238e-01, + 5.64508101390120198282e-01, + 5.55918685439004245374e-01, + 5.47281444601789957005e-01, + 5.38598873194839455891e-01, + 5.29873473495091729113e-01, + 5.21107754855426819063e-01, + 5.12304232818644900149e-01, + 5.03465428230393974296e-01, + 4.94593866351407229764e-01, + 4.85692075969380243627e-01, + 4.76762588510854068424e-01, + 4.67807937153435049460e-01, + 4.58830655938690934459e-01, + 4.49833278886094922733e-01, + 4.40818339108329071419e-01, + 4.31788367928309491095e-01, + 4.22745893998278443604e-01, + 4.13693442421281976085e-01, + 4.04633533875401296687e-01, + 3.95568683741051418945e-01, + 3.86501401231698737959e-01, + 3.77434188528326886036e-01, + 3.68369539917981492216e-01, + 3.59309940936731631034e-01, + 3.50257867517365428789e-01, + 3.41215785142159444554e-01, + 3.32186148001037462318e-01, + 3.23171398155436717659e-01, + 3.14173964708215069930e-01, + 3.05196262979898602641e-01, + 2.96240693691587786418e-01, + 2.87309642154843669637e-01, + 2.78405477468841422439e-01, + 2.69530551725107592187e-01, + 2.60687199220140719547e-01, + 2.51877735676207303861e-01, + 2.43104457470603635416e-01, + 2.34369640873684476068e-01, + 2.25675541295929371621e-01, + 2.17024392544335781308e-01, + 2.08418406088417329514e-01, + 1.99859770336071163044e-01, + 1.91350649919593329695e-01, + 1.82893184992099055997e-01, + 1.74489490534610131034e-01, + 1.66141655674062554970e-01, + 1.57851743012483253237e-01, + 1.49621787967589486845e-01, + 1.41453798125033586297e-01, + 1.33349752602548832225e-01, + 1.25311601426208646393e-01, + 1.17341264919035181968e-01, + 1.09440633102170670199e-01, + 1.01611565108827309190e-01, + 9.38558886112234730392e-02, + 8.61753992607110774760e-02, + 7.85718601412871003875e-02, + 7.10470012366834768880e-02, + 6.36025189112217892440e-02, + 5.62400754046094436545e-02, + 4.89612983408535609731e-02, + 4.17677802514581156257e-02, + 3.46610781130688300200e-02, + 2.76427128997189970605e-02, + 2.07141691498255002546e-02, + 1.38768945480800508230e-02, + 7.13229952237052523822e-03, + 4.81756855863834190269e-04, +-6.07339868562557089193e-03, +-1.25318707108654243260e-02, +-1.88924015449200635719e-02, +-2.51537725552469157431e-02, +-3.13148044620756293988e-02, +-3.73743576329800403224e-02, +-4.33313323615558548818e-02, +-4.91846691301275826258e-02, +-5.49333488564130167919e-02, +-6.05763931240776432041e-02, +-6.61128643971268664670e-02, +-7.15418662180770936754e-02, +-7.68625433898662002719e-02, +-8.20740821414635834952e-02, +-8.71757102771481412473e-02, +-9.21666973094307923065e-02, +-9.70463545756019146937e-02, +-1.01814035337895597566e-01, +-1.06469134867262671396e-01, +-1.11011090510758053673e-01, +-1.15439381742549487808e-01, +-1.19753530198565633080e-01, +-1.23953099694804141917e-01, +-1.28037696229327896402e-01, +-1.32006967967990523904e-01, +-1.35860605213926149970e-01, +-1.39598340360859801690e-01, +-1.43219947830287880342e-01, +-1.46725243992595816289e-01, +-1.50114087072177021520e-01, +-1.53386377036633686499e-01, +-1.56542055470133889550e-01, +-1.59581105431021136321e-01, +-1.62503551293762121821e-01, +-1.65309458575341239328e-01, +-1.67998933746201201123e-01, +-1.70572124025848675943e-01, +-1.73029217163238657751e-01, +-1.75370441202067656183e-01, +-1.77596064231102662712e-01, +-1.79706394119684198518e-01, +-1.81701778238549410682e-01, +-1.83582603166114660675e-01, +-1.85349294380384888026e-01, +-1.87002315936635632454e-01, +-1.88542170131047126524e-01, +-1.89969397150449442746e-01, +-1.91284574708360660678e-01, +-1.92488317667500768993e-01, +-1.93581277648966099125e-01, +-1.94564142628253139433e-01, +-1.95437636518337454206e-01, +-1.96202518740000220188e-01, +-1.96859583779614849552e-01, +-1.97409660734602421250e-01, +-1.97853612846778603718e-01, +-1.98192337023800152496e-01, +-1.98426763348949375398e-01, +-1.98557854579480330681e-01, +-1.98586605633759266665e-01, +-1.98514043067442053081e-01, +-1.98341224538922389353e-01, +-1.98069238264312830200e-01, +-1.97699202462185225082e-01, +-1.97232264788348182760e-01, +-1.96669601760900314424e-01, +-1.96012418175829317146e-01, +-1.95261946513421102978e-01, +-1.94419446335739987131e-01, +-1.93486203675455742390e-01, +-1.92463530416288858271e-01, +-1.91352763665352892941e-01, +-1.90155265117664590280e-01, +-1.88872420413116609561e-01, +-1.87505638486184761371e-01, +-1.86056350908662238020e-01, +-1.84526011225710412367e-01, +-1.82916094285511643402e-01, +-1.81228095562823987574e-01, +-1.79463530476726945695e-01, +-1.77623933702856395822e-01, +-1.75710858480429804596e-01, +-1.73725875914355953888e-01, +-1.71670574272733023058e-01, +-1.69546558280039033617e-01, +-1.67355448406313112031e-01, +-1.65098880152636018348e-01, +-1.62778503333212087867e-01, +-1.60395981354360589455e-01, +-1.57952990490720118766e-01, +-1.55451219158974890400e-01, +-1.52892367189410044448e-01, +-1.50278145095599335868e-01, +-1.47610273342536069130e-01, +-1.44890481613516919346e-01, +-1.42120508076075402482e-01, +-1.39302098647282379673e-01, +-1.36437006258713466877e-01, +-1.33526990121390659594e-01, +-1.30573814991000874963e-01, +-1.27579250433698415668e-01, +-1.24545070092789769700e-01, +-1.21473050956605960193e-01, +-1.18364972627860873255e-01, +-1.15222616594794866063e-01, +-1.12047765504399418623e-01, +-1.08842202438021534716e-01, +-1.05607710189640782716e-01, +-1.02346070547107481641e-01, +-9.90590635766376431670e-02, +-9.57484669108492753020e-02, +-9.24160550406251946054e-02, +-8.90635986110882432731e-02, +-8.56928637219669248060e-02, +-8.23056112326309707861e-02, +-7.89035960720733398066e-02, +-7.54885665541076555929e-02, +-7.20622636980560449249e-02, +-6.86264205551892075841e-02, +-6.51827615411845612270e-02, +-6.17330017748623643969e-02, +-5.82788464234569522637e-02, +-5.48219900546751473525e-02, +-5.13641159957934842484e-02, +-4.79068957000384210154e-02, +-4.44519881204940292552e-02, +-4.10010390917734252048e-02, +-3.75556807196898087553e-02, +-3.41175307791583073969e-02, +-3.06881921205520574736e-02, +-2.72692520847377800619e-02, +-2.38622819270072061837e-02, +-2.04688362501167613050e-02, +-1.70904524466470482402e-02, +-1.37286501508831742385e-02, +-1.03849307004176948793e-02, +-7.06077660767133897385e-03, +-3.75765104151932821316e-03, +-4.76997319211794638602e-04, + 2.77976159123423990222e-03, + 6.01122355799481745270e-03, + 9.21600776157955291212e-03, + 1.23927551599897541740e-02, + 1.55401289427332476439e-02, + 1.86568149735395066857e-02, + 2.17415222216296409596e-02, + 2.47929831813923952366e-02, + 2.78099542803314468686e-02, + 3.07912162751492260448e-02, + 3.37355746358383862260e-02, + 3.66418599176616260893e-02, + 3.95089281209001219608e-02, + 4.23356610382612519317e-02, + 4.51209665898422082608e-02, + 4.78637791455433780907e-02, + 5.05630598348475110426e-02, + 5.32177968438652948535e-02, + 5.58270056995735716732e-02, + 5.83897295411673830645e-02, + 6.09050393784494881189e-02, + 6.33720343372027039575e-02, + 6.57898418914746596631e-02, + 6.81576180827297012366e-02, + 7.04745477258180152980e-02, + 7.27398446017178401668e-02, + 7.49527516370186164263e-02, + 7.71125410701128527480e-02, + 7.92185146040738086270e-02, + 8.12700035461998010478e-02, + 8.32663689342140606042e-02, + 8.52070016491116299928e-02, + 8.70913225146551783773e-02, + 8.89187823835221463620e-02, + 9.06888622101164748601e-02, + 9.24010731100602389354e-02, + 9.40549564063880572107e-02, + 9.56500836624715466971e-02, + 9.71860567017110571486e-02, + 9.86625076140278250980e-02, + 1.00079098749209560726e-01, + 1.01435522697153571170e-01, + 1.02731502255068357643e-01, + 1.03966790381692222867e-01, + 1.05141170138599651662e-01, + 1.06254454618664812005e-01, + 1.07306486861763028529e-01, + 1.08297139757793273174e-01, + 1.09226315937109075271e-01, + 1.10093947648453857613e-01, + 1.10899996624498939357e-01, + 1.11644453935089996155e-01, + 1.12327339828307448677e-01, + 1.12948703559463028978e-01, + 1.13508623208143408223e-01, + 1.14007205483430296145e-01, + 1.14444585517425839738e-01, + 1.14820926647215854066e-01, + 1.15136420185409663053e-01, + 1.15391285179401628658e-01, + 1.15585768159497587204e-01, + 1.15720142876065593129e-01, + 1.15794710025859670655e-01, + 1.15809796967682440694e-01, + 1.15765757427549992320e-01, + 1.15662971193527863711e-01, + 1.15501843800413089847e-01, + 1.15282806204434651320e-01, + 1.15006314448161270358e-01, + 1.14672849315791761104e-01, + 1.14282915979024457531e-01, + 1.13837043633692902578e-01, + 1.13335785127364224723e-01, + 1.12779716578100402957e-01, + 1.12169436984582482353e-01, + 1.11505567827804186187e-01, + 1.10788752664543674320e-01, + 1.10019656712822919142e-01, + 1.09198966429570901160e-01, + 1.08327389080707270352e-01, + 1.07405652303864840302e-01, + 1.06434503663973611953e-01, + 1.05414710201933409239e-01, + 1.04347057976597171192e-01, + 1.03232351600300586991e-01, + 1.02071413768162977398e-01, + 1.00865084781397620906e-01, + 9.96142220648654208581e-02, + 9.83196996791074473432e-02, + 9.69824078270985767691e-02, + 9.56032523559593450102e-02, + 9.41831542538692501054e-02, + 9.27230491424269054335e-02, + 9.12238867646961854030e-02, + 8.96866304691910365410e-02, + 8.81122566900391923639e-02, + 8.65017544235756330462e-02, + 8.48561247016157149670e-02, + 8.31763800616522747111e-02, + 8.14635440142294359189e-02, + 7.97186505077449730772e-02, + 7.79427433909263833733e-02, + 7.61368758732360317865e-02, + 7.43021099834537401829e-02, + 7.24395160266886328770e-02, + 7.05501720400689841250e-02, + 6.86351632473627820685e-02, + 6.66955815127786150187e-02, + 6.47325247941935855156e-02, + 6.27470965960619936341e-02, + 6.07404054222478104186e-02, + 5.87135642290347939398e-02, + 5.66676898785539728820e-02, + 5.46039025928778953833e-02, + 5.25233254090291187821e-02, + 5.04270836351378148876e-02, + 4.83163043079990264794e-02, + 4.61921156522659484556e-02, + 4.40556465415169601352e-02, + 4.19080259614387148903e-02, + 3.97503824753536946779e-02, + 3.75838436923350352470e-02, + 3.54095357381316658274e-02, + 3.32285827291374860626e-02, + 3.10421062496353539206e-02, + 2.88512248325339532018e-02, + 2.66570534438272561950e-02, + 2.44607029709929951755e-02, + 2.22632797155504665032e-02, + 2.00658848899928875242e-02, + 1.78696141193047525197e-02, + 1.56755569472778119589e-02, + 1.34847963478305701845e-02, + 1.12984082415343196903e-02, + 9.11746101754993230892e-03, + 6.94301506117043099736e-03, + 4.77612228716621078223e-03, + 2.61782567912160601259e-03, + 4.69158834953931199938e-04, +-1.66885448120184334310e-03, +-3.79520078056328966087e-03, +-5.90887728454510350456e-03, +-8.00889235270581950621e-03, +-1.00942659036281096735e-02, +-1.21640298285631744818e-02, +-1.42172283976795769261e-02, +-1.62529186587560860178e-02, +-1.82701708281667977996e-02, +-2.02680686740044913030e-02, +-2.22457098911984715861e-02, +-2.42022064684845883420e-02, +-2.61366850470883434199e-02, +-2.80482872709881952966e-02, +-2.99361701286294627777e-02, +-3.17995062859638480401e-02, +-3.36374844106955839251e-02, +-3.54493094876133021942e-02, +-3.72342031249025678941e-02, +-3.89914038513265101549e-02, +-4.07201674041748756805e-02, +-4.24197670078825320172e-02, +-4.40894936432238218615e-02, +-4.57286563069958726380e-02, +-4.73365822621031329120e-02, +-4.89126172779674045499e-02, +-5.04561258611889093539e-02, +-5.19664914763842064604e-02, +-5.34431167571409876382e-02, +-5.48854237070259126652e-02, +-5.62928538905927214331e-02, +-5.76648686143374361590e-02, +-5.90009490975559047765e-02, +-6.03005966330638770723e-02, +-6.15633327377404851455e-02, +-6.27886992928659848356e-02, +-6.39762586742271682771e-02, +-6.51255938719669663639e-02, +-6.62363086001636625078e-02, +-6.73080273961252362191e-02, +-6.83403957093936531564e-02, +-6.93330799804545011567e-02, +-7.02857677091563298744e-02, +-7.11981675128459667867e-02, +-7.20700091742300513742e-02, +-7.29010436789823551562e-02, +-7.36910432431144429843e-02, +-7.44398013301399846808e-02, +-7.51471326580581411303e-02, +-7.58128731961966451092e-02, +-7.64368801519491603003e-02, +-7.70190319474562123947e-02, +-7.75592281862732546571e-02, +-7.80573896100858338754e-02, +-7.85134580455219832640e-02, +-7.89273963411314394278e-02, +-7.92991882945930925963e-02, +-7.96288385702248469045e-02, +-7.99163726068679303172e-02, +-8.01618365162299895132e-02, +-8.03652969717648935077e-02, +-8.05268410881816582014e-02, +-8.06465762916719064446e-02, +-8.07246301809524391402e-02, +-8.07611503792237672705e-02, +-8.07563043771459543319e-02, +-8.07102793669422780010e-02, +-8.06232820677405676024e-02, +-8.04955385422673613816e-02, +-8.03272940050135386691e-02, +-8.01188126219958829388e-02, +-7.98703773022373386681e-02, +-7.95822894810978148650e-02, +-7.92548688955872077111e-02, +-7.88884533517974217975e-02, +-7.84833984845913629202e-02, +-7.80400775096937587838e-02, +-7.75588809683271651618e-02, +-7.70402164645424963885e-02, +-7.64845083953963472689e-02, +-7.58921976741284420864e-02, +-7.52637414464975562645e-02, +-7.45996128004335623540e-02, +-7.39003004691712872543e-02, +-7.31663085280282593503e-02, +-7.23981560849959182580e-02, +-7.15963769653113479841e-02, +-7.07615193901859063086e-02, +-6.98941456498595042879e-02, +-6.89948317711622932658e-02, +-6.80641671797573843961e-02, +-6.71027543572484258538e-02, +-6.61112084933319216207e-02, +-6.50901571331780198770e-02, +-6.40402398202278705375e-02, +-6.29621077345897672828e-02, +-6.18564233272276414732e-02, +-6.07238599501278633608e-02, +-5.95651014826367106170e-02, +-5.83808419541620299276e-02, +-5.71717851634284957019e-02, +-5.59386442944868889082e-02, +-5.46821415296654678162e-02, +-5.34030076596649916354e-02, +-5.21019816909916097525e-02, +-5.07798104509243897198e-02, +-4.94372481902171159729e-02, +-4.80750561837304871138e-02, +-4.66940023291949543593e-02, +-4.52948607443019804486e-02, +-4.38784113623226362799e-02, +-4.24454395264523623443e-02, +-4.09967355830820473495e-02, +-3.95330944741913298257e-02, +-3.80553153290659820773e-02, +-3.65642010555344981748e-02, +-3.50605579309238787888e-02, +-3.35451951929296859900e-02, +-3.20189246305989869135e-02, +-3.04825601756209853266e-02, +-2.89369174941192380812e-02, +-2.73828135791425071599e-02, +-2.58210663440446019923e-02, +-2.42524942169475357656e-02, +-2.26779157364765740490e-02, +-2.10981491489598167732e-02, +-1.95140120072784944982e-02, +-1.79263207715556205368e-02, +-1.63358904118689959861e-02, +-1.47435340131725541729e-02, +-1.31500623826066934119e-02, +-1.15562836593809201841e-02, +-9.96300292740478522779e-03, +-8.37102183084635804999e-03, +-6.78113819279113280714e-03, +-5.19414563717416049443e-03, +-3.61083321415951816885e-03, +-2.03198502912982836496e-03, +-4.58379875457016528785e-04, + 1.10920912878408159559e-03, + 2.67001489999788748156e-03, + 4.22327674398739229267e-03, + 5.76824070645192907292e-03, + 7.30415991891262585123e-03, + 8.83029493991307340428e-03, + 1.03459140913472139728e-02, + 1.18502937897689078484e-02, + 1.33427188725394711699e-02, + 1.48224829186761088151e-02, + 1.62888885642629918649e-02, + 1.77412478122899279487e-02, + 1.91788823367922064977e-02, + 2.06011237811589489888e-02, + 2.20073140504912223570e-02, + 2.33968055978847275234e-02, + 2.47689617045220474012e-02, + 2.61231567534600458980e-02, + 2.74587764969989392427e-02, + 2.87752183175302503337e-02, + 3.00718914817559267172e-02, + 3.13482173881795972425e-02, + 3.26036298077741898416e-02, + 3.38375751177299316508e-02, + 3.50495125281968383790e-02, + 3.62389143019323234363e-02, + 3.74052659667742509741e-02, + 3.85480665208594169835e-02, + 3.96668286305130596281e-02, + 4.07610788207384555637e-02, + 4.18303576582400582495e-02, + 4.28742199269152648999e-02, + 4.38922347957571498678e-02, + 4.48839859791098777508e-02, + 4.58490718892284668251e-02, + 4.67871057810912635566e-02, + 4.76977158894239181008e-02, + 4.85805455578927625204e-02, + 4.94352533604324947958e-02, + 5.02615132146747092823e-02, + 5.10590144874505449946e-02, + 5.18274620923405288098e-02, + 5.25665765792536696099e-02, + 5.32760942160161940495e-02, + 5.39557670619600152073e-02, + 5.46053630334999498541e-02, + 5.52246659616954863048e-02, + 5.58134756417962285546e-02, + 5.63716078747732926568e-02, + 5.68988945008435942352e-02, + 5.73951834249974424118e-02, + 5.78603386345437897820e-02, + 5.82942402086913807890e-02, + 5.86967843201876629533e-02, + 5.90678832290408364902e-02, + 5.94074652683551154841e-02, + 5.97154748223121395467e-02, + 5.99918722963358186373e-02, + 6.02366340794795798730e-02, + 6.04497524990822918123e-02, + 6.06312357677402588574e-02, + 6.07811079226447462109e-02, + 6.08994087573431347460e-02, + 6.09861937459786132565e-02, + 6.10415339600735781800e-02, + 6.10655159779199541159e-02, + 6.10582417866455048894e-02, + 6.10198286770287368075e-02, + 6.09504091311373757955e-02, + 6.08501307028684462752e-02, + 6.07191558914731074892e-02, + 6.05576620081493127712e-02, + 6.03658410357920463540e-02, + 6.01438994819913433365e-02, + 5.98920582253712890930e-02, + 5.96105523553696475814e-02, + 5.92996310055547357076e-02, + 5.89595571805846263569e-02, + 5.85906075769135961662e-02, + 5.81930723973530239501e-02, + 5.77672551595985947492e-02, + 5.73134724988377947108e-02, + 5.68320539645518138516e-02, + 5.63233418116318024227e-02, + 5.57876907859301829351e-02, + 5.52254679043691909524e-02, + 5.46370522297332239514e-02, + 5.40228346402717510277e-02, + 5.33832175942438452720e-02, + 5.27186148895339920517e-02, + 5.20294514184751963337e-02, + 5.13161629180133513350e-02, + 5.05791957153526455793e-02, + 4.98190064692186004858e-02, + 4.90360619068817560340e-02, + 4.82308385570846126500e-02, + 4.74038224790149093080e-02, + 4.65555089874726130139e-02, + 4.56864023743756911267e-02, + 4.47970156267560870589e-02, + 4.38878701413918104191e-02, + 4.29594954362301426065e-02, + 4.20124288587509150950e-02, + 4.10472152914242438548e-02, + 4.00644068544164441703e-02, + 3.90645626056996611575e-02, + 3.80482482387188569728e-02, + 3.70160357777762072384e-02, + 3.59685032712854929615e-02, + 3.49062344830574772248e-02, + 3.38298185817733007563e-02, + 3.27398498288028888537e-02, + 3.16369272645302956892e-02, + 3.05216543933420694779e-02, + 2.93946388674391281826e-02, + 2.82564921696314662325e-02, + 2.71078292952747976208e-02, + 2.59492684335090040282e-02, + 2.47814306479556094309e-02, + 2.36049395570361274233e-02, + 2.24204210140672086093e-02, + 2.12285027872915685321e-02, + 2.00298142400041241651e-02, + 1.88249860109280658937e-02, + 1.76146496949991550329e-02, + 1.63994375247131611573e-02, + 1.51799820521929199751e-02, + 1.39569158321288973312e-02, + 1.27308711057459132687e-02, + 1.15024794859493635635e-02, + 1.02723716438034538834e-02, + 9.04117699648874194318e-03, + 7.80952339689281599400e-03, + 6.57803682497710377058e-03, + 5.34734108107065390925e-03, + 4.11805748123311807923e-03, + 2.89080455483250748500e-03, + 1.66619774448026097997e-03, + 4.44849108462394484276e-04, +-7.72632974192619353775e-04, +-1.98564409587129479459e-03, +-3.19358410962515939027e-03, +-4.39585741537518604610e-03, +-5.59187324294384193596e-03, +-6.78104593178024354222e-03, +-7.96279520725374188872e-03, +-9.13654645338901789942e-03, +-1.03017309819179135599e-02, +-1.14577862975281108415e-02, +-1.26041563591888523127e-02, +-1.37402918374362748022e-02, +-1.48656503675044012608e-02, +-1.59796967981878784704e-02, +-1.70819034363291870349e-02, +-1.81717502868205364741e-02, +-1.92487252880175659098e-02, +-2.03123245424604338683e-02, +-2.13620525428040268501e-02, +-2.23974223928605567502e-02, +-2.34179560236593246880e-02, +-2.44231844044319607034e-02, +-2.54126477484353970049e-02, +-2.63858957135253285875e-02, +-2.73424875973971651111e-02, +-2.82819925274152735029e-02, +-2.92039896449517132060e-02, +-3.01080682841611060874e-02, +-3.09938281451182656712e-02, +-3.18608794612527251866e-02, +-3.27088431610126698090e-02, +-3.35373510236956218211e-02, +-3.43460458293886189418e-02, +-3.51345815029584646050e-02, +-3.59026232520415142235e-02, +-3.66498476989806504234e-02, +-3.73759430066653228208e-02, +-3.80806089982259413085e-02, +-3.87635572705481989964e-02, +-3.94245113015637763110e-02, +-4.00632065512871449187e-02, +-4.06793905565660182666e-02, +-4.12728230195161804872e-02, +-4.18432758896181006270e-02, +-4.23905334394521562946e-02, +-4.29143923340550431655e-02, +-4.34146616938810431252e-02, +-4.38911631513571320884e-02, +-4.43437309010235244933e-02, +-4.47722117432520008706e-02, +-4.51764651215424140052e-02, +-4.55563631533957985598e-02, +-4.59117906547691981278e-02, +-4.62426451581186420681e-02, +-4.65488369240420196693e-02, +-4.68302889465325583584e-02, +-4.70869369518625499604e-02, +-4.73187293911136036551e-02, +-4.75256274263797934276e-02, +-4.77076049106652452791e-02, +-4.78646483615089088359e-02, +-4.79967569283660938639e-02, +-4.81039423537813551346e-02, +-4.81862289283918193705e-02, +-4.82436534398009986280e-02, +-4.82762651153660765635e-02, +-4.82841255589469900422e-02, +-4.82673086816636301433e-02, +-4.82259006267171733140e-02, +-4.81599996883273831494e-02, +-4.80697162248445095112e-02, +-4.79551725660972635867e-02, +-4.78165029150386111656e-02, +-4.76538532437557615928e-02, +-4.74673811839129988766e-02, +-4.72572559116971463444e-02, +-4.70236580273407853148e-02, +-4.67667794292976057857e-02, +-4.64868231831488537553e-02, +-4.61840033853220879867e-02, +-4.58585450217043055776e-02, +-4.55106838212354786188e-02, +-4.51406661045703067048e-02, +-4.47487486278967949715e-02, +-4.43351984220053674246e-02, +-4.39002926267011706063e-02, +-4.34443183206557337339e-02, +-4.29675723467968784242e-02, +-4.24703611333365343983e-02, +-4.19530005105376649355e-02, +-4.14158155233245728333e-02, +-4.08591402398425090903e-02, +-4.02833175560728118381e-02, +-3.96886989966125647289e-02, +-3.90756445117304562764e-02, +-3.84445222708086342678e-02, +-3.77957084522856853748e-02, +-3.71295870302152039577e-02, +-3.64465495575560030628e-02, +-3.57469949463106728693e-02, +-3.50313292446328208851e-02, +-3.42999654110217877534e-02, +-3.35533230857262762536e-02, +-3.27918283594781714840e-02, +-3.20159135396808763874e-02, +-3.12260169141751545152e-02, +-3.04225825127068701115e-02, +-2.96060598662241068746e-02, +-2.87769037641279583351e-02, +-2.79355740096046620269e-02, +-2.70825351731674365818e-02, +-2.62182563445339765484e-02, +-2.53432108829716763732e-02, +-2.44578761662360491536e-02, +-2.35627333382326387134e-02, +-2.26582670555346976649e-02, +-2.17449652328813719526e-02, +-2.08233187877915476571e-02, +-1.98938213844193738378e-02, +-1.89569691767836438767e-02, +-1.80132605515005567165e-02, +-1.70631958701489179486e-02, +-1.61072772113989640119e-02, +-1.51460081130329674015e-02, +-1.41798933139869222375e-02, +-1.32094384965426719925e-02, +-1.22351500287977872639e-02, +-1.12575347075429474386e-02, +-1.02770995016708190789e-02, +-9.29435129624720662855e-03, +-8.30979663736668323903e-03, +-7.32394147791955510418e-03, +-6.33729092439597792991e-03, +-5.35034898484767259402e-03, +-4.36361831813259892082e-03, +-3.37759998456233596562e-03, +-2.39279319807447028376e-03, +-1.40969508004874419758e-03, +-4.28800414884481764701e-04, + 5.49398592542026499921e-04, + 1.52441255742493384819e-03, + 2.49575515346705124192e-03, + 3.46294334909421361660e-03, + 4.42549764133481383921e-03, + 5.38294228725484918269e-03, + 6.33480553283812409388e-03, + 7.28061983920614500670e-03, + 8.21992210606954480656e-03, + 9.15225389230991427658e-03, + 1.00771616335884814375e-02, + 1.09941968568804098599e-02, + 1.19029163918370119862e-02, + 1.28028825788794285712e-02, + 1.36936634739278067369e-02, + 1.45748330496734655737e-02, + 1.54459713933036285605e-02, + 1.63066649005877105372e-02, + 1.71565064662418664820e-02, + 1.79950956704824222010e-02, + 1.88220389616893905849e-02, + 1.96369498350979915235e-02, + 2.04394490074384753420e-02, + 2.12291645874509368741e-02, + 2.20057322421993752093e-02, + 2.27687953591133446229e-02, + 2.35180052036899414625e-02, + 2.42530210727860510989e-02, + 2.49735104434401083973e-02, + 2.56791491171582640651e-02, + 2.63696213596067048635e-02, + 2.70446200356534542653e-02, + 2.77038467397033236206e-02, + 2.83470119212748915272e-02, + 2.89738350057704117935e-02, + 2.95840445103900430424e-02, + 3.01773781551470283990e-02, + 3.07535829689405612597e-02, + 3.13124153906489052779e-02, + 3.18536413652031544230e-02, + 3.23770364346098321606e-02, + 3.28823858238901367557e-02, + 3.33694845219050725826e-02, + 3.38381373570426913222e-02, + 3.42881590677418662816e-02, + 3.47193743678329280744e-02, + 3.51316180066747196786e-02, + 3.55247348240743179848e-02, + 3.58985797999757036414e-02, + 3.62530180989057912444e-02, + 3.65879251091717136446e-02, + 3.69031864768026920953e-02, + 3.71986981342348130286e-02, + 3.74743663237384755371e-02, + 3.77301076155911810361e-02, + 3.79658489210015839821e-02, + 3.81815274997910139576e-02, + 3.83770909628457501661e-02, + 3.85524972693506232102e-02, + 3.87077147188212219997e-02, + 3.88427219379517477127e-02, + 3.89575078623010107037e-02, + 3.90520717128378727634e-02, + 3.91264229673738417326e-02, + 3.91805813269093319851e-02, + 3.92145766769267448137e-02, + 3.92284490436606639308e-02, + 3.92222485453833716318e-02, + 3.91960353387427393179e-02, + 3.91498795601925853038e-02, + 3.90838612625587153437e-02, + 3.89980703467861372635e-02, + 3.88926064889137598768e-02, + 3.87675790623278684888e-02, + 3.86231070553441427351e-02, + 3.84593189841744911850e-02, + 3.82763528013330134314e-02, + 3.80743557995419576456e-02, + 3.78534845111941978257e-02, + 3.76139046034402041441e-02, + 3.73557907689583551525e-02, + 3.70793266124797640804e-02, + 3.67847045331337260676e-02, + 3.64721256026843687614e-02, + 3.61417994397318920186e-02, + 3.57939440799517269443e-02, + 3.54287858424472551500e-02, + 3.50465591922946295700e-02, + 3.46475065993586336943e-02, + 3.42318783934602438590e-02, + 3.37999326159794388769e-02, + 3.33519348679760310739e-02, + 3.28881581549163512501e-02, + 3.24088827280907126882e-02, + 3.19143959228117141125e-02, + 3.14049919934835039537e-02, + 3.08809719456320137809e-02, + 3.03426433649902835277e-02, + 2.97903202437320435703e-02, + 2.92243228039485228309e-02, + 2.86449773184645310742e-02, + 2.80526159290918272737e-02, + 2.74475764624171579553e-02, + 2.68302022432251076334e-02, + 2.62008419056547099679e-02, + 2.55598492021924458828e-02, + 2.49075828106016076979e-02, + 2.42444061388931500489e-02, + 2.35706871284384854304e-02, + 2.28867980553310382263e-02, + 2.21931153300989475463e-02, + 2.14900192958749729211e-02, + 2.07778940251304410081e-02, + 2.00571271150767407865e-02, + 1.93281094818433703264e-02, + 1.85912351535375483524e-02, + 1.78469010622939669442e-02, + 1.70955068354214992365e-02, + 1.63374545857532041393e-02, + 1.55731487013095522970e-02, + 1.48029956343801779445e-02, + 1.40274036901342491479e-02, + 1.32467828148644800601e-02, + 1.24615443839752523814e-02, + 1.16721009898197274068e-02, + 1.08788662294939664221e-02, + 1.00822544926967554851e-02, + 9.28268074975848594965e-03, + 8.48056033994836096224e-03, + 7.67630876016376067356e-03, + 6.87034145410842303492e-03, + 6.06307360206417237519e-03, + 5.25491991135924960826e-03, + 4.44629440763854959229e-03, + 3.63761022703795386390e-03, + 2.82927940936458007654e-03, + 2.02171269238637712692e-03, + 1.21531930732854268409e-03, + 4.10506775680379075531e-04, +-3.92319292591773477897e-04, +-1.19275539932616717227e-03, +-1.99040035684389668771e-03, +-2.78485548493010359392e-03, +-3.57572480602225085608e-03, +-4.36261523851058825862e-03, +-5.14513678806150041162e-03, +-5.92290273686880194143e-03, +-6.69552983074627079685e-03, +-7.46263846397084845696e-03, +-8.22385286178995214557e-03, +-8.97880126050735853649e-03, +-9.72711608506233310623e-03, +-1.04684341240196421979e-02, +-1.12023967018896625919e-02, +-1.19286498486973670946e-02, +-1.26468444667234853479e-02, +-1.33566364943390990250e-02, +-1.40576870668614704873e-02, +-1.47496626743549175825e-02, +-1.54322353163073335003e-02, +-1.61050826531120676310e-02, +-1.67678881542855998110e-02, +-1.74203412433571909468e-02, +-1.80621374393645714451e-02, +-1.86929784948938332301e-02, +-1.93125725306022809347e-02, +-1.99206341661660978060e-02, +-2.05168846475965727105e-02, +-2.11010519708690891250e-02, +-2.16728710018125117487e-02, +-2.22320835922093923420e-02, +-2.27784386920556920775e-02, +-2.33116924579366280312e-02, +-2.38316083574713066806e-02, +-2.43379572697852361585e-02, +-2.48305175819705514773e-02, +-2.53090752814938702020e-02, +-2.57734240445178890144e-02, +-2.62233653201022591517e-02, +-2.66587084102499136118e-02, +-2.70792705457725754736e-02, +-2.74848769579453880429e-02, +-2.78753609459266790682e-02, +-2.82505639399193153594e-02, +-2.86103355600531468472e-02, +-2.89545336709700236455e-02, +-2.92830244320940215330e-02, +-2.95956823435738237971e-02, +-2.98923902878850261677e-02, +-3.01730395670819218079e-02, +-3.04375299356923270655e-02, +-3.06857696292481205158e-02, +-3.09176753884519220361e-02, +-3.11331724789744579418e-02, +-3.13321947068878961518e-02, +-3.15146844297364905896e-02, +-3.16805925632501414468e-02, +-3.18298785837100445262e-02, +-3.19625105259753808373e-02, +-3.20784649771835711496e-02, +-3.21777270661380843109e-02, +-3.22602904484012090180e-02, +-3.23261572871092819903e-02, +-3.23753382295313973938e-02, +-3.24078523793953007792e-02, +-3.24237272650036850719e-02, +-3.24229988031694352224e-02, +-3.24057112589975146455e-02, +-3.23719172015455164404e-02, +-3.23216774553950619842e-02, +-3.22550610481695601561e-02, +-3.21721451540349229203e-02, +-3.20730150332222269105e-02, +-3.19577639676131355917e-02, +-3.18264931924307492572e-02, +-3.16793118240798893259e-02, +-3.15163367841841124406e-02, +-3.13376927198667984409e-02, +-3.11435119203261716325e-02, +-3.09339342297566856355e-02, +-3.07091069566692957682e-02, +-3.04691847796660503223e-02, +-3.02143296497258302680e-02, +-2.99447106890591077666e-02, +-2.96605040865920502324e-02, +-2.93618929901409558836e-02, +-2.90490673953408620744e-02, +-2.87222240313914564669e-02, +-2.83815662436870431995e-02, +-2.80273038733983362314e-02, +-2.76596531340728875314e-02, +-2.72788364853265505316e-02, +-2.68850825036951179836e-02, +-2.64786257507202589523e-02, +-2.60597066383420963853e-02, +-2.56285712916748155410e-02, +-2.51854714092403474124e-02, +-2.47306641207374125480e-02, +-2.42644118424243347698e-02, +-2.37869821301946587910e-02, +-2.32986475304263404573e-02, +-2.27996854286841091342e-02, +-2.22903778963591883699e-02, +-2.17710115353269804961e-02, +-2.12418773207074841614e-02, +-2.07032704418132450230e-02, +-2.01554901413684046940e-02, +-1.95988395530860316784e-02, +-1.90336255376889230961e-02, +-1.84601585174617617569e-02, +-1.78787523094215382302e-02, +-1.72897239571940322667e-02, +-1.66933935616846752803e-02, +-1.60900841106333160335e-02, +-1.54801213071404045879e-02, +-1.48638333972560768986e-02, +-1.42415509967192804169e-02, +-1.36136069169392123768e-02, +-1.29803359903072849241e-02, +-1.23420748949298001579e-02, +-1.16991619788734471652e-02, +-1.10519370840110493781e-02, +-1.04007413695592701441e-02, +-9.74591713539885336204e-03, +-9.08780764526554395155e-03, +-8.42675694990374125892e-03, +-7.76310971027038485004e-03, +-7.09721102088000169172e-03, +-6.42940623337920000302e-03, +-5.76004078043931225933e-03, +-5.08946000005612835676e-03, +-4.41800896034429992076e-03, +-3.74603228491338785533e-03, +-3.07387397891339432532e-03, +-2.40187725583507205585e-03, +-1.73038436515272897598e-03, +-1.05973642089167863906e-03, +-3.90273231208217510901e-04, + 2.77666870936983212030e-04, + 9.43747195927376416637e-04, + 1.60763286437934816049e-03, + 2.26899097268967123858e-03, + 2.92749075716241266912e-03, + 3.58280375663248612170e-03, + 4.23460397351204959754e-03, + 4.88256803317746110316e-03, + 5.52637534162357668688e-03, + 6.16570824130805751617e-03, + 6.80025216511182754170e-03, + 7.42969578834302112058e-03, + 8.05373117871052007777e-03, + 8.67205394419879975476e-03, + 9.28436337877218062498e-03, + 9.89036260584076794278e-03, + 1.04897587194219873291e-02, + 1.10822629229305347903e-02, + 1.16675906655330941658e-02, + 1.22454617760050857300e-02, + 1.28156005940266576326e-02, + 1.33777360988594062191e-02, + 1.39316020353439252305e-02, + 1.44769370371622355803e-02, + 1.50134847473070466572e-02, + 1.55409939357074259464e-02, + 1.60592186139547725421e-02, + 1.65679181470810912846e-02, + 1.70668573623377166359e-02, + 1.75558066549289203129e-02, + 1.80345420906532633021e-02, + 1.85028455054086320153e-02, + 1.89605046015185567387e-02, + 1.94073130408384669776e-02, + 1.98430705346031681369e-02, + 2.02675829299774241943e-02, + 2.06806622932754168021e-02, + 2.10821269898129222409e-02, + 2.14718017603625459244e-02, + 2.18495177941796202281e-02, + 2.22151127985720682478e-02, + 2.25684310649855168762e-02, + 2.29093235315810418717e-02, + 2.32376478422810298086e-02, + 2.35532684022618996056e-02, + 2.38560564298757396551e-02, + 2.41458900049817716538e-02, + 2.44226541136732810955e-02, + 2.46862406893853837675e-02, + 2.49365486503724774481e-02, + 2.51734839335446165809e-02, + 2.53969595246556420487e-02, + 2.56068954848354853049e-02, + 2.58032189734641453915e-02, + 2.59858642673822630431e-02, + 2.61547727764399259853e-02, + 2.63098930553838268598e-02, + 2.64511808120856638238e-02, + 2.65785989121172516736e-02, + 2.66921173796784670651e-02, + 2.67917133948867500215e-02, + 2.68773712874392570193e-02, + 2.69490825266583827746e-02, + 2.70068457079358954787e-02, + 2.70506665355911626869e-02, + 2.70805578021602322281e-02, + 2.70965393641366091015e-02, + 2.70986381141830531827e-02, + 2.70868879498386908034e-02, + 2.70613297387449595888e-02, + 2.70220112804171637422e-02, + 2.69689872645891524916e-02, + 2.69023192261612989484e-02, + 2.68220754967820745884e-02, + 2.67283311530973760606e-02, + 2.66211679617003732501e-02, + 2.65006743208199592454e-02, + 2.63669451987833119988e-02, + 2.62200820692939373657e-02, + 2.60601928435633990733e-02, + 2.58873917993413214800e-02, + 2.57017995068857182939e-02, + 2.55035427519193710899e-02, + 2.52927544556184984159e-02, + 2.50695735916821975386e-02, + 2.48341451005307974065e-02, + 2.45866198006852616775e-02, + 2.43271542973778100161e-02, + 2.40559108884488212499e-02, + 2.37730574675824729569e-02, + 2.34787674249385819314e-02, + 2.31732195452361150467e-02, + 2.28565979033475072391e-02, + 2.25290917574611608554e-02, + 2.21908954398750551951e-02, + 2.18422082454798119344e-02, + 2.14832343179954671220e-02, + 2.11141825340238932507e-02, + 2.07352663849828984521e-02, + 2.03467038569848726604e-02, + 1.99487173087274823058e-02, + 1.95415333474632871291e-02, + 1.91253827031149341298e-02, + 1.87005001006056471857e-02, + 1.82671241304729649324e-02, + 1.78254971178373536334e-02, + 1.73758649897937239581e-02, + 1.69184771412996537432e-02, + 1.64535862996303787475e-02, + 1.59814483874737844893e-02, + 1.55023223847373312068e-02, + 1.50164701891417791402e-02, + 1.45241564756737676078e-02, + 1.40256485549719173145e-02, + 1.35212162307227472952e-02, + 1.30111316561379447565e-02, + 1.24956691895912394563e-02, + 1.19751052494878589688e-02, + 1.14497181684445926975e-02, + 1.09197880468538122134e-02, + 1.03855966059087159725e-02, + 9.84742704016562143965e-03, + 9.30556386971926295659e-03, + 8.76029279206604755137e-03, + 8.21190053373426452621e-03, + 7.66067470175298657897e-03, + 7.10690363503945106427e-03, + 6.55087625577790554771e-03, + 5.99288192086684483317e-03, + 5.43321027350959859931e-03, + 4.87215109502278989617e-03, + 4.30999415693893248719e-03, + 3.74702907347534584434e-03, + 3.18354515444554302464e-03, + 2.61983125868587608809e-03, + 2.05617564807023672779e-03, + 1.49286584218635853295e-03, + 9.30188473745678081825e-04, + 3.68429144797911432754e-04, +-1.92127716177123029819e-04, +-7.51198996231790326432e-04, +-1.30850303889562991251e-03, +-1.86375978403549190029e-03, +-2.41669090655965632108e-03, +-2.96701995390177180115e-03, +-3.51447248221491799144e-03, +-4.05877619121137057229e-03, +-4.59966105758124674252e-03, +-5.13685946692752325171e-03, +-5.67010634415242211620e-03, +-6.19913928223347811958e-03, +-6.72369866932763082107e-03, +-7.24352781414225668777e-03, +-7.75837306951438713393e-03, +-8.26798395413882135363e-03, +-8.77211327238880053669e-03, +-9.27051723217174085401e-03, +-9.76295556076584719607e-03, +-1.02491916185828580571e-02, +-1.07289925108050229752e-02, +-1.12021291968433227976e-02, +-1.16683765975679858140e-02, +-1.21275137002619763649e-02, +-1.25793236612475982372e-02, +-1.30235939061431136438e-02, +-1.34601162277011333901e-02, +-1.38886868811863382206e-02, +-1.43091066772499612286e-02, +-1.47211810722588463257e-02, +-1.51247202560407922184e-02, +-1.55195392370066180543e-02, +-1.59054579246123636849e-02, +-1.62823012091269786472e-02, +-1.66498990386690776111e-02, +-1.70080864934834194435e-02, +-1.73567038574233001302e-02, +-1.76955966866107171354e-02, +-1.80246158752456059338e-02, +-1.83436177185377254084e-02, +-1.86524639727363474029e-02, +-1.89510219122339153286e-02, +-1.92391643837212557300e-02, +-1.95167698573757708580e-02, +-1.97837224750605396306e-02, +-2.00399120955206018480e-02, +-2.02852343365580237156e-02, +-2.05195906141726648608e-02, +-2.07428881786561915279e-02, +-2.09550401476275363621e-02, +-2.11559655360012838221e-02, +-2.13455892828807378137e-02, +-2.15238422753686667321e-02, +-2.16906613692930197446e-02, +-2.18459894068418723767e-02, +-2.19897752311081634558e-02, +-2.21219736975437064608e-02, +-2.22425456823232385595e-02, +-2.23514580876230314899e-02, +-2.24486838438175441424e-02, +-2.25342019086016941143e-02, +-2.26079972630452222249e-02, +-2.26700609045897422122e-02, +-2.27203898369985682337e-02, +-2.27589870572722542674e-02, +-2.27858615395436989171e-02, +-2.28010282159679666947e-02, +-2.28045079546240481161e-02, +-2.27963275344472623973e-02, +-2.27765196172116414497e-02, +-2.27451227165837051303e-02, +-2.27021811642711575374e-02, +-2.26477450732895796426e-02, +-2.25818702983737081003e-02, +-2.25046183935598033410e-02, +-2.24160565669674592681e-02, +-2.23162576328110422164e-02, +-2.22052999606712764269e-02, +-2.20832674220598039472e-02, +-2.19502493343100429923e-02, +-2.18063404018299551723e-02, +-2.16516406547519850434e-02, +-2.14862553850184781479e-02, +-2.13102950799411924865e-02, +-2.11238753532740700103e-02, +-2.09271168738412970123e-02, +-2.07201452917621688210e-02, +-2.05030911623162483137e-02, +-2.02760898674933312535e-02, +-2.00392815352738624946e-02, +-1.97928109566855824075e-02, +-1.95368275006852568088e-02, +-1.92714850269127511984e-02, +-1.89969417963674683247e-02, +-1.87133603800582019872e-02, +-1.84209075656767175266e-02, +-1.81197542623479680712e-02, +-1.78100754035098000905e-02, +-1.74920498479764381650e-02, +-1.71658602792400527548e-02, +-1.68316931030659776292e-02, +-1.64897383434381879230e-02, +-1.61401895369109177336e-02, +-1.57832436254263346054e-02, +-1.54191008476533275573e-02, +-1.50479646289087866384e-02, +-1.46700414697199573583e-02, +-1.42855408330877838713e-02, +-1.38946750305117498053e-02, +-1.34976591068377456406e-02, +-1.30947107239892130554e-02, +-1.26860500436455827383e-02, +-1.22718996089274719891e-02, +-1.18524842251538416876e-02, +-1.14280308397327317466e-02, +-1.09987684212486756113e-02, +-1.05649278378112127658e-02, +-1.01267417347274506223e-02, +-9.68444441156269923698e-03, +-9.23827169865409740523e-03, +-8.78846083313997161746e-03, +-8.33525033457069991494e-03, +-7.87887988016375100109e-03, +-7.41959017977004194749e-03, +-6.95762285061261864794e-03, +-6.49322029186454475341e-03, +-6.02662555912889408988e-03, +-5.55808223888622741915e-03, +-5.08783432297227420499e-03, +-4.61612608315053844776e-03, +-4.14320194584339666216e-03, +-3.66930636708468534829e-03, +-3.19468370775774284862e-03, +-2.71957810918098006822e-03, +-2.24423336910424412252e-03, +-1.76889281817741881794e-03, +-1.29379919695378617014e-03, +-8.19194533489142270866e-04, +-3.45320021597831196877e-04, + 1.27584100174339069422e-04, + 5.99278668799195350127e-04, + 1.06952571617924155171e-03, + 1.53808858766556200148e-03, + 2.00473205962055367468e-03, + 2.46922245597071959855e-03, + 2.93132776369034713654e-03, + 3.39081774716058033034e-03, + 3.84746406134854872921e-03, + 4.30104036375060765768e-03, + 4.75132242504706578390e-03, + 5.19808823841395525878e-03, + 5.64111812743960539668e-03, + 6.08019485259521982184e-03, + 6.51510371620631252576e-03, + 6.94563266587837867261e-03, + 7.37157239632470640683e-03, + 7.79271644955021464130e-03, + 8.20886131334327799614e-03, + 8.61980651802961989061e-03, + 9.02535473144288127867e-03, + 9.42531185206835209200e-03, + 9.81948710031542437715e-03, + 1.02076931078787062901e-02, + 1.05897460051441894696e-02, + 1.09654655066032842570e-02, + 1.13346749942337312461e-02, + 1.16972015988115480428e-02, + 1.20528762791150233225e-02, + 1.24015338989890838706e-02, + 1.27430133022312791491e-02, + 1.30771573852710050467e-02, + 1.34038131676064240644e-02, + 1.37228318599705717551e-02, + 1.40340689301969769737e-02, + 1.43373841667557219703e-02, + 1.46326417399349796578e-02, + 1.49197102606399897157e-02, + 1.51984628367875466287e-02, + 1.54687771272712503573e-02, + 1.57305353934761547874e-02, + 1.59836245483238222065e-02, + 1.62279362028255533246e-02, + 1.64633667101300000535e-02, + 1.66898172070444779369e-02, + 1.69071936530182861946e-02, + 1.71154068665722303155e-02, + 1.73143725591620549487e-02, + 1.75040113664655661019e-02, + 1.76842488770822502120e-02, + 1.78550156586383436397e-02, + 1.80162472812886650941e-02, + 1.81678843386109678537e-02, + 1.83098724658869831117e-02, + 1.84421623557678958372e-02, + 1.85647097713225045501e-02, + 1.86774755564665419227e-02, + 1.87804256437758242126e-02, + 1.88735310596836944330e-02, + 1.89567679270675991388e-02, + 1.90301174652290280842e-02, + 1.90935659872729333875e-02, + 1.91471048948949201796e-02, + 1.91907306705839213190e-02, + 1.92244448672513647269e-02, + 1.92482540952976406701e-02, + 1.92621700071291257483e-02, + 1.92662092791390723856e-02, + 1.92603935911679381709e-02, + 1.92447496034597632930e-02, + 1.92193089311317975854e-02, + 1.91841081161766568997e-02, + 1.91391885970173640519e-02, + 1.90845966756356746896e-02, + 1.90203834822977521646e-02, + 1.89466049378990836205e-02, + 1.88633217139549183572e-02, + 1.87705991902617184974e-02, + 1.86685074102564685372e-02, + 1.85571210341025014112e-02, + 1.84365192895308768750e-02, + 1.83067859204682249763e-02, + 1.81680091334814851345e-02, + 1.80202815420731528306e-02, + 1.78637001088602434540e-02, + 1.76983660856705124487e-02, + 1.75243849515933046435e-02, + 1.73418663490196370280e-02, + 1.71509240177099529789e-02, + 1.69516757269280171627e-02, + 1.67442432056789658468e-02, + 1.65287520710933055756e-02, + 1.63053317549959643495e-02, + 1.60741154287042248283e-02, + 1.58352399260948337179e-02, + 1.55888456649855098451e-02, + 1.53350765668743439091e-02, + 1.50740799750810755553e-02, + 1.48060065713376716456e-02, + 1.45310102908721653497e-02, + 1.42492482360351419013e-02, + 1.39608805885138576031e-02, + 1.36660705201842418155e-02, + 1.33649841026482960049e-02, + 1.30577902155067059053e-02, + 1.27446604534163440703e-02, + 1.24257690319823609071e-02, + 1.21012926925372719250e-02, + 1.17714106058561026463e-02, + 1.14363042748611334204e-02, + 1.10961574363676110377e-02, + 1.07511559619219848605e-02, + 1.04014877577871447251e-02, + 1.00473426641261246589e-02, + 9.68891235343915212253e-03, + 9.32639022830554151322e-03, + 8.95997131848667513476e-03, + 8.58985217744295814768e-03, + 8.21623077831776238433e-03, + 7.83930640944576623275e-03, + 7.45927956943647635368e-03, + 7.07635186189118064320e-03, + 6.69072588980388575225e-03, + 6.30260514970595094736e-03, + 5.91219392560345287368e-03, + 5.51969718276637197341e-03, + 5.12532046142244023662e-03, + 4.72926977040892190796e-03, + 4.33175148083997027526e-03, + 3.93297221983980160170e-03, + 3.53313876439927251547e-03, + 3.13245793540825817960e-03, + 2.73113649191582047102e-03, + 2.32938102567640907548e-03, + 1.92739785602901348045e-03, + 1.52539292516795199454e-03, + 1.12357169385324685146e-03, + 7.22139037616026076630e-04, + 3.21299143509566089132e-04, +-7.87445925439102364842e-05, +-4.77789667756481134173e-04, +-8.75634573781077039240e-04, +-1.27207889726797546831e-03, +-1.66692341962379432171e-03, +-2.05997021592245954311e-03, +-2.45102275292159678052e-03, +-2.83988598613405971924e-03, +-3.22636645590845556192e-03, +-3.61027238247302534671e-03, +-3.99141375989387706819e-03, +-4.36960244890573310667e-03, +-4.74465226856734742511e-03, +-5.11637908669945132983e-03, +-5.48460090906132020916e-03, +-5.84913796722293360258e-03, +-6.20981280509260748224e-03, +-6.56645036405622325310e-03, +-6.91887806669126605857e-03, +-7.26692589901343100750e-03, +-7.61042649121839841903e-03, +-7.94921519688219710420e-03, +-8.28313017058056322295e-03, +-8.61201244389523008771e-03, +-8.93570599976736823500e-03, +-9.25405784516927093497e-03, +-9.56691808205707705515e-03, +-9.87413997657404438058e-03, +-1.01755800264738422573e-02, +-1.04710980267316584175e-02, +-1.07605571333162300385e-02, +-1.10438239250919990192e-02, +-1.13207684638271209587e-02, +-1.15912643522783440769e-02, +-1.18551887903295075782e-02, +-1.21124226291589674048e-02, +-1.23628504234125462247e-02, +-1.26063604813613176076e-02, +-1.28428449130213884893e-02, +-1.30721996762182875867e-02, +-1.32943246205750771616e-02, +-1.35091235294078314266e-02, +-1.37165041595128135710e-02, +-1.39163782788270101731e-02, +-1.41086617019519286464e-02, +-1.42932743235239592683e-02, +-1.44701401494216879556e-02, +-1.46391873257979802936e-02, +-1.48003481659278162547e-02, +-1.49535591748633858722e-02, +-1.50987610718883325661e-02, +-1.52358988107658115813e-02, +-1.53649215977745036421e-02, +-1.54857829075290397841e-02, +-1.55984404965814546506e-02, +-1.57028564148030853886e-02, +-1.57989970145448431482e-02, +-1.58868329575775346640e-02, +-1.59663392198137396583e-02, +-1.60374950938135772682e-02, +-1.61002841890790400481e-02, +-1.61546944301414231726e-02, +-1.62007180524483263007e-02, +-1.62383515960572676062e-02, +-1.62675958971449409474e-02, +-1.62884560773407099932e-02, +-1.63009415308956705226e-02, +-1.63050659096987474173e-02, +-1.63008471061523926848e-02, +-1.62883072339218455682e-02, +-1.62674726065730329561e-02, +-1.62383737141145109706e-02, +-1.62010451974609233361e-02, +-1.61555258208356707084e-02, +-1.61018584421316855726e-02, +-1.60400899812505326469e-02, +-1.59702713864408145372e-02, +-1.58924575986573272945e-02, +-1.58067075139647107707e-02, +-1.57130839440085059988e-02, +-1.56116535745792449352e-02, +-1.55024869222944727820e-02, +-1.53856582894260490724e-02, +-1.52612457168996174667e-02, +-1.51293309354949591372e-02, +-1.49899993152762481957e-02, +-1.48433398132821487564e-02, +-1.46894449195070758013e-02, +-1.45284106012046419082e-02, +-1.43603362455460986657e-02, +-1.41853246006673119201e-02, +-1.40034817151370259009e-02, +-1.38149168758828280734e-02, +-1.36197425446084856987e-02, +-1.34180742927401692316e-02, +-1.32100307349369578552e-02, +-1.29957334612042334221e-02, +-1.27753069676474068084e-02, +-1.25488785859041301896e-02, +-1.23165784112953900081e-02, +-1.20785392297338319001e-02, +-1.18348964434312736022e-02, +-1.15857879954438421077e-02, +-1.13313542930994892027e-02, +-1.10717381303457890890e-02, +-1.08070846090634192782e-02, +-1.05375410593865573988e-02, +-1.02632569590727744380e-02, +-9.98438385196800254340e-03, +-9.70107526560752726763e-03, +-9.41348662799971515336e-03, +-9.12177518363594015682e-03, +-8.82609990877025046840e-03, +-8.52662142601712247370e-03, +-8.22350191830830204442e-03, +-7.91690504225831676033e-03, +-7.60699584098104789748e-03, +-7.29394065640553979080e-03, +-6.97790704113636535422e-03, +-6.65906366990342071799e-03, +-6.33758025065010895116e-03, +-6.01362743530314651508e-03, +-5.68737673027295675271e-03, +-5.35900040672940281006e-03, +-5.02867141070039921913e-03, +-4.69656327303835750137e-03, +-4.36285001930248206997e-03, +-4.02770607960259777180e-03, +-3.69130619844926536818e-03, +-3.35382534465939949331e-03, +-3.01543862135967731183e-03, +-2.67632117613655082580e-03, +-2.33664811137678819775e-03, +-1.99659439484433081508e-03, +-1.65633477053923894307e-03, +-1.31604366988200688349e-03, +-9.75895123270567642695e-04, +-6.36062672051197525343e-04, +-2.96719280950014205507e-04, + 4.19627489923029214371e-05, + 3.79811866940293777015e-04, + 7.16657358192283769176e-04, + 1.05232942947910620979e-03, + 1.38665929358586822832e-03, + 1.71947925326047606175e-03, + 2.05062278436349190031e-03, + 2.37992461822022008389e-03, + 2.70722082313579063065e-03, + 3.03234888503091078518e-03, + 3.35514778716229861502e-03, + 3.67545808888595972735e-03, + 3.99312200342836869094e-03, + 4.30798347462560838467e-03, + 4.61988825259515914490e-03, + 4.92868396830371639783e-03, + 5.23422020699498662111e-03, + 5.53634858044424124635e-03, + 5.83492279800282634405e-03, + 6.12979873640210736613e-03, + 6.42083450828168002950e-03, + 6.70789052941064140034e-03, + 6.99082958457222531506e-03, + 7.26951689207744420479e-03, + 7.54382016688265842619e-03, + 7.81360968227803008579e-03, + 8.07875833012169572434e-03, + 8.33914167959036965738e-03, + 8.59463803442023742407e-03, + 8.84512848861381158205e-03, + 9.09049698058539933088e-03, + 9.33063034572383098730e-03, + 9.56541836734724204572e-03, + 9.79475382602876601390e-03, + 1.00185325472712388750e-02, + 1.02366534475112885144e-02, + 1.04490185784319629392e-02, + 1.06555331695659429025e-02, + 1.08561056691723126222e-02, + 1.10506477833681605177e-02, + 1.12390745135014444300e-02, + 1.14213041917481192972e-02, + 1.15972585149209383992e-02, + 1.17668625764762845715e-02, + 1.19300448967066957673e-02, + 1.20867374511089888806e-02, + 1.22368756969161197878e-02, + 1.23803985977854972417e-02, + 1.25172486466337395256e-02, + 1.26473718866117884607e-02, + 1.27707179302137523863e-02, + 1.28872399765134221933e-02, + 1.29968948265256969976e-02, + 1.30996428966874464001e-02, + 1.31954482304573617740e-02, + 1.32842785080317399987e-02, + 1.33661050541768675060e-02, + 1.34409028441777739227e-02, + 1.35086505079049911532e-02, + 1.35693303320018558017e-02, + 1.36229282601955156012e-02, + 1.36694338917359037994e-02, + 1.37088404779683696588e-02, + 1.37411449170452750618e-02, + 1.37663477467847624597e-02, + 1.37844531356839973546e-02, + 1.37954688720959822018e-02, + 1.37994063515802581343e-02, + 1.37962805624378334612e-02, + 1.37861100694423310831e-02, + 1.37689169957797372806e-02, + 1.37447270032107649734e-02, + 1.37135692704694871907e-02, + 1.36754764699141325573e-02, + 1.36304847424457160204e-02, + 1.35786336707117930717e-02, + 1.35199662506130090928e-02, + 1.34545288611307815863e-02, + 1.33823712324960784892e-02, + 1.33035464127193650552e-02, + 1.32181107325021699600e-02, + 1.31261237685532539815e-02, + 1.30276483053305639631e-02, + 1.29227502952338896280e-02, + 1.28114988172704970942e-02, + 1.26939660342200184157e-02, + 1.25702271483237072724e-02, + 1.24403603555233947114e-02, + 1.23044467982784695020e-02, + 1.21625705169872422307e-02, + 1.20148184000413785211e-02, + 1.18612801325425308574e-02, + 1.17020481437095178606e-02, + 1.15372175530077808459e-02, + 1.13668861150298707019e-02, + 1.11911541631600167795e-02, + 1.10101245520525005406e-02, + 1.08239025989581676146e-02, + 1.06325960239305756377e-02, + 1.04363148889449076223e-02, + 1.02351715359647547215e-02, + 1.00292805239893083324e-02, + 9.81875856511689806827e-03, + 9.60372445965929077971e-03, + 9.38429903034274093265e-03, + 9.16060505563077998037e-03, + 8.93276720220602567235e-03, + 8.70091195664717161062e-03, + 8.46516755633743532561e-03, + 8.22566391964303297857e-03, + 7.98253257539762242634e-03, + 7.73590659173173638558e-03, + 7.48592050428459592631e-03, + 7.23271024383650030370e-03, + 6.97641306340083741655e-03, + 6.71716746481300884530e-03, + 6.45511312485713174836e-03, + 6.19039082096706390346e-03, + 5.92314235654277116555e-03, + 5.65351048592053172237e-03, + 5.38163883903518876911e-03, + 5.10767184581618297751e-03, + 4.83175466035329001513e-03, + 4.55403308487579983055e-03, + 4.27465349357983477596e-03, + 3.99376275634679561710e-03, + 3.71150816239089074641e-03, + 3.42803734387406560530e-03, + 3.14349819952992014238e-03, + 2.85803881833283880340e-03, + 2.57180740325433027441e-03, + 2.28495219514192630592e-03, + 1.99762139676367333693e-03, + 1.70996309705198873234e-03, + 1.42212519558894585903e-03, + 1.13425532736955879051e-03, + 8.46500787880119249379e-04, + 5.59008458531536360676e-04, + 2.71924732482213711831e-04, +-1.46045591101362367902e-05, +-3.00434220371862336588e-04, +-5.85419763496916080447e-04, +-8.69417480990889736912e-04, +-1.15228451734444565895e-03, +-1.43387894009652252202e-03, +-1.71405981025574941264e-03, +-1.99268725204318009406e-03, +-2.26962252192313383714e-03, +-2.54472807688939806764e-03, +-2.81786764197139655633e-03, +-3.08890627693018818625e-03, +-3.35771044210986593925e-03, +-3.62414806341412312415e-03, +-3.88808859637569193338e-03, +-4.14940308928948755479e-03, +-4.40796424537761438733e-03, +-4.66364648395760274940e-03, +-4.91632600058568031837e-03, +-5.16588082614466512915e-03, +-5.41219088485122776233e-03, +-5.65513805115323408418e-03, +-5.89460620549208617197e-03, +-6.13048128890366673949e-03, +-6.36265135643233371854e-03, +-6.59100662933489230694e-03, +-6.81543954604840913902e-03, +-7.03584481190112302068e-03, +-7.25211944754226237736e-03, +-7.46416283606952078722e-03, +-7.67187676883409296058e-03, +-7.87516548990104849060e-03, +-8.07393573914804915659e-03, +-8.26809679398036317943e-03, +-8.45756050964779383661e-03, +-8.64224135814309693537e-03, +-8.82205646566693382771e-03, +-8.99692564864382551826e-03, +-9.16677144827266789096e-03, +-9.33151916359954529401e-03, +-9.49109688309758385560e-03, +-9.64543551474287760850e-03, +-9.79446881457346311961e-03, +-9.93813341372091867132e-03, +-1.00763688439045248635e-02, +-1.02091175613780275888e-02, +-1.03363249693213758024e-02, +-1.04579394386685748525e-02, +-1.05739123273658041507e-02, +-1.06841979980529435540e-02, +-1.07887538341634794947e-02, +-1.08875402544387003823e-02, +-1.09805207258518982422e-02, +-1.10676617749403266577e-02, +-1.11489329975425002783e-02, +-1.12243070669403085388e-02, +-1.12937597404047310179e-02, +-1.13572698641464103764e-02, +-1.14148193766721185033e-02, +-1.14663933105489043718e-02, +-1.15119797925795526450e-02, +-1.15515700423923072665e-02, +-1.15851583694501700239e-02, +-1.16127421684842080385e-02, +-1.16343219133579756086e-02, +-1.16499011493693144931e-02, +-1.16594864839973874626e-02, +-1.16630875761035632254e-02, +-1.16607171235953484961e-02, +-1.16523908495632707444e-02, +-1.16381274869015692575e-02, +-1.16179487614245235960e-02, +-1.15918793734899987224e-02, +-1.15599469781440481603e-02, +-1.15221821637996792859e-02, +-1.14786184294645918214e-02, +-1.14292921605328150897e-02, +-1.13742426031563578781e-02, +-1.13135118372134652748e-02, +-1.12471447478901080685e-02, +-1.11751889958936409530e-02, +-1.10976949863161849369e-02, +-1.10147158361676694022e-02, +-1.09263073405979870001e-02, +-1.08325279378290572491e-02, +-1.07334386728172945930e-02, +-1.06291031596689976302e-02, +-1.05195875428303799864e-02, +-1.04049604570749746474e-02, +-1.02852929863124966520e-02, +-1.01606586212423712773e-02, +-1.00311332158768314049e-02, +-9.89679494295862653697e-03, +-9.75772424829860450524e-03, +-9.61400380405963254915e-03, +-9.46571846101251432315e-03, +-9.31295519979207127303e-03, +-9.15580308117954107250e-03, +-8.99435319544003054892e-03, +-8.82869861074311521043e-03, +-8.65893432069447625821e-03, +-8.48515719100898131722e-03, +-8.30746590535331487504e-03, +-8.12596091038898099557e-03, +-7.94074436004471931327e-03, +-7.75192005904976402797e-03, +-7.55959340575841978738e-03, +-7.36387133429604930773e-03, +-7.16486225605968488073e-03, +-6.96267600060247564275e-03, +-6.75742375593618195551e-03, +-6.54921800828115602267e-03, +-6.33817248129906873205e-03, +-6.12440207483747056649e-03, +-5.90802280322155672770e-03, +-5.68915173312445864029e-03, +-5.46790692104878739421e-03, +-5.24440735045367430189e-03, +-5.01877286855873742250e-03, +-4.79112412285956183744e-03, +-4.56158249738753112518e-03, +-4.33027004874617267582e-03, +-4.09730944195998200014e-03, +-3.86282388616571940171e-03, +-3.62693707018273397286e-03, +-3.38977309799298612628e-03, +-3.15145642416600349836e-03, +-2.91211178926129628936e-03, +-2.67186415524058896998e-03, +-2.43083864092491410552e-03, +-2.18916045752724818321e-03, +-1.94695484429555434880e-03, +-1.70434700429766003774e-03, +-1.46146204038146722802e-03, +-1.21842489134170429109e-03, +-9.75360268326885652967e-04, +-7.32392591517812274748e-04, +-4.89645927108687487733e-04, +-2.47243924624317883750e-04, +-5.30975460243512911756e-06, + 2.36033953325794955153e-04, + 4.76665171927515821017e-04, + 7.16462537401301477295e-04, + 9.55305409921098193718e-04, + 1.19307393366231218393e-03, + 1.42964909627860559810e-03, + 1.66491278780242935725e-03, + 1.89874785893865663695e-03, + 2.13103817872366176761e-03, + 2.36166869152246855501e-03, + 2.59052547333455795292e-03, + 2.81749578738373649203e-03, + 3.04246813896196085722e-03, + 3.26533232950441303435e-03, + 3.48597950986718595895e-03, + 3.70430223278326144556e-03, + 3.92019450447253243325e-03, + 4.13355183537975935659e-03, + 4.34427129001856843216e-03, + 4.55225153589615232075e-03, + 4.75739289149763357190e-03, + 4.95959737330627960239e-03, + 5.15876874183868530666e-03, + 5.35481254667346043274e-03, + 5.54763617045254779636e-03, + 5.73714887183583450297e-03, + 5.92326182738835572278e-03, + 6.10588817238264490450e-03, + 6.28494304049680499458e-03, + 6.46034360239086408867e-03, + 6.63200910314530080181e-03, + 6.79986089854376415248e-03, + 6.96382249018552904052e-03, + 7.12381955941148153205e-03, + 7.27978000003043010380e-03, + 7.43163394983032809388e-03, + 7.57931382086227036637e-03, + 7.72275432848473775138e-03, + 7.86189251915526618464e-03, + 7.99666779695973849174e-03, + 8.12702194886731447976e-03, + 8.25289916870263103033e-03, + 8.37424607982448221399e-03, + 8.49101175650416456486e-03, + 8.60314774399449817832e-03, + 8.71060807728277902706e-03, + 8.81334929852170718967e-03, + 8.91133047313173894122e-03, + 9.00451320457064906255e-03, + 9.09286164776551726618e-03, + 9.17634252120343510417e-03, + 9.25492511767886209817e-03, + 9.32858131369380602638e-03, + 9.39728557751129400799e-03, + 9.46101497585938137902e-03, + 9.51974917928707746462e-03, + 9.57347046617182048656e-03, + 9.62216372537993622216e-03, + 9.66581645758253331369e-03, + 9.70441877522852311411e-03, + 9.73796340117899505984e-03, + 9.76644566600631813813e-03, + 9.78986350396279965402e-03, + 9.80821744762437608411e-03, + 9.82151062121512652414e-03, + 9.82974873261935853941e-03, + 9.83294006408857654278e-03, + 9.83109546165142171581e-03, + 9.82422832323481126648e-03, + 9.81235458550605912920e-03, + 9.79549270944552429030e-03, + 9.77366366466025406068e-03, + 9.74689091245018769671e-03, + 9.71520038763806249860e-03, + 9.67862047917591658552e-03, + 9.63718200954081366527e-03, + 9.59091821293355135947e-03, + 9.53986471229417709594e-03, + 9.48405949514947999024e-03, + 9.42354288830722815196e-03, + 9.35835753141333638594e-03, + 9.28854834938808680833e-03, + 9.21416252375845123979e-03, + 9.13524946290390424397e-03, + 9.05186077123359793262e-03, + 8.96405021731353467140e-03, + 8.87187370096227494176e-03, + 8.77538921933519559804e-03, + 8.67465683201655221590e-03, + 8.56973862514041548333e-03, + 8.46069867456020023588e-03, + 8.34760300808964732233e-03, + 8.23051956683512782320e-03, + 8.10951816564266063370e-03, + 7.98467045268167613381e-03, + 7.85604986818807735083e-03, + 7.72373160239066269828e-03, + 7.58779255264339144021e-03, + 7.44831127978854735938e-03, + 7.30536796377457674917e-03, + 7.15904435855267175237e-03, + 7.00942374627864812214e-03, + 6.85659089084312764473e-03, + 6.70063199075772355368e-03, + 6.54163463142106230142e-03, + 6.37968773679228450674e-03, + 6.21488152049734249999e-03, + 6.04730743639451170240e-03, + 5.87705812862679335268e-03, + 5.70422738118673677138e-03, + 5.52891006702203955531e-03, + 5.35120209670836722432e-03, + 5.17120036671731789918e-03, + 4.98900270730638639716e-03, + 4.80470783005945180355e-03, + 4.61841527510534633622e-03, + 4.43022535804147177957e-03, + 4.24023911659228945614e-03, + 4.04855825702851463560e-03, + 3.85528510037712974709e-03, + 3.66052252844891639130e-03, + 3.46437392971235937414e-03, + 3.26694314504209770700e-03, + 3.06833441336932816884e-03, + 2.86865231726372458751e-03, + 2.66800172847322068781e-03, + 2.46648775345124351629e-03, + 2.26421567889880867575e-03, + 2.06129091734864790947e-03, + 1.85781895282100093132e-03, + 1.65390528657631021014e-03, + 1.44965538299551312262e-03, + 1.24517461561208316219e-03, + 1.04056821332572727035e-03, + 8.35941206823879187984e-04, + 6.31398375237409098873e-04, + 4.27044193058938911355e-04, + 2.22982777348387794809e-04, + 1.93178352541883997372e-05, +-1.83847388125652280721e-04, +-3.86410161515063485180e-04, +-5.88268318839344113436e-04, +-7.89320310186791547317e-04, +-9.89465252327087745748e-04, +-1.18860297876262669368e-03, +-1.38663408928657127910e-03, +-1.58345999902536368857e-03, +-1.77898298694016492559e-03, +-1.97310624376432260790e-03, +-2.16573391935423681734e-03, +-2.35677116942951958567e-03, +-2.54612420168103805937e-03, +-2.73370032122395708804e-03, +-2.91940797537506343401e-03, +-3.10315679773186291548e-03, +-3.28485765153320842871e-03, +-3.46442267228143797181e-03, +-3.64176530960461748362e-03, +-3.81680036834099439130e-03, +-3.98944404882473329516e-03, +-4.15961398635617159159e-03, +-4.32722928983605027026e-03, +-4.49221057954843436960e-03, +-4.65448002407309498196e-03, +-4.81396137631140419444e-03, +-4.97058000860978871360e-03, +-5.12426294696375662918e-03, +-5.27493890428890055411e-03, +-5.42253831274242328875e-03, +-5.56699335508204027484e-03, +-5.70823799504863171883e-03, +-5.84620800675817245406e-03, +-5.98084100309233864662e-03, +-6.11207646307366722627e-03, +-6.23985575821544256880e-03, +-6.36412217783412659938e-03, +-6.48482095331432296242e-03, +-6.60189928131710984660e-03, +-6.71530634592089337165e-03, +-6.82499333968801785016e-03, +-6.93091348364723199016e-03, +-7.03302204618568189975e-03, +-7.13127636084264718980e-03, +-7.22563584299942916062e-03, +-7.31606200545875488828e-03, +-7.40251847290886687281e-03, +-7.48497099526800394043e-03, +-7.56338745990427392674e-03, +-7.63773790272863697948e-03, +-7.70799451815705905650e-03, +-7.77413166794023880596e-03, +-7.83612588885893024404e-03, +-7.89395589928373019040e-03, +-7.94760260459900953756e-03, +-7.99704910149071600267e-03, +-8.04228068109907878735e-03, +-8.08328483103710852820e-03, +-8.12005123627678772336e-03, +-8.15257177890556759825e-03, +-8.18084053675576655662e-03, +-8.20485378091061375028e-03, +-8.22460997209095365235e-03, +-8.24010975592739773610e-03, +-8.25135595712299906024e-03, +-8.25835357251225588016e-03, +-8.26110976302289051754e-03, +-8.25963384454711686822e-03, +-8.25393727773001892323e-03, +-8.24403365668276502665e-03, +-8.22993869662941301968e-03, +-8.21167022049609611478e-03, +-8.18924814445231435966e-03, +-8.16269446241428900390e-03, +-8.13203322952094770359e-03, +-8.09729054459370524433e-03, +-8.05849453159142650738e-03, +-8.01567532007289515472e-03, +-7.96886502467894497492e-03, +-7.91809772364769626218e-03, +-7.86340943637591806292e-03, +-7.80483810004095092394e-03, +-7.74242354529683460967e-03, +-7.67620747106049876318e-03, +-7.60623341840202440295e-03, +-7.53254674355573021483e-03, +-7.45519459006761028158e-03, +-7.37422586009548602926e-03, +-7.28969118487934625988e-03, +-7.20164289439836468459e-03, +-7.11013498623295006618e-03, +-7.01522309364934187198e-03, +-6.91696445292533119292e-03, +-6.81541786993564071423e-03, +-6.71064368601629723105e-03, +-6.60270374312706912617e-03, +-6.49166134833155817480e-03, +-6.37758123761547179170e-03, +-6.26052953906250375660e-03, +-6.14057373540916311833e-03, +-6.01778262599883193018e-03, +-5.89222628815630304622e-03, +-5.76397603800424263021e-03, +-5.63310439074257793962e-03, +-5.49968502041355174204e-03, +-5.36379271917321667762e-03, +-5.22550335609255588165e-03, +-5.08489383551021401769e-03, +-4.94204205495888618943e-03, +-4.79702686268924927138e-03, +-4.64992801481256979451e-03, +-4.50082613208717050024e-03, +-4.34980265636943953800e-03, +-4.19693980675457916502e-03, +-4.04232053542952999431e-03, +-3.88602848326117904232e-03, +-3.72814793514442046479e-03, +-3.56876377513224178270e-03, +-3.40796144137293617951e-03, +-3.24582688087653560907e-03, +-3.08244650413554361137e-03, +-2.91790713962266495818e-03, +-2.75229598818970896956e-03, +-2.58570057739144132034e-03, +-2.41820871575722370558e-03, +-2.24990844703554021197e-03, +-2.08088800443330694187e-03, +-1.91123576487488202463e-03, +-1.74104020330362123901e-03, +-1.57038984704899425675e-03, +-1.39937323028345179249e-03, +-1.22807884859140337835e-03, +-1.05659511367403743075e-03, +-8.85010308212021861753e-04, +-7.13412540909905373669e-04, +-5.41889701744388552207e-04, +-3.70529417438410636591e-04, +-1.99419007184688332895e-04, +-2.86454386391723757354e-05, + 1.41704715791932274720e-04, + 3.11545322351527997646e-04, + 4.80790728994517078173e-04, + 6.49355808093498481151e-04, + 8.17155998766742235409e-04, + 9.84107348806230984584e-04, + 1.15012655618750773805e-03, + 1.31513101013778751017e-03, + 1.47903883174614527579e-03, + 1.64176891409281364154e-03, + 1.80324096188044400921e-03, + 1.96337553054683720821e-03, + 2.12209406484084378217e-03, + 2.27931893684354004020e-03, + 2.43497348341521844400e-03, + 2.58898204305202080458e-03, + 2.74126999213337996242e-03, + 2.89176378054382390501e-03, + 3.04039096665289229962e-03, + 3.18708025163550725742e-03, + 3.33176151311842744587e-03, + 3.47436583813595005824e-03, + 3.61482555538014498075e-03, + 3.75307426673132269943e-03, + 3.88904687805323055413e-03, + 4.02267962924054024026e-03, + 4.15391012350339004777e-03, + 4.28267735587738347658e-03, + 4.40892174094537157153e-03, + 4.53258513975950821928e-03, + 4.65361088595093140563e-03, + 4.77194381101678308937e-03, + 4.88753026877269871470e-03, + 5.00031815896078389583e-03, + 5.11025695000340892532e-03, + 5.21729770089245179637e-03, + 5.32139308220599526605e-03, + 5.42249739624305147206e-03, + 5.52056659626851391892e-03, + 5.61555830486112211863e-03, + 5.70743183135652247528e-03, + 5.79614818837954730302e-03, + 5.88167010745905063929e-03, + 5.96396205371965346109e-03, + 6.04299023964566684591e-03, + 6.11872263791200451943e-03, + 6.19112899327779828834e-03, + 6.26018083353982283945e-03, + 6.32585147954144774024e-03, + 6.38811605423505318724e-03, + 6.44695149079576538403e-03, + 6.50233653978409681384e-03, + 6.55425177535713839039e-03, + 6.60267960052677606309e-03, + 6.64760425146517907463e-03, + 6.68901180085764834188e-03, + 6.72689016030344512365e-03, + 6.76122908176596693758e-03, + 6.79202015807388054941e-03, + 6.81925682247539518416e-03, + 6.84293434724847406819e-03, + 6.86304984136987261678e-03, + 6.87960224724697578386e-03, + 6.89259233651607575860e-03, + 6.90202270491214152359e-03, + 6.90789776621477530361e-03, + 6.91022374527592089799e-03, + 6.90900867013538935724e-03, + 6.90426236323048170274e-03, + 6.89599643170657299052e-03, + 6.88422425683606498820e-03, + 6.86896098255334458527e-03, + 6.85022350311395231137e-03, + 6.82803044988653656810e-03, + 6.80240217728674077119e-03, + 6.77336074786231978617e-03, + 6.74092991653942995994e-03, + 6.70513511404041261804e-03, + 6.66600342948348283806e-03, + 6.62356359217582818522e-03, + 6.57784595261113724102e-03, + 6.52888246268356915031e-03, + 6.47670665513047465189e-03, + 6.42135362221612788353e-03, + 6.36285999366974046321e-03, + 6.30126391389077868121e-03, + 6.23660501843537051769e-03, + 6.16892440979760654785e-03, + 6.09826463250009130623e-03, + 6.02466964750847117777e-03, + 5.94818480598439686818e-03, + 5.86885682239295450313e-03, + 5.78673374697901473501e-03, + 5.70186493762921998985e-03, + 5.61430103113523277375e-03, + 5.52409391387439444726e-03, + 5.43129669192503241465e-03, + 5.33596366063239947036e-03, + 5.23815027364322050724e-03, + 5.13791311142524926431e-03, + 5.03530984929013124274e-03, + 4.93039922493699201561e-03, + 4.82324100553432541516e-03, + 4.71389595435920891187e-03, + 4.60242579701116046043e-03, + 4.48889318721965805553e-03, + 4.37336167226419578885e-03, + 4.25589565802507278913e-03, + 4.13656037368400047310e-03, + 4.01542183609403160321e-03, + 3.89254681383765111652e-03, + 3.76800279099204432978e-03, + 3.64185793062176202395e-03, + 3.51418103801726458557e-03, + 3.38504152369975422690e-03, + 3.25450936621163181353e-03, + 3.12265507471182202082e-03, + 2.98954965139678783756e-03, + 2.85526455376563029209e-03, + 2.71987165675057146821e-03, + 2.58344321473122102290e-03, + 2.44605182345362590079e-03, + 2.30777038187338556438e-03, + 2.16867205394239955310e-03, + 2.02883023036007446166e-03, + 1.88831849030696359050e-03, + 1.74721056318321156346e-03, + 1.60558029036844077814e-03, + 1.46350158702526116430e-03, + 1.32104840396417614300e-03, + 1.17829468959044993299e-03, + 1.03531435195189738287e-03, + 8.92181220906407453086e-04, + 7.48969010429437957559e-04, + 6.05751281079198837520e-04, + 4.62601402639519420582e-04, + 3.19592516958703328628e-04, + 1.76797501002548605557e-04, + 3.42889301410700559898e-05, +-1.07860958314116714895e-04, +-2.49580301302545907224e-04, +-3.90797645920318444633e-04, +-5.31441985020897648614e-04, +-6.71442792492634734323e-04, +-8.10730058197295030964e-04, +-9.49234322550691531593e-04, +-1.08688671073021991820e-03, +-1.22361896649146595362e-03, +-1.35936348557852870918e-03, +-1.49405334871076226656e-03, +-1.62762235413136985458e-03, +-1.76000504970118200505e-03, +-1.89113676452272319942e-03, +-2.02095364007995759864e-03, +-2.14939266087792180127e-03, +-2.27639168456901649570e-03, +-2.40188947155079574047e-03, +-2.52582571402181800535e-03, +-2.64814106448245725756e-03, +-2.76877716366639818613e-03, +-2.88767666789123715262e-03, +-3.00478327581455654377e-03, +-3.12004175458374362687e-03, +-3.23339796536792432186e-03, +-3.34479888826014811615e-03, +-3.45419264653828387429e-03, +-3.56152853027508903283e-03, +-3.66675701928568381627e-03, +-3.76982980540296712391e-03, +-3.87069981407154629915e-03, +-3.96932122525004045521e-03, +-4.06564949361390860078e-03, +-4.15964136804923296370e-03, +-4.25125491042980478001e-03, +-4.34044951367000032827e-03, +-4.42718591904522635466e-03, +-4.51142623277396223602e-03, +-4.59313394185401763226e-03, +-4.67227392914710930316e-03, +-4.74881248770633347667e-03, +-4.82271733434034600985e-03, +-4.89395762241020149813e-03, +-4.96250395385362200878e-03, +-5.02832839043272725871e-03, +-5.09140446420189209803e-03, +-5.15170718719160612709e-03, +-5.20921306030622689037e-03, +-5.26390008143260215712e-03, +-5.31574775275780748302e-03, +-5.36473708729396422251e-03, +-5.41085061460937211120e-03, +-5.45407238576448103601e-03, +-5.49438797745297521219e-03, +-5.53178449534730623527e-03, +-5.56625057664943048014e-03, +-5.59777639184752800333e-03, +-5.62635364567968653676e-03, +-5.65197557730641106377e-03, +-5.67463695969378130457e-03, +-5.69433409820978980731e-03, +-5.71106482843655206827e-03, +-5.72482851320176878984e-03, +-5.73562603883285941631e-03, +-5.74345981063785135379e-03, +-5.74833374761739290815e-03, +-5.75025327641265435880e-03, +-5.74922532449426235829e-03, +-5.74525831259774157761e-03, +-5.73836214641150563903e-03, +-5.72854820752343851104e-03, +-5.71582934363289423690e-03, +-5.70021985803501312490e-03, +-5.68173549838472177059e-03, +-5.66039344474815377811e-03, +-5.63621229694941539706e-03, +-5.60921206122125953764e-03, +-5.57941413616825417771e-03, +-5.54684129805165914567e-03, +-5.51151768540501883070e-03, +-5.47346878299080803754e-03, +-5.43272140510751410519e-03, +-5.38930367825777700136e-03, +-5.34324502318837303572e-03, +-5.29457613631248175806e-03, +-5.24332897052591333231e-03, +-5.18953671542863627375e-03, +-5.13323377696330972880e-03, +-5.07445575648276473585e-03, +-5.01323942925907713175e-03, +-4.94962272244652261993e-03, +-4.88364469251110090015e-03, +-4.81534550214015970304e-03, +-4.74476639664476486369e-03, +-4.67194967986881478511e-03, +-4.59693868961848651350e-03, +-4.51977777262569171968e-03, +-4.44051225906016977518e-03, +-4.35918843660393785094e-03, +-4.27585352410331936968e-03, +-4.19055564481250319292e-03, +-4.10334379924411681712e-03, +-4.01426783764161857621e-03, +-3.92337843208837196152e-03, +-3.83072704826951850737e-03, +-3.73636591690094466492e-03, +-3.64034800484260446379e-03, +-3.54272698590992135906e-03, +-3.44355721140094522825e-03, +-3.34289368035381060859e-03, +-3.24079200955149126021e-03, +-3.13730840328953165461e-03, +-3.03249962292274259992e-03, +-2.92642295620787733917e-03, +-2.81913618645769506812e-03, +-2.71069756152355744588e-03, +-2.60116576262271661374e-03, +-2.49059987302636997100e-03, +-2.37905934662592955658e-03, +-2.26660397639284923177e-03, +-2.15329386274948570215e-03, +-2.03918938186720523700e-03, +-1.92435115390780829905e-03, +-1.80884001122574964056e-03, +-1.69271696654636218636e-03, +-1.57604318113799030283e-03, +-1.45887993299307315576e-03, +-1.34128858503558523983e-03, +-1.22333055337022866653e-03, +-1.10506727559064096139e-03, +-9.86560179161664061245e-04, +-8.67870649892684017067e-04, +-7.49060000517653913794e-04, +-6.30189439397319385409e-04, +-5.11320039360376723744e-04, +-3.92512706698102461101e-04, +-2.73828150328942268588e-04, +-1.55326851148111989192e-04, +-3.70690315771187548660e-05, + 8.08853746707290755880e-05, + 1.98476752594946217068e-04, + 3.15645835666873892950e-04, + 4.32333735328772883737e-04, + 5.48481970218807931942e-04, + 6.64032495107181436854e-04, + 7.78927729529055225960e-04, + 8.93110586101435741449e-04, + 1.00652449850903457675e-03, + 1.11911344914620018882e-03, + 1.23082199640186964844e-03, + 1.34159530157362035657e-03, + 1.45137915539899904453e-03, + 1.56012000419063017430e-03, + 1.66776497556303743633e-03, + 1.77426190373947069608e-03, + 1.87955935442584700854e-03, + 1.98360664924133621098e-03, + 2.08635388969323877853e-03, + 2.18775198068548414054e-03, + 2.28775265355017198149e-03, + 2.38630848859077522237e-03, + 2.48337293712776532861e-03, + 2.57890034303572641614e-03, + 2.67284596376264485876e-03, + 2.76516599082240414204e-03, + 2.85581756975021973724e-03, + 2.94475881951346621368e-03, + 3.03194885136837165643e-03, + 3.11734778715522806505e-03, + 3.20091677702330967489e-03, + 3.28261801657889207284e-03, + 3.36241476344812956906e-03, + 3.44027135324883812095e-03, + 3.51615321496371192184e-03, + 3.59002688570913630964e-03, + 3.66186002489374750821e-03, + 3.73162142776055534565e-03, + 3.79928103830806575963e-03, + 3.86480996158482074943e-03, + 3.92818047535295911815e-03, + 3.98936604111683416202e-03, + 4.04834131451196205242e-03, + 4.10508215505163594206e-03, + 4.15956563522717256282e-03, + 4.21177004895932887568e-03, + 4.26167491939793193628e-03, + 4.30926100606804449861e-03, + 4.35451031136011804806e-03, + 4.39740608636303952073e-03, + 4.43793283603874291060e-03, + 4.47607632373735360443e-03, + 4.51182357505270758419e-03, + 4.54516288101758283297e-03, + 4.57608380063932208837e-03, + 4.60457716277592760817e-03, + 4.63063506735364276146e-03, + 4.65425088592728592590e-03, + 4.67541926158465074442e-03, + 4.69413610819694772369e-03, + 4.71039860901748680400e-03, + 4.72420521463094104236e-03, + 4.73555564025632692166e-03, + 4.74445086240650633347e-03, + 4.75089311490801708554e-03, + 4.75488588428478291259e-03, + 4.75643390451007622849e-03, + 4.75554315113093165057e-03, + 4.75222083476989180795e-03, + 4.74647539400918638819e-03, + 4.73831648766260323663e-03, + 4.72775498644069803317e-03, + 4.71480296401554071356e-03, + 4.69947368749087587836e-03, + 4.68178160728457970485e-03, + 4.66174234643011633356e-03, + 4.63937268930397338912e-03, + 4.61469056978682824754e-03, + 4.58771505886557909998e-03, + 4.55846635168473662131e-03, + 4.52696575405490270194e-03, + 4.49323566842705062613e-03, + 4.45729957934127077324e-03, + 4.41918203835877602265e-03, + 4.37890864848652049124e-03, + 4.33650604810387890753e-03, + 4.29200189440092326476e-03, + 4.24542484633809186906e-03, + 4.19680454713776754372e-03, + 4.14617160631750546196e-03, + 4.09355758127592610218e-03, + 4.03899495844180136256e-03, + 3.98251713399709519198e-03, + 3.92415839418544434153e-03, + 3.86395389521696766208e-03, + 3.80193964278122088427e-03, + 3.73815247117977034197e-03, + 3.67263002209005122098e-03, + 3.60541072297290579943e-03, + 3.53653376513536534670e-03, + 3.46603908146142026050e-03, + 3.39396732382294752731e-03, + 3.32035984018316321711e-03, + 3.24525865140575702286e-03, + 3.16870642778174132007e-03, + 3.09074646528776763449e-03, + 3.01142266158806225576e-03, + 2.93077949179369311866e-03, + 2.84886198399182102511e-03, + 2.76571569455873623317e-03, + 2.68138668326939897182e-03, + 2.59592148821740460393e-03, + 2.50936710055862152030e-03, + 2.42177093909172859790e-03, + 2.33318082468986958203e-03, + 2.24364495459622101392e-03, + 2.15321187659778126924e-03, + 2.06193046309074068043e-03, + 1.96984988505084042051e-03, + 1.87701958592308018950e-03, + 1.78348925544364851972e-03, + 1.68930880340843595812e-03, + 1.59452833340149326656e-03, + 1.49919811649695529192e-03, + 1.40336856494826384134e-03, + 1.30709020587860356294e-03, + 1.21041365498514362324e-03, + 1.11338959027166444805e-03, + 1.01606872582251793642e-03, + 9.18501785631088349393e-04, + 8.20739477496859018597e-04, + 7.22832467003395990300e-04, + 6.24831351591239583451e-04, + 5.26786634738466547599e-04, + 4.28748700261665177755e-04, + 3.30767786750949313850e-04, + 2.32893962150942354693e-04, + 1.35177098501164551355e-04, + 3.76668468481058423122e-05, +-5.95873876588743519559e-05, +-1.56536470474729711095e-04, +-2.53131562157722037748e-04, +-3.49324142647419787298e-04, +-4.45066035310075810549e-04, +-5.40309430740103734635e-04, +-6.35006910305014118934e-04, +-7.29111469423506203084e-04, +-8.22576540564630594166e-04, +-9.15356015957640898294e-04, +-1.00740427000084128463e-03, +-1.09867618135961594636e-03, +-1.18912715474222760448e-03, +-1.27871314234389459909e-03, +-1.36739066494837155016e-03, +-1.45511683267735177083e-03, +-1.54184936537829454448e-03, +-1.62754661264047644116e-03, +-1.71216757343079406702e-03, +-1.79567191533962417817e-03, +-1.87801999342815861480e-03, +-1.95917286866888803315e-03, +-2.03909232597019587571e-03, +-2.11774089177778042717e-03, +-2.19508185124423979562e-03, +-2.27107926495981587295e-03, +-2.34569798523625184378e-03, +-2.41890367193748701338e-03, +-2.49066280784942736815e-03, +-2.56094271358263403382e-03, +-2.62971156200168766290e-03, +-2.69693839217458606120e-03, +-2.76259312283697608739e-03, +-2.82664656536508410861e-03, +-2.88907043625251033769e-03, +-2.94983736908550680730e-03, +-3.00892092601204481916e-03, +-3.06629560870052934873e-03, +-3.12193686878331445531e-03, +-3.17582111778177576464e-03, +-3.22792573650879186659e-03, +-3.27822908394535990351e-03, +-3.32671050558861836413e-03, +-3.37335034126782541686e-03, +-3.41812993242640843911e-03, +-3.46103162886747485125e-03, +-3.50203879496072990885e-03, +-3.54113581530953033458e-03, +-3.57830809987640932265e-03, +-3.61354208856588636489e-03, +-3.64682525526394910736e-03, +-3.67814611133359227815e-03, +-3.70749420856602597552e-03, +-3.73486014158783824479e-03, +-3.76023554972410066835e-03, +-3.78361311831824139590e-03, +-3.80498657950949356263e-03, +-3.82435071246891309174e-03, +-3.84170134309564249159e-03, +-3.85703534317483227867e-03, +-3.87035062899941184958e-03, +-3.88164615945781315415e-03, +-3.89092193359018290177e-03, +-3.89817898761586753217e-03, +-3.90341939143522623223e-03, +-3.90664624460901419717e-03, +-3.90786367181894002398e-03, +-3.90707681781324485393e-03, +-3.90429184184126710708e-03, +-3.89951591158146492616e-03, +-3.89275719656733548701e-03, +-3.88402486111620462786e-03, +-3.87332905676572971168e-03, +-3.86068091422367464308e-03, +-3.84609253483633988652e-03, +-3.82957698158139896172e-03, +-3.81114826959133828205e-03, +-3.79082135621343309026e-03, +-3.76861213061301580582e-03, +-3.74453740292646350060e-03, +-3.71861489297091191847e-03, +-3.69086321851783442580e-03, +-3.66130188313754665122e-03, +-3.62995126362247863203e-03, +-3.59683259699652849509e-03, +-3.56196796711877707378e-03, +-3.52538029088927777621e-03, +-3.48709330406542271710e-03, +-3.44713154669716278014e-03, +-3.40552034818984500006e-03, +-3.36228581200323853317e-03, +-3.31745479999584480524e-03, +-3.27105491642360043589e-03, +-3.22311449160199306810e-03, +-3.17366256524132884023e-03, +-3.12272886946435550976e-03, +-3.07034381151609402430e-03, +-3.01653845617577253541e-03, +-2.96134450788043245700e-03, +-2.90479429257073850854e-03, +-2.84692073926870632683e-03, +-2.78775736139794984292e-03, +-2.72733823785672839513e-03, +-2.66569799385409870324e-03, +-2.60287178151993913236e-03, +-2.53889526029965357373e-03, +-2.47380457714372692726e-03, +-2.40763634650355490621e-03, +-2.34042763014413865083e-03, +-2.27221591678447533066e-03, +-2.20303910157702452152e-03, +-2.13293546543681959357e-03, +-2.06194365423175264909e-03, +-1.99010265784496783933e-03, +-1.91745178912041433321e-03, +-1.84403066270314016858e-03, +-1.76987917378504866148e-03, +-1.69503747676780160310e-03, +-1.61954596385395933195e-03, +-1.54344524357734455208e-03, +-1.46677611928450082716e-03, +-1.38957956757772282952e-03, +-1.31189671673156917249e-03, +-1.23376882509377769348e-03, +-1.15523725948148982788e-03, +-1.07634347358468449377e-03, +-9.97128986387143959394e-04, +-9.17635360616648500243e-04, +-8.37904181234895789956e-04, +-7.57977033978787513406e-04, +-6.77895483963235779418e-04, +-5.97701054357152421204e-04, +-5.17435205142649512489e-04, +-4.37139311968777596797e-04, +-3.56854645110210024969e-04, +-2.76622348541154185371e-04, +-1.96483419135612727945e-04, +-1.16478686003570469231e-04, +-3.66487899740422618075e-05, + 4.29658367651341511670e-05, + 1.22324990860946911401e-04, + 2.01388717811737909388e-04, + 2.80117331797544979934e-04, + 3.58471435313892643378e-04, + 4.36411938600040889922e-04, + 5.13900078851591240840e-04, + 5.90897439209055901944e-04, + 6.67365967512406946770e-04, + 7.43267994812951346417e-04, + 8.18566253633950927961e-04, + 8.93223895970637264512e-04, + 9.67204511021861590946e-04, + 1.04047214264425358192e-03, + 1.11299130652140420249e-03, + 1.18472700703946731866e-03, + 1.25564475386154045418e-03, + 1.32571057819342382096e-03, + 1.39489104873262805863e-03, + 1.46315328729405358735e-03, + 1.53046498410463441449e-03, + 1.59679441276025036248e-03, + 1.66211044483838841015e-03, + 1.72638256415947395801e-03, + 1.78958088069116868016e-03, + 1.85167614408905580742e-03, + 1.91263975686785663195e-03, + 1.97244378719760738577e-03, + 2.03106098131931389963e-03, + 2.08846477557452425353e-03, + 2.14462930804391795764e-03, + 2.19952942979019039696e-03, + 2.25314071570019555310e-03, + 2.30543947492238164229e-03, + 2.35640276089497556142e-03, + 2.40600838096100867747e-03, + 2.45423490556669890092e-03, + 2.50106167703914496897e-03, + 2.54646881794065452556e-03, + 2.59043723899601840976e-03, + 2.63294864659046256791e-03, + 2.67398554983521103204e-03, + 2.71353126719851020857e-03, + 2.75156993270003411012e-03, + 2.78808650166653335112e-03, + 2.82306675604716231925e-03, + 2.85649730928709153985e-03, + 2.88836561075816750793e-03, + 2.91865994974546466220e-03, + 2.94736945898928888107e-03, + 2.97448411778179853254e-03, + 2.99999475461813899443e-03, + 3.02389304940205334848e-03, + 3.04617153520601608579e-03, + 3.06682359958635559691e-03, + 3.08584348545404892755e-03, + 3.10322629150200672218e-03, + 3.11896797218987227585e-03, + 3.13306533728775369815e-03, + 3.14551605098039102626e-03, + 3.15631863053354591933e-03, + 3.16547244452441024071e-03, + 3.17297771063858400492e-03, + 3.17883549303571563346e-03, + 3.18304769928660826611e-03, + 3.18561707688456985377e-03, + 3.18654720933417290318e-03, + 3.18584251182050994661e-03, + 3.18350822646264360050e-03, + 3.17955041715474407901e-03, + 3.17397596399888754642e-03, + 3.16679255733362226624e-03, + 3.15800869136252529770e-03, + 3.14763365738724267343e-03, + 3.13567753664971719460e-03, + 3.12215119278838691003e-03, + 3.10706626391348732577e-03, + 3.09043515430657261128e-03, + 3.07227102574976181429e-03, + 3.05258778849025729646e-03, + 3.03140009184578061371e-03, + 3.00872331445699433758e-03, + 2.98457355419296660459e-03, + 2.95896761771581541176e-03, + 2.93192300971099667137e-03, + 2.90345792178986830678e-03, + 2.87359122107115833381e-03, + 2.84234243844815569202e-03, + 2.80973175654865899714e-03, + 2.77577999739489662823e-03, + 2.74050860977057735360e-03, + 2.70393965630238552328e-03, + 2.66609580026378606421e-03, + 2.62700029210837524354e-03, + 2.58667695574077254050e-03, + 2.54515017453282822377e-03, + 2.50244487709332368713e-03, + 2.45858652279897166651e-03, + 2.41360108709495107052e-03, + 2.36751504657360840878e-03, + 2.32035536383917847733e-03, + 2.27214947216734537011e-03, + 2.22292525996793232518e-03, + 2.17271105505975571301e-03, + 2.12153560876561335380e-03, + 2.06942807983705873154e-03, + 2.01641801821680422338e-03, + 1.96253534864859182849e-03, + 1.90781035414268307880e-03, + 1.85227365930619859540e-03, + 1.79595621354771339470e-03, + 1.73888927416449511586e-03, + 1.68110438932177089048e-03, + 1.62263338093348468728e-03, + 1.56350832745304072283e-03, + 1.50376154658367453161e-03, + 1.44342557791726690958e-03, + 1.38253316551135724960e-03, + 1.32111724041281413007e-03, + 1.25921090313770521994e-03, + 1.19684740611688275949e-03, + 1.13406013611574898320e-03, + 1.07088259663794954646e-03, + 1.00734839032173340879e-03, + 9.43491201338451197442e-04, + 8.79344777802133358187e-04, + 8.14942914198997676867e-04, + 7.50319433846045077789e-04, + 6.85508171388117602645e-04, + 6.20542955341616764633e-04, + 5.55457590694125209752e-04, + 4.90285841569116395515e-04, + 4.25061413963795440944e-04, + 3.59817938569106346609e-04, + 2.94588953680933085706e-04, + 2.29407888210245771441e-04, + 1.64308044801349289110e-04, + 9.93225830661220992091e-05, + 3.44845029432159748818e-05, +-3.01733718103322993271e-05, +-9.46184099865878051579e-05, +-1.58818189144901994068e-04, +-2.22740511673599295237e-04, +-2.86353420686933518319e-04, +-3.49625215749474168095e-04, +-4.12524468420490651472e-04, +-4.75020037611034338584e-04, +-5.37081084745966554420e-04, +-5.98677088724102000189e-04, +-6.59777860668749548644e-04, +-7.20353558462378845868e-04, +-7.80374701058222453379e-04, +-8.39812182561741876058e-04, +-8.98637286076072534964e-04, +-9.56821697304657218380e-04, +-1.01433751790445296839e-03, +-1.07115727858425125243e-03, +-1.12725395194157021125e-03, +-1.18260096503265514645e-03, +-1.23717221166938983953e-03, +-1.29094206443821453087e-03, +-1.34388538643541812813e-03, +-1.39597754271321623266e-03, +-1.44719441143244622640e-03, +-1.49751239471598309415e-03, +-1.54690842919921311277e-03, +-1.59535999627203944548e-03, +-1.64284513200888535912e-03, +-1.68934243678199938477e-03, +-1.73483108455441971917e-03, +-1.77929083184826127527e-03, +-1.82270202638530284291e-03, +-1.86504561539608984359e-03, +-1.90630315359404723698e-03, +-1.94645681081197273812e-03, +-1.98548937929780454012e-03, +-2.02338428066662365593e-03, +-2.06012557250690765687e-03, +-2.09569795463821536424e-03, +-2.13008677501847496286e-03, +-2.16327803529848140124e-03, +-2.19525839602226170363e-03, +-2.22601518147149193827e-03, +-2.25553638415244925991e-03, +-2.28381066892440051305e-03, +-2.31082737676846549160e-03, +-2.33657652819600639496e-03, +-2.36104882629574550773e-03, +-2.38423565941946538627e-03, +-2.40612910350581450311e-03, +-2.42672192404203967281e-03, +-2.44600757766397268814e-03, +-2.46398021339438002067e-03, +-2.48063467352028057047e-03, +-2.49596649410964519650e-03, +-2.50997190516864723125e-03, +-2.52264783044025284534e-03, +-2.53399188684540720151e-03, +-2.54400238356825665262e-03, +-2.55267832078691359055e-03, +-2.56001938805160448795e-03, +-2.56602596231194192769e-03, +-2.57069910559561132235e-03, +-2.57404056234069840772e-03, +-2.57605275638400242275e-03, +-2.57673878760806066013e-03, +-2.57610242824962915389e-03, +-2.57414811887259368725e-03, +-2.57088096400836900457e-03, +-2.56630672746716416779e-03, +-2.56043182732341697075e-03, +-2.55326333057917390437e-03, +-2.54480894750897836121e-03, +-2.53507702569032763312e-03, +-2.52407654372365647388e-03, +-2.51181710464612895778e-03, +-2.49830892904353337597e-03, +-2.48356284786475705814e-03, +-2.46759029494360467016e-03, +-2.45040329923257435216e-03, +-2.43201447675357512387e-03, +-2.41243702227060758184e-03, +-2.39168470068965325834e-03, +-2.36977183819085321370e-03, +-2.34671331309871259233e-03, +-2.32252454649548413859e-03, +-2.29722149258377488293e-03, +-2.27082062880380698353e-03, +-2.24333894571130537665e-03, +-2.21479393662223902547e-03, +-2.18520358703003540410e-03, +-2.15458636380176215414e-03, +-2.12296120415960722083e-03, +-2.09034750445369690852e-03, +-2.05676510873303809365e-03, +-2.02223429712087166693e-03, +-1.98677577400132665889e-03, +-1.95041065602380068143e-03, +-1.91316045993188566660e-03, +-1.87504709022398054208e-03, +-1.83609282665202818569e-03, +-1.79632031156571974305e-03, +-1.75575253710894539118e-03, +-1.71441283227574312563e-03, +-1.67232484983291908656e-03, +-1.62951255311622692640e-03, +-1.58600020270752910083e-03, +-1.54181234300042021082e-03, +-1.49697378866114633872e-03, +-1.45150961099237444871e-03, +-1.40544512420743054025e-03, +-1.35880587162187237323e-03, +-1.31161761177006727826e-03, +-1.26390630445442453227e-03, +-1.21569809673418671551e-03, +-1.16701930886166653674e-03, +-1.11789642017300181083e-03, +-1.06835605494137557414e-03, +-1.01842496819956130141e-03, +-9.68130031539442812739e-04, +-9.17498218896290623249e-04, +-8.66556592324564493868e-04, +-8.15332287772978616183e-04, +-7.63852500866257408917e-04, +-7.12144472700820384964e-04, +-6.60235475661517237297e-04, +-6.08152799267011124132e-04, +-5.55923736050680200420e-04, +-5.03575567484773503439e-04, +-4.51135549954315671906e-04, +-3.98630900788171399930e-04, +-3.46088784354618185513e-04, +-2.93536298227804867602e-04, +-2.41000459432347881880e-04, +-1.88508190773214112049e-04, +-1.36086307257084302303e-04, +-8.37615026124415208318e-05, +-3.15603359146758591044e-05, + 2.04907816767023618287e-05, + 7.23656000628412833693e-05, + 1.24038043225600054433e-04, + 1.75482222116205200833e-04, + 2.26672447407071596913e-04, + 2.77583242099614419147e-04, + 3.28189353983021332804e-04, + 3.78465767937005519422e-04, + 4.28387718073507952569e-04, + 4.77930699711027453993e-04, + 5.27070481176294264314e-04, + 5.75783115427220041314e-04, + 6.24044951492278227381e-04, + 6.71832645720683982113e-04, + 7.19123172837888647094e-04, + 7.65893836801815361230e-04, + 8.12122281454607207463e-04, + 8.57786500964706813931e-04, + 9.02864850055145489773e-04, + 9.47336054012924352885e-04, + 9.91179218475344821562e-04, + 1.03437383898850724685e-03, + 1.07689981033424705438e-03, + 1.11873743562118156160e-03, + 1.15986743513579325555e-03, + 1.20027095494985164281e-03, + 1.23992957528063201672e-03, + 1.27882531860024116835e-03, + 1.31694065749045157408e-03, + 1.35425852224024464987e-03, + 1.39076230818266951932e-03, + 1.42643588276789089024e-03, + 1.46126359237003949389e-03, + 1.49523026882479484305e-03, + 1.52832123569547530945e-03, + 1.56052231426488533308e-03, + 1.59181982925111196493e-03, + 1.62220061424500194142e-03, + 1.65165201686719317030e-03, + 1.68016190364333106375e-03, + 1.70771866459552704512e-03, + 1.73431121754877184786e-03, + 1.75992901215076880984e-03, + 1.78456203360429659956e-03, + 1.80820080611094821665e-03, + 1.83083639602529585529e-03, + 1.85246041471891220720e-03, + 1.87306502115368290161e-03, + 1.89264292416397640097e-03, + 1.91118738444732896159e-03, + 1.92869221626372814270e-03, + 1.94515178884347187879e-03, + 1.96056102750367033591e-03, + 1.97491541447399011552e-03, + 1.98821098943195847739e-03, + 2.00044434974860733945e-03, + 2.01161265044509608366e-03, + 2.02171360386141883703e-03, + 2.03074547903829647627e-03, + 2.03870710081329245544e-03, + 2.04559784863279697439e-03, + 2.05141765508121132200e-03, + 2.05616700412915255278e-03, + 2.05984692910230610119e-03, + 2.06245901037309994214e-03, + 2.06400537277705341602e-03, + 2.06448868275625058155e-03, + 2.06391214523207744413e-03, + 2.06227950020990537586e-03, + 2.05959501911819184081e-03, + 2.05586350088483903534e-03, + 2.05109026775365885925e-03, + 2.04528116084394225374e-03, + 2.03844253545626581670e-03, + 2.03058125612778830188e-03, + 2.02170469144040887075e-03, + 2.01182070858521491047e-03, + 2.00093766768695948202e-03, + 1.98906441589210680049e-03, + 1.97621028122438920777e-03, + 1.96238506621177182659e-03, + 1.94759904128888393197e-03, + 1.93186293797900990321e-03, + 1.91518794185986402506e-03, + 1.89758568531769714928e-03, + 1.87906824009385019746e-03, + 1.85964810962852347687e-03, + 1.83933822120627122297e-03, + 1.81815191790804173144e-03, + 1.79610295037441560807e-03, + 1.77320546838494034515e-03, + 1.74947401225873200130e-03, + 1.72492350408103120758e-03, + 1.69956923876105037673e-03, + 1.67342687492632539309e-03, + 1.64651242565860508361e-03, + 1.61884224907680703345e-03, + 1.59043303877220510226e-03, + 1.56130181410158168538e-03, + 1.53146591034349164456e-03, + 1.50094296872333799256e-03, + 1.46975092631300560328e-03, + 1.43790800581038743892e-03, + 1.40543270520465083014e-03, + 1.37234378733301696889e-03, + 1.33866026933477191320e-03, + 1.30440141200818598630e-03, + 1.26958670907636713213e-03, + 1.23423587636767762184e-03, + 1.19836884091695044206e-03, + 1.16200572999298904278e-03, + 1.12516686005846404395e-03, + 1.08787272566834868938e-03, + 1.05014398831246302812e-03, + 1.01200146520824866246e-03, + 9.73466118049983288388e-04, + 9.34559041719948196611e-04, + 8.95301452967915711335e-04, + 8.55714679064593008659e-04, + 8.15820146435422468428e-04, + 7.75639369280203805866e-04, + 7.35193938184691589237e-04, + 6.94505508730360781103e-04, + 6.53595790107610935191e-04, + 6.12486533739071471218e-04, + 5.71199521918073420228e-04, + 5.29756556468897262142e-04, + 4.88179447433947737416e-04, + 4.46490001794050709802e-04, + 4.04710012227305993091e-04, + 3.62861245912609686835e-04, + 3.20965433382992511909e-04, + 2.79044257434640438631e-04, + 2.37119342097372800019e-04, + 1.95212241671636533603e-04, + 1.53344429837704167947e-04, + 1.11537288842718541599e-04, + 6.98120987704314377789e-05, + 2.81900268993452554395e-05, +-1.33078828458379828427e-05, +-5.46607203438825674300e-05, +-9.58477196232063128950e-05, +-1.36848269099311073286e-04, +-1.77641921698430010380e-04, +-2.18208404862630192013e-04, +-2.58527630431676846631e-04, +-2.98579704396867049668e-04, +-3.38344936521953437280e-04, +-3.77803849827058782322e-04, +-4.16937189930904319925e-04, +-4.55725934246739843459e-04, +-4.94151301028182598010e-04, +-5.32194758260364701556e-04, +-5.69838032392598397777e-04, +-6.07063116908156791794e-04, +-6.43852280727741713151e-04, +-6.80188076442613171781e-04, +-7.16053348373450011463e-04, +-7.51431240451819475352e-04, +-7.86305203920363614614e-04, +-8.20659004848588277854e-04, +-8.54476731460626398769e-04, +-8.87742801272211191736e-04, +-9.20441968033579760618e-04, +-9.52559328475276884118e-04, +-9.84080328854130366098e-04, +-1.01499077129671671886e-03, +-1.04527681993767346084e-03, +-1.07492500685012399610e-03, +-1.10392223776622968451e-03, +-1.13225579758538573774e-03, +-1.15991335566776048067e-03, +-1.18688297091152023324e-03, +-1.21315309661150744040e-03, +-1.23871258509778933189e-03, +-1.26355069215218973264e-03, +-1.28765708120147479195e-03, +-1.31102182728572635648e-03, +-1.33363542080036233568e-03, +-1.35548877101096445358e-03, +-1.37657320933958870861e-03, +-1.39688049242180935793e-03, +-1.41640280493340441764e-03, +-1.43513276218638474030e-03, +-1.45306341249334513427e-03, +-1.47018823930013145355e-03, +-1.48650116308605430814e-03, +-1.50199654303180877256e-03, +-1.51666917845484855790e-03, +-1.53051431001215848537e-03, +-1.54352762067077827791e-03, +-1.55570523644627803014e-03, +-1.56704372690943645810e-03, +-1.57754010546188694168e-03, +-1.58719182938115940286e-03, +-1.59599679963599232028e-03, +-1.60395336047266818397e-03, +-1.61106029877347285521e-03, +-1.61731684318832920691e-03, +-1.62272266304074063749e-03, +-1.62727786700950075895e-03, +-1.63098300158752559583e-03, +-1.63383904931938927878e-03, +-1.63584742681915007098e-03, +-1.63700998257036147918e-03, +-1.63732899451001076216e-03, +-1.63680716739846910703e-03, +-1.63544762997745404300e-03, +-1.63325393191824947553e-03, +-1.63023004056244216753e-03, +-1.62638033745757639228e-03, +-1.62170961469021174955e-03, +-1.61622307101895478811e-03, +-1.60992630781018361379e-03, +-1.60282532477918769794e-03, +-1.59492651553961163439e-03, +-1.58623666296416683703e-03, +-1.57676293435965995428e-03, +-1.56651287645941865272e-03, +-1.55549441023637930251e-03, +-1.54371582554013535814e-03, +-1.53118577556127515200e-03, +-1.51791327112649242562e-03, +-1.50390767482801038582e-03, +-1.48917869499094052133e-03, +-1.47373637948217746547e-03, +-1.45759110936466060836e-03, +-1.44075359240074425682e-03, +-1.42323485640868073465e-03, +-1.40504624247599204864e-03, +-1.38619939803382081524e-03, +-1.36670626979641294217e-03, +-1.34657909656966815262e-03, +-1.32583040193301449593e-03, +-1.30447298679896685550e-03, +-1.28251992185438013459e-03, +-1.25998453988795662377e-03, +-1.23688042800817435581e-03, +-1.21322141975630610686e-03, +-1.18902158711867676766e-03, +-1.16429523244280098797e-03, +-1.13905688026204581637e-03, +-1.11332126903301116203e-03, +-1.08710334279067352171e-03, +-1.06041824272541424130e-03, +-1.03328129868704887868e-03, +-1.00570802062011207742e-03, +-9.77714089935322180555e-04, +-9.49315350821759501229e-04, +-9.20527801504691478400e-04, +-8.91367585453492765508e-04, +-8.61850982544499480062e-04, +-8.31994400183724228809e-04, +-8.01814364393843201882e-04, +-7.71327510870362977047e-04, +-7.40550576011879011992e-04, +-7.09500387928816301369e-04, +-6.78193857435692871310e-04, +-6.46647969031396334730e-04, +-6.14879771872516131710e-04, +-5.82906370744061324771e-04, +-5.50744917032461615489e-04, +-5.18412599705563741960e-04, +-4.85926636304230086336e-04, +-4.53304263950078342206e-04, +-4.20562730374023118537e-04, +-3.87719284970423796848e-04, +-3.54791169881019867287e-04, +-3.21795611113349097968e-04, +-2.88749809698345409788e-04, +-2.55670932891157169815e-04, +-2.22576105419946933131e-04, +-1.89482400786797724242e-04, +-1.56406832625384566377e-04, +-1.23366346119315335164e-04, +-9.03778094855688048136e-05, +-5.74580055274082543144e-05, +-2.46236232605249242254e-05, + 8.10875038316639484403e-06, + 4.07226387702898438674e-05, + 7.32016836950174766508e-05, + 1.05529653418793463730e-04, + 1.37690450616703013997e-04, + 1.69668120226623675949e-04, + 2.01446857197505152211e-04, + 2.33011014133184106998e-04, + 2.64345108828066273181e-04, + 2.95433831690941053547e-04, + 3.26262053053821875562e-04, + 3.56814830362236329840e-04, + 3.87077415243466558745e-04, + 4.17035260449873101951e-04, + 4.46674026673809685620e-04, + 4.75979589231274630330e-04, + 5.04938044610982032269e-04, + 5.33535716886269443388e-04, + 5.61759163986835612092e-04, + 5.89595183827354429873e-04, + 6.17030820290651992738e-04, + 6.44053369062530110985e-04, + 6.70650383315962803771e-04, + 6.96809679241917109133e-04, + 7.22519341424928177552e-04, + 7.47767728060641924219e-04, + 7.72543476013702731450e-04, + 7.96835505713403631674e-04, + 8.20633025885535226200e-04, + 8.43925538118381487161e-04, + 8.66702841260924973336e-04, + 8.88955035651854165446e-04, + 9.10672527177615212350e-04, + 9.31846031157871484973e-04, + 9.52466576057239681409e-04, + 9.72525507021732124775e-04, + 9.92014489238877755425e-04, + 1.01092551112014119447e-03, + 1.02925088730489687483e-03, + 1.04698326148487523037e-03, + 1.06411560904814419225e-03, + 1.08064123954212140503e-03, + 1.09655379895474709012e-03, + 1.11184727181350227060e-03, + 1.12651598310145530275e-03, + 1.14055459999043234086e-03, + 1.15395813339070935251e-03, + 1.16672193931725690953e-03, + 1.17884172007230573521e-03, + 1.19031352524443380207e-03, + 1.20113375252423222606e-03, + 1.21129914833666986994e-03, + 1.22080680829065105208e-03, + 1.22965417744607123825e-03, + 1.23783905039882846655e-03, + 1.24535957118451323482e-03, + 1.25221423300135711529e-03, + 1.25840187775329488164e-03, + 1.26392169541390537828e-03, + 1.26877322321232639292e-03, + 1.27295634464211107444e-03, + 1.27647128829414154005e-03, + 1.27931862651490548498e-03, + 1.28149927389138891531e-03, + 1.28301448556399880392e-03, + 1.28386585536898346210e-03, + 1.28405531381196435364e-03, + 1.28358512587416814105e-03, + 1.28245788865312404514e-03, + 1.28067652883962455890e-03, + 1.27824430003284665244e-03, + 1.27516477989559045420e-03, + 1.27144186715168476705e-03, + 1.26707977842766580760e-03, + 1.26208304494093768826e-03, + 1.25645650903666696377e-03, + 1.25020532057574596321e-03, + 1.24333493317623205304e-03, + 1.23585110031071486285e-03, + 1.22775987126220184967e-03, + 1.21906758694106096864e-03, + 1.20978087556570016413e-03, + 1.19990664820977745338e-03, + 1.18945209421860830651e-03, + 1.17842467649774342194e-03, + 1.16683212667649549056e-03, + 1.15468244014949755240e-03, + 1.14198387099919015063e-03, + 1.12874492680236585690e-03, + 1.11497436332383317165e-03, + 1.10068117910044980384e-03, + 1.08587460991860403070e-03, + 1.07056412318845268865e-03, + 1.05475941221827552129e-03, + 1.03847039039213777552e-03, + 1.02170718525430208670e-03, + 1.00448013250386408712e-03, + 9.86799769902908796571e-04, + 9.68676831101775311604e-04, + 9.50122239384842536686e-04, + 9.31147101340516931967e-04, + 9.11762700458799784341e-04, + 8.91980490660106628206e-04, + 8.71812089758989324645e-04, + 8.51269272866356447108e-04, + 8.30363965733769732354e-04, + 8.09108238043540397427e-04, + 7.87514296648406260902e-04, + 7.65594478764287304610e-04, + 7.43361245119910263486e-04, + 7.20827173067144330761e-04, + 6.98004949655533580080e-04, + 6.74907364674943543829e-04, + 6.51547303669901115876e-04, + 6.27937740929578719871e-04, + 6.04091732456894250046e-04, + 5.80022408920566161228e-04, + 5.55742968593996586671e-04, + 5.31266670284408345712e-04, + 5.06606826256191336046e-04, + 4.81776795151971288286e-04, + 4.56789974915332633570e-04, + 4.31659795718581772855e-04, + 4.06399712899354833857e-04, + 3.81023199909761244551e-04, + 3.55543741281616379035e-04, + 3.29974825611307478416e-04, + 3.04329938567904757871e-04, + 2.78622555928232935440e-04, + 2.52866136642138929734e-04, + 2.27074115931597155090e-04, + 2.01259898427254919819e-04, + 1.75436851345555256277e-04, + 1.49618297710086417540e-04, + 1.23817509620332964109e-04, + 9.80477015714136803867e-05, + 7.23220238277867656044e-05, + 4.66535558543199922808e-05, + 2.10552998080745397132e-05, +-4.45982590633637267685e-06, +-2.98789930144383005840e-05, +-5.51894696797388301145e-05, +-8.03786267385361320997e-05, +-1.05433943858796803006e-04, +-1.30343015620240231141e-04, +-1.55093557512704107414e-04, +-1.79673411849813922459e-04, +-2.04070553595469639328e-04, +-2.28273096100298591472e-04, +-2.52269296745275168909e-04, +-2.76047562490193821964e-04, +-2.99596455324310003560e-04, +-3.22904697616543522477e-04, +-3.45961177363105203825e-04, +-3.68754953329960058744e-04, +-3.91275260088006534946e-04, +-4.13511512938510329696e-04, +-4.35453312726917203881e-04, +-4.57090450542803317623e-04, +-4.78412912303817451296e-04, +-4.99410883221915679296e-04, +-5.20074752149766658671e-04, +-5.40395115805737333292e-04, +-5.60362782875298238647e-04, +-5.79968777987699369778e-04, +-5.99204345565891864818e-04, +-6.18060953548384053174e-04, +-6.36530296981365232775e-04, +-6.54604301479925370678e-04, +-6.72275126556943374879e-04, +-6.89535168818290744586e-04, +-7.06377065023390971615e-04, +-7.22793695009926024340e-04, +-7.38778184481572101731e-04, +-7.54323907658020135873e-04, +-7.69424489786242268852e-04, +-7.84073809512324942927e-04, +-7.98266001112985629749e-04, +-8.11995456586320977881e-04, +-8.25256827601124256372e-04, +-8.38045027304191287275e-04, +-8.50355231985365717443e-04, +-8.62182882599891249782e-04, +-8.73523686147764872115e-04, +-8.84373616909959786754e-04, +-8.94728917541413090037e-04, +-9.04586100020679756244e-04, +-9.13941946456355816704e-04, +-9.22793509750267264627e-04, +-9.31138114117751138944e-04, +-9.38973355465201283722e-04, +-9.46297101625169024067e-04, +-9.53107492449534513500e-04, +-9.59402939761150449702e-04, +-9.65182127164483996684e-04, +-9.70444009715949393313e-04, +-9.75187813454562795953e-04, +-9.79413034793723616400e-04, +-9.83119439774883139768e-04, +-9.86307063184082167401e-04, +-9.88976207532291833394e-04, +-9.91127441900544869230e-04, +-9.92761600651050806279e-04, +-9.93879782005378667811e-04, +-9.94483346490992797459e-04, +-9.94573915257405570187e-04, +-9.94153368263331295093e-04, +-9.93223842336246652909e-04, +-9.91787729105850180897e-04, +-9.89847672812951264940e-04, +-9.87406567995411906316e-04, +-9.84467557052782528404e-04, +-9.81034027691367847834e-04, +-9.77109610251477699733e-04, +-9.72698174918703792335e-04, +-9.67803828821115733234e-04, +-9.62430913014279427325e-04, +-9.56583999356122919276e-04, +-9.50267887273650141942e-04, +-9.43487600423628257514e-04, +-9.36248383249343269982e-04, +-9.28555697435622562526e-04, +-9.20415218264345998470e-04, +-9.11832830872733794518e-04, +-9.02814626416679100358e-04, +-8.93366898141493941121e-04, +-8.83496137362504399722e-04, +-8.73209029357859358757e-04, +-8.62512449176020662943e-04, +-8.51413457360529739998e-04, +-8.39919295594453380396e-04, +-8.28037382267176572288e-04, +-8.15775307966064137412e-04, +-8.03140830895733765817e-04, +-7.90141872227454497395e-04, +-7.76786511381427125823e-04, +-7.63082981244709722575e-04, +-7.49039663327390583050e-04, +-7.34665082859875225377e-04, +-7.19967903833961626534e-04, +-7.04956923990644160512e-04, +-6.89641069757283018196e-04, +-6.74029391137054853869e-04, +-6.58131056553546409972e-04, +-6.41955347653322514097e-04, +-6.25511654069284880192e-04, +-6.08809468147721304272e-04, +-5.91858379642030605315e-04, +-5.74668070375839888306e-04, +-5.57248308878482566560e-04, +-5.39608944995842118066e-04, +-5.21759904479256251923e-04, +-5.03711183555554655941e-04, +-4.85472843480994986718e-04, +-4.67055005082172224832e-04, +-4.48467843286585717087e-04, +-4.29721581645848931235e-04, +-4.10826486854523479156e-04, +-3.91792863267230776457e-04, +-3.72631047417096349181e-04, +-3.53351402538234474118e-04, +-3.33964313095238879339e-04, +-3.14480179322441726845e-04, +-2.94909411775696268711e-04, +-2.75262425899514299663e-04, +-2.55549636612443630684e-04, +-2.35781452913229664075e-04, +-2.15968272510589943134e-04, +-1.96120476479425779204e-04, +-1.76248423945933802622e-04, +-1.56362446804383454146e-04, +-1.36472844468305155993e-04, +-1.16589878658458767635e-04, +-9.67237682303544415822e-05, +-7.68846840437216406863e-05, +-5.70827438766376965410e-05, +-3.73280073865603565495e-05, +-1.76304711208225556719e-05, + 1.99993642088864226016e-06, + 2.15533596699292954036e-05, + 4.10200208154242509364e-05, + 6.03902245722433725860e-05, + 7.96543628875890849517e-05, + 9.88029195844659414733e-05, + 1.17826474939476195025e-04, + 1.36715710193023647035e-04, + 1.55461411989631342456e-04, + 1.74054476746553134919e-04, + 1.92485914948569894868e-04, + 2.10746855366906229437e-04, + 2.28828549200575789499e-04, + 2.46722374138184409598e-04, + 2.64419838338276027342e-04, + 2.81912584326679917842e-04, + 2.99192392808960154656e-04, + 3.16251186396444155819e-04, + 3.33081033244039836395e-04, + 3.49674150598494463179e-04, + 3.66022908255491080231e-04, + 3.82119831924034101915e-04, + 3.97957606496917735885e-04, + 4.13529079225828470872e-04, + 4.28827262799762372065e-04, + 4.43845338325564724331e-04, + 4.58576658209470361914e-04, + 4.73014748938412597258e-04, + 4.87153313760160528844e-04, + 5.00986235261103489760e-04, + 5.14507577840937952753e-04, + 5.27711590083254872101e-04, + 5.40592707021128712937e-04, + 5.53145552297087950144e-04, + 5.65364940216665540391e-04, + 5.77245877694797693454e-04, + 5.88783566094626962042e-04, + 5.99973402958039613193e-04, + 6.10810983627539487439e-04, + 6.21292102758916895203e-04, + 6.31412755724494408928e-04, + 6.41169139906554250846e-04, + 6.50557655880656818606e-04, + 6.59574908488803728079e-04, + 6.68217707802125100019e-04, + 6.76483069973211437013e-04, + 6.84368217977891248049e-04, + 6.91870582246639927691e-04, + 6.98987801185634960270e-04, + 7.05717721587660520161e-04, + 7.12058398933015208009e-04, + 7.18008097580767590783e-04, + 7.23565290850654123378e-04, + 7.28728660995954687085e-04, + 7.33497099067867354590e-04, + 7.37869704671835252748e-04, + 7.41845785616332496076e-04, + 7.45424857454791262544e-04, + 7.48606642921267949158e-04, + 7.51391071260577316469e-04, + 7.53778277453638493114e-04, + 7.55768601338868977087e-04, + 7.57362586630487056617e-04, + 7.58560979834606492235e-04, + 7.59364729064121901821e-04, + 7.59774982753388386167e-04, + 7.59793088273752925850e-04, + 7.59420590451042459845e-04, + 7.58659229986178283191e-04, + 7.57510941780111337653e-04, + 7.55977853164323059486e-04, + 7.54062282038194995303e-04, + 7.51766734914572948463e-04, + 7.49093904874909206383e-04, + 7.46046669435407165151e-04, + 7.42628088325620098163e-04, + 7.38841401181018265533e-04, + 7.34690025151058076665e-04, + 7.30177552424332988561e-04, + 7.25307747672431467334e-04, + 7.20084545414128533031e-04, + 7.14512047301645285974e-04, + 7.08594519330652482768e-04, + 7.02336388975790940938e-04, + 6.95742242253507572024e-04, + 6.88816820714019178648e-04, + 6.81565018364235775117e-04, + 6.73991878523528100201e-04, + 6.66102590614281019760e-04, + 6.57902486889110115278e-04, + 6.49397039096706574744e-04, + 6.40591855088354865909e-04, + 6.31492675367040820315e-04, + 6.22105369581239602515e-04, + 6.12435932965378496476e-04, + 6.02490482729133372541e-04, + 5.92275254397530565020e-04, + 5.81796598104019854238e-04, + 5.71060974838680235344e-04, + 5.60074952653592437156e-04, + 5.48845202827616417997e-04, + 5.37378495992671769733e-04, + 5.25681698223757196999e-04, + 5.13761767094866308656e-04, + 5.01625747702958151193e-04, + 4.89280768662212254237e-04, + 4.76734038070840296462e-04, + 4.63992839452548365767e-04, + 4.51064527674926475653e-04, + 4.37956524847056961718e-04, + 4.24676316198432479525e-04, + 4.11231445941475173573e-04, + 3.97629513119952544397e-04, + 3.83878167445365014142e-04, + 3.69985105123653247247e-04, + 3.55958064674343052560e-04, + 3.41804822744478146133e-04, + 3.27533189919382002140e-04, + 3.13151006532530441166e-04, + 2.98666138476795246359e-04, + 2.84086473019086157080e-04, + 2.69419914620704385386e-04, + 2.54674380765407412045e-04, + 2.39857797797613132851e-04, + 2.24978096772516947353e-04, + 2.10043209320515654199e-04, + 1.95061063527882452839e-04, + 1.80039579835930709352e-04, + 1.64986666960563460723e-04, + 1.49910217834334317253e-04, + 1.34818105573139893332e-04, + 1.19718179469376976285e-04, + 1.04618261013640937926e-04, + 8.95261399470057895635e-05, + 7.44495703456539838043e-05, + 5.93962667399166655609e-05, + 4.43739002695007426613e-05, + 2.93900948769175320138e-05, + 1.44524235407680616859e-05, +-4.31595449223615991972e-07, +-1.52545021735661563586e-05, +-3.00088987191676871767e-05, +-4.46874527685018162865e-05, +-5.92829011400601544354e-05, +-7.37880532784749535325e-05, +-8.81957946927382018627e-05, +-1.02499090340838023227e-04, +-1.16690987959360069175e-04, +-1.30764621336392747363e-04, +-1.44713213526426610466e-04, +-1.58530080005720515508e-04, +-1.72208631766646892702e-04, +-1.85742378349807455221e-04, +-1.99124930812504506716e-04, +-2.12350004632196330849e-04, +-2.25411422543850048289e-04, +-2.38303117309836905331e-04, +-2.51019134421297284484e-04, +-2.63553634729709143104e-04, +-2.75900897007725623075e-04, +-2.88055320438154207046e-04, +-3.00011427029988502792e-04, +-3.11763863960725555544e-04, +-3.23307405843803333592e-04, +-3.34636956920517840506e-04, +-3.45747553175349475393e-04, +-3.56634364374105745227e-04, +-3.67292696023986241921e-04, +-3.77717991254969290369e-04, +-3.87905832621729396159e-04, +-3.97851943825608877700e-04, +-4.07552191355998907722e-04, +-4.17002586050548289687e-04, +-4.26199284573830689850e-04, +-4.35138590813964924123e-04, +-4.43816957196747625784e-04, +-4.52230985917061883723e-04, +-4.60377430087148228118e-04, +-4.68253194801565195918e-04, +-4.75855338118517359660e-04, +-4.83181071957494603746e-04, +-4.90227762913035460673e-04, +-4.96992932984516386924e-04, +-5.03474260221955485957e-04, +-5.09669579287852308157e-04, +-5.15576881935093001182e-04, +-5.21194317400982664451e-04, +-5.26520192717613616691e-04, +-5.31552972938706402850e-04, +-5.36291281283125418830e-04, +-5.40733899195399727276e-04, +-5.44879766323496587781e-04, +-5.48727980414253735213e-04, +-5.52277797126791330021e-04, +-5.55528629764419335478e-04, +-5.58480048925468798571e-04, +-5.61131782073551080119e-04, +-5.63483713027851970505e-04, +-5.65535881373998238451e-04, +-5.67288481796187900146e-04, +-5.68741863331195915583e-04, +-5.69896528545036479795e-04, +-5.70753132632961161612e-04, +-5.71312482443646482352e-04, +-5.71575535428334754844e-04, +-5.71543398515829263219e-04, +-5.71217326914227299835e-04, +-5.70598722840296476537e-04, +-5.69689134177503594091e-04, +-5.68490253063648432949e-04, +-5.67003914409159020388e-04, +-5.65232094347102977452e-04, +-5.63176908616005544687e-04, +-5.60840610876602073745e-04, +-5.58225590963675973900e-04, +-5.55334373074175820066e-04, +-5.52169613892796438438e-04, +-5.48734100656311134595e-04, +-5.45030749157866334711e-04, +-5.41062601692576870642e-04, +-5.36832824945712001018e-04, +-5.32344707824832300003e-04, +-5.27601659237243400015e-04, +-5.22607205814143416754e-04, +-5.17364989582876229866e-04, +-5.11878765588764158417e-04, +-5.06152399467916375153e-04, +-5.00189864972510559588e-04, +-4.93995241450078683386e-04, +-4.87572711278240109554e-04, +-4.80926557256444178138e-04, +-4.74061159956301635728e-04, +-4.66980995031984519490e-04, +-4.59690630492344271939e-04, +-4.52194723936275402073e-04, +-4.44498019752993822097e-04, +-4.36605346288767746325e-04, +-4.28521612981757975790e-04, +-4.20251807466636860457e-04, +-4.11800992650551039072e-04, +-4.03174303762152705464e-04, +-3.94376945375264067670e-04, +-3.85414188409003615268e-04, +-3.76291367105835428391e-04, +-3.67013875989376269545e-04, +-3.57587166803538351878e-04, +-3.48016745434793248019e-04, +-3.38308168819116130647e-04, +-3.28467041835364367049e-04, +-3.18499014186804374482e-04, +-3.08409777272385283997e-04, +-2.98205061049476030047e-04, +-2.87890630889810130322e-04, +-2.77472284430191329634e-04, +-2.66955848419733049459e-04, +-2.56347175565217071970e-04, +-2.45652141376338599681e-04, +-2.34876641012365765249e-04, +-2.24026586131914569105e-04, +-2.13107901747536509227e-04, +-2.02126523086630768746e-04, +-1.91088392460356650080e-04, +-1.79999456142178738786e-04, +-1.68865661257607132476e-04, +-1.57692952686686938598e-04, +-1.46487269980864699605e-04, +-1.35254544295716316437e-04, +-1.24000695341184972607e-04, +-1.12731628350718165836e-04, +-1.01453231070878122327e-04, +-9.01713707729724520340e-05, +-7.88918912880573160781e-05, +-6.76206100668247551966e-05, +-5.63633152658752571273e-05, +-4.51257628616542845251e-05, +-3.39136737935608547517e-05, +-2.27327311375149941554e-05, +-1.15885773114489628905e-05, +-4.86811313915871210201e-07, + 1.05670140028143166991e-05, + 2.15673946238210968425e-05, + 3.25088780256781116596e-05, + 4.33860657922279085714e-05, + 5.41936161910015515536e-05, + 6.49262467088870516650e-05, + 7.55787365460706083136e-05, + 8.61459290670060090240e-05, + 9.66227342073920110596e-05, + 1.07004130835977286562e-04, + 1.17285169070277186945e-04, + 1.27460972545122102045e-04, + 1.37526740632994235337e-04, + 1.47477750615313961575e-04, + 1.57309359803685470123e-04, + 1.67017007610150564068e-04, + 1.76596217565703518526e-04, + 1.86042599286130139018e-04, + 1.95351850384440511605e-04, + 2.04519758329024586505e-04, + 2.13542202246907178919e-04, + 2.22415154671328456478e-04, + 2.31134683232958544662e-04, + 2.39696952294124378952e-04, + 2.48098224525461843754e-04, + 2.56334862424394095085e-04, + 2.64403329774836909783e-04, + 2.72300193047718441016e-04, + 2.80022122741781036813e-04, + 2.87565894664178829838e-04, + 2.94928391150552234555e-04, + 3.02106602224121655823e-04, + 3.09097626693513312206e-04, + 3.15898673188933149566e-04, + 3.22507061136495965393e-04, + 3.28920221670429965485e-04, + 3.35135698482898333403e-04, + 3.41151148611357961198e-04, + 3.46964343163231182625e-04, + 3.52573167977838467131e-04, + 3.57975624225448146778e-04, + 3.63169828943500801448e-04, + 3.68154015509882480677e-04, + 3.72926534053389822573e-04, + 3.77485851801332371845e-04, + 3.81830553364452182901e-04, + 3.85959340959241372672e-04, + 3.89871034567797159973e-04, + 3.93564572035445218046e-04, + 3.97039009106330996121e-04, + 4.00293519397200458273e-04, + 4.03327394309708944353e-04, + 4.06140042881526601437e-04, + 4.08730991576614218711e-04, + 4.11099884015009905264e-04, + 4.13246480642570374747e-04, + 4.15170658341088754176e-04, + 4.16872409979225850337e-04, + 4.18351843904797517006e-04, + 4.19609183378898695574e-04, + 4.20644765952442063056e-04, + 4.21459042785672199482e-04, + 4.22052577911266981522e-04, + 4.22426047441667507944e-04, + 4.22580238721291740270e-04, + 4.22516049424304497659e-04, + 4.22234486598678352993e-04, + 4.21736665657268593004e-04, + 4.21023809316662376602e-04, + 4.20097246484596811584e-04, + 4.18958411096749831423e-04, + 4.17608840903733937334e-04, + 4.16050176209156481050e-04, + 4.14284158559614175323e-04, + 4.12312629387525297810e-04, + 4.10137528607722027553e-04, + 4.07760893168739989995e-04, + 4.05184855559753253750e-04, + 4.02411642274163466621e-04, + 3.99443572230806823956e-04, + 3.96283055153818239771e-04, + 3.92932589912160215497e-04, + 3.89394762819913727372e-04, + 3.85672245898332176350e-04, + 3.81767795100792530199e-04, + 3.77684248501704115941e-04, + 3.73424524450519546449e-04, + 3.68991619691936916479e-04, + 3.64388607453439920380e-04, + 3.59618635501351871335e-04, + 3.54684924166520241986e-04, + 3.49590764340821041987e-04, + 3.44339515445693598438e-04, + 3.38934603373838513624e-04, + 3.33379518405329915154e-04, + 3.27677813099311473176e-04, + 3.21833100162536569697e-04, + 3.15849050295926377270e-04, + 3.09729390020389752213e-04, + 3.03477899483178554640e-04, + 2.97098410245953236785e-04, + 2.90594803055835239260e-04, + 2.83971005600701430303e-04, + 2.77230990249963083708e-04, + 2.70378771782053405493e-04, + 2.63418405099919501929e-04, + 2.56353982935728650153e-04, + 2.49189633546102382294e-04, + 2.41929518399063687127e-04, + 2.34577829853976687832e-04, + 2.27138788835770893786e-04, + 2.19616642504623810770e-04, + 2.12015661922379533436e-04, + 2.04340139716986798554e-04, + 1.96594387746109900425e-04, + 1.88782734761210285561e-04, + 1.80909524073276134666e-04, + 1.72979111221486337802e-04, + 1.64995861645938764022e-04, + 1.56964148365684399598e-04, + 1.48888349663314485498e-04, + 1.40772846777168322190e-04, + 1.32622021602487612625e-04, + 1.24440254402532454779e-04, + 1.16231921530969174315e-04, + 1.08001393166544268506e-04, + 9.97530310612700842022e-05, + 9.14911863031805467012e-05, + 8.32201970948494534723e-05, + 7.49443865486733659534e-05, + 6.66680605000458429647e-05, + 5.83955053395394390486e-05, + 5.01309858650572228258e-05, + 4.18787431550387222699e-05, + 3.36429924637896997147e-05, + 2.54279211398450498503e-05, + 1.72376865684373168860e-05, + 9.07641413898224680109e-06, + 9.48195238618905657624e-07, +-7.14291472735570851774e-06, +-1.51928982871868691030e-05, +-2.31977778255819772578e-05, +-3.11536174769894797995e-05, +-3.90565249883959565128e-05, +-4.69026535507838503733e-05, +-5.46882035983796400101e-05, +-6.24094245749816497679e-05, +-7.00626166665431140837e-05, +-7.76441324992083051551e-05, +-8.51503788021582837904e-05, +-9.25778180344744060573e-05, +-9.99229699753842974660e-05, +-1.07182413277143970569e-04, +-1.14352786980001299723e-04, +-1.21430791988570707662e-04, +-1.28413192508978856029e-04, +-1.35296817446291592216e-04, +-1.42078561761593261028e-04, +-1.48755387788243690359e-04, +-1.55324326506731677858e-04, +-1.61782478777755279195e-04, +-1.68127016532938305905e-04, +-1.74355183922886855866e-04, +-1.80464298422043775347e-04, +-1.86451751890066126042e-04, +-1.92315011589316994193e-04, +-1.98051621158110087483e-04, +-2.03659201539461954481e-04, +-2.09135451865034778822e-04, +-2.14478150293975007752e-04, +-2.19685154806484236054e-04, +-2.24754403951855035284e-04, +-2.29683917550825442361e-04, +-2.34471797352042666748e-04, +-2.39116227642561802579e-04, +-2.43615475812239792083e-04, +-2.47967892871911476695e-04, +-2.52171913925349226639e-04, +-2.56226058594915238626e-04, +-2.60128931400936235906e-04, +-2.63879222094777748236e-04, +-2.67475705945676030771e-04, +-2.70917243981398745550e-04, +-2.74202783182808239749e-04, +-2.77331356632420174182e-04, +-2.80302083617130378106e-04, +-2.83114169685247407150e-04, +-2.85766906657990832612e-04, +-2.88259672595703273380e-04, +-2.90591931718978374165e-04, +-2.92763234284938700901e-04, +-2.94773216418979381367e-04, +-2.96621599902229947550e-04, +-2.98308191915087070681e-04, +-2.99832884737117537181e-04, +-3.01195655403731915589e-04, +-3.02396565319990604306e-04, +-3.03435759831933548735e-04, +-3.04313467755884059594e-04, +-3.05030000866147890746e-04, +-3.05585753341585221812e-04, +-3.05981201171519584091e-04, +-3.06216901521509134165e-04, +-3.06293492059487573384e-04, +-3.06211690242816218007e-04, +-3.05972292566802656771e-04, +-3.05576173775270109809e-04, +-3.05024286033762090722e-04, +-3.04317658065994024481e-04, +-3.03457394254183585730e-04, +-3.02444673703895100005e-04, +-3.01280749274062569550e-04, +-2.99966946572861902810e-04, +-2.98504662920123960135e-04, +-2.96895366276984148252e-04, +-2.95140594143503544149e-04, +-2.93241952424972839204e-04, +-2.91201114267648395687e-04, +-2.89019818864694969657e-04, +-2.86699870233074851408e-04, +-2.84243135962187955679e-04, +-2.81651545935045764021e-04, +-2.78927091022785277833e-04, +-2.76071821753329086409e-04, +-2.73087846955029312987e-04, +-2.69977332376105608885e-04, +-2.66742499280753122669e-04, +-2.63385623022735818576e-04, +-2.59909031597333319095e-04, +-2.56315104172533353259e-04, +-2.52606269600299821604e-04, +-2.48785004908817504021e-04, +-2.44853833776614545140e-04, +-2.40815324989414303834e-04, +-2.36672090880646487053e-04, +-2.32426785756489917047e-04, +-2.28082104306388832628e-04, +-2.23640779999901656528e-04, +-2.19105583470820145051e-04, +-2.14479320889489653368e-04, +-2.09764832324187768019e-04, +-2.04964990092551698191e-04, +-2.00082697103893516945e-04, +-1.95120885193399471553e-04, +-1.90082513449059745374e-04, +-1.84970566532296863812e-04, +-1.79788052993171517313e-04, +-1.74538003581126675585e-04, +-1.69223469552129467206e-04, +-1.63847520973145840571e-04, +-1.58413245024881097671e-04, +-1.52923744303641519389e-04, +-1.47382135123237027838e-04, +-1.41791545817854290970e-04, +-1.36155115046730930926e-04, +-1.30475990101566258683e-04, +-1.24757325217510580588e-04, +-1.19002279888661194524e-04, +-1.13214017188868415280e-04, +-1.07395702098746854882e-04, +-1.01550499839754549119e-04, +-9.56815742161736681884e-05, +-8.97920859658150297307e-05, +-8.38851911202858713332e-05, +-7.79640393756770905178e-05, +-7.20317724744152869908e-05, +-6.60915225991128571850e-05, +-6.01464107792394842228e-05, +-5.41995453113256703899e-05, +-4.82540201935260191645e-05, +-4.23129135752554075560e-05, +-3.63792862227040107682e-05, +-3.04561800008946262114e-05, +-2.45466163730380569304e-05, +-1.86535949179281487331e-05, +-1.27800918660038342780e-05, +-6.92905865481930068159e-06, +-1.10342050454853296994e-06, + 4.69392498575835322107e-06, + 1.04601092206202085443e-05, + 1.61922939685309686330e-05, + 2.18876726998310187900e-05, + 2.75434719013333585431e-05, + 3.31569523672128619587e-05, + 3.87254104655551669952e-05, + 4.42461793799820151014e-05, + 4.97166303258813707623e-05, + 5.51341737406907975117e-05, + 6.04962604476992873623e-05, + 6.58003827929482047439e-05, + 7.10440757547033927043e-05, + 7.62249180250887078177e-05, + 8.13405330633888576592e-05, + 8.63885901206668644324e-05, + 9.13668052352641340674e-05, + 9.62729421987680101039e-05, + 1.01104813492143344174e-04, + 1.05860281191625613681e-04, + 1.10537257844079884095e-04, + 1.15133707311478630493e-04, + 1.19647645584220456037e-04, + 1.24077141563022885209e-04, + 1.28420317809117991549e-04, + 1.32675351262483061940e-04, + 1.36840473927932757339e-04, + 1.40913973528841685815e-04, + 1.44894194128284206635e-04, + 1.48779536717473748154e-04, + 1.52568459771325131390e-04, + 1.56259479770980684197e-04, + 1.59851171693240460712e-04, + 1.63342169466755023468e-04, + 1.66731166394932026195e-04, + 1.70016915545461323039e-04, + 1.73198230106457167626e-04, + 1.76273983709174160992e-04, + 1.79243110717270954634e-04, + 1.82104606482673126973e-04, + 1.84857527568029053264e-04, + 1.87500991935841927272e-04, + 1.90034179104279262861e-04, + 1.92456330269822776862e-04, + 1.94766748396794513220e-04, + 1.96964798273908584360e-04, + 1.99049906537954266611e-04, + 2.01021561664790589848e-04, + 2.02879313927801336551e-04, + 2.04622775323984274973e-04, + 2.06251619467897348657e-04, + 2.07765581453663538119e-04, + 2.09164457685255029832e-04, + 2.10448105675328230946e-04, + 2.11616443812851108683e-04, + 2.12669451099812634523e-04, + 2.13607166857295168675e-04, + 2.14429690401230681543e-04, + 2.15137180688158456340e-04, + 2.15729855931309154023e-04, + 2.16207993187385875055e-04, + 2.16571927914393662145e-04, + 2.16822053500895369719e-04, + 2.16958820767090094714e-04, + 2.16982737438119145310e-04, + 2.16894367590011544417e-04, + 2.16694331068704375103e-04, + 2.16383302882573573273e-04, + 2.15962012568937173273e-04, + 2.15431243534988864970e-04, + 2.14791832373643112571e-04, + 2.14044668154778804569e-04, + 2.13190691692375993652e-04, + 2.12230894788062836786e-04, + 2.11166319451582256295e-04, + 2.09998057098713050445e-04, + 2.08727247727178962314e-04, + 2.07355079071098812689e-04, + 2.05882785734526249080e-04, + 2.04311648304645308329e-04, + 2.02642992445200404404e-04, + 2.00878187970725529407e-04, + 1.99018647902181230460e-04, + 1.97065827504565370225e-04, + 1.95021223307131414326e-04, + 1.92886372106789062567e-04, + 1.90662849955323298245e-04, + 1.88352271131035512233e-04, + 1.85956287095443860338e-04, + 1.83476585435658924713e-04, + 1.80914888793067202884e-04, + 1.78272953778979965879e-04, + 1.75552569877858596036e-04, + 1.72755558338776385452e-04, + 1.69883771055775014205e-04, + 1.66939089437739287235e-04, + 1.63923423268464666259e-04, + 1.60838709557554023410e-04, + 1.57686911382826176059e-04, + 1.54470016724860052760e-04, + 1.51190037294350436165e-04, + 1.47849007352938516474e-04, + 1.44448982528168725411e-04, + 1.40992038623224621736e-04, + 1.37480270422103131650e-04, + 1.33915790490908510934e-04, + 1.30300727975883427756e-04, + 1.26637227398848910710e-04, + 1.22927447450726668463e-04, + 1.19173559783751544113e-04, + 1.15377747803056433318e-04, + 1.11542205458248867627e-04, + 1.07669136035655032668e-04, + 1.03760750951825973841e-04, + 9.98192685489614168559e-05, + 9.58469128929003691322e-05, + 9.18459125742597699837e-05, + 8.78184995133790156831e-05, + 8.37669077696560454268e-05, + 7.96933723559265666005e-05, + 7.56001280584259725565e-05, + 7.14894082630083944159e-05, + 6.73634437881340204573e-05, + 6.32244617252882825861e-05, + 5.90746842873461779663e-05, + 5.49163276654787824009e-05, + 5.07516008951872145687e-05, + 4.65827047319741682405e-05, + 4.24118305372229097931e-05, + 3.82411591748462793188e-05, + 3.40728599191875283292e-05, + 2.99090893747361998109e-05, + 2.57519904081409751117e-05, + 2.16036910930649429937e-05, + 1.74663036683280136440e-05, + 1.33419235098453462380e-05, + 9.23262811685928130563e-06, + 5.14047611288089638620e-06, + 1.06750626183722631479e-06, +-2.98426350016022994691e-06, +-7.01283701696614740918e-06, +-1.10162408480615069031e-05, +-1.49925251873214083662e-05, +-1.89397647644820879499e-05, +-2.28560597288927702187e-05, +-2.67395365152196406880e-05, +-3.05883486907130078530e-05, +-3.44006777836602540958e-05, +-3.81747340927275210175e-05, +-4.19087574768357373853e-05, +-4.56010181252311126428e-05, +-4.92498173074900873615e-05, +-5.28534881031252298821e-05, +-5.64103961105393312886e-05, +-5.99189401350206662131e-05, +-6.33775528555675324869e-05, +-6.67847014702764807609e-05, +-7.01388883200425772204e-05, +-7.34386514903965126506e-05, +-7.66825653912348156535e-05, +-7.98692413142890845568e-05, +-8.29973279680875074835e-05, +-8.60655119903289004060e-05, +-8.90725184374467171371e-05, +-9.20171112512619700620e-05, +-9.48980937025603441979e-05, +-9.77143088115187759442e-05, +-1.00464639744859388255e-04, +-1.03148010189625194497e-04, +-1.05763384703536859194e-04, +-1.08309769041847384465e-04, +-1.10786210460631133696e-04, +-1.13191797996501934058e-04, +-1.15525662722708351705e-04, +-1.17786977981613268270e-04, +-1.19974959593534190815e-04, +-1.22088866041986484267e-04, +-1.24127998635342794240e-04, +-1.26091701644931496271e-04, +-1.27979362419654144924e-04, +-1.29790411477168272404e-04, +-1.31524322571708625470e-04, +-1.33180612738637493483e-04, +-1.34758842315833984394e-04, +-1.36258614942015598460e-04, +-1.37679577532133398362e-04, +-1.39021420229953017716e-04, +-1.40283876337992947491e-04, +-1.41466722224963323403e-04, +-1.42569777210869091466e-04, +-1.43592903429972301504e-04, +-1.44536005671797138268e-04, +-1.45399031200369268681e-04, +-1.46181969551921958151e-04, +-1.46884852311272975705e-04, +-1.47507752867118645777e-04, +-1.48050786146473433835e-04, +-1.48514108328523704045e-04, +-1.48897916538148837292e-04, +-1.49202448519377127998e-04, +-1.49427982289073205905e-04, +-1.49574835771129388594e-04, +-1.49643366411473540236e-04, +-1.49633970774193841890e-04, +-1.49547084119100584043e-04, +-1.49383179961047775483e-04, +-1.49142769611348204603e-04, +-1.48826401701621687922e-04, +-1.48434661690425537565e-04, +-1.47968171353023028678e-04, +-1.47427588254649171362e-04, +-1.46813605207650059491e-04, +-1.46126949712865211208e-04, +-1.45368383385638768636e-04, +-1.44538701366849164877e-04, +-1.43638731719351636813e-04, +-1.42669334810229859632e-04, +-1.41631402679272359055e-04, +-1.40525858394075560832e-04, +-1.39353655392192250567e-04, +-1.38115776810750613777e-04, +-1.36813234803965936073e-04, +-1.35447069848972789655e-04, +-1.34018350040412986173e-04, +-1.32528170374222436503e-04, +-1.30977652021046207277e-04, +-1.29367941589733019114e-04, +-1.27700210381360810966e-04, +-1.25975653634228948810e-04, +-1.24195489760284478228e-04, +-1.22360959573421820921e-04, +-1.20473325510130619526e-04, +-1.18533870842929396042e-04, +-1.16543898887054415644e-04, +-1.14504732200871589131e-04, +-1.12417711780453782031e-04, +-1.10284196248804102999e-04, +-1.08105561040170155152e-04, +-1.05883197579935365976e-04, +-1.03618512460517512327e-04, +-1.01312926613771452371e-04, +-9.89678744803231588006e-05, +-9.65848031763287176834e-05, +-9.41651716580904694746e-05, +-9.17104498849975562341e-05, +-8.92221179812627604834e-05, +-8.67016653968825132086e-05, +-8.41505900682881210822e-05, +-8.15703975791493105397e-05, +-7.89626003217504745472e-05, +-7.63287166594104368560e-05, +-7.36702700903663770804e-05, +-7.09887884135877711683e-05, +-6.82858028969257033506e-05, +-6.55628474480432515319e-05, +-6.28214577885690295556e-05, +-6.00631706318681429140e-05, +-5.72895228648756703262e-05, +-5.45020507343892520119e-05, +-5.17022890382489225453e-05, +-4.88917703218011553620e-05, +-4.60720240800406300981e-05, +-4.32445759658305523042e-05, +-4.04109470046085756875e-05, +-3.75726528159311059401e-05, +-3.47312028422512456081e-05, +-3.18880995853173453093e-05, +-2.90448378505280945666e-05, +-2.62029039996194488388e-05, +-2.33637752120533564114e-05, +-2.05289187554215721418e-05, +-1.76997912652334544591e-05, +-1.48778380343994300278e-05, +-1.20644923127652564947e-05, +-9.26117461698225729130e-06, +-6.46929205104167329041e-06, +-3.69023763779291335841e-06, +-9.25389661709245930119e-07, + 1.82388897678174475935e-06, + 4.55625139514285705999e-06, + 7.27036735044587330100e-06, + 9.96492384873170706833e-06, + 1.26386257417392112551e-05, + 1.52901963107384078629e-05, + 1.79183778372582360025e-05, + 2.05219321604610694255e-05, + 2.30996412209251530034e-05, + 2.56503075906517305266e-05, + 2.81727549890619002719e-05, + 3.06658287848128515438e-05, + 3.31283964832040277388e-05, + 3.55593481990333369126e-05, + 3.79575971147140200598e-05, + 4.03220799234941648030e-05, + 4.26517572576077638367e-05, + 4.49456141012434531802e-05, + 4.72026601881682524812e-05, + 4.94219303839001843038e-05, + 5.16024850522865696258e-05, + 5.37434104064078973302e-05, + 5.58438188436953509251e-05, + 5.79028492651570688234e-05, + 5.99196673786599580684e-05, + 6.18934659861721192748e-05, + 6.38234652549182388762e-05, + 6.57089129723729151135e-05, + 6.75490847850720971908e-05, + 6.93432844211934012709e-05, + 7.10908438968675459669e-05, + 7.27911237062255626245e-05, + 7.44435129951590121491e-05, + 7.60474297187843856823e-05, + 7.76023207826402985129e-05, + 7.91076621676173416964e-05, + 8.05629590386577253093e-05, + 8.19677458372435649003e-05, + 8.33215863577352583002e-05, + 8.46240738076027652209e-05, + 8.58748308515986194002e-05, + 8.70735096399619166833e-05, + 8.82197918207153089585e-05, + 8.93133885361372406803e-05, + 9.03540404035136604684e-05, + 9.13415174802592236660e-05, + 9.22756192135239819386e-05, + 9.31561743743901176599e-05, + 9.39830409767967284683e-05, + 9.47561061813165863036e-05, + 9.54752861839191087042e-05, + 9.61405260898756268200e-05, + 9.67517997729504849579e-05, + 9.73091097200465650948e-05, + 9.78124868614685578656e-05, + 9.82619903869737118746e-05, + 9.86577075477993088205e-05, + 9.89997534448505824923e-05, + 9.92882708032377870244e-05, + 9.95234297333714079334e-05, + 9.97054274788150226867e-05, + 9.98344881511112553288e-05, + 9.99108624517949686465e-05, + 9.99348273818228400017e-05, + 9.99066859386446587009e-05, + 9.98267668011501124433e-05, + 9.96954240027345068914e-05, + 9.95130365927253445271e-05, + 9.92800082864197933671e-05, + 9.89967671039888494865e-05, + 9.86637649985053661076e-05, + 9.82814774733607114231e-05, + 9.78504031893375142773e-05, + 9.73710635616093991710e-05, + 9.68440023469432334675e-05, + 9.62697852213858742314e-05, + 9.56489993487133770321e-05, + 9.49822529399337749968e-05, + 9.42701748041285732824e-05, + 9.35134138909305995691e-05, + 9.27126388249273401896e-05, + 9.18685374322917528561e-05, + 9.09818162599413001162e-05, + 9.00532000875254733281e-05, + 8.90834314325462917842e-05, + 8.80732700489246370709e-05, + 8.70234924193121910140e-05, + 8.59348912414666484460e-05, + 8.48082749089950011304e-05, + 8.36444669867888660050e-05, + 8.24443056814470995493e-05, + 8.12086433070261377561e-05, + 7.99383457464084788138e-05, + 7.86342919086182418845e-05, + 7.72973731824044141140e-05, + 7.59284928863964466827e-05, + 7.45285657161542757073e-05, + 7.30985171884366598380e-05, + 7.16392830829906657707e-05, + 7.01518088821840928807e-05, + 6.86370492088033058069e-05, + 6.70959672623157418921e-05, + 6.55295342539230995203e-05, + 6.39387288407061954269e-05, + 6.23245365591873072856e-05, + 6.06879492586022889272e-05, + 5.90299645341966667546e-05, + 5.73515851608610711097e-05, + 5.56538185273922726215e-05, + 5.39376760716902238437e-05, + 5.22041727171985520334e-05, + 5.04543263108674547410e-05, + 4.86891570629490461476e-05, + 4.69096869889039770705e-05, + 4.51169393537250871997e-05, + 4.33119381189441731090e-05, + 4.14957073926132242688e-05, + 3.96692708825496971343e-05, + 3.78336513531005402778e-05, + 3.59898700857156045134e-05, + 3.41389463435847715115e-05, + 3.22818968406223129981e-05, + 3.04197352150379130334e-05, + 2.85534715077610400016e-05, + 2.66841116459819329256e-05, + 2.48126569320371454517e-05, + 2.29401035378939945552e-05, + 2.10674420054833346785e-05, + 1.91956567530948109463e-05, + 1.73257255880832701685e-05, + 1.54586192260933851384e-05, + 1.35953008170508304306e-05, + 1.17367254781075038266e-05, + 9.88383983376396622401e-06, + 8.03758156337068200962e-06, + 6.19887895622111748366e-06, + 4.36865047440966400299e-06, + 2.54780432366209949829e-06, + 7.37238032308926373124e-07, +-1.06216196140181903275e-06, +-2.84952071350109670505e-06, +-4.62397516982719811819e-06, +-6.38467455271440543276e-06, +-8.13078073870770317037e-06, +-9.86146862713564825958e-06, +-1.15759264994108745933e-05, +-1.32733563689023272133e-05, +-1.49529743212684799525e-05, +-1.66140108451148118640e-05, +-1.82557111528464673220e-05, +-1.98773354916211406247e-05, +-2.14781594442844695424e-05, +-2.30574742201769104257e-05, +-2.46145869357362549322e-05, +-2.61488208847895399478e-05, +-2.76595157984633117411e-05, +-2.91460280946186709296e-05, +-3.06077311167595817127e-05, +-3.20440153623401097595e-05, +-3.34542887004032530218e-05, +-3.48379765785163355760e-05, +-3.61945222189482393904e-05, +-3.75233868040389463073e-05, +-3.88240496507459911801e-05, +-4.00960083743247562354e-05, +-4.13387790411311751020e-05, +-4.25518963105175459442e-05, +-4.37349135658282231866e-05, +-4.48874030344820757594e-05, +-4.60089558971416373264e-05, +-4.70991823859845203494e-05, +-4.81577118720843649186e-05, +-4.91841929419274583989e-05, +-5.01782934630889257735e-05, +-5.11397006390924718810e-05, +-5.20681210535034743074e-05, +-5.29632807032923507936e-05, +-5.38249250215106612256e-05, +-5.46528188893461618547e-05, +-5.54467466376069967565e-05, +-5.62065120377057097340e-05, +-5.69319382822057842072e-05, +-5.76228679550160513534e-05, +-5.82791629913088267694e-05, +-5.89007046272428875285e-05, +-5.94873933395923440545e-05, +-6.00391487753712058541e-05, +-6.05559096715516123285e-05, +-6.10376337649892107507e-05, +-6.14842976926593108057e-05, +-6.18958968823238233226e-05, +-6.22724454337409338497e-05, +-6.26139759905511322129e-05, +-6.29205396029612726468e-05, +-6.31922055813587270996e-05, +-6.34290613409973911456e-05, +-6.36312122378911084342e-05, +-6.37987813960626292450e-05, +-6.39319095262928170339e-05, +-6.40307547365266211065e-05, +-6.40954923340890131856e-05, +-6.41263146198697370432e-05, +-6.41234306746411955895e-05, +-6.40870661376762528177e-05, +-6.40174629778308577552e-05, +-6.39148792572699500983e-05, +-6.37795888880064606964e-05, +-6.36118813814352140369e-05, +-6.34120615910403414867e-05, +-6.31804494484613599157e-05, +-6.29173796931019454690e-05, +-6.26232015954722085176e-05, +-6.22982786744524704445e-05, +-6.19429884086736173409e-05, +-6.15577219422070999163e-05, +-6.11428837847619450737e-05, +-6.06988915065878725514e-05, +-6.02261754282833389803e-05, +-5.97251783057105978649e-05, +-5.91963550102224186499e-05, +-5.86401722044022619997e-05, +-5.80571080135254614690e-05, +-5.74476516929463732093e-05, +-5.68123032916220525477e-05, +-5.61515733119774190850e-05, +-5.54659823663211952113e-05, +-5.47560608300273307289e-05, +-5.40223484916846797155e-05, +-5.32653942004291476500e-05, +-5.24857555106721337967e-05, +-5.16839983244288007024e-05, +-5.08606965314631670927e-05, +-5.00164316474561513313e-05, +-4.91517924504131009438e-05, +-4.82673746155130051357e-05, +-4.73637803486131881954e-05, +-4.64416180186217908985e-05, +-4.55015017889379735677e-05, +-4.45440512481755157082e-05, +-4.35698910403685871315e-05, +-4.25796504948757788397e-05, +-4.15739632561744871879e-05, +-4.05534669137558035886e-05, +-3.95188026323245935744e-05, +-3.84706147824963234157e-05, +-3.74095505721943694328e-05, +-3.63362596789495190404e-05, +-3.52513938832865674302e-05, +-3.41556067034013181253e-05, +-3.30495530313091846969e-05, +-3.19338887706706398895e-05, +-3.08092704764648499791e-05, +-2.96763549967042926164e-05, +-2.85357991163705457791e-05, +-2.73882592037593264182e-05, +-2.62343908594002619289e-05, +-2.50748485677371487745e-05, +-2.39102853517339171191e-05, +-2.27413524305865331410e-05, +-2.15686988806957918462e-05, +-2.03929713000709965051e-05, +-1.92148134763324269733e-05, +-1.80348660584579070906e-05, +-1.68537662324394557363e-05, +-1.56721474009943186837e-05, +-1.44906388674901791041e-05, +-1.33098655242168735925e-05, +-1.21304475451532646111e-05, +-1.09530000833746117339e-05, +-9.77813297322283117563e-06, +-8.60645043737828595960e-06, +-7.43855079896758336784e-06, +-6.27502619881871961423e-06, +-5.11646231799598331854e-06, +-3.96343810572348692644e-06, +-2.81652551282231002175e-06, +-1.67628923075757107106e-06, +-5.43286436407872494914e-07, + 5.81933457334323180159e-07, + 1.69882904504591760570e-06, + 2.80686716623920578712e-06, + 3.90552313671397189482e-06, + 4.99428097372263609408e-06, + 6.07263361485467176461e-06, + 7.14008313057028191911e-06, + 8.19614093029787374922e-06, + 9.24032796203801469698e-06, + 1.02721749054007427328e-05, + 1.12912223580112092028e-05, + 1.22970210152323833412e-05, + 1.32891318431440794091e-05, + 1.42671262447347562611e-05, + 1.52305862192577593330e-05, + 1.61791045147036835158e-05, + 1.71122847733627428900e-05, + 1.80297416704377348772e-05, + 1.89311010456723673200e-05, + 1.98160000279815890877e-05, + 2.06840871530521841883e-05, + 2.15350224739038173570e-05, + 2.23684776643877086669e-05, + 2.31841361156243059649e-05, + 2.39816930253700516258e-05, + 2.47608554803058473310e-05, + 2.55213425312606982502e-05, + 2.62628852613713497754e-05, + 2.69852268471835885421e-05, + 2.76881226127196124491e-05, + 2.83713400765207057253e-05, + 2.90346589916937132319e-05, + 2.96778713789779565021e-05, + 3.03007815528719345064e-05, + 3.09032061408479746811e-05, + 3.14849740956869842052e-05, + 3.20459267009823244011e-05, + 3.25859175698492306789e-05, + 3.31048126368919349237e-05, + 3.36024901434722378835e-05, + 3.40788406163417342690e-05, + 3.45337668396904437789e-05, + 3.49671838206697444440e-05, + 3.53790187484598781464e-05, + 3.57692109469451898635e-05, + 3.61377118210646532115e-05, + 3.64844847969168087159e-05, + 3.68095052556900961707e-05, + 3.71127604615011769638e-05, + 3.73942494832178994610e-05, + 3.76539831103605689643e-05, + 3.78919837631567116656e-05, + 3.81082853968511798366e-05, + 3.83029334003578804196e-05, + 3.84759844893473848450e-05, + 3.86275065938727009992e-05, + 3.87575787406301688963e-05, + 3.88662909299569613790e-05, + 3.89537440076727901374e-05, + 3.90200495318706458425e-05, + 3.90653296347647622198e-05, + 3.90897168797087779285e-05, + 3.90933541134949965766e-05, + 3.90763943140510594358e-05, + 3.90390004336481431357e-05, + 3.89813452377418961383e-05, + 3.89036111395635601957e-05, + 3.88059900305833037435e-05, + 3.86886831069694882507e-05, + 3.85519006921667821723e-05, + 3.83958620557194456086e-05, + 3.82207952284667728518e-05, + 3.80269368142381611136e-05, + 3.78145317981768458210e-05, + 3.75838333518232266695e-05, + 3.73351026350875769854e-05, + 3.70686085952445174832e-05, + 3.67846277630824283257e-05, + 3.64834440463398959695e-05, + 3.61653485205640830985e-05, + 3.58306392175243310777e-05, + 3.54796209113175163119e-05, + 3.51126049022988697399e-05, + 3.47299087989734188192e-05, + 3.43318562979863894208e-05, + 3.39187769623452468762e-05, + 3.34910059980102160423e-05, + 3.30488840289914551757e-05, + 3.25927568710847293757e-05, + 3.21229753043848019326e-05, + 3.16398948447075694127e-05, + 3.11438755140624220878e-05, + 3.06352816103032127987e-05, + 3.01144814760946232977e-05, + 2.95818472673267157311e-05, + 2.90377547211135299580e-05, + 2.84825829235031577303e-05, + 2.79167140770347614077e-05, + 2.73405332682701918481e-05, + 2.67544282354346262150e-05, + 2.61587891362891606750e-05, + 2.55540083163661297088e-05, + 2.49404800776966532080e-05, + 2.43186004481496464925e-05, + 2.36887669515123128053e-05, + 2.30513783784305334912e-05, + 2.24068345583368003357e-05, + 2.17555361324791958683e-05, + 2.10978843281734282551e-05, + 2.04342807343983282075e-05, + 1.97651270788443597626e-05, + 1.90908250065320015982e-05, + 1.84117758601161542057e-05, + 1.77283804619801040644e-05, + 1.70410388982337398535e-05, + 1.63501503047186065565e-05, + 1.56561126551311619623e-05, + 1.49593225513600180476e-05, + 1.42601750161419401356e-05, + 1.35590632881392743862e-05, + 1.28563786195291532370e-05, + 1.21525100762025804540e-05, + 1.14478443406703827613e-05, + 1.07427655177589017509e-05, + 1.00376549431903564451e-05, + 9.33289099512935430329e-06, + 8.62884890878591384318e-06, + 7.92590059414905157801e-06, + 7.22441445693406108369e-06, + 6.52475522282227181239e-06, + 5.82728376506354903543e-06, + 5.13235693551778566856e-06, + 4.44032739920081165146e-06, + 3.75154347240349402752e-06, + 3.06634896445295587704e-06, + 2.38508302317038128695e-06, + 1.70807998408878326806e-06, + 1.03566922349157826689e-06, + 3.68175015318385312927e-07, +-2.94083608003316195796e-07, +-9.50792990756428532175e-07, +-1.60164498510903015186e-06, +-2.24633707822957432882e-06, +-2.88457251529725585548e-06, +-3.51606041836507742817e-06, +-4.14051590104719538038e-06, +-4.75766017899043685381e-06, +-5.36722067610390392149e-06, +-5.96893112651196722918e-06, +-6.56253167221256118968e-06, +-7.14776895641407462845e-06, +-7.72439621252695393942e-06, +-8.29217334879925126829e-06, +-8.85086702857723481774e-06, +-9.40025074617520820593e-06, +-9.94010489835155732234e-06, +-1.04702168513777000056e-05, +-1.09903810036992033189e-05, +-1.15003988441811452764e-05, +-1.20000790059446446682e-05, +-1.24892373157938542529e-05, +-1.29676968392356399312e-05, +-1.34352879211056542826e-05, +-1.38918482218078280619e-05, +-1.43372227491767596487e-05, +-1.47712638859842104608e-05, +-1.51938314131016376365e-05, +-1.56047925283423453849e-05, +-1.60040218609994824601e-05, +-1.63914014821137958761e-05, +-1.67668209104843766012e-05, +-1.71301771144641440945e-05, +-1.74813745095637493407e-05, +-1.78203249518961361498e-05, +-1.81469477275017576168e-05, +-1.84611695375891659296e-05, +-1.87629244797279366534e-05, +-1.90521540250400636825e-05, +-1.93288069914307297748e-05, +-1.95928395129016073037e-05, +-1.98442150049985344194e-05, +-2.00829041264385711751e-05, +-2.03088847369703611226e-05, +-2.05221418515166891200e-05, +-2.07226675906578703594e-05, +-2.09104611275098419107e-05, +-2.10855286310533183536e-05, +-2.12478832059765801270e-05, +-2.13975448290907599989e-05, +-2.15345402823791832330e-05, +-2.16589030827471214040e-05, +-2.17706734085350807535e-05, +-2.18698980228635944017e-05, +-2.19566301938759495123e-05, +-2.20309296119498917597e-05, +-2.20928623039478315611e-05, +-2.21425005445764114633e-05, +-2.21799227649298888801e-05, +-2.22052134582895725366e-05, +-2.22184630832555388114e-05, +-2.22197679642845197419e-05, +-2.22092301897129874779e-05, +-2.21869575073414682510e-05, +-2.21530632176585956473e-05, +-2.21076660647849037526e-05, +-2.20508901252157237687e-05, +-2.19828646944432693725e-05, +-2.19037241715403474508e-05, +-2.18136079417860268177e-05, +-2.17126602574166129554e-05, +-2.16010301165839486721e-05, +-2.14788711406044598715e-05, +-2.13463414495824367763e-05, +-2.12036035364909901271e-05, +-2.10508241397952941727e-05, +-2.08881741147017592605e-05, +-2.07158283031179152496e-05, +-2.05339654024071466103e-05, +-2.03427678330234534560e-05, +-2.01424216051101083219e-05, +-1.99331161841466409333e-05, +-1.97150443557298639234e-05, +-1.94884020895712982066e-05, +-1.92533884027966296513e-05, +-1.90102052226298810192e-05, +-1.87590572485473988781e-05, +-1.85001518139830994003e-05, +-1.82336987476685074346e-05, +-1.79599102346913299191e-05, +-1.76790006773522863739e-05, +-1.73911865559027042601e-05, +-1.70966862892450109082e-05, +-1.67957200956739338487e-05, +-1.64885098537402634234e-05, +-1.61752789633142813903e-05, +-1.58562522069297573337e-05, +-1.55316556114829399716e-05, +-1.52017163103647922620e-05, +-1.48666624061033995360e-05, +-1.45267228335893107877e-05, +-1.41821272239584706039e-05, +-1.38331057692081632425e-05, +-1.34798890876143142534e-05, +-1.31227080900243395635e-05, +-1.27617938470932148766e-05, +-1.23973774575348411156e-05, +-1.20296899174529279452e-05, +-1.16589619908198458004e-05, +-1.12854240811699317332e-05, +-1.09093061045693789425e-05, +-1.05308373639278654549e-05, +-1.01502464247116462527e-05, +-9.76776099211927309387e-06, +-9.38360778978138410360e-06, +-8.99801244003842426661e-06, +-8.61119934585468618966e-06, +-8.22339157442569339263e-06, +-7.83481074252833694781e-06, +-7.44567690366960780872e-06, +-7.05620843708181691813e-06, +-6.66662193861726721860e-06, +-6.27713211358587016620e-06, +-5.88795167158394612084e-06, +-5.49929122336098261949e-06, +-5.11135917976332167136e-06, +-4.72436165279991700163e-06, +-4.33850235886762889933e-06, +-3.95398252417811778438e-06, +-3.57100079241896547341e-06, +-3.18975313468634483958e-06, +-2.81043276172503517281e-06, +-2.43323003850372685734e-06, +-2.05833240115816176063e-06, +-1.68592427633299744872e-06, +-1.31618700294525707091e-06, +-9.49298756398597503033e-07, +-5.85434475269598042740e-07, +-2.24765790491995588430e-07, + 1.32539042944795253329e-07, + 4.86315211761806101974e-07, + 8.36401407601896179804e-07, + 1.18263988767470755612e-06, + 1.52487653281902728484e-06, + 1.86296090296814218483e-06, + 2.19674629001149769367e-06, + 2.52608976803993208671e-06, + 2.85085224096945087408e-06, + 3.17089848753367322990e-06, + 3.48609720364736703897e-06, + 3.79632104212865399887e-06, + 4.10144664978819417086e-06, + 4.40135470188026015846e-06, + 4.69592993391712774085e-06, + 4.98506117085352237869e-06, + 5.26864135364426027284e-06, + 5.54656756317971894038e-06, + 5.81874104161062011015e-06, + 6.08506721106972112904e-06, + 6.34545568979961026893e-06, + 6.59982030570251321293e-06, + 6.84807910732276385433e-06, + 7.09015437227939167509e-06, + 7.32597261316240703008e-06, + 7.55546458091406095787e-06, + 7.77856526571271897894e-06, + 7.99521389537842829865e-06, + 8.20535393132500495055e-06, + 8.40893306208027325446e-06, + 8.60590319439752568476e-06, + 8.79622044198663719764e-06, + 8.97984511188937595011e-06, + 9.15674168852855148177e-06, + 9.32687881545792753647e-06, + 9.49022927484590670408e-06, + 9.64676996472301928230e-06, + 9.79648187402453286072e-06, + 9.93935005546419846816e-06, + 1.00753635962716102202e-05, + 1.02045155868300701406e-05, + 1.03268030872496085793e-05, + 1.04422270919149080961e-05, + 1.05507924920450241771e-05, + 1.06525080363035427313e-05, + 1.07473862895008009574e-05, + 1.08354435894281464503e-05, + 1.09167000018650293508e-05, + 1.09911792738028123146e-05, + 1.10589087849281107333e-05, + 1.11199194974072203387e-05, + 1.11742459040198995155e-05, + 1.12219259746838584705e-05, + 1.12630011014179261237e-05, + 1.12975160417893515888e-05, + 1.13255188608912239713e-05, + 1.13470608718986725231e-05, + 1.13621965752502408455e-05, + 1.13709835965033970314e-05, + 1.13734826229117897745e-05, + 1.13697573387741017237e-05, + 1.13598743596030994434e-05, + 1.13439031651642332040e-05, + 1.13219160314340630866e-05, + 1.12939879615281848059e-05, + 1.12601966156488724434e-05, + 1.12206222401028280833e-05, + 1.11753475954396282394e-05, + 1.11244578837614569632e-05, + 1.10680406752547680398e-05, + 1.10061858339946508134e-05, + 1.09389854430727538072e-05, + 1.08665337290993678862e-05, + 1.07889269861304655274e-05, + 1.07062634990703402997e-05, + 1.06186434666001975772e-05, + 1.05261689236834371503e-05, + 1.04289436636973722826e-05, + 1.03270731602417616547e-05, + 1.02206644886739122943e-05, + 1.01098262474197981978e-05, + 9.99466847911029713993e-06, + 9.87530259159213775891e-06, + 9.75184127886138886650e-06, + 9.62439844196833259673e-06, + 9.49308910994118403798e-06, + 9.35802936077670613891e-06, + 9.21933624254407122552e-06, + 9.07712769464878633412e-06, + 8.93152246930307774312e-06, + 8.78264005324776636302e-06, + 8.63060058977119588699e-06, + 8.47552480106907815021e-06, + 8.31753391098935562125e-06, + 8.15674956820603695338e-06, + 7.99329376986349665764e-06, + 7.82728878573373623468e-06, + 7.65885708292866533933e-06, + 7.48812125120667820171e-06, + 7.31520392891465129538e-06, + 7.14022772960352193400e-06, + 6.96331516935741928119e-06, + 6.78458859487234582688e-06, + 6.60417011232208535555e-06, + 6.42218151704836629878e-06, + 6.23874422410881874162e-06, + 6.05397919971873245333e-06, + 5.86800689361913014930e-06, + 5.68094717240549469965e-06, + 5.49291925384726654124e-06, + 5.30404164223008170432e-06, + 5.11443206475166292147e-06, + 4.92420740899910160668e-06, + 4.73348366153649160803e-06, + 4.54237584763147922608e-06, + 4.35099797214519011545e-06, + 4.15946296161273383862e-06, + 3.96788260753767942779e-06, + 3.77636751092580240556e-06, + 3.58502702807880729068e-06, + 3.39396921767065449759e-06, + 3.20330078912824216524e-06, + 3.01312705233424288917e-06, + 2.82355186867183291849e-06, + 2.63467760343009042062e-06, + 2.44660507958478551702e-06, + 2.25943353297212192994e-06, + 2.07326056886889636990e-06, + 1.88818211999486711094e-06, + 1.70429240594666796266e-06, + 1.52168389407997070498e-06, + 1.34044726184580192320e-06, + 1.16067136059360877587e-06, + 9.82443180850182688139e-07, + 8.05847819080474491893e-07, + 6.30968445938113515307e-07, + 4.57886276012498259056e-07, + 2.86680539075394581232e-07, + 1.17428452831952805658e-07, +-4.97948028199512061526e-08, +-2.14916110022078276637e-07, +-3.77864435677151772163e-07, +-5.38570852660314438457e-07, +-6.96968559519905157610e-07, +-8.52992898671310133264e-07, +-1.00658137308563959240e-06, +-1.15767366147595502125e-06, +-1.30621163198739205903e-06, +-1.45213935439566631263e-06, +-1.59540311081938818504e-06, +-1.73595140495523324136e-06, +-1.87373496984242769148e-06, +-2.00870677416657680066e-06, +-2.14082202711105138891e-06, +-2.27003818176825526611e-06, +-2.39631493712127321177e-06, +-2.51961423860721225935e-06, +-2.63990027727692722499e-06, +-2.75713948756333368392e-06, +-2.87130054367384340272e-06, +-2.98235435462072420536e-06, +-3.09027405790690176183e-06, +-3.19503501188302714502e-06, +-3.29661478679241666049e-06, +-3.39499315452328387347e-06, +-3.49015207708610277043e-06, +-3.58207569383478124936e-06, +-3.67075030745277205795e-06, +-3.75616436872432333914e-06, +-3.83830846011024974469e-06, +-3.91717527815298500760e-06, +-3.99275961473000555479e-06, +-4.06505833718047160103e-06, +-4.13407036732752447398e-06, +-4.19979665941946242550e-06, +-4.26224017701520252964e-06, +-4.32140586883761345266e-06, +-4.37730064362061373922e-06, +-4.42993334397458008860e-06, +-4.47931471929707665449e-06, +-4.52545739775462975901e-06, +-4.56837585736176623178e-06, +-4.60808639618528355489e-06, +-4.64460710170019533535e-06, +-4.67795781932549308073e-06, +-4.70816012016700297387e-06, +-4.73523726799615031957e-06, +-4.75921418549265574824e-06, +-4.78011741977943205404e-06, +-4.79797510727910759225e-06, +-4.81281693792077799724e-06, +-4.82467411872585649209e-06, +-4.83357933680284597292e-06, +-4.83956672177992600872e-06, +-4.84267180770512457676e-06, +-4.84293149444327853537e-06, +-4.84038400859978304718e-06, +-4.83506886400059992306e-06, +-4.82702682175797029301e-06, +-4.81629984995190550901e-06, +-4.80293108295687288677e-06, +-4.78696478044319962005e-06, +-4.76844628608297569874e-06, +-4.74742198598980721643e-06, +-4.72393926692184768618e-06, +-4.69804647427729357874e-06, +-4.66979286991168869255e-06, +-4.63922858980587374532e-06, +-4.60640460161349042157e-06, +-4.57137266211669161266e-06, +-4.53418527461856474313e-06, +-4.49489564630047438049e-06, +-4.45355764557232873177e-06, +-4.41022575944365265741e-06, +-4.36495505094285770681e-06, +-4.31780111661199634214e-06, +-4.26882004410400630158e-06, +-4.21806836990897163306e-06, +-4.16560303723581088566e-06, +-4.11148135407525745674e-06, +-4.05576095146995474136e-06, +-3.99849974201671793024e-06, +-3.93975587862589741230e-06, +-3.87958771356253902739e-06, +-3.81805375779311230168e-06, +-3.75521264066174805207e-06, +-3.69112306991899966841e-06, +-3.62584379212629908306e-06, +-3.55943355345803456996e-06, +-3.49195106092336089756e-06, +-3.42345494402936616337e-06, +-3.35400371690614687047e-06, +-3.28365574091441607464e-06, +-3.21246918775588953681e-06, +-3.14050200310536497332e-06, +-3.06781187078386562419e-06, +-2.99445617749091577548e-06, +-2.92049197811430259292e-06, +-2.84597596163407434304e-06, +-2.77096441763784568063e-06, +-2.69551320346391274513e-06, +-2.61967771198731242738e-06, +-2.54351284006417954935e-06, +-2.46707295764927670231e-06, +-2.39041187760002226610e-06, +-2.31358282618092573712e-06, +-2.23663841428083219829e-06, +-2.15963060935584024358e-06, +-2.08261070810834870857e-06, +-2.00562930991492076031e-06, +-1.92873629101175331357e-06, +-1.85198077944850633880e-06, +-1.77541113081986172875e-06, +-1.69907490478282910220e-06, +-1.62301884236816257159e-06, +-1.54728884409369261285e-06, +-1.47192994888573774293e-06, +-1.39698631381516495750e-06, +-1.32250119465412662692e-06, +-1.24851692725776004904e-06, +-1.17507490977594879706e-06, +-1.10221558569852023006e-06, +-1.02997842773779330541e-06, +-9.58401922550402422422e-07, +-8.87523556300846598974e-07, +-8.17379801068637194395e-07, +-7.48006102099267160073e-07, +-6.79436865899721901669e-07, +-6.11705449178669713405e-07, +-5.44844148629825548117e-07, +-4.78884191557767192135e-07, +-4.13855727343869051617e-07, +-3.49787819750522529807e-07, +-2.86708440059940296556e-07, +-2.24644461044386128961e-07, +-1.63621651764123018711e-07, +-1.03664673187799380991e-07, +-4.47970746308059675830e-08, + 0 /* Need a final zero coefficient */ + diff --git a/libk3b/plugin/libsamplerate/samplerate.c b/libk3b/plugin/libsamplerate/samplerate.c new file mode 100644 index 0000000..58ad40a --- /dev/null +++ b/libk3b/plugin/libsamplerate/samplerate.c @@ -0,0 +1,301 @@ +/* +** Copyright (C) 2002,2003 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** 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, write to the Free Software +** Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include +#include +#include + +#include "config.h" + +#include "samplerate.h" +#include "common.h" + +SRC_STATE * +src_new (int converter_type, int channels, int *error) +{ SRC_PRIVATE *psrc ; + + if (error) + *error = SRC_ERR_NO_ERROR ; + + if (channels < 1) + { if (error) + *error = SRC_ERR_BAD_CHANNEL_COUNT ; + return NULL ; + } ; + + if ((psrc = calloc (1, sizeof (*psrc))) == NULL) + { if (error) + *error = SRC_ERR_MALLOC_FAILED ; + return NULL ; + } ; + + psrc->channels = channels ; + + if (sinc_set_converter (psrc, converter_type) != SRC_ERR_NO_ERROR && + zoh_set_converter (psrc, converter_type) != SRC_ERR_NO_ERROR && + linear_set_converter (psrc, converter_type) != SRC_ERR_NO_ERROR) + { if (error) + *error = SRC_ERR_BAD_CONVERTER ; + free (psrc) ; + psrc = NULL ; + } ; + + src_reset ((SRC_STATE*) psrc) ; + + return (SRC_STATE*) psrc ; +} /* src_new */ + +SRC_STATE * +src_delete (SRC_STATE *state) +{ SRC_PRIVATE *psrc ; + + psrc = (SRC_PRIVATE*) state ; + if (psrc) + { if (psrc->private_data) + free (psrc->private_data) ; + memset (psrc, 0, sizeof (SRC_PRIVATE)) ; + free (psrc) ; + } ; + + return NULL ; +} /* src_state */ + +int +src_process (SRC_STATE *state, SRC_DATA *data) +{ SRC_PRIVATE *psrc ; + int error ; + + psrc = (SRC_PRIVATE*) state ; + + if (psrc == NULL) + return SRC_ERR_BAD_STATE ; + if (psrc->process == NULL) + return SRC_ERR_BAD_PROC_PTR ; + + /* Check for valid SRC_DATA first. */ + if (data == NULL) + return SRC_ERR_BAD_DATA ; + /* Check src_ratio is in range. */ + if (data->src_ratio < (1.0 / SRC_MAX_RATIO) || data->src_ratio > (1.0 * SRC_MAX_RATIO)) + return SRC_ERR_BAD_SRC_RATIO ; + + /* And that data_in and data_out are valid. */ + if (data->data_in == NULL || data->data_out == NULL) + return SRC_ERR_BAD_DATA_PTR ; + + if (data->data_in == NULL) + data->input_frames = 0 ; + + if (data->data_in < data->data_out) + { if (data->data_in + data->input_frames * psrc->channels > data->data_out) + { /*-printf ("data_in: %p data_out: %p\n", + data->data_in + data->input_frames * psrc->channels, data->data_out) ;-*/ + return SRC_ERR_DATA_OVERLAP ; + } ; + } + else if (data->data_out + data->output_frames * psrc->channels > data->data_in) + { /*-printf ("data_out: %p (%p) data_in: %p\n", data->data_out, + data->data_out + data->output_frames * psrc->channels, data->data_in) ;-*/ + return SRC_ERR_DATA_OVERLAP ; + } ; + + if (data->input_frames < 0) + data->input_frames = 0 ; + if (data->output_frames < 0) + data->output_frames = 0 ; + + /* Set the input and output counts to zero. */ + data->input_frames_used = 0 ; + data->output_frames_gen = 0 ; + + /* Special case for when last_ratio has not been set. */ + if (psrc->last_ratio < (1.0 / SRC_MAX_RATIO)) + psrc->last_ratio = data->src_ratio ; + + /* Now process. */ + error = psrc->process (psrc, data) ; + + return error ; +} /* src_process */ + +int +src_set_ratio (SRC_STATE *state, double new_ratio) +{ SRC_PRIVATE *psrc ; + + psrc = (SRC_PRIVATE*) state ; + + if (psrc == NULL) + return SRC_ERR_BAD_STATE ; + if (psrc->process == NULL) + return SRC_ERR_BAD_PROC_PTR ; + + psrc->last_ratio = new_ratio ; + + return SRC_ERR_NO_ERROR ; +} /* src_set_ratio */ + +int +src_reset (SRC_STATE *state) +{ SRC_PRIVATE *psrc ; + + if ((psrc = (SRC_PRIVATE*) state) == NULL) + return SRC_ERR_BAD_STATE ; + + if (psrc->reset != NULL) + psrc->reset (psrc) ; + + psrc->last_position = 0.0 ; + psrc->last_ratio = 0.0 ; + + psrc->error = SRC_ERR_NO_ERROR ; + + return SRC_ERR_NO_ERROR ; +} /* src_reset */ + +/*============================================================================== +** Control functions. +*/ + +const char * +src_get_name (int converter_type) +{ const char *desc ; + + if ((desc = sinc_get_name (converter_type)) != NULL) + return desc ; + + if ((desc = zoh_get_name (converter_type)) != NULL) + return desc ; + + if ((desc = linear_get_name (converter_type)) != NULL) + return desc ; + + return NULL ; +} /* src_get_name */ + +const char * +src_get_description (int converter_type) +{ const char *desc ; + + if ((desc = sinc_get_description (converter_type)) != NULL) + return desc ; + + if ((desc = zoh_get_description (converter_type)) != NULL) + return desc ; + + if ((desc = linear_get_description (converter_type)) != NULL) + return desc ; + + return NULL ; +} /* src_get_description */ + +const char * +src_get_version (void) +{ return "libsamplerate-k3b";/*PACKAGE "-" VERSION ;*/ +} /* src_get_version */ + +int +src_is_valid_ratio (double ratio) +{ + if (ratio < (1.0 / SRC_MAX_RATIO) || ratio > (1.0 * SRC_MAX_RATIO)) + return SRC_FALSE ; + + return SRC_TRUE ; +} /* src_is_valid_ratio */ + +/*============================================================================== +** Error reporting functions. +*/ + +int +src_error (SRC_STATE *state) +{ if (state) + return ((SRC_PRIVATE*) state)->error ; + return SRC_ERR_NO_ERROR ; +} /* src_error */ + +const char* +src_strerror (int error) +{ + switch (error) + { case SRC_ERR_NO_ERROR : + return "No error" ; + case SRC_ERR_MALLOC_FAILED : + return "Malloc failed." ; + case SRC_ERR_BAD_STATE : + return "SRC_STATE pointer is NULL." ; + case SRC_ERR_BAD_DATA : + return "SRC_DATA pointer is NULL." ; + case SRC_ERR_BAD_DATA_PTR : + return "SRC_DATA->data_out is NULL." ; + case SRC_ERR_NO_PRIVATE : + return "Internal error. No private data." ; + case SRC_ERR_BAD_SRC_RATIO : + return "SRC ratio outside [-12, 12] range." ; + case SRC_ERR_BAD_SINC_STATE : + return "src_process() called without reset after end_of_input." ; + case SRC_ERR_BAD_PROC_PTR : + return "Internal error. No process pointer." ; + case SRC_ERR_SHIFT_BITS : + return "Internal error. SHIFT_BITS too large." ; + case SRC_ERR_FILTER_LEN : + return "Internal error. Filter length too large." ; + case SRC_ERR_BAD_CONVERTER : + return "Bad converter number." ; + case SRC_ERR_BAD_CHANNEL_COUNT : + return "Channel count must be >= 1." ; + case SRC_ERR_SINC_BAD_BUFFER_LEN : + return "Internal error. Bad buffer length. Please report this." ; + case SRC_ERR_SIZE_INCOMPATIBILITY : + return "Internal error. Input data / internal buffer size difference. Please report this." ; + case SRC_ERR_BAD_PRIV_PTR : + return "Internal error. Private pointer is NULL. Please report this." ; + + case SRC_ERR_DATA_OVERLAP : + return "Input and output data arrays overlap." ; + + case SRC_ERR_MAX_ERROR : + return "Placeholder. No error defined for this error number." ; + + default : break ; + } + + return NULL ; +} /* src_strerror */ + +/*============================================================================== +** Simple interface for performing a single conversion from input buffer to +** output buffer at a fixed conversion ratio. +*/ + +int +src_simple (SRC_DATA *src_data, int converter, int channels) +{ SRC_STATE *src_state ; + int error ; + + if ((src_state = src_new (converter, channels, &error)) == NULL) + return error ; + + src_data->end_of_input = 1 ; /* Only one buffer worth of input. */ + + error = src_process (src_state, src_data) ; + + src_state = src_delete (src_state) ; + + return error ; +} /* src_simple */ + diff --git a/libk3b/plugin/libsamplerate/samplerate.h b/libk3b/plugin/libsamplerate/samplerate.h new file mode 100644 index 0000000..dfc4448 --- /dev/null +++ b/libk3b/plugin/libsamplerate/samplerate.h @@ -0,0 +1,138 @@ +/* +** Copyright (C) 2002,2003 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** 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, write to the Free Software +** Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +/* +** API documentation is available here: +** http://www.mega-nerd.com/SRC/api.html +*/ + +#ifndef SAMPLERATE_H +#define SAMPLERATE_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +typedef struct SRC_STATE_tag SRC_STATE ; + +typedef struct +{ float *data_in, *data_out ; + + long input_frames, output_frames ; + long input_frames_used, output_frames_gen ; + + int end_of_input ; + + double src_ratio ; +} SRC_DATA ; + +/* +** Simple interface for performing a single conversion from input buffer to +** output buffer at a fixed conversion ratio. +*/ +int src_simple (SRC_DATA *data, int converter_type, int channels) ; + +/* +** Initialisation function : return an anonymous pointer to the internal state +** of the converter. Choose a converter from the enums below. +*/ + +SRC_STATE* src_new (int converter_type, int channels, int *error) ; + +/* +** Cleanup all internal allocations. +** Always returns NULL. +*/ + +SRC_STATE* src_delete (SRC_STATE *state) ; + +/* +** This library contains a number of different sample rate converters, +** numbered 0 through N. +** +** Return a string giving either a name or a more full description of each +** sample rate converter or NULL if no sample rate converter exists for +** the given value. The converters are sequentially numbered from 0 to N. +*/ + +const char *src_get_name (int converter_type) ; +const char *src_get_description (int converter_type) ; +const char *src_get_version (void) ; + +/* +** Processing function. +** Returns non zero on error. +*/ + +int src_process (SRC_STATE *state, SRC_DATA *data) ; + +/* +** Set a new SRC ratio. This allows step responses +** in the conversion ratio. +** Returns non zero on error. +*/ + +int src_set_ratio (SRC_STATE *state, double new_ratio) ; + +/* +** Reset the internal SRC state. +** Does not modify the quality settings. +** Does not free any memory allocations. +** Returns non zero on error. +*/ + +int src_reset (SRC_STATE *state) ; + +/* +** Return TRUE if ratio is a valid conversion ratio, FALSE +** otherwise. +*/ + +int src_is_valid_ratio (double ratio) ; + +/* +** Return an error number. +*/ + +int src_error (SRC_STATE *state) ; + +/* +** Convert the error number into a string. +*/ +const char* src_strerror (int error) ; + +/* +** The following enums can be used to set the interpolator type +** using the function src_set_converter(). +*/ + +enum +{ + SRC_SINC_BEST_QUALITY = 0, + SRC_SINC_MEDIUM_QUALITY = 1, + SRC_SINC_FASTEST = 2, + SRC_ZERO_ORDER_HOLD = 3, + SRC_LINEAR = 4 +} ; + + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* SAMPLERATE_H */ diff --git a/libk3b/plugin/libsamplerate/src_linear.c b/libk3b/plugin/libsamplerate/src_linear.c new file mode 100644 index 0000000..c1736d2 --- /dev/null +++ b/libk3b/plugin/libsamplerate/src_linear.c @@ -0,0 +1,194 @@ +/* +** Copyright (C) 2002,2003 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** 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, write to the Free Software +** Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include +#include +#include + +#include "config.h" +#include "float_cast.h" +#include "common.h" + +static void linear_reset (SRC_PRIVATE *psrc) ; + +/*======================================================================================== +*/ + +#define LINEAR_MAGIC_MARKER MAKE_MAGIC('l','i','n','e','a','r') + +typedef struct +{ int linear_magic_marker ; + int channels ; + long in_count, in_used ; + long out_count, out_gen ; + float last_value [1] ; +} LINEAR_DATA ; + +/*---------------------------------------------------------------------------------------- +*/ +int +linear_process (SRC_PRIVATE *psrc, SRC_DATA *data) +{ LINEAR_DATA *linear ; + double src_ratio, input_index ; + int ch ; + + if (psrc->private_data == NULL) + return SRC_ERR_NO_PRIVATE ; + + linear = (LINEAR_DATA*) psrc->private_data ; + + linear->in_count = data->input_frames * linear->channels ; + linear->out_count = data->output_frames * linear->channels ; + linear->in_used = linear->out_gen = 0 ; + + src_ratio = psrc->last_ratio ; + input_index = psrc->last_position ; + + /* Calculate samples before first sample in input array. */ + while (input_index > 0.0 && input_index < 1.0 && linear->out_gen < linear->out_count) + { + if (linear->in_used + input_index > linear->in_count) + break ; + + if (fabs (psrc->last_ratio - data->src_ratio) > SRC_MIN_RATIO_DIFF) + src_ratio = psrc->last_ratio + linear->out_gen * (data->src_ratio - psrc->last_ratio) / (linear->out_count - 1) ; + + for (ch = 0 ; ch < linear->channels ; ch++) + { data->data_out [linear->out_gen] = linear->last_value [ch] + input_index * + (data->data_in [ch] - linear->last_value [ch]) ; + linear->out_gen ++ ; + } ; + + /* Figure out the next index. */ + input_index += 1.0 / src_ratio ; + } ; + + /* Main processing loop. */ + while (linear->out_gen < linear->out_count) + { + linear->in_used += linear->channels * lrint (floor (input_index)) ; + input_index -= floor (input_index) ; + + if (linear->in_used + input_index > linear->in_count) + break ; + + if (fabs (psrc->last_ratio - data->src_ratio) > SRC_MIN_RATIO_DIFF) + src_ratio = psrc->last_ratio + linear->out_gen * (data->src_ratio - psrc->last_ratio) / (linear->out_count - 1) ; + + for (ch = 0 ; ch < linear->channels ; ch++) + { data->data_out [linear->out_gen] = data->data_in [linear->in_used + ch] + input_index * + (data->data_in [linear->in_used + linear->channels + ch] - data->data_in [linear->in_used + ch]) ; + linear->out_gen ++ ; + } ; + + /* Figure out the next index. */ + input_index += 1.0 / src_ratio ; + } ; + +/*- if (input_index > linear->in_count - linear->in_used) + { input_index -= linear->in_count - linear->in_used ; + linear->in_used = linear->in_count ; + puts ("XXXXXXXXXX") ; /+*-exit (1) ;-*+/ + } ; +-*/ + + psrc->last_position = input_index ; + + for (ch = 0 ; ch < linear->channels ; ch++) + { linear->last_value [ch] = data->data_in [linear->in_used - linear->channels + ch] ; + +/*- data->data_out [0 + ch] = -0.9 ; + data->data_out [linear->out_gen - linear->channels + ch] = 0.9 ; -*/ + } ; + + /* Save current ratio rather then target ratio. */ + psrc->last_ratio = src_ratio ; + + data->input_frames_used = linear->in_used / linear->channels ; + data->output_frames_gen = linear->out_gen / linear->channels ; + + return SRC_ERR_NO_ERROR ; +} /* linear_process */ + +/*------------------------------------------------------------------------------ +*/ + +const char* +linear_get_name (int src_enum) +{ + if (src_enum == SRC_LINEAR) + return "Linear Interpolator" ; + + return NULL ; +} /* linear_get_name */ + +const char* +linear_get_description (int src_enum) +{ + if (src_enum == SRC_LINEAR) + return "Linear interpolator, very fast, poor quality." ; + + return NULL ; +} /* linear_get_descrition */ + +int +linear_set_converter (SRC_PRIVATE *psrc, int src_enum) +{ LINEAR_DATA *linear ; + + if (src_enum != SRC_LINEAR) + return SRC_ERR_BAD_CONVERTER ; + + if (psrc->private_data != NULL) + { linear = (LINEAR_DATA*) psrc->private_data ; + if (linear->linear_magic_marker != LINEAR_MAGIC_MARKER) + { free (psrc->private_data) ; + psrc->private_data = NULL ; + } ; + } ; + + if (psrc->private_data == NULL) + { linear = calloc (1, sizeof (*linear) + psrc->channels * sizeof (float)) ; + if (linear == NULL) + return SRC_ERR_MALLOC_FAILED ; + psrc->private_data = linear ; + } ; + + linear->linear_magic_marker = LINEAR_MAGIC_MARKER ; + linear->channels = psrc->channels ; + + psrc->process = linear_process ; + psrc->reset = linear_reset ; + + linear_reset (psrc) ; + + return SRC_ERR_NO_ERROR ; +} /* linear_set_converter */ + +/*=================================================================================== +*/ + +static void +linear_reset (SRC_PRIVATE *psrc) +{ LINEAR_DATA *linear ; + + linear = (LINEAR_DATA*) psrc->private_data ; + if (linear == NULL) + return ; + + memset (linear->last_value, 0, sizeof (linear->last_value [0]) * linear->channels) ; +} /* linear_reset */ diff --git a/libk3b/plugin/libsamplerate/src_sinc.c b/libk3b/plugin/libsamplerate/src_sinc.c new file mode 100644 index 0000000..ddfc06b --- /dev/null +++ b/libk3b/plugin/libsamplerate/src_sinc.c @@ -0,0 +1,471 @@ +/* +** Copyright (C) 2002,2003 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** 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, write to the Free Software +** Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include +#include +#include + +#include "config.h" +#include "float_cast.h" +#include "common.h" + +#define SINC_MAGIC_MARKER MAKE_MAGIC(' ','s','i','n','c',' ') + +#define ARRAY_LEN(x) ((int) (sizeof (x) / sizeof ((x) [0]))) + +/*======================================================================================== +** Macros for handling the index into the array for the filter. +** Double precision floating point is not accurate enough so use a 64 bit +** fixed point value instead. SHIFT_BITS (current value of 48) is the number +** of bits to the right of the decimal point. +** The rest of the macros are for retrieving the fractional and integer parts +** and for converting floats and ints to the fixed point format or from the +** fixed point type back to integers and floats. +*/ + +#define MAKE_INCREMENT_T(x) ((increment_t) (x)) + +#define SHIFT_BITS 16 +#define FP_ONE ((double) (((increment_t) 1) << SHIFT_BITS)) + +#define DOUBLE_TO_FP(x) (lrint ((x) * FP_ONE)) +#define INT_TO_FP(x) (((increment_t) (x)) << SHIFT_BITS) + +#define FP_FRACTION_PART(x) ((x) & ((((increment_t) 1) << SHIFT_BITS) - 1)) +#define FP_INTEGER_PART(x) ((x) & (((increment_t) -1) << SHIFT_BITS)) + +#define FP_TO_INT(x) (((x) >> SHIFT_BITS)) +#define FP_TO_DOUBLE(x) (FP_FRACTION_PART (x) / FP_ONE) + +/*======================================================================================== +*/ + +typedef int32_t increment_t ; +typedef float coeff_t ; + +enum +{ + STATE_BUFFER_START = 101, + STATE_DATA_CONTINUE = 102, + STATE_BUFFER_END = 103, + STATE_FINISHED +} ; + +typedef struct +{ int sinc_magic_marker ; + + int channels ; + long in_count, in_used ; + long out_count, out_gen ; + + int coeff_half_len, index_inc ; + int has_diffs ; + + double src_ratio, input_index ; + + int coeff_len ; + coeff_t const *coeffs ; + + int b_current, b_end, b_real_end, b_len ; + float *pdata ; + float buffer [1] ; +} SINC_FILTER ; + +static double calc_output (SINC_FILTER *filter, increment_t increment, increment_t start_filter_index, int ch) ; + +static void prepare_data (SINC_FILTER *filter, SRC_DATA *data, int half_filter_chan_len) ; + +static void sinc_reset (SRC_PRIVATE *psrc) ; + +static coeff_t const high_qual_coeffs [] = +{ +#include "high_qual_coeffs.h" +} ; /* high_qual_coeffs */ + +static coeff_t const mid_qual_coeffs [] = +{ +#include "mid_qual_coeffs.h" +} ; /* mid_qual_coeffs */ + +static coeff_t const fastest_coeffs [] = +{ +#include "fastest_coeffs.h" +} ; /* fastest_coeffs */ + +/*---------------------------------------------------------------------------------------- +*/ + +const char* +sinc_get_name (int src_enum) +{ + switch (src_enum) + { case SRC_SINC_BEST_QUALITY : + return "Best Sinc Interpolator" ; + + case SRC_SINC_MEDIUM_QUALITY : + return "Medium Sinc Interpolator" ; + + case SRC_SINC_FASTEST : + return "Fastest Sinc Interpolator" ; + } ; + + return NULL ; +} /* sinc_get_descrition */ + +const char* +sinc_get_description (int src_enum) +{ + switch (src_enum) + { case SRC_SINC_BEST_QUALITY : + return "Band limitied sinc interpolation, best quality, 97dB SNR, 96% BW." ; + + case SRC_SINC_MEDIUM_QUALITY : + return "Band limitied sinc interpolation, medium quality, 97dB SNR, 90% BW." ; + + case SRC_SINC_FASTEST : + return "Band limitied sinc interpolation, fastest, 97dB SNR, 80% BW." ; + } ; + + return NULL ; +} /* sinc_get_descrition */ + +int +sinc_set_converter (SRC_PRIVATE *psrc, int src_enum) +{ SINC_FILTER *filter, temp_filter ; + int count ; + + /* Quick sanity check. */ + if (SHIFT_BITS >= sizeof (increment_t) * 8 - 1) + return SRC_ERR_SHIFT_BITS ; + + if (psrc->private_data != NULL) + { filter = (SINC_FILTER*) psrc->private_data ; + if (filter->sinc_magic_marker != SINC_MAGIC_MARKER) + { free (psrc->private_data) ; + psrc->private_data = NULL ; + } ; + } ; + + memset (&temp_filter, 0, sizeof (temp_filter)) ; + + temp_filter.sinc_magic_marker = SINC_MAGIC_MARKER ; + temp_filter.channels = psrc->channels ; + + psrc->process = sinc_process ; + psrc->reset = sinc_reset ; + + switch (src_enum) + { case SRC_SINC_BEST_QUALITY : + temp_filter.coeffs = high_qual_coeffs ; + temp_filter.coeff_half_len = (sizeof (high_qual_coeffs) / sizeof (coeff_t)) - 1 ; + temp_filter.index_inc = 128 ; + temp_filter.has_diffs = SRC_FALSE ; + temp_filter.coeff_len = sizeof (high_qual_coeffs) / sizeof (coeff_t) ; + break ; + + case SRC_SINC_MEDIUM_QUALITY : + temp_filter.coeffs = mid_qual_coeffs ; + temp_filter.coeff_half_len = (sizeof (mid_qual_coeffs) / sizeof (coeff_t)) - 1 ; + temp_filter.index_inc = 128 ; + temp_filter.has_diffs = SRC_FALSE ; + temp_filter.coeff_len = sizeof (mid_qual_coeffs) / sizeof (coeff_t) ; + break ; + + case SRC_SINC_FASTEST : + temp_filter.coeffs = fastest_coeffs ; + temp_filter.coeff_half_len = (sizeof (fastest_coeffs) / sizeof (coeff_t)) - 1 ; + temp_filter.index_inc = 128 ; + temp_filter.has_diffs = SRC_FALSE ; + temp_filter.coeff_len = sizeof (fastest_coeffs) / sizeof (coeff_t) ; + break ; + + default : + return SRC_ERR_BAD_CONVERTER ; + } ; + + /* + ** FIXME : This needs to be looked at more closely to see if there is + ** a better way. Need to look at prepare_data () at the same time. + */ + + temp_filter.b_len = 1000 + 2 * lrint (ceil (temp_filter.coeff_len / (temp_filter.index_inc * 1.0) * SRC_MAX_RATIO)) ; + temp_filter.b_len *= temp_filter.channels ; + + if ((filter = calloc (1, sizeof (SINC_FILTER) + sizeof (filter->buffer [0]) * (temp_filter.b_len + temp_filter.channels))) == NULL) + return SRC_ERR_MALLOC_FAILED ; + + *filter = temp_filter ; + memset (&temp_filter, 0xEE, sizeof (temp_filter)) ; + + psrc->private_data = filter ; + + sinc_reset (psrc) ; + + count = (filter->coeff_half_len * INT_TO_FP (1)) / FP_ONE ; + + if (abs (count - filter->coeff_half_len) >= 1) + return SRC_ERR_FILTER_LEN ; + + return SRC_ERR_NO_ERROR ; +} /* sinc_set_converter */ + +static void +sinc_reset (SRC_PRIVATE *psrc) +{ SINC_FILTER *filter ; + + filter = (SINC_FILTER*) psrc->private_data ; + if (filter == NULL) + return ; + + filter->b_current = filter->b_end = 0 ; + filter->b_real_end = -1 ; + + filter->src_ratio = filter->input_index = 0.0 ; + + memset (filter->buffer, 0, filter->b_len * sizeof (filter->buffer [0])) ; + + /* Set this for a sanity check */ + memset (filter->buffer + filter->b_len, 0xAA, filter->channels * sizeof (filter->buffer [0])) ; +} /* sinc_reset */ + +/*======================================================================================== +** Beware all ye who dare pass this point. There be dragons here. +*/ + +int +sinc_process (SRC_PRIVATE *psrc, SRC_DATA *data) +{ SINC_FILTER *filter ; + double input_index, src_ratio, count, float_increment, terminate ; + increment_t increment, start_filter_index ; + int half_filter_chan_len, samples_in_hand, ch ; + + if (psrc->private_data == NULL) + return SRC_ERR_NO_PRIVATE ; + + filter = (SINC_FILTER*) psrc->private_data ; + + /* If there is not a problem, this will be optimised out. */ + if (sizeof (filter->buffer [0]) != sizeof (data->data_in [0])) + return SRC_ERR_SIZE_INCOMPATIBILITY ; + + filter->in_count = data->input_frames * filter->channels ; + filter->out_count = data->output_frames * filter->channels ; + filter->in_used = filter->out_gen = 0 ; + + src_ratio = psrc->last_ratio ; + + /* Check the sample rate ratio wrt the buffer len. */ + count = (filter->coeff_half_len + 2.0) / filter->index_inc ; + if (MIN (psrc->last_ratio, data->src_ratio) < 1.0) + count /= MIN (psrc->last_ratio, data->src_ratio) ; + count = lrint (ceil (count)) ; + + /* Maximum coefficientson either side of center point. */ + half_filter_chan_len = filter->channels * (lrint (count) + 1) ; + + input_index = psrc->last_position ; + if (input_index >= 1.0) + { filter->b_current = (filter->b_current + filter->channels * lrint (floor (input_index))) % filter->b_len ; + input_index -= floor (input_index) ; + } ; + + float_increment = filter->index_inc ; + + filter->b_current = (filter->b_current + filter->channels * lrint (floor (input_index))) % filter->b_len ; + input_index -= floor (input_index) ; + + terminate = 1.0 / src_ratio + 1e-20 ; + + /* Main processing loop. */ + while (filter->out_gen < filter->out_count) + { + /* Need to reload buffer? */ + samples_in_hand = (filter->b_end - filter->b_current + filter->b_len) % filter->b_len ; + + if (samples_in_hand <= half_filter_chan_len) + { prepare_data (filter, data, half_filter_chan_len) ; + + samples_in_hand = (filter->b_end - filter->b_current + filter->b_len) % filter->b_len ; + if (samples_in_hand <= half_filter_chan_len) + break ; + } ; + + /* This is the termination condition. */ + if (filter->b_real_end >= 0) + { if (filter->b_current + input_index + terminate >= filter->b_real_end) + break ; + } ; + + if (fabs (psrc->last_ratio - data->src_ratio) > 1e-10) + src_ratio = psrc->last_ratio + filter->out_gen * (data->src_ratio - psrc->last_ratio) / (filter->out_count - 1) ; + + float_increment = filter->index_inc * 1.0 ; + if (src_ratio < 1.0) + float_increment = filter->index_inc * src_ratio ; + + increment = DOUBLE_TO_FP (float_increment) ; + + start_filter_index = DOUBLE_TO_FP (input_index * float_increment) ; + + for (ch = 0 ; ch < filter->channels ; ch++) + { data->data_out [filter->out_gen] = (float_increment / filter->index_inc) * + calc_output (filter, increment, start_filter_index, ch) ; + filter->out_gen ++ ; + } ; + + /* Figure out the next index. */ + input_index += 1.0 / src_ratio ; + + filter->b_current = (filter->b_current + filter->channels * lrint (floor (input_index))) % filter->b_len ; + input_index -= floor (input_index) ; + } ; + + psrc->last_position = input_index ; + + /* Save current ratio rather then target ratio. */ + psrc->last_ratio = src_ratio ; + + data->input_frames_used = filter->in_used / filter->channels ; + data->output_frames_gen = filter->out_gen / filter->channels ; + + return SRC_ERR_NO_ERROR ; +} /* sinc_process */ + +/*---------------------------------------------------------------------------------------- +*/ + +static void +prepare_data (SINC_FILTER *filter, SRC_DATA *data, int half_filter_chan_len) +{ int len = 0 ; + + if (filter->b_real_end >= 0) + return ; /* This doesn't make sense, so return. */ + + if (filter->b_current == 0) + { /* Initial state. Set up zeros at the start of the buffer and + ** then load new data after that. + */ + len = filter->b_len - 2 * half_filter_chan_len ; + + filter->b_current = filter->b_end = half_filter_chan_len ; + } + else if (filter->b_end + half_filter_chan_len + filter->channels < filter->b_len) + { /* Load data at current end position. */ + len = MAX (filter->b_len - filter->b_current - half_filter_chan_len, 0) ; + } + else + { /* Move data at end of buffer back to the start of the buffer. */ + len = filter->b_end - filter->b_current ; + memmove (filter->buffer, filter->buffer + filter->b_current - half_filter_chan_len, + (half_filter_chan_len + len) * sizeof (filter->buffer [0])) ; + + filter->b_current = half_filter_chan_len ; + filter->b_end = filter->b_current + len ; + + /* Now load data at current end of buffer. */ + len = MAX (filter->b_len - filter->b_current - half_filter_chan_len, 0) ; + } ; + + len = MIN (filter->in_count - filter->in_used, len) ; + len -= (len % filter->channels) ; + + memcpy (filter->buffer + filter->b_end, data->data_in + filter->in_used, + len * sizeof (filter->buffer [0])) ; + + filter->b_end += len ; + filter->in_used += len ; + + if (filter->in_used == filter->in_count && + filter->b_end - filter->b_current < 2 * half_filter_chan_len && data->end_of_input) + { /* Handle the case where all data in the current buffer has been + ** consumed and this is the last buffer. + */ + + if (filter->b_len - filter->b_end < half_filter_chan_len + 5) + { /* If necessary, move data down to the start of the buffer. */ + len = filter->b_end - filter->b_current ; + memmove (filter->buffer, filter->buffer + filter->b_current - half_filter_chan_len, + (half_filter_chan_len + len) * sizeof (filter->buffer [0])) ; + + filter->b_current = half_filter_chan_len ; + filter->b_end = filter->b_current + len ; + } ; + + filter->b_real_end = filter->b_end ; + len = half_filter_chan_len + 5 ; + + memset (filter->buffer + filter->b_end, 0, len * sizeof (filter->buffer [0])) ; + filter->b_end += len ; + } ; + + return ; +} /* prepare_data */ + + +static double +calc_output (SINC_FILTER *filter, increment_t increment, increment_t start_filter_index, int ch) +{ double fraction, left, right, icoeff ; + increment_t filter_index, max_filter_index ; + int data_index, coeff_count, indx ; + + /* Convert input parameters into fixed point. */ + max_filter_index = INT_TO_FP (filter->coeff_half_len) ; + + /* First apply the left half of the filter. */ + filter_index = start_filter_index ; + coeff_count = (max_filter_index - filter_index) / increment ; + filter_index = filter_index + coeff_count * increment ; + data_index = filter->b_current - filter->channels * coeff_count ; + + left = 0.0 ; + do + { fraction = FP_TO_DOUBLE (filter_index) ; + indx = FP_TO_INT (filter_index) ; + + icoeff = filter->coeffs [indx] + fraction * (filter->coeffs [indx + 1] - filter->coeffs [indx]) ; + + left += icoeff * filter->buffer [data_index + ch] ; + + filter_index -= increment ; + data_index = data_index + filter->channels ; + } + while (filter_index >= MAKE_INCREMENT_T (0)) ; + + /* Now apply the right half of the filter. */ + filter_index = increment - start_filter_index ; + coeff_count = (max_filter_index - filter_index) / increment ; + filter_index = filter_index + coeff_count * increment ; + data_index = filter->b_current + filter->channels * (1 + coeff_count) ; + + right = 0.0 ; + do + { fraction = FP_TO_DOUBLE (filter_index) ; + indx = FP_TO_INT (filter_index) ; + + icoeff = filter->coeffs [indx] + fraction * (filter->coeffs [indx + 1] - filter->coeffs [indx]) ; + + right += icoeff * filter->buffer [data_index + ch] ; + + filter_index -= increment ; + data_index = data_index - filter->channels ; + } + while (filter_index > MAKE_INCREMENT_T (0)) ; + + return (left + right) ; +} /* calc_output */ + diff --git a/libk3b/plugin/libsamplerate/src_zoh.c b/libk3b/plugin/libsamplerate/src_zoh.c new file mode 100644 index 0000000..7e18d87 --- /dev/null +++ b/libk3b/plugin/libsamplerate/src_zoh.c @@ -0,0 +1,186 @@ +/* +** Copyright (C) 2002,2003 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** 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, write to the Free Software +** Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include +#include +#include + +#include "config.h" +#include "float_cast.h" +#include "common.h" + +static void zoh_reset (SRC_PRIVATE *psrc) ; + +/*======================================================================================== +*/ + +#define ZOH_MAGIC_MARKER MAKE_MAGIC('s','r','c','z','o','h') + +typedef struct +{ int zoh_magic_marker ; + int channels ; + long in_count, in_used ; + long out_count, out_gen ; + float last_value [1] ; +} ZOH_DATA ; + +/*---------------------------------------------------------------------------------------- +*/ + +int +zoh_process (SRC_PRIVATE *psrc, SRC_DATA *data) +{ ZOH_DATA *zoh ; + double src_ratio, input_index ; + int ch ; + + if (psrc->private_data == NULL) + return SRC_ERR_NO_PRIVATE ; + + zoh = (ZOH_DATA*) psrc->private_data ; + + zoh->in_count = data->input_frames * zoh->channels ; + zoh->out_count = data->output_frames * zoh->channels ; + zoh->in_used = zoh->out_gen = 0 ; + + src_ratio = psrc->last_ratio ; + input_index = psrc->last_position ; + + /* Calculate samples before first sample in input array. */ + while (input_index > 0.0 && input_index < 1.0 && zoh->out_gen < zoh->out_count) + { + if (zoh->in_used + input_index >= zoh->in_count) + break ; + + if (fabs (psrc->last_ratio - data->src_ratio) > SRC_MIN_RATIO_DIFF) + src_ratio = psrc->last_ratio + zoh->out_gen * (data->src_ratio - psrc->last_ratio) / (zoh->out_count - 1) ; + + for (ch = 0 ; ch < zoh->channels ; ch++) + { data->data_out [zoh->out_gen] = zoh->last_value [ch] ; + zoh->out_gen ++ ; + } ; + + /* Figure out the next index. */ + input_index += 1.0 / src_ratio ; + } ; + + zoh->in_used += zoh->channels * lrint (floor (input_index)) ; + input_index -= floor (input_index) ; + + /* Main processing loop. */ + while (zoh->out_gen < zoh->out_count && zoh->in_used + input_index < zoh->in_count) + { + if (fabs (psrc->last_ratio - data->src_ratio) > SRC_MIN_RATIO_DIFF) + src_ratio = psrc->last_ratio + zoh->out_gen * (data->src_ratio - psrc->last_ratio) / (zoh->out_count - 1) ; + + for (ch = 0 ; ch < zoh->channels ; ch++) + { data->data_out [zoh->out_gen] = data->data_in [zoh->in_used + ch] ; + zoh->out_gen ++ ; + } ; + + /* Figure out the next index. */ + input_index += 1.0 / src_ratio ; + + zoh->in_used += zoh->channels * lrint (floor (input_index)) ; + input_index -= floor (input_index) ; + } ; + + psrc->last_position = input_index ; + + if (zoh->in_used > 0) + for (ch = 0 ; ch < zoh->channels ; ch++) + zoh->last_value [ch] = data->data_in [zoh->in_used - zoh->channels + ch] ; + + /* Save current ratio rather then target ratio. */ + psrc->last_ratio = src_ratio ; + + data->input_frames_used = zoh->in_used / zoh->channels ; + data->output_frames_gen = zoh->out_gen / zoh->channels ; + + return SRC_ERR_NO_ERROR ; +} /* zoh_process */ + +/*------------------------------------------------------------------------------ +*/ + +const char* +zoh_get_name (int src_enum) +{ + if (src_enum == SRC_ZERO_ORDER_HOLD) + return "ZOH Interpolator" ; + + return NULL ; +} /* zoh_get_name */ + +const char* +zoh_get_description (int src_enum) +{ + if (src_enum == SRC_ZERO_ORDER_HOLD) + return "Zero order hold interpolator, very fast, poor quality." ; + + return NULL ; +} /* zoh_get_descrition */ + +int +zoh_set_converter (SRC_PRIVATE *psrc, int src_enum) +{ ZOH_DATA *zoh = NULL; + + if (src_enum != SRC_ZERO_ORDER_HOLD) + return SRC_ERR_BAD_CONVERTER ; + + if (psrc->private_data != NULL) + { zoh = (ZOH_DATA*) psrc->private_data ; + if (zoh->zoh_magic_marker != ZOH_MAGIC_MARKER) + { free (psrc->private_data) ; + psrc->private_data = NULL ; + } ; + } ; + + if (psrc->private_data == NULL) + { zoh = calloc (1, sizeof (*zoh) + psrc->channels * sizeof (float)) ; + if (zoh == NULL) + return SRC_ERR_MALLOC_FAILED ; + psrc->private_data = zoh ; + } ; + + zoh->zoh_magic_marker = ZOH_MAGIC_MARKER ; + zoh->channels = psrc->channels ; + + psrc->process = zoh_process ; + psrc->reset = zoh_reset ; + + zoh_reset (psrc) ; + + return SRC_ERR_NO_ERROR ; +} /* zoh_set_converter */ + +/*=================================================================================== +*/ + +static void +zoh_reset (SRC_PRIVATE *psrc) +{ ZOH_DATA *zoh ; + + zoh = (ZOH_DATA*) psrc->private_data ; + if (zoh == NULL) + return ; + + zoh->channels = psrc->channels ; + memset (zoh->last_value, 0, sizeof (zoh->last_value [0]) * zoh->channels) ; + + return ; +} /* zoh_reset */ diff --git a/libk3b/projects/Makefile.am b/libk3b/projects/Makefile.am new file mode 100644 index 0000000..1a07372 --- /dev/null +++ b/libk3b/projects/Makefile.am @@ -0,0 +1,32 @@ +AM_CPPFLAGS= -I$(srcdir)/../../src -I$(srcdir)/../core -I$(srcdir)/../plugin -I$(srcdir)/../../libk3bdevice -I$(srcdir)/../tools -I$(srcdir)/datacd -I$(srcdir)/audiocd -I$(srcdir)/mixedcd -I$(srcdir)/movixcd -I$(srcdir)/movixdvd -I$(srcdir)/datadvd -I$(srcdir)/videocd -I$(srcdir)/videodvd $(all_includes) + +noinst_LTLIBRARIES = libk3bproject.la + +libk3bproject_la_LIBADD = ./datacd/libdata.la ./datadvd/libdvd.la ./mixedcd/libmixed.la ./videocd/libvcd.la ./videodvd/libvideodvd.la ./movixcd/libmovix.la ./movixdvd/libmovixdvd.la ./audiocd/libaudio.la + +libk3bproject_la_LDFLAGS = $(all_libraries) + +libk3bproject_la_SOURCES = k3babstractwriter.cpp \ + k3bgrowisofswriter.cpp \ + k3bgrowisofshandler.cpp \ + k3bdoc.cpp \ + k3bcdrdaowriter.cpp \ + k3bcdrecordwriter.cpp \ + k3binffilewriter.cpp \ + k3btocfilewriter.cpp \ + k3bimagefilereader.cpp \ + k3bcuefileparser.cpp \ + k3bpipebuffer.cpp + +include_HEADERS = k3bdoc.h \ + k3bgrowisofswriter.h \ + k3bcdrdaowriter.h \ + k3bcdrecordwriter.h \ + k3binffilewriter.h \ + k3btocfilewriter.h \ + k3bcuefileparser.h \ + k3bimagefilereader.h + +SUBDIRS = datacd audiocd mixedcd movixcd videocd datadvd movixdvd videodvd + +METASOURCES = AUTO diff --git a/libk3b/projects/audiocd/Makefile.am b/libk3b/projects/audiocd/Makefile.am new file mode 100644 index 0000000..60942cc --- /dev/null +++ b/libk3b/projects/audiocd/Makefile.am @@ -0,0 +1,35 @@ +AM_CPPFLAGS= -I$(srcdir)/../../../src \ + -I$(srcdir)/.. \ + -I$(srcdir)/../../core \ + -I$(srcdir)/../../plugin \ + -I$(srcdir)/../../cddb \ + -I$(srcdir)/../../../libk3bdevice \ + -I$(srcdir)/../../tools $(all_includes) + +METASOURCES = AUTO + +noinst_LTLIBRARIES = libaudio.la + +libaudio_la_SOURCES = k3baudiojob.cpp \ + k3baudiotrack.cpp \ + k3baudiodoc.cpp \ + k3baudiofile.cpp \ + k3baudiozerodata.cpp \ + k3baudiodatasource.cpp \ + k3baudionormalizejob.cpp \ + k3baudiojobtempdata.cpp \ + k3baudioimager.cpp \ + k3baudiomaxspeedjob.cpp \ + k3baudiocdtracksource.cpp \ + k3baudiocdtrackdrag.cpp \ + k3baudiodatasourceiterator.cpp + +include_HEADERS = k3baudiodoc.h \ + k3baudiojob.h \ + k3baudiocdtrackdrag.h \ + k3baudiotrack.h \ + k3baudiodatasource.h \ + k3baudiofile.h \ + k3baudiozerodata.h \ + k3baudiocdtracksource.h \ + k3baudiodatasourceiterator.h diff --git a/libk3b/projects/audiocd/k3baudiocdtrackdrag.cpp b/libk3b/projects/audiocd/k3baudiocdtrackdrag.cpp new file mode 100644 index 0000000..8429f25 --- /dev/null +++ b/libk3b/projects/audiocd/k3baudiocdtrackdrag.cpp @@ -0,0 +1,109 @@ +/* + * + * $Id: k3baudiocdtrackdrag.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2005 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3baudiocdtrackdrag.h" + +#include +#include +#include +#include +#include + +#include +#include + + +// FIXME: multiple tracks +K3bAudioCdTrackDrag::K3bAudioCdTrackDrag( const K3bDevice::Toc& toc, const QValueList& cdTrackNumbers, + const K3bCddbResultEntry& cddb, + K3bDevice::Device* lastDev, QWidget* dragSource, const char* name ) + : QStoredDrag( "k3b/audio_track_drag", dragSource, name ), + m_toc(toc), + m_cdTrackNumbers(cdTrackNumbers), + m_cddb(cddb), + m_device(lastDev) +{ + QByteArray data; + QDataStream s( data, IO_WriteOnly ); + s << (unsigned int)toc.count(); + for( K3bDevice::Toc::const_iterator it = toc.begin(); it != toc.end(); ++it ) { + const K3bDevice::Track& track = *it; + s << track.firstSector().lba() << track.lastSector().lba(); + } + QTextStream t( s.device() ); + t << cddb.cdArtist << endl + << cddb.cdTitle << endl; + for( unsigned int i = 0; i < toc.count(); ++i ) { + t << cddb.artists[i] << endl + << cddb.titles[i] << endl; + } + + s << (unsigned int)cdTrackNumbers.count(); + + for( QValueList::const_iterator it = cdTrackNumbers.begin(); + it != cdTrackNumbers.end(); ++it ) + s << *it; + + if( lastDev ) + t << lastDev->blockDeviceName() << endl; + else + t << endl; + + // TODO: the rest + setEncodedData( data ); +} + + +bool K3bAudioCdTrackDrag::decode( const QMimeSource* e, + K3bDevice::Toc& toc, QValueList& trackNumbers, + K3bCddbResultEntry& cddb, K3bDevice::Device** dev ) +{ + QByteArray data = e->encodedData( "k3b/audio_track_drag" ); + + QDataStream s( data, IO_ReadOnly ); + + unsigned int trackCnt; + s >> trackCnt; + for( unsigned int i = 0; i < trackCnt; ++i ) { + int fs, ls; + s >> fs; + s >> ls; + toc.append( K3bDevice::Track( fs, ls, K3bDevice::Track::AUDIO ) ); + } + + QTextStream t( s.device() ); + cddb.artists.clear(); + cddb.titles.clear(); + cddb.cdArtist = t.readLine(); + cddb.cdTitle = t.readLine(); + for( unsigned int i = 0; i < trackCnt; ++i ) { + cddb.artists.append( t.readLine() ); + cddb.titles.append( t.readLine() ); + } + + s >> trackCnt; + trackNumbers.clear(); + for( unsigned int i = 0; i < trackCnt; ++i ) { + int trackNumber = 0; + s >> trackNumber; + trackNumbers.append( trackNumber ); + } + + QString devName = t.readLine(); + if( dev && !devName.isEmpty() ) + *dev = k3bcore->deviceManager()->findDevice( devName ); + + return true; +} diff --git a/libk3b/projects/audiocd/k3baudiocdtrackdrag.h b/libk3b/projects/audiocd/k3baudiocdtrackdrag.h new file mode 100644 index 0000000..3148466 --- /dev/null +++ b/libk3b/projects/audiocd/k3baudiocdtrackdrag.h @@ -0,0 +1,50 @@ +/* + * + * $Id: k3baudiocdtrackdrag.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2005 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_AUDIO_CDTRACK_DRAG_H_ +#define _K3B_AUDIO_CDTRACK_DRAG_H_ + +#include +#include +#include + +#include +#include +#include +#include "k3b_export.h" + +class LIBK3B_EXPORT K3bAudioCdTrackDrag : public QStoredDrag +{ + public: + K3bAudioCdTrackDrag( const K3bDevice::Toc& toc, const QValueList& cdTrackNumbers, const K3bCddbResultEntry& cddb, + K3bDevice::Device* lastDev = 0, QWidget* dragSource = 0, const char* name = 0 ); + + const K3bDevice::Toc& toc() const { return m_toc; } + const QValueList& cdTrackNumbers() const { return m_cdTrackNumbers; } + const K3bCddbResultEntry& cddbEntry() const { return m_cddb; } + + bool provides( const char* mimetype ) const { return !qstrcmp( mimetype, "k3b/audio_track_drag" ); } + + static bool canDecode( const QMimeSource* s ) { return s->provides( "k3b/audio_track_drag" ); } + static bool decode( const QMimeSource* s, K3bDevice::Toc&, QValueList& trackNumbers, K3bCddbResultEntry&, K3bDevice::Device** dev = 0 ); + + private: + K3bDevice::Toc m_toc; + QValueList m_cdTrackNumbers; + K3bCddbResultEntry m_cddb; + K3bDevice::Device* m_device; +}; + +#endif diff --git a/libk3b/projects/audiocd/k3baudiocdtracksource.cpp b/libk3b/projects/audiocd/k3baudiocdtracksource.cpp new file mode 100644 index 0000000..b61e865 --- /dev/null +++ b/libk3b/projects/audiocd/k3baudiocdtracksource.cpp @@ -0,0 +1,262 @@ +/* + * + * $Id: k3baudiocdtracksource.cpp 676194 2007-06-16 08:59:19Z trueg $ + * Copyright (C) 2005 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3baudiocdtracksource.h" +#include "k3baudiotrack.h" +#include "k3baudiodoc.h" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + + +K3bAudioCdTrackSource::K3bAudioCdTrackSource( const K3bDevice::Toc& toc, int cdTrackNumber, + const K3bCddbResultEntry& cddb, K3bDevice::Device* dev ) + : K3bAudioDataSource(), + m_discId( toc.discId() ), + m_length( toc[cdTrackNumber-1].length() ), + m_toc( toc ), + m_cdTrackNumber( cdTrackNumber ), + m_cddbEntry( cddb ), + m_lastUsedDevice( dev ), + m_cdParanoiaLib( 0 ), + m_initialized( false ) +{ +} + + +K3bAudioCdTrackSource::K3bAudioCdTrackSource( unsigned int discid, const K3b::Msf& length, int cdTrackNumber, + const QString& artist, const QString& title, + const QString& cdArtist, const QString& cdTitle ) + : K3bAudioDataSource(), + m_discId( discid ), + m_length( length ), + m_cdTrackNumber( cdTrackNumber ), + m_lastUsedDevice( 0 ), + m_cdParanoiaLib( 0 ), + m_initialized( false ) +{ + for( int i = 1; i < cdTrackNumber; ++i ) { + m_cddbEntry.titles.append( QString::null ); + m_cddbEntry.artists.append( QString::null ); + } + m_cddbEntry.titles.append( title ); + m_cddbEntry.artists.append( artist ); + m_cddbEntry.cdTitle = cdTitle; + m_cddbEntry.cdArtist = cdArtist; +} + + +K3bAudioCdTrackSource::K3bAudioCdTrackSource( const K3bAudioCdTrackSource& source ) + : K3bAudioDataSource( source ), + m_discId( source.m_discId ), + m_toc( source.m_toc ), + m_cdTrackNumber( source.m_cdTrackNumber ), + m_cddbEntry( source.m_cddbEntry ), + m_lastUsedDevice( source.m_lastUsedDevice ), + m_cdParanoiaLib( 0 ), + m_initialized( false ) +{ +} + + +K3bAudioCdTrackSource::~K3bAudioCdTrackSource() +{ + closeParanoia(); + delete m_cdParanoiaLib; +} + + +bool K3bAudioCdTrackSource::initParanoia() +{ + if( !m_initialized ) { + if( !m_cdParanoiaLib ) + m_cdParanoiaLib = K3bCdparanoiaLib::create(); + + if( m_cdParanoiaLib ) { + m_lastUsedDevice = searchForAudioCD(); + + // ask here for the cd since searchForAudioCD() may also be called from outside + if( !m_lastUsedDevice ) { + // could not find the CD, so ask for it + QString s = i18n("Please insert Audio CD %1%2") + .arg(m_discId, 0, 16) + .arg(m_cddbEntry.cdTitle.isEmpty() || m_cddbEntry.cdArtist.isEmpty() + ? QString::null + : " (" + m_cddbEntry.cdArtist + " - " + m_cddbEntry.cdTitle + ")"); + + while( K3bDevice::Device* dev = K3bThreadWidget::selectDevice( track()->doc()->view(), s ) ) { + if( searchForAudioCD( dev ) ) { + m_lastUsedDevice = dev; + break; + } + } + } + + // user canceled + if( !m_lastUsedDevice ) + return false; + + k3bcore->blockDevice( m_lastUsedDevice ); + + if( m_toc.isEmpty() ) + m_toc = m_lastUsedDevice->readToc(); + + if( !m_cdParanoiaLib->initParanoia( m_lastUsedDevice, m_toc ) ) { + k3bcore->unblockDevice( m_lastUsedDevice ); + return false; + } + + if( doc() ) { + m_cdParanoiaLib->setParanoiaMode( doc()->audioRippingParanoiaMode() ); + m_cdParanoiaLib->setNeverSkip( !doc()->audioRippingIgnoreReadErrors() ); + m_cdParanoiaLib->setMaxRetries( doc()->audioRippingRetries() ); + } + + m_cdParanoiaLib->initReading( m_toc[m_cdTrackNumber-1].firstSector().lba() + startOffset().lba() + m_position.lba(), + m_toc[m_cdTrackNumber-1].firstSector().lba() + lastSector().lba() ); + + // we only block during the initialization because we cannot determine the end of the reading process :( + k3bcore->unblockDevice( m_lastUsedDevice ); + + m_initialized = true; + kdDebug() << "(K3bAudioCdTrackSource) initialized." << endl; + } + } + + return m_initialized; +} + + +void K3bAudioCdTrackSource::closeParanoia() +{ + if( m_cdParanoiaLib && m_initialized ) { + m_cdParanoiaLib->close(); + } + m_initialized = false; +} + + +K3bDevice::Device* K3bAudioCdTrackSource::searchForAudioCD() const +{ + kdDebug() << "(K3bAudioCdTrackSource::searchForAudioCD()" << endl; + // first try the saved device + if( m_lastUsedDevice && searchForAudioCD( m_lastUsedDevice ) ) + return m_lastUsedDevice; + + const QPtrList& devices = k3bcore->deviceManager()->readingDevices(); + for( QPtrListIterator it(devices); *it; ++it ) { + if( searchForAudioCD( *it ) ) { + return *it; + } + } + + kdDebug() << "(K3bAudioCdTrackSource::searchForAudioCD) failed." << endl; + + return 0; +} + + +bool K3bAudioCdTrackSource::searchForAudioCD( K3bDevice::Device* dev ) const +{ + kdDebug() << "(K3bAudioCdTrackSource::searchForAudioCD(" << dev->description() << ")" << endl; + K3bDevice::Toc toc = dev->readToc(); + return ( toc.discId() == m_discId ); +} + + +void K3bAudioCdTrackSource::setDevice( K3bDevice::Device* dev ) +{ + if( dev && dev != m_lastUsedDevice ) { + m_lastUsedDevice = dev; + if( m_initialized ) { + } + } +} + + +K3b::Msf K3bAudioCdTrackSource::originalLength() const +{ + return m_length; +} + + +bool K3bAudioCdTrackSource::seek( const K3b::Msf& msf ) +{ + // HACK: to reinitialize every time we restart the decoding + if( msf == 0 && m_cdParanoiaLib ) + closeParanoia(); + + m_position = msf; + + if( m_cdParanoiaLib ) + m_cdParanoiaLib->initReading( m_toc[m_cdTrackNumber-1].firstSector().lba() + startOffset().lba() + m_position.lba(), + m_toc[m_cdTrackNumber-1].firstSector().lba() + lastSector().lba() ); + + return true; +} + + +int K3bAudioCdTrackSource::read( char* data, unsigned int ) +{ + if( initParanoia() ) { + int status = 0; + char* buf = m_cdParanoiaLib->read( &status, 0, false /* big endian */ ); + if( status == K3bCdparanoiaLib::S_OK ) { + if( buf == 0 ) { + // done + closeParanoia(); + return 0; + } + else { + ++m_position; + ::memcpy( data, buf, CD_FRAMESIZE_RAW ); + return CD_FRAMESIZE_RAW; + } + } + else { + // in case the reading fails we go back to "not initialized" + closeParanoia(); + return -1; + } + } + else + return -1; +} + + +QString K3bAudioCdTrackSource::type() const +{ + return i18n("CD Track"); +} + + +QString K3bAudioCdTrackSource::sourceComment() const +{ + return i18n("Track %1 from Audio CD %2").arg(m_cdTrackNumber).arg(m_discId,0,16); +} + + +K3bAudioDataSource* K3bAudioCdTrackSource::copy() const +{ + return new K3bAudioCdTrackSource( *this ); +} diff --git a/libk3b/projects/audiocd/k3baudiocdtracksource.h b/libk3b/projects/audiocd/k3baudiocdtracksource.h new file mode 100644 index 0000000..6eaaa5b --- /dev/null +++ b/libk3b/projects/audiocd/k3baudiocdtracksource.h @@ -0,0 +1,99 @@ +/* + * + * $Id: k3baudiocdtracksource.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2005 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_AUDIO_CD_TRACK_SOURCE_H_ +#define _K3B_AUDIO_CD_TRACK_SOURCE_H_ + +#include "k3baudiodatasource.h" + +#include +#include + +#include "k3b_export.h" + + +namespace K3bDevice { + class Device; +} +class K3bCdparanoiaLib; + + +/** + * Audio data source which reads it's data directly from an audio CD. + * + * Be aware that since GUI elements are not allowed in sources (other thread) + * the source relies on the audio CD being inserted before any read operations. + * It will search all available devices for the CD starting with the last used drive. + */ +class LIBK3B_EXPORT K3bAudioCdTrackSource : public K3bAudioDataSource +{ + public: + /** + * Default constructor to create a new source. + */ + K3bAudioCdTrackSource( const K3bDevice::Toc& toc, int cdTrackNumber, const K3bCddbResultEntry& cddb, + K3bDevice::Device* dev = 0 ); + + /** + * Constructor to create sources when loading from a project file without toc information + */ + K3bAudioCdTrackSource( unsigned int discid, const K3b::Msf& length, int cdTrackNumber, + const QString& artist, const QString& title, + const QString& cdartist, const QString& cdtitle ); + K3bAudioCdTrackSource( const K3bAudioCdTrackSource& ); + ~K3bAudioCdTrackSource(); + + unsigned int discId() const { return m_discId; } + int cdTrackNumber() const { return m_cdTrackNumber; } + const K3bCddbResultEntry& metaInfo() const { return m_cddbEntry; } + + K3b::Msf originalLength() const; + bool seek( const K3b::Msf& ); + int read( char* data, unsigned int max ); + QString type() const; + QString sourceComment() const; + K3bAudioDataSource* copy() const; + + /** + * Searches for the corresponding Audio CD and returns the device in which it has + * been found or 0 if it could not be found. + */ + K3bDevice::Device* searchForAudioCD() const; + + /** + * Set the device the source should start to look for the CD. + */ + void setDevice( K3bDevice::Device* dev ); + + private: + bool initParanoia(); + void closeParanoia(); + bool searchForAudioCD( K3bDevice::Device* ) const; + + unsigned int m_discId; + K3b::Msf m_length; + K3bDevice::Toc m_toc; + int m_cdTrackNumber; + K3bCddbResultEntry m_cddbEntry; + + // ripping + // we only save the device we last saw the CD in + K3bDevice::Device* m_lastUsedDevice; + K3bCdparanoiaLib* m_cdParanoiaLib; + K3b::Msf m_position; + bool m_initialized; +}; + +#endif diff --git a/libk3b/projects/audiocd/k3baudiodatasource.cpp b/libk3b/projects/audiocd/k3baudiodatasource.cpp new file mode 100644 index 0000000..0f705f4 --- /dev/null +++ b/libk3b/projects/audiocd/k3baudiodatasource.cpp @@ -0,0 +1,210 @@ +/* + * + * $Id: k3baudiodatasource.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2004 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3baudiodatasource.h" +#include "k3baudiotrack.h" +#include "k3baudiodoc.h" + + +K3bAudioDataSource::K3bAudioDataSource() + : m_track(0), + m_prev(0), + m_next(0) +{ +} + + +K3bAudioDataSource::K3bAudioDataSource( const K3bAudioDataSource& source ) + : m_track( 0 ), + m_prev( 0 ), + m_next( 0 ), + m_startOffset( source.m_startOffset ), + m_endOffset( source.m_endOffset ) +{ +} + + +K3bAudioDataSource::~K3bAudioDataSource() +{ + take(); +} + + +K3bAudioDoc* K3bAudioDataSource::doc() const +{ + if( m_track ) + return m_track->doc(); + else + return 0; +} + + +K3bAudioDataSource* K3bAudioDataSource::take() +{ + // if we do not have a track we are not in any list + if( m_track ) { + if( !m_prev ) + m_track->setFirstSource( m_next ); + + if( m_prev ) + m_prev->m_next = m_next; + if( m_next ) + m_next->m_prev = m_prev; + + m_prev = m_next = 0; + + emitChange(); + m_track = 0; + } + + return this; +} + + +void K3bAudioDataSource::moveAfter( K3bAudioDataSource* source ) +{ + // cannot create a list outside a track! + if( !source->track() ) + return; + + if( source == this ) + return; + + // remove this from the list + take(); + + K3bAudioDataSource* oldNext = source->m_next; + + // set track as prev + source->m_next = this; + m_prev = source; + + // set oldNext as next + if( oldNext ) + oldNext->m_prev = this; + m_next = oldNext; + + m_track = source->track(); + emitChange(); +} + + +void K3bAudioDataSource::moveAhead( K3bAudioDataSource* source ) +{ + // cannot create a list outside a track! + if( !source->track() ) + return; + + if( source == this ) + return; + + // remove this from the list + take(); + + K3bAudioDataSource* oldPrev = source->m_prev; + + // set track as next + m_next = source; + source->m_prev = this; + + // set oldPrev as prev + m_prev = oldPrev; + if( oldPrev ) + oldPrev->m_next = this; + + m_track = source->track(); + + if( !m_prev ) + m_track->setFirstSource( this ); + + emitChange(); +} + + +void K3bAudioDataSource::emitChange() +{ + if( m_track ) + m_track->sourceChanged( this ); +} + + +K3bAudioDataSource* K3bAudioDataSource::split( const K3b::Msf& pos ) +{ + if( pos < length() ) { + K3bAudioDataSource* s = copy(); + s->setStartOffset( startOffset() + pos ); + s->setEndOffset( endOffset() ); + setEndOffset( startOffset() + pos ); + s->moveAfter( this ); + emitChange(); + return s; + } + else + return 0; +} + + +K3b::Msf K3bAudioDataSource::lastSector() const +{ + if( endOffset() > 0 ) + return endOffset()-1; + else + return originalLength()-1; +} + + +K3b::Msf K3bAudioDataSource::length() const +{ + if( originalLength() == 0 ) + return 0; + else if( lastSector() < m_startOffset ) + return 1; + else + return lastSector() - m_startOffset + 1; +} + + +void K3bAudioDataSource::setStartOffset( const K3b::Msf& msf ) +{ + m_startOffset = msf; + fixupOffsets(); + emitChange(); +} + + +void K3bAudioDataSource::setEndOffset( const K3b::Msf& msf ) +{ + m_endOffset = msf; + fixupOffsets(); + emitChange(); +} + + +void K3bAudioDataSource::fixupOffsets() +{ + // no length available yet + if( originalLength() == 0 ) + return; + + if( startOffset() >= originalLength() ) { + setStartOffset( 0 ); + } + if( endOffset() > originalLength() ) { + setEndOffset( 0 ); // whole source + } + if( endOffset() > 0 && endOffset() <= startOffset() ) { + setEndOffset( startOffset() ); + } +} diff --git a/libk3b/projects/audiocd/k3baudiodatasource.h b/libk3b/projects/audiocd/k3baudiodatasource.h new file mode 100644 index 0000000..d12fd10 --- /dev/null +++ b/libk3b/projects/audiocd/k3baudiodatasource.h @@ -0,0 +1,168 @@ +/* + * + * $Id: k3baudiodatasource.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2004 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_AUDIO_DATA_SOURCE_H_ +#define _K3B_AUDIO_DATA_SOURCE_H_ + +#include +#include "k3b_export.h" +class K3bAudioTrack; +class K3bAudioDoc; + + +/** + * An AudioDataSource has an original length which represents the maximum amount of audio + * sectors this source can provide (in special cases this is not true, see K3bAudioZeroData). + * + * It is possible to just use a portion of that data by changing the startOffset and endOffset. + * This will change the actual length of the data provided by this source through the read method. + * + * Sources are part of a list which can be traversed via the prev() and next() methods. This list + * is part of a K3bAudioTrack which in turn is part of a list which is owned by a K3bAudioDoc. + * + * The list may be modified with the take(), moveAfter(), and moveAhead() methods. The source takes + * care of fixing the list and notifying the track about the change (It is also possible to move sources + * from one track to the other). + * + * When a source is deleted it automatically removes itself from it's list. + */ +class LIBK3B_EXPORT K3bAudioDataSource +{ + friend class K3bAudioTrack; + + public: + K3bAudioDataSource(); + + /** + * Create en identical copy except that the copy will not be in any list. + */ + K3bAudioDataSource( const K3bAudioDataSource& ); + virtual ~K3bAudioDataSource(); + + /** + * The original length of the source is the maximum data which is available + * when startOffset is 0 this is the max for endOffset + * + * Be aware that this may change (see K3bAudioZeroData) + */ + virtual K3b::Msf originalLength() const = 0; + + /** + * The default implementation returns the originalLength modified by startOffset and endOffset + */ + virtual K3b::Msf length() const; + + /** + * @return The raw size in pcm samples (16bit, 44800 kHz, stereo) + */ + KIO::filesize_t size() const { return length().audioBytes(); } + + virtual bool seek( const K3b::Msf& ) = 0; + + /** + * Read data from the source. + */ + virtual int read( char* data, unsigned int max ) = 0; + + /** + * Type of the data in readable form. + */ + virtual QString type() const = 0; + + /** + * The source in readable form (this is the filename for files) + */ + virtual QString sourceComment() const = 0; + + /** + * Used in case an error occurred. For now this is used if the + * decoder was not able to decode an audiofile + */ + virtual bool isValid() const { return true; } + + /** + * The doc the source is currently a part of or null. + */ + K3bAudioDoc* doc() const; + K3bAudioTrack* track() const { return m_track; } + + K3bAudioDataSource* prev() const { return m_prev; } + K3bAudioDataSource* next() const { return m_next; } + + K3bAudioDataSource* take(); + + void moveAfter( K3bAudioDataSource* track ); + void moveAhead( K3bAudioDataSource* track ); + + /** + * Set the start offset from the beginning of the source's originalLength. + */ + virtual void setStartOffset( const K3b::Msf& ); + + /** + * Set the end offset from the beginning of the file. The endOffset sector + * is not included in the data. + * The maximum value is originalLength() which means to use all data. + * 0 means the same as originalLength(). + * This has to be bigger than the start offset. + */ + virtual void setEndOffset( const K3b::Msf& ); + + virtual const K3b::Msf& startOffset() const { return m_startOffset; } + + /** + * The end offset. It is the first sector not included in the data. + * If 0 the last sector is determined by the originalLength + */ + virtual const K3b::Msf& endOffset() const { return m_endOffset; } + + /** + * Get the last used sector in the source. + * The default implementation uses originalLength() and endOffset() + */ + virtual K3b::Msf lastSector() const; + + /** + * Create a copy of this source which is not part of a list + */ + virtual K3bAudioDataSource* copy() const = 0; + + /** + * Split the source at position pos and return the splitted source + * on success. + * The new source will be moved after this source. + * + * The default implementation uses copy() to create a new source instance + */ + virtual K3bAudioDataSource* split( const K3b::Msf& pos ); + + protected: + /** + * Informs the parent track about changes. + */ + void emitChange(); + + private: + void fixupOffsets(); + + K3bAudioTrack* m_track; + K3bAudioDataSource* m_prev; + K3bAudioDataSource* m_next; + + K3b::Msf m_startOffset; + K3b::Msf m_endOffset; +}; + +#endif diff --git a/libk3b/projects/audiocd/k3baudiodatasourceiterator.cpp b/libk3b/projects/audiocd/k3baudiodatasourceiterator.cpp new file mode 100644 index 0000000..81e0a59 --- /dev/null +++ b/libk3b/projects/audiocd/k3baudiodatasourceiterator.cpp @@ -0,0 +1,71 @@ +/* + * + * $Id: sourceheader,v 1.3 2005/01/19 13:03:46 trueg Exp $ + * Copyright (C) 2005 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3baudiodatasourceiterator.h" +#include "k3baudiodoc.h" +#include "k3baudiotrack.h" +#include "k3baudiodatasource.h" + + +K3bAudioDataSourceIterator::K3bAudioDataSourceIterator( K3bAudioDoc* doc ) + : m_doc( doc ) +{ + first(); +} + + +K3bAudioDataSource* K3bAudioDataSourceIterator::current() const +{ + return m_currentSource; +} + + +K3bAudioDataSource* K3bAudioDataSourceIterator::next() +{ + m_currentSource = m_currentSource->next(); + if( !m_currentSource ) { + m_currentTrack = m_currentTrack->next(); + if( m_currentTrack ) + m_currentSource = m_currentTrack->firstSource(); + } + + return m_currentSource; +} + + +bool K3bAudioDataSourceIterator::hasNext() const +{ + if( !m_currentSource ) + return false; + if( m_currentSource->next() ) + return true; + if( m_currentTrack->next() ) + return true; + + return false; +} + + +K3bAudioDataSource* K3bAudioDataSourceIterator::first() +{ + m_currentTrack = m_doc->firstTrack(); + + if( m_currentTrack ) + m_currentSource = m_currentTrack->firstSource(); + else + m_currentSource = 0; + + return m_currentSource; +} diff --git a/libk3b/projects/audiocd/k3baudiodatasourceiterator.h b/libk3b/projects/audiocd/k3baudiodatasourceiterator.h new file mode 100644 index 0000000..7a0ce59 --- /dev/null +++ b/libk3b/projects/audiocd/k3baudiodatasourceiterator.h @@ -0,0 +1,61 @@ +/* + * + * $Id: sourceheader,v 1.3 2005/01/19 13:03:46 trueg Exp $ + * Copyright (C) 2005 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_AUDIO_DATA_SOURCE_ITERATOR_H_ +#define _K3B_AUDIO_DATA_SOURCE_ITERATOR_H_ +#include "k3b_export.h" +class K3bAudioDataSource; +class K3bAudioTrack; +class K3bAudioDoc; + + +/** + * This Iterator iterates over the sources in an audio project + * + * Be aware that this iterator does not properly update when the doc + * changes. A manual update can be issued with first(). This is becasue + * an update would either involve slots (this being a QObject) which is + * too much overhead or the AudioDoc would need to have knowledge of all + * the iterators which is also overhead that would be overkill. + */ +class LIBK3B_EXPORT K3bAudioDataSourceIterator +{ + public: + /** + * This will place the iterator on the first source just like first() does. + */ + explicit K3bAudioDataSourceIterator( K3bAudioDoc* ); + + K3bAudioDataSource* current() const; + + bool hasNext() const; + + /** + * \return the next source or 0 if at end. + */ + K3bAudioDataSource* next(); + + /** + * Reset the iterator + */ + K3bAudioDataSource* first(); + + private: + K3bAudioDoc* m_doc; + K3bAudioTrack* m_currentTrack; + K3bAudioDataSource* m_currentSource; +}; + +#endif diff --git a/libk3b/projects/audiocd/k3baudiodoc.cpp b/libk3b/projects/audiocd/k3baudiodoc.cpp new file mode 100644 index 0000000..e7661ba --- /dev/null +++ b/libk3b/projects/audiocd/k3baudiodoc.cpp @@ -0,0 +1,1127 @@ +/* + * + * $Id: k3baudiodoc.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include +#include "k3baudiodoc.h" +#include "k3baudiotrack.h" +#include "k3baudiojob.h" +#include "k3baudiofile.h" +#include "k3baudiozerodata.h" +#include "k3baudiocdtracksource.h" + +#include +#include +#include +#include + + +// QT-includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// KDE-includes +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + + +class K3bAudioDoc::Private +{ +public: + Private() { + cdTextValidator = new K3bCdTextValidator(); + } + + ~Private() { + delete cdTextValidator; + } + + K3bCdTextValidator* cdTextValidator; +}; + + +K3bAudioDoc::K3bAudioDoc( QObject* parent ) + : K3bDoc( parent ), + m_firstTrack(0), + m_lastTrack(0) +{ + d = new Private; + m_docType = AUDIO; +} + +K3bAudioDoc::~K3bAudioDoc() +{ + // delete all tracks + int i = 1; + int cnt = numOfTracks(); + while( m_firstTrack ) { + kdDebug() << "(K3bAudioDoc::~K3bAudioDoc) deleting track " << i << " of " << cnt << endl; + delete m_firstTrack->take(); + kdDebug() << "(K3bAudioDoc::~K3bAudioDoc) deleted." << endl; + ++i; + } + + delete d; +} + +bool K3bAudioDoc::newDocument() +{ + // delete all tracks + while( m_firstTrack ) + delete m_firstTrack->take(); + + m_normalize = false; + m_hideFirstTrack = false; + m_cdText = false; + m_cdTextData.clear(); + m_audioRippingParanoiaMode = 0; + m_audioRippingRetries = 5; + m_audioRippingIgnoreReadErrors = true; + + return K3bDoc::newDocument(); +} + + +QString K3bAudioDoc::name() const +{ + if( !m_cdTextData.title().isEmpty() ) + return m_cdTextData.title(); + else + return K3bDoc::name(); +} + + +K3bAudioTrack* K3bAudioDoc::firstTrack() const +{ + return m_firstTrack; +} + + +K3bAudioTrack* K3bAudioDoc::lastTrack() const +{ + return m_lastTrack; +} + + +// this one is called by K3bAudioTrack to update the list +void K3bAudioDoc::setFirstTrack( K3bAudioTrack* track ) +{ + m_firstTrack = track; +} + +// this one is called by K3bAudioTrack to update the list +void K3bAudioDoc::setLastTrack( K3bAudioTrack* track ) +{ + m_lastTrack = track; +} + + +KIO::filesize_t K3bAudioDoc::size() const +{ + // This is not really correct but what the user expects ;) + return length().mode1Bytes(); +} + + +K3b::Msf K3bAudioDoc::length() const +{ + K3b::Msf length = 0; + K3bAudioTrack* track = m_firstTrack; + while( track ) { + length += track->length(); + track = track->next(); + } + + return length; +} + + +void K3bAudioDoc::addUrls( const KURL::List& urls ) +{ + // make sure we add them at the end even if urls are in the queue + addTracks( urls, 99 ); +} + + +void K3bAudioDoc::addTracks( const KURL::List& urls, uint position ) +{ + KURL::List allUrls = extractUrlList( K3b::convertToLocalUrls(urls) ); + KURL::List::iterator end( allUrls.end()); + for( KURL::List::iterator it = allUrls.begin(); it != end; it++, position++ ) { + KURL& url = *it; + if( url.path().right(3).lower() == "cue" ) { + // try adding a cue file + if( K3bAudioTrack* newAfter = importCueFile( url.path(), getTrack(position) ) ) { + position = newAfter->trackNumber(); + continue; + } + } + + if( K3bAudioTrack* track = createTrack( url ) ) { + addTrack( track, position ); + + K3bAudioDecoder* dec = static_cast( track->firstSource() )->decoder(); + track->setTitle( dec->metaInfo( K3bAudioDecoder::META_TITLE ) ); + track->setArtist( dec->metaInfo( K3bAudioDecoder::META_ARTIST ) ); + track->setSongwriter( dec->metaInfo( K3bAudioDecoder::META_SONGWRITER ) ); + track->setComposer( dec->metaInfo( K3bAudioDecoder::META_COMPOSER ) ); + track->setCdTextMessage( dec->metaInfo( K3bAudioDecoder::META_COMMENT ) ); + } + } + + emit changed(); + + informAboutNotFoundFiles(); +} + + +KURL::List K3bAudioDoc::extractUrlList( const KURL::List& urls ) +{ + KURL::List allUrls = urls; + KURL::List urlsFromPlaylist; + KURL::List::iterator it = allUrls.begin(); + while( it != allUrls.end() ) { + + const KURL& url = *it; + QFileInfo fi( url.path() ); + + if( !url.isLocalFile() ) { + kdDebug() << url.path() << " no local file" << endl; + it = allUrls.remove( it ); + m_notFoundFiles.append( url ); + } + else if( !fi.exists() ) { + it = allUrls.remove( it ); + kdDebug() << url.path() << " not found" << endl; + m_notFoundFiles.append( url ); + } + else if( fi.isDir() ) { + it = allUrls.remove( it ); + // add all files in the dir + QDir dir(fi.filePath()); + QStringList entries = dir.entryList( QDir::Files ); + KURL::List::iterator oldIt = it; + // add all files into the list after the current item + for( QStringList::iterator dirIt = entries.begin(); + dirIt != entries.end(); ++dirIt ) + it = allUrls.insert( oldIt, KURL::fromPathOrURL( dir.absPath() + "/" + *dirIt ) ); + } + else if( readPlaylistFile( url, urlsFromPlaylist ) ) { + it = allUrls.remove( it ); + KURL::List::iterator oldIt = it; + // add all files into the list after the current item + for( KURL::List::iterator dirIt = urlsFromPlaylist.begin(); + dirIt != urlsFromPlaylist.end(); ++dirIt ) + it = allUrls.insert( oldIt, *dirIt ); + } + else + ++it; + } + + return allUrls; +} + + +bool K3bAudioDoc::readPlaylistFile( const KURL& url, KURL::List& playlist ) +{ + // check if the file is a m3u playlist + // and if so add all listed files + + QFile f( url.path() ); + if( !f.open( IO_ReadOnly ) ) + return false; + + QTextStream t( &f ); + char buf[7]; + t.readRawBytes( buf, 7 ); + if( QString::fromLatin1( buf, 7 ) != "#EXTM3U" ) + return false; + + // skip the first line + t.readLine(); + + // read the file + while( !t.atEnd() ) { + QString line = t.readLine(); + if( line[0] != '#' ) { + KURL mp3url; + // relative paths + if( line[0] != '/' ) + mp3url.setPath( url.directory(false) + line ); + else + mp3url.setPath( line ); + + playlist.append( mp3url ); + } + } + + return true; +} + + +void K3bAudioDoc::addSources( K3bAudioTrack* parent, + const KURL::List& urls, + K3bAudioDataSource* sourceAfter ) +{ + kdDebug() << "(K3bAudioDoc::addSources( " << parent << ", " + << urls.first().path() << ", " + << sourceAfter << " )" << endl; + KURL::List allUrls = extractUrlList( urls ); + KURL::List::const_iterator end(allUrls.end()); + for( KURL::List::const_iterator it = allUrls.begin(); it != end; ++it ) { + if( K3bAudioFile* file = createAudioFile( *it ) ) { + if( sourceAfter ) + file->moveAfter( sourceAfter ); + else + file->moveAhead( parent->firstSource() ); + sourceAfter = file; + } + } + + informAboutNotFoundFiles(); + kdDebug() << "(K3bAudioDoc::addSources) finished." << endl; +} + + +K3bAudioTrack* K3bAudioDoc::importCueFile( const QString& cuefile, K3bAudioTrack* after, K3bAudioDecoder* decoder ) +{ + if( !after ) + after = m_lastTrack; + + kdDebug() << "(K3bAudioDoc::importCueFile( " << cuefile << ", " << after << ")" << endl; + K3bCueFileParser parser( cuefile ); + if( parser.isValid() && parser.toc().contentType() == K3bDevice::AUDIO ) { + + kdDebug() << "(K3bAudioDoc::importCueFile) parsed with image: " << parser.imageFilename() << endl; + + // global cd-text + if( !parser.cdText().title().isEmpty() ) + setTitle( parser.cdText().title() ); + if( !parser.cdText().performer().isEmpty() ) + setPerformer( parser.cdText().performer() ); + + bool reused = true; + if( !decoder ) + decoder = getDecoderForUrl( KURL::fromPathOrURL(parser.imageFilename()), &reused ); + + if( decoder ) { + if( !reused ) + decoder->analyseFile(); + + K3bAudioFile* newFile = 0; + unsigned int i = 0; + for( K3bDevice::Toc::const_iterator it = parser.toc().begin(); + it != parser.toc().end(); ++it ) { + const K3bDevice::Track& track = *it; + + newFile = new K3bAudioFile( decoder, this ); + newFile->setStartOffset( track.firstSector() ); + newFile->setEndOffset( track.lastSector()+1 ); + + K3bAudioTrack* newTrack = new K3bAudioTrack( this ); + newTrack->addSource( newFile ); + newTrack->moveAfter( after ); + + // we do not know the length of the source yet so we have to force the index value + if( track.index0() > 0 ) + newTrack->m_index0Offset = track.length() - track.index0(); + else + newTrack->m_index0Offset = 0; + + // cd-text + newTrack->setTitle( parser.cdText()[i].title() ); + newTrack->setPerformer( parser.cdText()[i].performer() ); + + // add the next track after this one + after = newTrack; + ++i; + } + + // let the last source use the data up to the end of the file + if( newFile ) + newFile->setEndOffset(0); + + return after; + } + } + return 0; +} + + +K3bAudioDecoder* K3bAudioDoc::getDecoderForUrl( const KURL& url, bool* reused ) +{ + K3bAudioDecoder* decoder = 0; + + // check if we already have a proper decoder + if( m_decoderPresenceMap.contains( url.path() ) ) { + decoder = m_decoderPresenceMap[url.path()]; + *reused = true; + } + else if( (decoder = K3bAudioDecoderFactory::createDecoder( url )) ) { + kdDebug() << "(K3bAudioDoc) using " << decoder->className() + << " for decoding of " << url.path() << endl; + + decoder->setFilename( url.path() ); + *reused = false; + } + + return decoder; +} + + +K3bAudioFile* K3bAudioDoc::createAudioFile( const KURL& url ) +{ + if( !QFile::exists( url.path() ) ) { + m_notFoundFiles.append( url.path() ); + kdDebug() << "(K3bAudioDoc) could not find file " << url.path() << endl; + return 0; + } + + bool reused; + K3bAudioDecoder* decoder = getDecoderForUrl( url, &reused ); + if( decoder ) { + if( !reused ) + decoder->analyseFile(); + return new K3bAudioFile( decoder, this ); + } + else { + m_unknownFileFormatFiles.append( url.path() ); + kdDebug() << "(K3bAudioDoc) unknown file type in file " << url.path() << endl; + return 0; + } +} + + +K3bAudioTrack* K3bAudioDoc::createTrack( const KURL& url ) +{ + kdDebug() << "(K3bAudioDoc::createTrack( " << url.path() << " )" << endl; + if( K3bAudioFile* file = createAudioFile( url ) ) { + K3bAudioTrack* newTrack = new K3bAudioTrack( this ); + newTrack->setFirstSource( file ); + return newTrack; + } + else + return 0; +} + + +void K3bAudioDoc::addTrack( const KURL& url, uint position ) +{ + addTracks( KURL::List(url), position ); +} + + + +K3bAudioTrack* K3bAudioDoc::getTrack( unsigned int trackNum ) +{ + K3bAudioTrack* track = m_firstTrack; + unsigned int i = 1; + while( track ) { + if( i == trackNum ) + return track; + track = track->next(); + ++i; + } + + return 0; +} + + +void K3bAudioDoc::addTrack( K3bAudioTrack* track, uint position ) +{ + kdDebug() << "(K3bAudioDoc::addTrack( " << track << ", " << position << " )" << endl; + track->m_parent = this; + if( !m_firstTrack ) + m_firstTrack = m_lastTrack = track; + else if( position == 0 ) + track->moveAhead( m_firstTrack ); + else { + K3bAudioTrack* after = getTrack( position ); + if( after ) + track->moveAfter( after ); + else + track->moveAfter( m_lastTrack ); // just to be sure it's anywhere... + } + + emit changed(); +} + + +void K3bAudioDoc::removeTrack( K3bAudioTrack* track ) +{ + delete track; +} + + +void K3bAudioDoc::moveTrack( K3bAudioTrack* track, K3bAudioTrack* after ) +{ + track->moveAfter( after ); +} + + +QString K3bAudioDoc::typeString() const +{ + return "audio"; +} + + +bool K3bAudioDoc::loadDocumentData( QDomElement* root ) +{ + newDocument(); + + // we will parse the dom-tree and create a K3bAudioTrack for all entries immediately + // this should not take long and so not block the gui + + QDomNodeList nodes = root->childNodes(); + + for( uint i = 0; i < nodes.count(); i++ ) { + + QDomElement e = nodes.item(i).toElement(); + + if( e.isNull() ) + return false; + + if( e.nodeName() == "general" ) { + if( !readGeneralDocumentData( e ) ) + return false; + } + + else if( e.nodeName() == "normalize" ) + setNormalize( e.text() == "yes" ); + + else if( e.nodeName() == "hide_first_track" ) + setHideFirstTrack( e.text() == "yes" ); + + else if( e.nodeName() == "audio_ripping" ) { + QDomNodeList ripNodes = e.childNodes(); + for( uint j = 0; j < ripNodes.length(); j++ ) { + if( ripNodes.item(j).nodeName() == "paranoia_mode" ) + setAudioRippingParanoiaMode( ripNodes.item(j).toElement().text().toInt() ); + else if( ripNodes.item(j).nodeName() == "read_retries" ) + setAudioRippingRetries( ripNodes.item(j).toElement().text().toInt() ); + else if( ripNodes.item(j).nodeName() == "ignore_read_errors" ) + setAudioRippingIgnoreReadErrors( ripNodes.item(j).toElement().text() == "yes" ); + } + } + + // parse cd-text + else if( e.nodeName() == "cd-text" ) { + if( !e.hasAttribute( "activated" ) ) + return false; + + writeCdText( e.attributeNode( "activated" ).value() == "yes" ); + + QDomNodeList cdTextNodes = e.childNodes(); + for( uint j = 0; j < cdTextNodes.length(); j++ ) { + if( cdTextNodes.item(j).nodeName() == "title" ) + setTitle( cdTextNodes.item(j).toElement().text() ); + + else if( cdTextNodes.item(j).nodeName() == "artist" ) + setArtist( cdTextNodes.item(j).toElement().text() ); + + else if( cdTextNodes.item(j).nodeName() == "arranger" ) + setArranger( cdTextNodes.item(j).toElement().text() ); + + else if( cdTextNodes.item(j).nodeName() == "songwriter" ) + setSongwriter( cdTextNodes.item(j).toElement().text() ); + + else if( cdTextNodes.item(j).nodeName() == "composer" ) + setComposer( cdTextNodes.item(j).toElement().text() ); + + else if( cdTextNodes.item(j).nodeName() == "disc_id" ) + setDisc_id( cdTextNodes.item(j).toElement().text() ); + + else if( cdTextNodes.item(j).nodeName() == "upc_ean" ) + setUpc_ean( cdTextNodes.item(j).toElement().text() ); + + else if( cdTextNodes.item(j).nodeName() == "message" ) + setCdTextMessage( cdTextNodes.item(j).toElement().text() ); + } + } + + else if( e.nodeName() == "contents" ) { + + QDomNodeList contentNodes = e.childNodes(); + + for( uint j = 0; j< contentNodes.length(); j++ ) { + + QDomElement trackElem = contentNodes.item(j).toElement(); + + // first of all we need a track + K3bAudioTrack* track = new K3bAudioTrack(); + + + // backwards compatibility + // ----------------------------------------------------------------------------------------------------- + QDomAttr oldUrlAttr = trackElem.attributeNode( "url" ); + if( !oldUrlAttr.isNull() ) { + if( K3bAudioFile* file = + createAudioFile( KURL::fromPathOrURL( oldUrlAttr.value() ) ) ) { + track->addSource( file ); + } + } + // ----------------------------------------------------------------------------------------------------- + + + QDomNodeList trackNodes = trackElem.childNodes(); + for( uint trackJ = 0; trackJ < trackNodes.length(); trackJ++ ) { + + if( trackNodes.item(trackJ).nodeName() == "sources" ) { + QDomNodeList sourcesNodes = trackNodes.item(trackJ).childNodes(); + for( unsigned int sourcesIndex = 0; sourcesIndex < sourcesNodes.length(); sourcesIndex++ ) { + QDomElement sourceElem = sourcesNodes.item(sourcesIndex).toElement(); + if( sourceElem.nodeName() == "file" ) { + if( K3bAudioFile* file = + createAudioFile( KURL::fromPathOrURL( sourceElem.attributeNode( "url" ).value() ) ) ) { + file->setStartOffset( K3b::Msf::fromString( sourceElem.attributeNode( "start_offset" ).value() ) ); + file->setEndOffset( K3b::Msf::fromString( sourceElem.attributeNode( "end_offset" ).value() ) ); + track->addSource( file ); + } + } + else if( sourceElem.nodeName() == "silence" ) { + K3bAudioZeroData* zero = new K3bAudioZeroData(); + zero->setLength( K3b::Msf::fromString( sourceElem.attributeNode( "length" ).value() ) ); + track->addSource( zero ); + } + else if( sourceElem.nodeName() == "cdtrack" ) { + K3b::Msf length = K3b::Msf::fromString( sourceElem.attributeNode( "length" ).value() ); + int titlenum = 0; + unsigned int discid = 0; + QString title, artist, cdTitle, cdArtist; + + QDomNodeList cdTrackSourceNodes = sourceElem.childNodes(); + for( unsigned int cdTrackSourceIndex = 0; cdTrackSourceIndex < cdTrackSourceNodes.length(); ++cdTrackSourceIndex ) { + QDomElement cdTrackSourceItemElem = cdTrackSourceNodes.item(cdTrackSourceIndex).toElement(); + if( cdTrackSourceItemElem.nodeName() == "title_number" ) + titlenum = cdTrackSourceItemElem.text().toInt(); + else if( cdTrackSourceItemElem.nodeName() == "disc_id" ) + discid = cdTrackSourceItemElem.text().toUInt( 0, 16 ); + else if( cdTrackSourceItemElem.nodeName() == "title" ) + title = cdTrackSourceItemElem.text().toInt(); + else if( cdTrackSourceItemElem.nodeName() == "artist" ) + artist = cdTrackSourceItemElem.text().toInt(); + else if( cdTrackSourceItemElem.nodeName() == "cdtitle" ) + cdTitle = cdTrackSourceItemElem.text().toInt(); + else if( cdTrackSourceItemElem.nodeName() == "cdartist" ) + cdArtist = cdTrackSourceItemElem.text().toInt(); + } + + if( discid != 0 && titlenum > 0 ) { + K3bAudioCdTrackSource* cdtrack = new K3bAudioCdTrackSource( discid, length, titlenum, + artist, title, + cdArtist, cdTitle ); + cdtrack->setStartOffset( K3b::Msf::fromString( sourceElem.attributeNode( "start_offset" ).value() ) ); + cdtrack->setEndOffset( K3b::Msf::fromString( sourceElem.attributeNode( "end_offset" ).value() ) ); + track->addSource( cdtrack ); + } + else { + kdDebug() << "(K3bAudioDoc) invalid cdtrack source." << endl; + return false; + } + } + else { + kdDebug() << "(K3bAudioDoc) unknown source type: " << sourceElem.nodeName() << endl; + return false; + } + } + } + + // load cd-text + else if( trackNodes.item(trackJ).nodeName() == "cd-text" ) { + QDomNodeList cdTextNodes = trackNodes.item(trackJ).childNodes(); + for( uint trackCdTextJ = 0; trackCdTextJ < cdTextNodes.length(); trackCdTextJ++ ) { + if( cdTextNodes.item(trackCdTextJ).nodeName() == "title" ) + track->setTitle( cdTextNodes.item(trackCdTextJ).toElement().text() ); + + else if( cdTextNodes.item(trackCdTextJ).nodeName() == "artist" ) + track->setArtist( cdTextNodes.item(trackCdTextJ).toElement().text() ); + + else if( cdTextNodes.item(trackCdTextJ).nodeName() == "arranger" ) + track->setArranger( cdTextNodes.item(trackCdTextJ).toElement().text() ); + + else if( cdTextNodes.item(trackCdTextJ).nodeName() == "songwriter" ) + track->setSongwriter( cdTextNodes.item(trackCdTextJ).toElement().text() ); + + else if( cdTextNodes.item(trackCdTextJ).nodeName() == "composer" ) + track->setComposer( cdTextNodes.item(trackCdTextJ).toElement().text() ); + + else if( cdTextNodes.item(trackCdTextJ).nodeName() == "isrc" ) + track->setIsrc( cdTextNodes.item(trackCdTextJ).toElement().text() ); + + else if( cdTextNodes.item(trackCdTextJ).nodeName() == "message" ) + track->setCdTextMessage( cdTextNodes.item(trackCdTextJ).toElement().text() ); + } + } + + else if( trackNodes.item(trackJ).nodeName() == "index0" ) + track->setIndex0( K3b::Msf::fromString( trackNodes.item(trackJ).toElement().text() ) ); + + // TODO: load other indices + + // load options + else if( trackNodes.item(trackJ).nodeName() == "copy_protection" ) + track->setCopyProtection( trackNodes.item(trackJ).toElement().text() == "yes" ); + + else if( trackNodes.item(trackJ).nodeName() == "pre_emphasis" ) + track->setPreEmp( trackNodes.item(trackJ).toElement().text() == "yes" ); + } + + // add the track + if( track->numberSources() > 0 ) + addTrack( track, 99 ); // append to the end // TODO improve + else { + kdDebug() << "(K3bAudioDoc) no sources. deleting track " << track << endl; + delete track; + } + } + } + } + + informAboutNotFoundFiles(); + + setModified(false); + + return true; +} + +bool K3bAudioDoc::saveDocumentData( QDomElement* docElem ) +{ + QDomDocument doc = docElem->ownerDocument(); + saveGeneralDocumentData( docElem ); + + // add normalize + QDomElement normalizeElem = doc.createElement( "normalize" ); + normalizeElem.appendChild( doc.createTextNode( normalize() ? "yes" : "no" ) ); + docElem->appendChild( normalizeElem ); + + // add hide track + QDomElement hideFirstTrackElem = doc.createElement( "hide_first_track" ); + hideFirstTrackElem.appendChild( doc.createTextNode( hideFirstTrack() ? "yes" : "no" ) ); + docElem->appendChild( hideFirstTrackElem ); + + // save the audio cd ripping settings + // paranoia mode, read retries, and ignore read errors + // ------------------------------------------------------------ + QDomElement ripMain = doc.createElement( "audio_ripping" ); + docElem->appendChild( ripMain ); + + QDomElement ripElem = doc.createElement( "paranoia_mode" ); + ripElem.appendChild( doc.createTextNode( QString::number( audioRippingParanoiaMode() ) ) ); + ripMain.appendChild( ripElem ); + + ripElem = doc.createElement( "read_retries" ); + ripElem.appendChild( doc.createTextNode( QString::number( audioRippingRetries() ) ) ); + ripMain.appendChild( ripElem ); + + ripElem = doc.createElement( "ignore_read_errors" ); + ripElem.appendChild( doc.createTextNode( audioRippingIgnoreReadErrors() ? "yes" : "no" ) ); + ripMain.appendChild( ripElem ); + // ------------------------------------------------------------ + + // save disc cd-text + // ------------------------------------------------------------- + QDomElement cdTextMain = doc.createElement( "cd-text" ); + cdTextMain.setAttribute( "activated", cdText() ? "yes" : "no" ); + QDomElement cdTextElem = doc.createElement( "title" ); + cdTextElem.appendChild( doc.createTextNode( (title())) ); + cdTextMain.appendChild( cdTextElem ); + + cdTextElem = doc.createElement( "artist" ); + cdTextElem.appendChild( doc.createTextNode( (artist())) ); + cdTextMain.appendChild( cdTextElem ); + + cdTextElem = doc.createElement( "arranger" ); + cdTextElem.appendChild( doc.createTextNode( (arranger())) ); + cdTextMain.appendChild( cdTextElem ); + + cdTextElem = doc.createElement( "songwriter" ); + cdTextElem.appendChild( doc.createTextNode( (songwriter())) ); + cdTextMain.appendChild( cdTextElem ); + + cdTextElem = doc.createElement( "composer" ); + cdTextElem.appendChild( doc.createTextNode( composer()) ); + cdTextMain.appendChild( cdTextElem ); + + cdTextElem = doc.createElement( "disc_id" ); + cdTextElem.appendChild( doc.createTextNode( (disc_id())) ); + cdTextMain.appendChild( cdTextElem ); + + cdTextElem = doc.createElement( "upc_ean" ); + cdTextElem.appendChild( doc.createTextNode( (upc_ean())) ); + cdTextMain.appendChild( cdTextElem ); + + cdTextElem = doc.createElement( "message" ); + cdTextElem.appendChild( doc.createTextNode( (cdTextMessage())) ); + cdTextMain.appendChild( cdTextElem ); + + docElem->appendChild( cdTextMain ); + // ------------------------------------------------------------- + + // save the tracks + // ------------------------------------------------------------- + QDomElement contentsElem = doc.createElement( "contents" ); + + for( K3bAudioTrack* track = firstTrack(); track != 0; track = track->next() ) { + + QDomElement trackElem = doc.createElement( "track" ); + + // add sources + QDomElement sourcesParent = doc.createElement( "sources" ); + + for( K3bAudioDataSource* source = track->firstSource(); source; source = source->next() ) { + // TODO: save a source element with a type attribute and start- and endoffset + // then distict between the different source types. + if( K3bAudioFile* file = dynamic_cast(source) ) { + QDomElement sourceElem = doc.createElement( "file" ); + sourceElem.setAttribute( "url", file->filename() ); + sourceElem.setAttribute( "start_offset", file->startOffset().toString() ); + sourceElem.setAttribute( "end_offset", file->endOffset().toString() ); + sourcesParent.appendChild( sourceElem ); + } + else if( K3bAudioZeroData* zero = dynamic_cast(source) ) { + QDomElement sourceElem = doc.createElement( "silence" ); + sourceElem.setAttribute( "length", zero->length().toString() ); + sourcesParent.appendChild( sourceElem ); + } + else if( K3bAudioCdTrackSource* cdTrack = dynamic_cast(source) ) { + QDomElement sourceElem = doc.createElement( "cdtrack" ); + sourceElem.setAttribute( "length", cdTrack->originalLength().toString() ); + sourceElem.setAttribute( "start_offset", cdTrack->startOffset().toString() ); + sourceElem.setAttribute( "end_offset", cdTrack->endOffset().toString() ); + + QDomElement subElem = doc.createElement( "title_number" ); + subElem.appendChild( doc.createTextNode( QString::number(cdTrack->cdTrackNumber()) ) ); + sourceElem.appendChild( subElem ); + + subElem = doc.createElement( "disc_id" ); + subElem.appendChild( doc.createTextNode( QString::number(cdTrack->discId(), 16) ) ); + sourceElem.appendChild( subElem ); + + subElem = doc.createElement( "title" ); + subElem.appendChild( doc.createTextNode( cdTrack->metaInfo().titles[cdTrack->cdTrackNumber()-1] ) ); + sourceElem.appendChild( subElem ); + + subElem = doc.createElement( "artist" ); + subElem.appendChild( doc.createTextNode( cdTrack->metaInfo().artists[cdTrack->cdTrackNumber()-1] ) ); + sourceElem.appendChild( subElem ); + + subElem = doc.createElement( "cdtitle" ); + subElem.appendChild( doc.createTextNode( cdTrack->metaInfo().cdTitle ) ); + sourceElem.appendChild( subElem ); + + subElem = doc.createElement( "cdartist" ); + subElem.appendChild( doc.createTextNode( cdTrack->metaInfo().cdArtist ) ); + sourceElem.appendChild( subElem ); + + sourcesParent.appendChild( sourceElem ); + } + else { + kdError() << "(K3bAudioDoc) saving sources other than file or zero not supported yet." << endl; + return false; + } + } + trackElem.appendChild( sourcesParent ); + + // index 0 + QDomElement index0Elem = doc.createElement( "index0" ); + index0Elem.appendChild( doc.createTextNode( track->index0().toString() ) ); + trackElem.appendChild( index0Elem ); + + // TODO: other indices + + // add cd-text + cdTextMain = doc.createElement( "cd-text" ); + cdTextElem = doc.createElement( "title" ); + cdTextElem.appendChild( doc.createTextNode( (track->title())) ); + cdTextMain.appendChild( cdTextElem ); + + cdTextElem = doc.createElement( "artist" ); + cdTextElem.appendChild( doc.createTextNode( (track->artist())) ); + cdTextMain.appendChild( cdTextElem ); + + cdTextElem = doc.createElement( "arranger" ); + cdTextElem.appendChild( doc.createTextNode( (track->arranger()) ) ); + cdTextMain.appendChild( cdTextElem ); + + cdTextElem = doc.createElement( "songwriter" ); + cdTextElem.appendChild( doc.createTextNode( (track->songwriter()) ) ); + cdTextMain.appendChild( cdTextElem ); + + cdTextElem = doc.createElement( "composer" ); + cdTextElem.appendChild( doc.createTextNode( (track->composer()) ) ); + cdTextMain.appendChild( cdTextElem ); + + cdTextElem = doc.createElement( "isrc" ); + cdTextElem.appendChild( doc.createTextNode( ( track->isrc()) ) ); + cdTextMain.appendChild( cdTextElem ); + + cdTextElem = doc.createElement( "message" ); + cdTextElem.appendChild( doc.createTextNode( (track->cdTextMessage()) ) ); + cdTextMain.appendChild( cdTextElem ); + + trackElem.appendChild( cdTextMain ); + + // add copy protection + QDomElement copyElem = doc.createElement( "copy_protection" ); + copyElem.appendChild( doc.createTextNode( track->copyProtection() ? "yes" : "no" ) ); + trackElem.appendChild( copyElem ); + + // add pre emphasis + copyElem = doc.createElement( "pre_emphasis" ); + copyElem.appendChild( doc.createTextNode( track->preEmp() ? "yes" : "no" ) ); + trackElem.appendChild( copyElem ); + + contentsElem.appendChild( trackElem ); + } + // ------------------------------------------------------------- + + docElem->appendChild( contentsElem ); + + return true; +} + + +int K3bAudioDoc::numOfTracks() const +{ + return ( m_lastTrack ? m_lastTrack->trackNumber() : 0 ); +} + + +K3bBurnJob* K3bAudioDoc::newBurnJob( K3bJobHandler* hdl, QObject* parent ) +{ + return new K3bAudioJob( this, hdl, parent ); +} + + +void K3bAudioDoc::informAboutNotFoundFiles() +{ + if( !m_notFoundFiles.isEmpty() ) { + QStringList l; + for( KURL::List::const_iterator it = m_notFoundFiles.begin(); + it != m_notFoundFiles.end(); ++it ) + l.append( (*it).path() ); + KMessageBox::informationList( qApp->activeWindow(), + i18n("Could not find the following files:"), + l, + i18n("Not Found") ); + + m_notFoundFiles.clear(); + } + if( !m_unknownFileFormatFiles.isEmpty() ) { + QStringList l; + for( KURL::List::const_iterator it = m_unknownFileFormatFiles.begin(); + it != m_unknownFileFormatFiles.end(); ++it ) + l.append( (*it).path() ); + KMessageBox::informationList( qApp->activeWindow(), + i18n("

Unable to handle the following files due to an unsupported format:" + "

You may manually convert these audio files to wave using another " + "application supporting the audio format and then add the wave files " + "to the K3b project."), + l, + i18n("Unsupported Format") ); + + m_unknownFileFormatFiles.clear(); + } +} + + + +void K3bAudioDoc::removeCorruptTracks() +{ +// K3bAudioTrack* track = m_tracks->first(); +// while( track ) { +// if( track->status() != 0 ) { +// removeTrack(track); +// track = m_tracks->current(); +// } +// else +// track = m_tracks->next(); +// } +} + + +void K3bAudioDoc::slotTrackChanged( K3bAudioTrack* track ) +{ + kdDebug() << "(K3bAudioDoc::slotTrackChanged " << track << endl; + setModified( true ); + // if the track is empty now we simply delete it + if( track->firstSource() ) { + emit trackChanged(track); + emit changed(); + } + else { + kdDebug() << "(K3bAudioDoc::slotTrackChanged) track " << track << " empty. Deleting." << endl; + delete track; // this will emit the proper signal + } + kdDebug() << "(K3bAudioDoc::slotTrackChanged done" << track << endl; +} + + +void K3bAudioDoc::slotTrackRemoved( K3bAudioTrack* track ) +{ + setModified( true ); + emit trackRemoved(track); + emit changed(); +} + + +void K3bAudioDoc::increaseDecoderUsage( K3bAudioDecoder* decoder ) +{ + kdDebug() << "(K3bAudioDoc::increaseDecoderUsage)" << endl; + if( !m_decoderUsageCounterMap.contains( decoder ) ) { + m_decoderUsageCounterMap[decoder] = 1; + m_decoderPresenceMap[decoder->filename()] = decoder; + } + else + m_decoderUsageCounterMap[decoder]++; + kdDebug() << "(K3bAudioDoc::increaseDecoderUsage) finished" << endl; +} + + +void K3bAudioDoc::decreaseDecoderUsage( K3bAudioDecoder* decoder ) +{ + m_decoderUsageCounterMap[decoder]--; + if( m_decoderUsageCounterMap[decoder] <= 0 ) { + m_decoderUsageCounterMap.erase(decoder); + m_decoderPresenceMap.erase(decoder->filename()); + delete decoder; + } +} + + +K3bDevice::CdText K3bAudioDoc::cdTextData() const +{ + K3bDevice::CdText text( m_cdTextData ); + text.reserve( numOfTracks() ); + K3bAudioTrack* track = firstTrack(); + while( track ) { + text.append( track->cdText() ); + + track = track->next(); + } + return text; +} + + +K3bDevice::Toc K3bAudioDoc::toToc() const +{ + K3bDevice::Toc toc; + + // FIXME: add MCN + + K3bAudioTrack* track = firstTrack(); + K3b::Msf pos = 0; + while( track ) { + toc.append( track->toCdTrack() ); + track = track->next(); + } + + return toc; +} + + +void K3bAudioDoc::setTitle( const QString& v ) +{ + m_cdTextData.setTitle( v ); + emit changed(); +} + + +void K3bAudioDoc::setArtist( const QString& v ) +{ + setPerformer( v ); +} + + +void K3bAudioDoc::setPerformer( const QString& v ) +{ + QString s( v ); + d->cdTextValidator->fixup( s ); + m_cdTextData.setPerformer( s ); + emit changed(); +} + + +void K3bAudioDoc::setDisc_id( const QString& v ) +{ + QString s( v ); + d->cdTextValidator->fixup( s ); + m_cdTextData.setDiscId( s ); + emit changed(); +} + + +void K3bAudioDoc::setArranger( const QString& v ) +{ + QString s( v ); + d->cdTextValidator->fixup( s ); + m_cdTextData.setArranger( s ); + emit changed(); +} + + +void K3bAudioDoc::setSongwriter( const QString& v ) +{ + QString s( v ); + d->cdTextValidator->fixup( s ); + m_cdTextData.setSongwriter( s ); + emit changed(); +} + + +void K3bAudioDoc::setComposer( const QString& v ) +{ + QString s( v ); + d->cdTextValidator->fixup( s ); + m_cdTextData.setComposer( s ); + emit changed(); +} + + +void K3bAudioDoc::setUpc_ean( const QString& v ) +{ + QString s( v ); + d->cdTextValidator->fixup( s ); + m_cdTextData.setUpcEan( s ); + emit changed(); +} + + +void K3bAudioDoc::setCdTextMessage( const QString& v ) +{ + QString s( v ); + d->cdTextValidator->fixup( s ); + m_cdTextData.setMessage( s ); + emit changed(); +} + +#include "k3baudiodoc.moc" diff --git a/libk3b/projects/audiocd/k3baudiodoc.h b/libk3b/projects/audiocd/k3baudiodoc.h new file mode 100644 index 0000000..87a512e --- /dev/null +++ b/libk3b/projects/audiocd/k3baudiodoc.h @@ -0,0 +1,263 @@ +/* + * + * $Id: k3baudiodoc.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef K3BAUDIODOC_H +#define K3BAUDIODOC_H + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include "k3b_export.h" +#include + +class K3bApp; +class K3bAudioTrack; +class QWidget; +class QTimer; +class QDomDocument; +class QDomElement; +class K3bThreadJob; +class KConfig; +class K3bAudioDataSource; +class K3bAudioDecoder; +class K3bAudioFile; + +/**Document class for an audio project. + *@author Sebastian Trueg + */ + +class LIBK3B_EXPORT K3bAudioDoc : public K3bDoc +{ + Q_OBJECT + + friend class K3bMixedDoc; + friend class K3bAudioTrack; + friend class K3bAudioFile; + + public: + K3bAudioDoc( QObject* ); + ~K3bAudioDoc(); + + QString name() const; + + bool newDocument(); + + bool hideFirstTrack() const { return m_hideFirstTrack; } + int numOfTracks() const; + + bool normalize() const { return m_normalize; } + + K3bAudioTrack* firstTrack() const; + K3bAudioTrack* lastTrack() const; + + /** + * Slow. + * \return the K3bAudioTrack with track number trackNum starting at 1 or 0 if trackNum > numOfTracks() + */ + K3bAudioTrack* getTrack( unsigned int trackNum ); + + /** + * Creates a new audiofile inside this doc which has no track yet. + */ + K3bAudioFile* createAudioFile( const KURL& url ); + + /** get the current size of the project */ + KIO::filesize_t size() const; + K3b::Msf length() const; + + // CD-Text + bool cdText() const { return m_cdText; } + const QString& title() const { return m_cdTextData.title(); } + const QString& artist() const { return m_cdTextData.performer(); } + const QString& disc_id() const { return m_cdTextData.discId(); } + const QString& arranger() const { return m_cdTextData.arranger(); } + const QString& songwriter() const { return m_cdTextData.songwriter(); } + const QString& composer() const { return m_cdTextData.composer(); } + const QString& upc_ean() const { return m_cdTextData.upcEan(); } + const QString& cdTextMessage() const { return m_cdTextData.message(); } + + /** + * Create complete CD-Text including the tracks' data. + */ + K3bDevice::CdText cdTextData() const; + + int audioRippingParanoiaMode() const { return m_audioRippingParanoiaMode; } + int audioRippingRetries() const { return m_audioRippingRetries; } + bool audioRippingIgnoreReadErrors() const { return m_audioRippingIgnoreReadErrors; } + + /** + * Represent the structure of the doc as CD Table of Contents. + */ + K3bDevice::Toc toToc() const; + + K3bBurnJob* newBurnJob( K3bJobHandler*, QObject* parent = 0 ); + + /** + * Shows dialogs. + */ + void informAboutNotFoundFiles(); + + /** + * returns the new after track, ie. the the last added track or null if + * the import failed. + * + * This is a blocking method. + * + * \param cuefile The Cuefile to be imported + * \param after The track after which the new tracks should be inserted + * \param decoder The decoder to be used for the new tracks. If 0 a new one will be created. + * + * BE AWARE THAT THE DECODER HAS TO FIT THE AUDIO FILE IN THE CUE. + */ + K3bAudioTrack* importCueFile( const QString& cuefile, K3bAudioTrack* after, K3bAudioDecoder* decoder = 0 ); + + /** + * Create a decoder for a specific url. If another AudioFileSource with this + * url is already part of this project the associated decoder is returned. + * + * In the first case the decoder will not be initialized yet (K3bAudioDecoder::analyseFile + * is not called yet). + * + * \param url The url for which a decoder is requested. + * \param reused If not null this variable is set to true if the decoder is already in + * use and K3bAudioDecoder::analyseFile() does not have to be called anymore. + */ + K3bAudioDecoder* getDecoderForUrl( const KURL& url, bool* reused = 0 ); + + static bool readPlaylistFile( const KURL& url, KURL::List& playlist ); + + public slots: + void addUrls( const KURL::List& ); + void addTrack( const KURL&, uint ); + void addTracks( const KURL::List&, uint ); + /** + * Adds a track without any testing + * + * Slow because it uses getTrack. + */ + void addTrack( K3bAudioTrack* track, uint position = 0 ); + + void addSources( K3bAudioTrack* parent, const KURL::List& urls, K3bAudioDataSource* sourceAfter = 0 ); + + void removeTrack( K3bAudioTrack* ); + void moveTrack( K3bAudioTrack* track, K3bAudioTrack* after ); + + void setHideFirstTrack( bool b ) { m_hideFirstTrack = b; } + void setNormalize( bool b ) { m_normalize = b; } + + // CD-Text + void writeCdText( bool b ) { m_cdText = b; } + void setTitle( const QString& v ); + void setArtist( const QString& v ); + void setPerformer( const QString& v ); + void setDisc_id( const QString& v ); + void setArranger( const QString& v ); + void setSongwriter( const QString& v ); + void setComposer( const QString& v ); + void setUpc_ean( const QString& v ); + void setCdTextMessage( const QString& v ); + + // Audio-CD Ripping + void setAudioRippingParanoiaMode( int i ) { m_audioRippingParanoiaMode = i; } + void setAudioRippingRetries( int r ) { m_audioRippingRetries = r; } + void setAudioRippingIgnoreReadErrors( bool b ) { m_audioRippingIgnoreReadErrors = b; } + + void removeCorruptTracks(); + + private slots: + void slotTrackChanged( K3bAudioTrack* ); + void slotTrackRemoved( K3bAudioTrack* ); + + signals: + void trackChanged( K3bAudioTrack* ); + void trackRemoved( K3bAudioTrack* ); + + protected: + /** reimplemented from K3bDoc */ + bool loadDocumentData( QDomElement* ); + /** reimplemented from K3bDoc */ + bool saveDocumentData( QDomElement* ); + + QString typeString() const; + + private: + // the stuff for adding files + // --------------------------------------------------------- + K3bAudioTrack* createTrack( const KURL& url ); + + /** + * Handle directories and M3u files + */ + KURL::List extractUrlList( const KURL::List& urls ); + // --------------------------------------------------------- + + /** + * Used by K3bAudioTrack to update the track list + */ + void setFirstTrack( K3bAudioTrack* track ); + /** + * Used by K3bAudioTrack to update the track list + */ + void setLastTrack( K3bAudioTrack* track ); + + /** + * Used by K3bAudioFile to tell the doc that it does not need the decoder anymore. + */ + void decreaseDecoderUsage( K3bAudioDecoder* ); + void increaseDecoderUsage( K3bAudioDecoder* ); + + K3bAudioTrack* m_firstTrack; + K3bAudioTrack* m_lastTrack; + + bool m_hideFirstTrack; + bool m_normalize; + + KURL::List m_notFoundFiles; + KURL::List m_unknownFileFormatFiles; + + // CD-Text + // -------------------------------------------------- + K3bDevice::CdText m_cdTextData; + bool m_cdText; + // -------------------------------------------------- + + // Audio ripping + int m_audioRippingParanoiaMode; + int m_audioRippingRetries; + bool m_audioRippingIgnoreReadErrors; + + // + // decoder housekeeping + // -------------------------------------------------- + // used to check if we may delete a decoder + QMap m_decoderUsageCounterMap; + // used to check if we already have a decoder for a specific file + QMap m_decoderPresenceMap; + + class Private; + Private* d; +}; + + +#endif diff --git a/libk3b/projects/audiocd/k3baudiofile.cpp b/libk3b/projects/audiocd/k3baudiofile.cpp new file mode 100644 index 0000000..2011e73 --- /dev/null +++ b/libk3b/projects/audiocd/k3baudiofile.cpp @@ -0,0 +1,112 @@ +/* + * + * $Id: k3baudiofile.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2004 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3baudiofile.h" +#include "k3baudiodoc.h" +#include "k3baudiotrack.h" + +#include + + +K3bAudioFile::K3bAudioFile( K3bAudioDecoder* dec, K3bAudioDoc* doc ) + : K3bAudioDataSource(), + m_doc(doc), + m_decoder(dec), + m_decodedData(0) +{ + // FIXME: somehow make it possible to switch docs + doc->increaseDecoderUsage( m_decoder ); +} + + +K3bAudioFile::K3bAudioFile( const K3bAudioFile& file ) + : K3bAudioDataSource( file ), + m_doc( file.m_doc ), + m_decoder( file.m_decoder ), + m_decodedData(0) +{ + m_doc->increaseDecoderUsage( m_decoder ); +} + + +K3bAudioFile::~K3bAudioFile() +{ + m_doc->decreaseDecoderUsage( m_decoder ); +} + + +QString K3bAudioFile::type() const +{ + return m_decoder->fileType(); +} + + +QString K3bAudioFile::sourceComment() const +{ + return m_decoder->filename().section( "/", -1 ); +} + + +const QString& K3bAudioFile::filename() const +{ + return m_decoder->filename(); +} + + +bool K3bAudioFile::isValid() const +{ + return m_decoder->isValid(); +} + + +K3b::Msf K3bAudioFile::originalLength() const +{ + return m_decoder->length(); +} + + +bool K3bAudioFile::seek( const K3b::Msf& msf ) +{ + // this is valid once the decoder has been initialized. + if( startOffset() + msf <= lastSector() && + m_decoder->seek( startOffset() + msf ) ) { + m_decodedData = msf.audioBytes(); + return true; + } + else + return false; +} + + +int K3bAudioFile::read( char* data, unsigned int max ) +{ + // here we can trust on the decoder to always provide enough data + // see if we decode too much + if( max + m_decodedData > length().audioBytes() ) + max = length().audioBytes() - m_decodedData; + + int read = m_decoder->decode( data, max ); + + if( read > 0 ) + m_decodedData += read; + + return read; +} + + +K3bAudioDataSource* K3bAudioFile::copy() const +{ + return new K3bAudioFile( *this ); +} diff --git a/libk3b/projects/audiocd/k3baudiofile.h b/libk3b/projects/audiocd/k3baudiofile.h new file mode 100644 index 0000000..83f75eb --- /dev/null +++ b/libk3b/projects/audiocd/k3baudiofile.h @@ -0,0 +1,85 @@ +/* + * + * $Id: k3baudiofile.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2004 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_AUDIO_FILE_H_ +#define _K3B_AUDIO_FILE_H_ + +#include "k3baudiodatasource.h" + +#include +#include +#include "k3b_export.h" + +class K3bAudioDecoder; +class K3bAudioTrack; + + +/** + * The K3bAudioFile is the most important audio data source. It gets its data + * from an audio file and uses a K3bAudioDecoder to decode this data. + * + * Be aware that it is currently not possible to change the doc of an AudioFile. + * The reason for this is the decoder sharing which is in place to allow gapless + * splitting of audio files into several tracks. + * + * \see K3bAudioDoc::createDecoderForUrl + */ +class LIBK3B_EXPORT K3bAudioFile : public K3bAudioDataSource +{ + public: + /** + * The AudioFile registers itself with the doc. This is part of the + * decoder handling facility in K3bAudioDoc which reuses the same decoder + * for sources with the same url. + * + * Use K3bAudioDoc::getDecoderForUrl to create a decoder. + */ + K3bAudioFile( K3bAudioDecoder*, K3bAudioDoc* ); + K3bAudioFile( const K3bAudioFile& ); + + /** + * The AudioFile deregisters itself from the doc. If it was the last file + * to use the decoder the doc will take care of deleting it. + */ + ~K3bAudioFile(); + + const QString& filename() const; + + /** + * The complete length of the file used by this source. + */ + K3b::Msf originalLength() const; + + QString type() const; + QString sourceComment() const; + + bool isValid() const; + + K3bAudioDecoder* decoder() const { return m_decoder; } + + bool seek( const K3b::Msf& ); + + int read( char* data, unsigned int max ); + + K3bAudioDataSource* copy() const; + + private: + K3bAudioDoc* m_doc; + K3bAudioDecoder* m_decoder; + + unsigned long long m_decodedData; +}; + +#endif diff --git a/libk3b/projects/audiocd/k3baudioimager.cpp b/libk3b/projects/audiocd/k3baudioimager.cpp new file mode 100644 index 0000000..b8a7a11 --- /dev/null +++ b/libk3b/projects/audiocd/k3baudioimager.cpp @@ -0,0 +1,203 @@ +/* + * + * $Id: k3baudioimager.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2004 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3baudioimager.h" +#include "k3baudiodoc.h" +#include "k3baudiotrack.h" +#include "k3baudiodatasource.h" + +#include +#include + +#include +#include + +#include + +#include + + +class K3bAudioImager::WorkThread : public K3bThread +{ +public: + WorkThread( K3bAudioDoc* doc ); + + void run(); + + void cancel(); + + bool m_canceled; + int m_fd; + QStringList m_imageNames; + K3bAudioImager::ErrorType lastError; + +private: + K3bAudioDoc* m_doc; +}; + + +K3bAudioImager::WorkThread::WorkThread( K3bAudioDoc* doc ) + : K3bThread(), + m_canceled(false), + m_fd(-1), + m_doc(doc) +{ +} + + +void K3bAudioImager::WorkThread::run() +{ + m_canceled = false; + + emitStarted(); + + lastError = K3bAudioImager::ERROR_UNKNOWN; + + // + // + // + QStringList::iterator imageFileIt = m_imageNames.begin(); + K3bWaveFileWriter waveFileWriter; + + K3bAudioTrack* track = m_doc->firstTrack(); + int trackNumber = 1; + unsigned long long totalSize = m_doc->length().audioBytes(); + unsigned long long totalRead = 0; + char buffer[2352 * 10]; + + while( track ) { + + emitNextTrack( trackNumber, m_doc->numOfTracks() ); + + // + // Seek to the beginning of the track + // + if( !track->seek(0) ) { + emitInfoMessage( i18n("Unable to seek in track %1.").arg(trackNumber), K3bJob::ERROR ); + emitFinished(false); + return; + } + + // + // Initialize the reading + // + int read = 0; + unsigned long long trackRead = 0; + + // + // Create the image file + // + if( m_fd == -1 ) { + if( !waveFileWriter.open( *imageFileIt ) ) { + emitInfoMessage( i18n("Could not open %1 for writing").arg(*imageFileIt), K3bJob::ERROR ); + emitFinished(false); + return; + } + } + + // + // Read data from the track + // + while( (read = track->read( buffer, sizeof(buffer) )) > 0 ) { + if( m_fd == -1 ) { + waveFileWriter.write( buffer, read, K3bWaveFileWriter::BigEndian ); + } + else { + if( ::write( m_fd, reinterpret_cast(buffer), read ) != read ) { + kdDebug() << "(K3bAudioImager::WorkThread) writing to fd " << m_fd << " failed." << endl; + lastError = K3bAudioImager::ERROR_FD_WRITE; + emitFinished(false); + return; + } + } + + if( m_canceled ) { + emitCanceled(); + emitFinished(false); + return; + } + + // + // Emit progress + // + totalRead += read; + trackRead += read; + + emitSubPercent( 100*trackRead/track->length().audioBytes() ); + emitPercent( 100*totalRead/totalSize ); + emitProcessedSubSize( trackRead/1024/1024, track->length().audioBytes()/1024/1024 ); + emitProcessedSize( totalRead/1024/1024, totalSize/1024/1024 ); + } + + if( read < 0 ) { + emitInfoMessage( i18n("Error while decoding track %1.").arg(trackNumber), K3bJob::ERROR ); + kdDebug() << "(K3bAudioImager::WorkThread) read error on track " << trackNumber + << " at pos " << K3b::Msf(trackRead/2352) << endl; + lastError = K3bAudioImager::ERROR_DECODING_TRACK; + emitFinished(false); + return; + } + + track = track->next(); + trackNumber++; + imageFileIt++; + } + + emitFinished(true); +} + + +void K3bAudioImager::WorkThread::cancel() +{ + m_canceled = true; +} + + + + +K3bAudioImager::K3bAudioImager( K3bAudioDoc* doc, K3bJobHandler* jh, QObject* parent, const char* name ) + : K3bThreadJob( jh, parent, name ), + m_doc(doc) +{ + m_thread = new WorkThread(doc); + setThread( m_thread ); +} + + +K3bAudioImager::~K3bAudioImager() +{ + delete m_thread; +} + + +void K3bAudioImager::writeToFd( int fd ) +{ + m_thread->m_fd = fd; +} + + +void K3bAudioImager::setImageFilenames( const QStringList& p ) +{ + m_thread->m_imageNames = p; + m_thread->m_fd = -1; +} + + +K3bAudioImager::ErrorType K3bAudioImager::lastErrorType() const +{ + return m_thread->lastError; +} + +#include "k3baudioimager.moc" diff --git a/libk3b/projects/audiocd/k3baudioimager.h b/libk3b/projects/audiocd/k3baudioimager.h new file mode 100644 index 0000000..df4ae7a --- /dev/null +++ b/libk3b/projects/audiocd/k3baudioimager.h @@ -0,0 +1,59 @@ +/* + * + * $Id: k3baudioimager.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2004 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_AUDIO_IMAGER_H_ +#define _K3B_AUDIO_IMAGER_H_ + +#include + +class K3bAudioDoc; + +class K3bAudioImager : public K3bThreadJob +{ + Q_OBJECT + + public: + K3bAudioImager( K3bAudioDoc*, K3bJobHandler*, QObject* parent = 0, const char* name = 0 ); + ~K3bAudioImager(); + + /** + * the data gets written directly into fd instead of the imagefile. + * Be aware that this only makes sense before starting the job. + * To disable just set fd to -1 + */ + void writeToFd( int fd ); + + /** + * Image path. Should be an empty directory or a non-existing + * directory in which case it will be created. + */ + void setImageFilenames( const QStringList& p ); + + enum ErrorType { + ERROR_FD_WRITE, + ERROR_DECODING_TRACK, + ERROR_UNKNOWN + }; + + ErrorType lastErrorType() const; + + private: + K3bAudioDoc* m_doc; + + class WorkThread; + WorkThread* m_thread; +}; + +#endif diff --git a/libk3b/projects/audiocd/k3baudiojob.cpp b/libk3b/projects/audiocd/k3baudiojob.cpp new file mode 100644 index 0000000..c2e62c2 --- /dev/null +++ b/libk3b/projects/audiocd/k3baudiojob.cpp @@ -0,0 +1,864 @@ +/* + * + * $Id: k3baudiojob.cpp 690212 2007-07-20 11:02:13Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include "k3baudiojob.h" + +#include "k3baudioimager.h" +#include +#include "k3baudiotrack.h" +#include "k3baudiodatasource.h" +#include "k3baudionormalizejob.h" +#include "k3baudiojobtempdata.h" +#include "k3baudiomaxspeedjob.h" +#include "k3baudiocdtracksource.h" +#include "k3baudiofile.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + + + +static QString createNonExistingFilesString( const QValueList& items, unsigned int max ) +{ + QString s; + unsigned int cnt = 0; + for( QValueList::const_iterator it = items.begin(); + it != items.end(); ++it ) { + + s += KStringHandler::csqueeze( (*it)->filename(), 60 ); + + ++cnt; + if( cnt >= max || it == items.end() ) + break; + + s += "
"; + } + + if( items.count() > max ) + s += "..."; + + return s; +} + + + +class K3bAudioJob::Private +{ + public: + Private() + : copies(1), + copiesDone(0) { + } + + int copies; + int copiesDone; + int usedSpeed; + + bool useCdText; + bool maxSpeed; + + bool zeroPregap; + bool less4Sec; +}; + + +K3bAudioJob::K3bAudioJob( K3bAudioDoc* doc, K3bJobHandler* hdl, QObject* parent ) + : K3bBurnJob( hdl, parent ), + m_doc( doc ), + m_normalizeJob(0), + m_maxSpeedJob(0) +{ + d = new Private; + + m_audioImager = new K3bAudioImager( m_doc, this, this ); + connect( m_audioImager, SIGNAL(infoMessage(const QString&, int)), + this, SIGNAL(infoMessage(const QString&, int)) ); + connect( m_audioImager, SIGNAL(percent(int)), + this, SLOT(slotAudioDecoderPercent(int)) ); + connect( m_audioImager, SIGNAL(subPercent(int)), + this, SLOT(slotAudioDecoderSubPercent(int)) ); + connect( m_audioImager, SIGNAL(finished(bool)), + this, SLOT(slotAudioDecoderFinished(bool)) ); + connect( m_audioImager, SIGNAL(nextTrack(int, int)), + this, SLOT(slotAudioDecoderNextTrack(int, int)) ); + + m_writer = 0; + m_tempData = new K3bAudioJobTempData( m_doc, this ); +} + + +K3bAudioJob::~K3bAudioJob() +{ + delete d; +} + + +K3bDevice::Device* K3bAudioJob::writer() const +{ + if( m_doc->onlyCreateImages() ) + return 0; // no writer needed -> no blocking on K3bBurnJob + else + return m_doc->burner(); +} + + +K3bDoc* K3bAudioJob::doc() const +{ + return m_doc; +} + + +void K3bAudioJob::start() +{ + jobStarted(); + + m_written = true; + m_canceled = false; + m_errorOccuredAndAlreadyReported = false; + d->copies = m_doc->copies(); + d->copiesDone = 0; + d->useCdText = m_doc->cdText(); + d->usedSpeed = m_doc->speed(); + d->maxSpeed = false; + + if( m_doc->dummy() ) + d->copies = 1; + + emit newTask( i18n("Preparing data") ); + + // + // Check if all files exist + // + QValueList nonExistingFiles; + K3bAudioTrack* track = m_doc->firstTrack(); + while( track ) { + K3bAudioDataSource* source = track->firstSource(); + while( source ) { + if( K3bAudioFile* file = dynamic_cast( source ) ) { + if( !QFile::exists( file->filename() ) ) + nonExistingFiles.append( file ); + } + source = source->next(); + } + track = track->next(); + } + if( !nonExistingFiles.isEmpty() ) { + if( questionYesNo( "

" + i18n("The following files could not be found. Do you want to remove them from the " + "project and continue without adding them to the image?") + + "

" + createNonExistingFilesString( nonExistingFiles, 10 ), + i18n("Warning"), + i18n("Remove missing files and continue"), + i18n("Cancel and go back") ) ) { + for( QValueList::const_iterator it = nonExistingFiles.begin(); + it != nonExistingFiles.end(); ++it ) { + delete *it; + } + } + else { + m_canceled = true; + emit canceled(); + jobFinished(false); + return; + } + } + + // + // Make sure the project is not empty + // + if( m_doc->numOfTracks() == 0 ) { + emit infoMessage( i18n("Please add files to your project first."), ERROR ); + jobFinished(false); + return; + } + + if( m_doc->onTheFly() && !checkAudioSources() ) { + emit infoMessage( i18n("Unable to write on-the-fly with these audio sources."), WARNING ); + m_doc->setOnTheFly(false); + } + + + // we don't need this when only creating image and it is possible + // that the burn device is null + if( !m_doc->onlyCreateImages() ) { + + // + // there are a lot of writers out there which produce coasters + // in dao mode if the CD contains pregaps of length 0 (or maybe already != 2 secs?) + // + // Also most writers do not accept cuesheets with tracks smaller than 4 seconds (a violation + // of the red book standard) in DAO mode. + // + d->zeroPregap = false; + d->less4Sec = false; + track = m_doc->firstTrack(); + while( track ) { + if( track->postGap() == 0 && track->next() != 0 ) // the last track's postgap is always 0 + d->zeroPregap = true; + + if( track->length() < K3b::Msf( 0, 4, 0 ) ) + d->less4Sec = true; + + track = track->next(); + } + + // determine writing mode + if( m_doc->writingMode() == K3b::WRITING_MODE_AUTO ) { + // + // DAO is always the first choice + // RAW second and TAO last + // there are none-DAO writers that are supported by cdrdao + // + // older cdrecord versions do not support the -shorttrack option in RAW writing mode + // + if( !writer()->dao() && writingApp() == K3b::CDRECORD ) { + if(!writer()->supportsRawWriting() && + ( !d->less4Sec || k3bcore->externalBinManager()->binObject("cdrecord")->hasFeature( "short-track-raw" ) ) ) + m_usedWritingMode = K3b::RAW; + else + m_usedWritingMode = K3b::TAO; + } + else { + if( (d->zeroPregap||d->less4Sec) && writer()->supportsRawWriting() ) { + m_usedWritingMode = K3b::RAW; + if( d->less4Sec ) + emit infoMessage( i18n("Tracklengths below 4 seconds violate the Red Book standard."), WARNING ); + } + else + m_usedWritingMode = K3b::DAO; + } + } + else + m_usedWritingMode = m_doc->writingMode(); + + bool cdrecordOnTheFly = false; + bool cdrecordCdText = false; + if( k3bcore->externalBinManager()->binObject("cdrecord") ) { + cdrecordOnTheFly = k3bcore->externalBinManager()->binObject("cdrecord")->hasFeature( "audio-stdin" ); + cdrecordCdText = k3bcore->externalBinManager()->binObject("cdrecord")->hasFeature( "cdtext" ); + } + + // determine writing app + if( writingApp() == K3b::DEFAULT ) { + if( m_usedWritingMode == K3b::DAO ) { + // there are none-DAO writers that are supported by cdrdao + if( !writer()->dao() || + ( !cdrecordOnTheFly && m_doc->onTheFly() ) || + ( d->useCdText && !cdrecordCdText ) || + m_doc->hideFirstTrack() ) + m_usedWritingApp = K3b::CDRDAO; + else + m_usedWritingApp = K3b::CDRECORD; + } + else + m_usedWritingApp = K3b::CDRECORD; + } + else + m_usedWritingApp = writingApp(); + + // on-the-fly writing with cdrecord >= 2.01a13 + if( m_usedWritingApp == K3b::CDRECORD && + m_doc->onTheFly() && + !cdrecordOnTheFly ) { + emit infoMessage( i18n("On-the-fly writing with cdrecord < 2.01a13 not supported."), ERROR ); + m_doc->setOnTheFly(false); + } + + if( m_usedWritingApp == K3b::CDRECORD && + d->useCdText ) { + if( !cdrecordCdText ) { + emit infoMessage( i18n("Cdrecord %1 does not support CD-Text writing.") + .arg(k3bcore->externalBinManager()->binObject("cdrecord")->version), ERROR ); + d->useCdText = false; + } + else if( m_usedWritingMode == K3b::TAO ) { + emit infoMessage( i18n("It is not possible to write CD-Text in TAO mode."), WARNING ); + d->useCdText = false; + } + } + } + + + if( !m_doc->onlyCreateImages() && m_doc->onTheFly() ) { + if( m_doc->speed() == 0 ) { + // try to determine the max possible speed + emit newSubTask( i18n("Determining maximum writing speed") ); + if( !m_maxSpeedJob ) { + m_maxSpeedJob = new K3bAudioMaxSpeedJob( m_doc, this, this ); + connect( m_maxSpeedJob, SIGNAL(percent(int)), + this, SIGNAL(subPercent(int)) ); + connect( m_maxSpeedJob, SIGNAL(finished(bool)), + this, SLOT(slotMaxSpeedJobFinished(bool)) ); + } + m_maxSpeedJob->start(); + return; + } + else { + if( !prepareWriter() ) { + cleanupAfterError(); + jobFinished(false); + return; + } + + if( startWriting() ) { + + // now the writer is running and we can get it's stdin + // we only use this method when writing on-the-fly since + // we cannot easily change the audioDecode fd while it's working + // which we would need to do since we write into several + // image files. + m_audioImager->writeToFd( m_writer->fd() ); + } + else { + // startWriting() already did the cleanup + return; + } + } + } + else { + emit burning(false); + emit infoMessage( i18n("Creating image files in %1").arg(m_doc->tempDir()), INFO ); + emit newTask( i18n("Creating image files") ); + m_tempData->prepareTempFileNames( doc()->tempDir() ); + QStringList filenames; + for( int i = 1; i <= m_doc->numOfTracks(); ++i ) + filenames += m_tempData->bufferFileName( i ); + m_audioImager->setImageFilenames( filenames ); + } + + m_audioImager->start(); +} + + +void K3bAudioJob::slotMaxSpeedJobFinished( bool success ) +{ + d->maxSpeed = success; + if( !success ) + emit infoMessage( i18n("Unable to determine maximum speed for some reason. Ignoring."), WARNING ); + + // now start the writing + // same code as above. See the commecnts there + if( !prepareWriter() ) { + cleanupAfterError(); + jobFinished(false); + return; + } + + if( startWriting() ) + m_audioImager->writeToFd( m_writer->fd() ); + + m_audioImager->start(); +} + + +void K3bAudioJob::cancel() +{ + m_canceled = true; + + if( m_maxSpeedJob ) + m_maxSpeedJob->cancel(); + + if( m_writer ) + m_writer->cancel(); + + m_audioImager->cancel(); + emit infoMessage( i18n("Writing canceled."), K3bJob::ERROR ); + removeBufferFiles(); + emit canceled(); + jobFinished(false); +} + + +void K3bAudioJob::slotWriterFinished( bool success ) +{ + if( m_canceled || m_errorOccuredAndAlreadyReported ) + return; + + if( !success ) { + cleanupAfterError(); + jobFinished(false); + return; + } + else { + d->copiesDone++; + + if( d->copiesDone == d->copies ) { + if( m_doc->onTheFly() || m_doc->removeImages() ) + removeBufferFiles(); + + jobFinished(true); + } + else { + K3bDevice::eject( m_doc->burner() ); + + if( startWriting() ) { + if( m_doc->onTheFly() ) { + // now the writer is running and we can get it's stdin + // we only use this method when writing on-the-fly since + // we cannot easily change the audioDecode fd while it's working + // which we would need to do since we write into several + // image files. + m_audioImager->writeToFd( m_writer->fd() ); + m_audioImager->start(); + } + } + } + } +} + + +void K3bAudioJob::slotAudioDecoderFinished( bool success ) +{ + if( m_canceled || m_errorOccuredAndAlreadyReported ) + return; + + if( !success ) { + if( m_audioImager->lastErrorType() == K3bAudioImager::ERROR_FD_WRITE ) { + // this means that the writer job failed so let's use the error handling there. + return; + } + + emit infoMessage( i18n("Error while decoding audio tracks."), ERROR ); + cleanupAfterError(); + jobFinished(false); + return; + } + + if( m_doc->onlyCreateImages() || !m_doc->onTheFly() ) { + + emit infoMessage( i18n("Successfully decoded all tracks."), SUCCESS ); + + if( m_doc->normalize() ) { + normalizeFiles(); + } + else if( !m_doc->onlyCreateImages() ) { + if( !prepareWriter() ) { + cleanupAfterError(); + jobFinished(false); + } + else + startWriting(); + } + else { + jobFinished(true); + } + } +} + + +void K3bAudioJob::slotAudioDecoderNextTrack( int t, int tt ) +{ + if( m_doc->onlyCreateImages() || !m_doc->onTheFly() ) { + K3bAudioTrack* track = m_doc->getTrack(t); + emit newSubTask( i18n("Decoding audio track %1 of %2%3") + .arg(t) + .arg(tt) + .arg( track->title().isEmpty() || track->artist().isEmpty() + ? QString::null + : " (" + track->artist() + " - " + track->title() + ")" ) ); + } +} + + +bool K3bAudioJob::prepareWriter() +{ + delete m_writer; + + if( m_usedWritingApp == K3b::CDRECORD ) { + + if( !writeInfFiles() ) { + kdDebug() << "(K3bAudioJob) could not write inf-files." << endl; + emit infoMessage( i18n("IO Error. Most likely no space left on harddisk."), ERROR ); + + return false; + } + + K3bCdrecordWriter* writer = new K3bCdrecordWriter( m_doc->burner(), this, this ); + + writer->setWritingMode( m_usedWritingMode ); + writer->setSimulate( m_doc->dummy() ); + writer->setBurnSpeed( d->usedSpeed ); + + writer->addArgument( "-useinfo" ); + + if( d->useCdText ) { + writer->setRawCdText( m_doc->cdTextData().rawPackData() ); + } + + // add all the audio tracks + writer->addArgument( "-audio" ); + + // we only need to pad in one case. cdrecord < 2.01.01a03 cannot handle shorttrack + raw + if( d->less4Sec ) { + if( m_usedWritingMode == K3b::RAW && + !k3bcore->externalBinManager()->binObject( "cdrecord" )->hasFeature( "short-track-raw" ) ) { + writer->addArgument( "-pad" ); + } + else { + // Allow tracks shorter than 4 seconds + writer->addArgument( "-shorttrack" ); + } + } + + K3bAudioTrack* track = m_doc->firstTrack(); + while( track ) { + if( m_doc->onTheFly() ) { + // this is only supported by cdrecord versions >= 2.01a13 + writer->addArgument( QFile::encodeName( m_tempData->infFileName( track ) ) ); + } + else { + writer->addArgument( QFile::encodeName( m_tempData->bufferFileName( track ) ) ); + } + track = track->next(); + } + + m_writer = writer; + } + else { + if( !writeTocFile() ) { + kdDebug() << "(K3bDataJob) could not write tocfile." << endl; + emit infoMessage( i18n("IO Error"), ERROR ); + + return false; + } + + // create the writer + // create cdrdao job + K3bCdrdaoWriter* writer = new K3bCdrdaoWriter( m_doc->burner(), this, this ); + writer->setCommand( K3bCdrdaoWriter::WRITE ); + writer->setSimulate( m_doc->dummy() ); + writer->setBurnSpeed( d->usedSpeed ); + writer->setTocFile( m_tempData->tocFileName() ); + + m_writer = writer; + } + + connect( m_writer, SIGNAL(infoMessage(const QString&, int)), this, SIGNAL(infoMessage(const QString&, int)) ); + connect( m_writer, SIGNAL(percent(int)), this, SLOT(slotWriterJobPercent(int)) ); + connect( m_writer, SIGNAL(processedSize(int, int)), this, SIGNAL(processedSize(int, int)) ); + connect( m_writer, SIGNAL(subPercent(int)), this, SIGNAL(subPercent(int)) ); + connect( m_writer, SIGNAL(processedSubSize(int, int)), this, SIGNAL(processedSubSize(int, int)) ); + connect( m_writer, SIGNAL(nextTrack(int, int)), this, SLOT(slotWriterNextTrack(int, int)) ); + connect( m_writer, SIGNAL(buffer(int)), this, SIGNAL(bufferStatus(int)) ); + connect( m_writer, SIGNAL(deviceBuffer(int)), this, SIGNAL(deviceBuffer(int)) ); + connect( m_writer, SIGNAL(writeSpeed(int, int)), this, SIGNAL(writeSpeed(int, int)) ); + connect( m_writer, SIGNAL(finished(bool)), this, SLOT(slotWriterFinished(bool)) ); + // connect( m_writer, SIGNAL(newTask(const QString&)), this, SIGNAL(newTask(const QString&)) ); + connect( m_writer, SIGNAL(newSubTask(const QString&)), this, SIGNAL(newSubTask(const QString&)) ); + connect( m_writer, SIGNAL(debuggingOutput(const QString&, const QString&)), + this, SIGNAL(debuggingOutput(const QString&, const QString&)) ); + + return true; +} + + +void K3bAudioJob::slotWriterNextTrack( int t, int tt ) +{ + K3bAudioTrack* track = m_doc->getTrack(t); + // t is in range 1..tt + if( m_doc->hideFirstTrack() ) + track = m_doc->getTrack(t+1); + emit newSubTask( i18n("Writing track %1 of %2%3") + .arg(t) + .arg(tt) + .arg( track->title().isEmpty() || track->artist().isEmpty() + ? QString::null + : " (" + track->artist() + " - " + track->title() + ")" ) ); +} + + +void K3bAudioJob::slotWriterJobPercent( int p ) +{ + double totalTasks = d->copies; + double tasksDone = d->copiesDone; + if( m_doc->normalize() ) { + totalTasks+=1.0; + tasksDone+=1.0; + } + if( !m_doc->onTheFly() ) { + totalTasks+=1.0; + tasksDone+=1.0; + } + + emit percent( (int)((100.0*tasksDone + (double)p) / totalTasks) ); +} + + +void K3bAudioJob::slotAudioDecoderPercent( int p ) +{ + if( m_doc->onlyCreateImages() ) { + if( m_doc->normalize() ) + emit percent( p/2 ); + else + emit percent( p ); + } + else if( !m_doc->onTheFly() ) { + double totalTasks = d->copies; + double tasksDone = d->copiesDone; // =0 when creating an image + if( m_doc->normalize() ) { + totalTasks+=1.0; + } + if( !m_doc->onTheFly() ) { + totalTasks+=1.0; + } + + emit percent( (int)((100.0*tasksDone + (double)p) / totalTasks) ); + } +} + + +void K3bAudioJob::slotAudioDecoderSubPercent( int p ) +{ + // when writing on the fly the writer produces the subPercent + if( m_doc->onlyCreateImages() || !m_doc->onTheFly() ) { + emit subPercent( p ); + } +} + + +bool K3bAudioJob::startWriting() +{ + if( m_doc->dummy() ) + emit newTask( i18n("Simulating") ); + else if( d->copies > 1 ) + emit newTask( i18n("Writing Copy %1").arg(d->copiesDone+1) ); + else + emit newTask( i18n("Writing") ); + + + emit newSubTask( i18n("Waiting for media") ); + if( waitForMedia( m_doc->burner() ) < 0 ) { + cancel(); + return false; + } + + // just to be sure we did not get canceled during the async discWaiting + if( m_canceled ) + return false; + + // in case we determined the max possible writing speed we have to reset the speed on the writer job + // here since an inserted media is necessary + // the Max speed job will compare the max speed value with the supported values of the writer + if( d->maxSpeed ) + m_writer->setBurnSpeed( m_maxSpeedJob->maxSpeed() ); + + emit burning(true); + m_writer->start(); + return true; +} + + +void K3bAudioJob::cleanupAfterError() +{ + m_errorOccuredAndAlreadyReported = true; + m_audioImager->cancel(); + + if( m_writer ) + m_writer->cancel(); + + // remove the temp files + removeBufferFiles(); +} + + +void K3bAudioJob::removeBufferFiles() +{ + if ( !m_doc->onTheFly() ) { + emit infoMessage( i18n("Removing temporary files."), INFO ); + } + + // removes buffer images and temp toc or inf files + m_tempData->cleanup(); +} + + +void K3bAudioJob::normalizeFiles() +{ + if( !m_normalizeJob ) { + m_normalizeJob = new K3bAudioNormalizeJob( this, this ); + + connect( m_normalizeJob, SIGNAL(infoMessage(const QString&, int)), + this, SIGNAL(infoMessage(const QString&, int)) ); + connect( m_normalizeJob, SIGNAL(percent(int)), this, SLOT(slotNormalizeProgress(int)) ); + connect( m_normalizeJob, SIGNAL(subPercent(int)), this, SLOT(slotNormalizeSubProgress(int)) ); + connect( m_normalizeJob, SIGNAL(finished(bool)), this, SLOT(slotNormalizeJobFinished(bool)) ); + connect( m_normalizeJob, SIGNAL(newTask(const QString&)), this, SIGNAL(newSubTask(const QString&)) ); + connect( m_normalizeJob, SIGNAL(debuggingOutput(const QString&, const QString&)), + this, SIGNAL(debuggingOutput(const QString&, const QString&)) ); + } + + // add all the files + // TODO: we may need to split the wave files and put them back together! + QValueVector files; + K3bAudioTrack* track = m_doc->firstTrack(); + while( track ) { + files.append( m_tempData->bufferFileName(track) ); + track = track->next(); + } + + m_normalizeJob->setFilesToNormalize( files ); + + emit newTask( i18n("Normalizing volume levels") ); + m_normalizeJob->start(); +} + +void K3bAudioJob::slotNormalizeJobFinished( bool success ) +{ + if( m_canceled || m_errorOccuredAndAlreadyReported ) + return; + + if( success ) { + if( m_doc->onlyCreateImages() ) { + jobFinished(true); + } + else { + // start the writing + if( !prepareWriter() ) { + cleanupAfterError(); + jobFinished(false); + } + else + startWriting(); + } + } + else { + cleanupAfterError(); + jobFinished(false); + } +} + +void K3bAudioJob::slotNormalizeProgress( int p ) +{ + double totalTasks = d->copies+2.0; + double tasksDone = 1; // the decoding has been finished + + emit percent( (int)((100.0*tasksDone + (double)p) / totalTasks) ); +} + + +void K3bAudioJob::slotNormalizeSubProgress( int p ) +{ + emit subPercent( p ); +} + + +bool K3bAudioJob::writeTocFile() +{ + K3bTocFileWriter tocWriter; + tocWriter.setData( m_doc->toToc() ); + tocWriter.setHideFirstTrack( m_doc->hideFirstTrack() ); + if( d->useCdText ) + tocWriter.setCdText( m_doc->cdTextData() ); + if( !m_doc->onTheFly() ) { + QStringList filenames; + for( int i = 1; i <= m_doc->numOfTracks(); ++i ) + filenames += m_tempData->bufferFileName( i ); + tocWriter.setFilenames( filenames ); + } + return tocWriter.save( m_tempData->tocFileName() ); +} + + +bool K3bAudioJob::writeInfFiles() +{ + K3bInfFileWriter infFileWriter; + K3bAudioTrack* track = m_doc->firstTrack(); + while( track ) { + + infFileWriter.setTrack( track->toCdTrack() ); + infFileWriter.setTrackNumber( track->trackNumber() ); + if( !m_doc->onTheFly() ) + infFileWriter.setBigEndian( false ); + + if( !infFileWriter.save( m_tempData->infFileName(track) ) ) + return false; + + track = track->next(); + } + return true; +} + + +// checks if the doc contains sources from an audio cd which cannot be read on-the-fly +bool K3bAudioJob::checkAudioSources() +{ + K3bAudioTrack* track = m_doc->firstTrack(); + K3bAudioDataSource* source = track->firstSource(); + + while( source ) { + + if( K3bAudioCdTrackSource* cdSource = dynamic_cast(source) ) { + // + // If which cases we cannot wite on-the-fly: + // 1. the writing device contains one of the audio cds + // 2. Well, one of the cds is missing + // + K3bDevice::Device* dev = cdSource->searchForAudioCD(); + if( !dev || dev == writer() ) + return false; + else + cdSource->setDevice( dev ); + } + + // next source + source = source->next(); + if( !source ) { + track = track->next(); + if( track ) + source = track->firstSource(); + } + } + + return true; +} + + +QString K3bAudioJob::jobDescription() const +{ + return i18n("Writing Audio CD") + + ( m_doc->title().isEmpty() + ? QString::null + : QString( " (%1)" ).arg(m_doc->title()) ); +} + + +QString K3bAudioJob::jobDetails() const +{ + return ( i18n( "1 track (%1 minutes)", + "%n tracks (%1 minutes)", + m_doc->numOfTracks() ).arg(m_doc->length().toString()) + + ( m_doc->copies() > 1 && !m_doc->dummy() + ? i18n(" - %n copy", " - %n copies", m_doc->copies()) + : QString::null ) ); +} + +#include "k3baudiojob.moc" diff --git a/libk3b/projects/audiocd/k3baudiojob.h b/libk3b/projects/audiocd/k3baudiojob.h new file mode 100644 index 0000000..af37639 --- /dev/null +++ b/libk3b/projects/audiocd/k3baudiojob.h @@ -0,0 +1,107 @@ +/* + * + * $Id: k3baudiojob.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef K3BAUDIOJOB_H +#define K3BAUDIOJOB_H + +#include + + +class K3bAudioDoc; +class K3bAudioImager; +class QFile; +class QDataStream; +class K3bAbstractWriter; +class KTempFile; +class K3bCdrecordWriter; +class K3bAudioNormalizeJob; +class K3bAudioJobTempData; +class K3bDevice::Device; +class K3bAudioMaxSpeedJob; + +/** + *@author Sebastian Trueg + */ +class K3bAudioJob : public K3bBurnJob +{ + Q_OBJECT + + public: + K3bAudioJob( K3bAudioDoc*, K3bJobHandler*, QObject* parent = 0 ); + ~K3bAudioJob(); + + K3bDoc* doc() const; + K3bDevice::Device* writer() const; + + QString jobDescription() const; + QString jobDetails() const; + + public slots: + void cancel(); + void start(); + + protected slots: + // writer slots + void slotWriterFinished( bool success ); + void slotWriterNextTrack(int, int); + void slotWriterJobPercent(int); + + // audiodecoder slots + void slotAudioDecoderFinished( bool ); + void slotAudioDecoderNextTrack( int, int ); + void slotAudioDecoderPercent(int); + void slotAudioDecoderSubPercent( int ); + + // normalizing slots + void slotNormalizeJobFinished( bool ); + void slotNormalizeProgress( int ); + void slotNormalizeSubProgress( int ); + + // max speed + void slotMaxSpeedJobFinished( bool ); + + private: + bool prepareWriter(); + bool startWriting(); + void cleanupAfterError(); + void removeBufferFiles(); + void normalizeFiles(); + bool writeTocFile(); + bool writeInfFiles(); + bool checkAudioSources(); + + K3bAudioDoc* m_doc; + K3bAudioImager* m_audioImager; + K3bAbstractWriter* m_writer; + K3bAudioNormalizeJob* m_normalizeJob; + K3bAudioJobTempData* m_tempData; + K3bAudioMaxSpeedJob* m_maxSpeedJob; + + KTempFile* m_tocFile; + + bool m_canceled; + bool m_errorOccuredAndAlreadyReported; + + bool m_written; + + int m_usedWritingApp; + int m_usedWritingMode; + + class Private; + Private* d; +}; + +#endif diff --git a/libk3b/projects/audiocd/k3baudiojobtempdata.cpp b/libk3b/projects/audiocd/k3baudiojobtempdata.cpp new file mode 100644 index 0000000..af98c2e --- /dev/null +++ b/libk3b/projects/audiocd/k3baudiojobtempdata.cpp @@ -0,0 +1,132 @@ +/* + * + * $Id: k3baudiojobtempdata.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3baudiojobtempdata.h" +#include "k3baudiodoc.h" +#include "k3baudiotrack.h" +#include +#include +#include +#include + +#include +#include +#include + +#include + + +class K3bAudioJobTempData::Private +{ +public: + Private( K3bAudioDoc* _doc ) + : doc(_doc) { + } + + QValueVector bufferFiles; + QValueVector infFiles; + QString tocFile; + + K3bAudioDoc* doc; +}; + + +K3bAudioJobTempData::K3bAudioJobTempData( K3bAudioDoc* doc, QObject* parent, const char* name ) + : QObject( parent, name ) +{ + d = new Private( doc ); +} + + +K3bAudioJobTempData::~K3bAudioJobTempData() +{ + delete d; +} + + +const QString& K3bAudioJobTempData::bufferFileName( int track ) +{ + if( (int)d->bufferFiles.count() < track ) + prepareTempFileNames(); + return d->bufferFiles.at(track-1); +} + +const QString& K3bAudioJobTempData::bufferFileName( K3bAudioTrack* track ) +{ + return bufferFileName( track->trackNumber() ); +} + + +const QString& K3bAudioJobTempData::tocFileName() +{ + if( d->tocFile.isEmpty() ) + prepareTempFileNames(); + return d->tocFile; +} + + +const QString& K3bAudioJobTempData::infFileName( int track ) +{ + if( (int)d->infFiles.count() < track ) + prepareTempFileNames(); + return d->infFiles.at( track - 1 ); +} + +const QString& K3bAudioJobTempData::infFileName( K3bAudioTrack* track ) +{ + return infFileName( track->trackNumber() ); +} + + +K3bAudioDoc* K3bAudioJobTempData::doc() const +{ + return d->doc; +} + + +void K3bAudioJobTempData::prepareTempFileNames( const QString& path ) +{ + d->bufferFiles.clear(); + d->infFiles.clear(); + + QString prefix = K3b::findUniqueFilePrefix( "k3b_audio_", path ) + "_"; + + for( int i = 0; i < d->doc->numOfTracks(); i++ ) { + d->bufferFiles.append( prefix + QString::number( i+1 ).rightJustify( 2, '0' ) + ".wav" ); + d->infFiles.append( prefix + QString::number( i+1 ).rightJustify( 2, '0' ) + ".inf" ); + } + + d->tocFile = prefix + ".toc"; +} + + +void K3bAudioJobTempData::cleanup() +{ + for( uint i = 0; i < d->infFiles.count(); ++i ) { + if( QFile::exists( d->infFiles[i] ) ) + QFile::remove( d->infFiles[i] ); + } + + for( uint i = 0; i < d->bufferFiles.count(); ++i ) { + if( QFile::exists( d->bufferFiles[i] ) ) + QFile::remove( d->bufferFiles[i] ); + } + + if( QFile::exists( d->tocFile ) ) + QFile::remove( d->tocFile ); +} + + +#include "k3baudiojobtempdata.moc" diff --git a/libk3b/projects/audiocd/k3baudiojobtempdata.h b/libk3b/projects/audiocd/k3baudiojobtempdata.h new file mode 100644 index 0000000..72b753f --- /dev/null +++ b/libk3b/projects/audiocd/k3baudiojobtempdata.h @@ -0,0 +1,64 @@ +/* + * + * $Id: k3baudiojobtempdata.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef _K3B_AUDIO_JOB_TEMPDATA_H_ +#define _K3B_AUDIO_JOB_TEMPDATA_H_ + +#include +#include + +class K3bAudioTrack; +class K3bAudioDoc; +class QTextStream; + + +class K3bAudioJobTempData : public QObject +{ + Q_OBJECT + + public: + K3bAudioJobTempData( K3bAudioDoc* doc, QObject* parent = 0, const char* name = 0 ); + ~K3bAudioJobTempData(); + + const QString& bufferFileName( int track ); + const QString& bufferFileName( K3bAudioTrack* track ); + + const QString& infFileName( int track ); + const QString& infFileName( K3bAudioTrack* track ); + + const QString& tocFileName(); + + K3bAudioDoc* doc() const; + + /** + * use this if you want + * a specific directory + * it defaults to the default K3b temp dir + */ + void prepareTempFileNames( const QString& path = QString::null ); + + /** + * remove all temp files (this does not include the audio buffer files + * since these are not created and thus not handled by the K3bAudioJobTempData) + */ + void cleanup(); + + private: + class Private; + Private* d; +}; + +#endif diff --git a/libk3b/projects/audiocd/k3baudiomaxspeedjob.cpp b/libk3b/projects/audiocd/k3baudiomaxspeedjob.cpp new file mode 100644 index 0000000..975ab89 --- /dev/null +++ b/libk3b/projects/audiocd/k3baudiomaxspeedjob.cpp @@ -0,0 +1,224 @@ +/* + * + * $Id: k3baudiomaxspeedjob.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2005 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3baudiomaxspeedjob.h" +#include "k3baudiotrack.h" +#include "k3baudiodatasource.h" +#include "k3baudiodoc.h" +#include "k3baudiocdtracksource.h" +#include "k3baudiodatasourceiterator.h" + +#include + +#include + +#include +#include + +#include + + +class K3bAudioMaxSpeedJob::WorkThread : public K3bThread +{ +public: + WorkThread( K3bAudioDoc* doc ); + ~WorkThread(); + + void run(); + + int speedTest( K3bAudioDataSource* source ); + void cancel(); + int maxSpeedByMedia() const; + + int maxSpeed; + +private: + K3bAudioDoc* m_doc; + bool m_canceled; + char* m_buffer; +}; + + +K3bAudioMaxSpeedJob::WorkThread::WorkThread( K3bAudioDoc* doc ) + : K3bThread(), + m_doc(doc), + m_canceled(false) +{ + m_buffer = new char[2352*10]; +} + + +K3bAudioMaxSpeedJob::WorkThread::~WorkThread() +{ + delete [] m_buffer; +} + + +void K3bAudioMaxSpeedJob::WorkThread::run() +{ + kdDebug() << k_funcinfo << endl; + m_canceled = false; + + emitStarted(); + + K3bAudioDataSourceIterator it( m_doc ); + + // count sources for minimal progress info + int numSources = 0; + int sourcesDone = 0; + while( it.current() ) { + ++numSources; + it.next(); + } + + bool success = true; + maxSpeed = 175*1000; + it.first(); + + while( it.current() && !m_canceled ) { + if( !it.current()->seek(0) ) { + kdDebug() << "(K3bAudioMaxSpeedJob) seek failed." << endl; + success = false; + break; + } + + // read some data + int speed = speedTest( it.current() ); + + ++sourcesDone; + emitPercent( 100*numSources/sourcesDone ); + + if( speed < 0 ) { + success = false; + break; + } + else if( speed > 0 ) { + // update the max speed + maxSpeed = QMIN( maxSpeed, speed ); + } + + it.next(); + } + + if( m_canceled ) { + emitCanceled(); + success = false; + } + + if( success ) + kdDebug() << "(K3bAudioMaxSpeedJob) max speed: " << maxSpeed << endl; + + emitFinished( success ); +} + +// returns the amount of data read from this source +int K3bAudioMaxSpeedJob::WorkThread::speedTest( K3bAudioDataSource* source ) +{ + // + // in case of an audio track source we only test when the cd is inserted since asking the user would + // confuse him a lot. + // + // FIXME: there is still the problem of the spin up time. + // + if( K3bAudioCdTrackSource* cdts = dynamic_cast( source ) ) { + if( K3bDevice::Device* dev = cdts->searchForAudioCD() ) { + cdts->setDevice( dev ); + } + else { + kdDebug() << "(K3bAudioMaxSpeedJob) ignoring audio cd track source." << endl; + return 0; + } + } + + QTime t; + int dataRead = 0; + int r = 0; + + // start the timer + t.start(); + + // read ten seconds of audio data. This is some value which seemed about right. :) + while( dataRead < 2352*75*10 && (r = source->read( m_buffer, 2352*10 )) > 0 ) { + dataRead += r; + } + + // elapsed millisec + int usedT = t.elapsed(); + + if( r < 0 ) { + kdDebug() << "(K3bAudioMaxSpeedJob) read failure." << endl; + return -1; + } + + // KB/sec (add 1 millisecond to avoid division by 0) + int throughput = (dataRead*1000+usedT)/(usedT+1)/1024; + kdDebug() << "(K3bAudioMaxSpeedJob) throughput: " << throughput + << " (" << dataRead << "/" << usedT << ")" << endl; + + + return throughput; +} + + +void K3bAudioMaxSpeedJob::WorkThread::cancel() +{ + kdDebug() << k_funcinfo << endl; + m_canceled = true; +} + + +int K3bAudioMaxSpeedJob::WorkThread::maxSpeedByMedia() const +{ + int s = 0; + + QValueList speeds = m_doc->burner()->determineSupportedWriteSpeeds(); + // simply use what we have and let the writer decide if the speeds are empty + if( !speeds.isEmpty() ) { + // start with the highest speed and go down the list until we are below our max + QValueListIterator it = speeds.end(); + --it; + while( *it > maxSpeed && it != speeds.begin() ) + --it; + + // this is the first valid speed or the lowest supported one + s = *it; + kdDebug() << "(K3bAudioMaxSpeedJob) using speed factor: " << (s/175) << endl; + } + + return s; +} + + + + +K3bAudioMaxSpeedJob::K3bAudioMaxSpeedJob( K3bAudioDoc* doc, K3bJobHandler* jh, QObject* parent, const char* name ) + : K3bThreadJob( jh, parent, name ) +{ + m_thread = new WorkThread( doc ); + setThread( m_thread ); +} + + +K3bAudioMaxSpeedJob::~K3bAudioMaxSpeedJob() +{ + delete m_thread; +} + + +int K3bAudioMaxSpeedJob::maxSpeed() const +{ + return m_thread->maxSpeedByMedia(); +} +#include "k3baudiomaxspeedjob.moc" diff --git a/libk3b/projects/audiocd/k3baudiomaxspeedjob.h b/libk3b/projects/audiocd/k3baudiomaxspeedjob.h new file mode 100644 index 0000000..876bc7f --- /dev/null +++ b/libk3b/projects/audiocd/k3baudiomaxspeedjob.h @@ -0,0 +1,43 @@ +/* + * + * $Id: k3baudiomaxspeedjob.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2005 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_AUDIO_MAX_SPEED_JOB_H_ +#define _K3B_AUDIO_MAX_SPEED_JOB_H_ + +#include + +class K3bAudioDoc; + + +class K3bAudioMaxSpeedJob : public K3bThreadJob +{ + Q_OBJECT + + public: + K3bAudioMaxSpeedJob( K3bAudioDoc* doc, K3bJobHandler*, QObject* parent = 0, const char* name = 0 ); + ~K3bAudioMaxSpeedJob(); + + /** + * KB/sec + * Only valid if the job finished successfully. + */ + int maxSpeed() const; + + private: + class WorkThread; + WorkThread* m_thread; +}; + +#endif diff --git a/libk3b/projects/audiocd/k3baudionormalizejob.cpp b/libk3b/projects/audiocd/k3baudionormalizejob.cpp new file mode 100644 index 0000000..782712b --- /dev/null +++ b/libk3b/projects/audiocd/k3baudionormalizejob.cpp @@ -0,0 +1,205 @@ +/* + * + * $Id: k3baudionormalizejob.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include "k3baudionormalizejob.h" +#include +#include +#include + +#include +#include + + +K3bAudioNormalizeJob::K3bAudioNormalizeJob( K3bJobHandler* hdl, QObject* parent, const char* name ) + : K3bJob( hdl, parent, name ), + m_process(0) +{ +} + + +K3bAudioNormalizeJob::~K3bAudioNormalizeJob() +{ + if( m_process ) + delete m_process; +} + + +void K3bAudioNormalizeJob::start() +{ + m_canceled = false; + m_currentAction = COMPUTING_LEVELS; + m_currentTrack = 1; + + jobStarted(); + + if( m_process ) + delete m_process; + + m_process = new K3bProcess(); + connect( m_process, SIGNAL(stderrLine(const QString&)), this, SLOT(slotStdLine(const QString&)) ); + connect( m_process, SIGNAL(processExited(KProcess*)), this, SLOT(slotProcessExited(KProcess*)) ); + + const K3bExternalBin* bin = k3bcore->externalBinManager()->binObject( "normalize-audio" ); + + if( !bin ) { + emit infoMessage( i18n("Could not find normalize-audio executable."), ERROR ); + jobFinished(false); + return; + } + + if( !bin->copyright.isEmpty() ) + emit infoMessage( i18n("Using %1 %2 - Copyright (C) %3").arg(bin->name()).arg(bin->version).arg(bin->copyright), INFO ); + + // create the commandline + *m_process << bin; + + // additional user parameters from config + const QStringList& params = bin->userParameters(); + for( QStringList::const_iterator it = params.begin(); it != params.end(); ++it ) + *m_process << *it; + + // end the options + *m_process << "--"; + + // add the files + for( uint i = 0; i < m_files.count(); ++i ) + *m_process << m_files[i]; + + // now start the process + if( !m_process->start( KProcess::NotifyOnExit, KProcess::AllOutput ) ) { + // something went wrong when starting the program + // it "should" be the executable + kdDebug() << "(K3bAudioNormalizeJob) could not start normalize-audio" << endl; + emit infoMessage( i18n("Could not start normalize-audio."), K3bJob::ERROR ); + jobFinished(false); + } +} + + +void K3bAudioNormalizeJob::cancel() +{ + m_canceled = true; + + if( m_process ) + if( m_process->isRunning() ) { + m_process->kill(); + } +} + + +void K3bAudioNormalizeJob::slotStdLine( const QString& line ) +{ + // percent, subPercent, newTask (compute level and adjust) + + // emit newSubTask( i18n("Normalizing track %1 of %2 (%3)").arg(t).arg(tt).arg(m_files.at(t-1)) ); + + emit debuggingOutput( "normalize-audio", line ); + + // wenn "% done" drin: + // wenn ein --% drin ist, so beginnt ein neuer track + // sonst prozent parsen "batch xxx" ist der fortschritt der action + // also ev. den batch fortschritt * 1/2 + + if( line.startsWith( "Applying adjustment" ) ) { + if( m_currentAction == COMPUTING_LEVELS ) { + // starting the adjustment with track 1 + m_currentTrack = 1; + m_currentAction = ADJUSTING_LEVELS; + } + } + + else if( line.contains( "already normalized" ) ) { + // no normalization necessary for the current track + emit infoMessage( i18n("Track %1 is already normalized.").arg(m_currentTrack), INFO ); + m_currentTrack++; + } + + else if( line.contains( "--% done") ) { + if( m_currentAction == ADJUSTING_LEVELS ) { + emit newTask( i18n("Adjusting volume level for track %1 of %2").arg(m_currentTrack).arg(m_files.count()) ); + kdDebug() << "(K3bAudioNormalizeJob) adjusting level for track " + << m_currentTrack + << " " + << m_files.at(m_currentTrack-1) + << endl; + } + else { + emit newTask( i18n("Computing level for track %1 of %2").arg(m_currentTrack).arg(m_files.count()) ); + kdDebug() << "(K3bAudioNormalizeJob) computing level for track " + << m_currentTrack + << " " + << m_files.at(m_currentTrack-1) + << endl; + } + + m_currentTrack++; + } + + else if( int pos = line.find( "% done" ) > 0 ) { + // parse progress: "XXX% done" and "batch XXX% done" + pos -= 3; + bool ok; + // TODO: do not use fixed values + // track progress starts at position 19 in version 0.7.6 + int p = line.mid( 19, 3 ).toInt(&ok); + if( ok ) + emit subPercent( p ); + else + kdDebug() << "(K3bAudioNormalizeJob) subPercent parsing error at pos " + << 19 << " in line '" << line.mid( 19, 3 ) << "'" << endl; + + // batch progress starts at position 50 in version 0.7.6 + p = line.mid( 50, 3 ).toInt(&ok); + if( ok && m_currentAction == COMPUTING_LEVELS ) + emit percent( (int)((double)p/2.0) ); + else if( ok && m_currentAction == ADJUSTING_LEVELS ) + emit percent( 50 + (int)((double)p/2.0) ); + else + kdDebug() << "(K3bAudioNormalizeJob) percent parsing error at pos " + << 50 << " in line '" << line.mid( 50, 3 ) << "'" << endl; + + } +} + + +void K3bAudioNormalizeJob::slotProcessExited( KProcess* p ) +{ + if( p->normalExit() ) { + switch( p->exitStatus() ) { + case 0: + emit infoMessage( i18n("Successfully normalized all tracks."), SUCCESS ); + jobFinished(true); + break; + default: + if( !m_canceled ) { + emit infoMessage( i18n("%1 returned an unknown error (code %2).").arg("normalize-audio").arg(p->exitStatus()), + K3bJob::ERROR ); + emit infoMessage( i18n("Please send me an email with the last output."), K3bJob::ERROR ); + emit infoMessage( i18n("Error while normalizing tracks."), ERROR ); + } + else + emit canceled(); + jobFinished(false); + break; + } + } + else { + emit infoMessage( i18n("%1 did not exit cleanly.").arg("Normalize"), K3bJob::ERROR ); + jobFinished( false ); + } +} + +#include "k3baudionormalizejob.moc" diff --git a/libk3b/projects/audiocd/k3baudionormalizejob.h b/libk3b/projects/audiocd/k3baudionormalizejob.h new file mode 100644 index 0000000..e56086b --- /dev/null +++ b/libk3b/projects/audiocd/k3baudionormalizejob.h @@ -0,0 +1,63 @@ +/* + * + * $Id: k3baudionormalizejob.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef _K3B_AUDIO_NORMALIZE_JOB_H_ +#define _K3B_AUDIO_NORMALIZE_JOB_H_ + + +#include + +#include + +class K3bProcess; +class KProcess; + + +class K3bAudioNormalizeJob : public K3bJob +{ + Q_OBJECT + + public: + K3bAudioNormalizeJob( K3bJobHandler*, QObject* parent = 0, const char* name = 0 ); + ~K3bAudioNormalizeJob(); + + public slots: + void start(); + void cancel(); + + void setFilesToNormalize( const QValueVector& files ) { m_files = files; } + + private slots: + void slotStdLine( const QString& line ); + void slotProcessExited( KProcess* p ); + + private: + K3bProcess* m_process; + + QValueVector m_files; + bool m_canceled; + + enum Action { + COMPUTING_LEVELS, + ADJUSTING_LEVELS + }; + + int m_currentAction; + int m_currentTrack; +}; + + +#endif diff --git a/libk3b/projects/audiocd/k3baudiotrack.cpp b/libk3b/projects/audiocd/k3baudiotrack.cpp new file mode 100644 index 0000000..a1d12e4 --- /dev/null +++ b/libk3b/projects/audiocd/k3baudiotrack.cpp @@ -0,0 +1,628 @@ +/* + * + * $Id: k3baudiotrack.cpp 620139 2007-01-05 11:59:05Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include "k3baudiotrack.h" +#include "k3baudiodoc.h" +#include "k3baudiodatasource.h" + +#include +#include +#include + +#include + +#include + + + +class K3bAudioTrack::Private +{ +public: + Private() { + cdTextValidator = new K3bCdTextValidator(); + } + + ~Private() { + delete cdTextValidator; + } + + K3bCdTextValidator* cdTextValidator; +}; + + +K3bAudioTrack::K3bAudioTrack() + : m_parent(0), + m_copy(false), + m_preEmp(false), + m_index0Offset(150), + m_prev(0), + m_next(0), + m_firstSource(0), + m_currentSource(0), + m_alreadyReadBytes(0), + m_currentlyDeleting(false) +{ + d = new Private; +} + + +K3bAudioTrack::K3bAudioTrack( K3bAudioDoc* parent ) + : m_parent(parent), + m_copy(false), + m_preEmp(false), + m_index0Offset(150), + m_prev(0), + m_next(0), + m_firstSource(0), + m_currentSource(0), + m_alreadyReadBytes(0), + m_currentlyDeleting(false) +{ + d = new Private; +} + + +K3bAudioTrack::~K3bAudioTrack() +{ + kdDebug() << "(K3bAudioTrack::~K3bAudioTrack) " << this << endl; + // + // It is crucial that we do not emit the changed signal here because otherwise + // the doc will delete us again once we are empty! + // + m_currentlyDeleting = true; + + // fix the list + take(); + + kdDebug() << "(K3bAudioTrack::~K3bAudioTrack) deleting sources." << endl; + + // delete all sources + while( m_firstSource ) + delete m_firstSource->take(); + + kdDebug() << "(K3bAudioTrack::~K3bAudioTrack) finished" << endl; + + delete d; +} + + +void K3bAudioTrack::emitChanged() +{ + if( m_parent ) + m_parent->slotTrackChanged( this ); +} + + +void K3bAudioTrack::setArtist( const QString& a ) +{ + setPerformer( a ); +} + + +void K3bAudioTrack::setPerformer( const QString& a ) +{ + QString s( a ); + d->cdTextValidator->fixup( s ); + m_cdText.setPerformer(s); + emitChanged(); +} + + +void K3bAudioTrack::setTitle( const QString& t ) +{ + QString s( t ); + d->cdTextValidator->fixup( s ); + m_cdText.setTitle(s); + emitChanged(); +} + + +void K3bAudioTrack::setArranger( const QString& t ) +{ + QString s( t ); + d->cdTextValidator->fixup( s ); + m_cdText.setArranger(s); + emitChanged(); +} + + +void K3bAudioTrack::setSongwriter( const QString& t ) +{ + QString s( t ); + d->cdTextValidator->fixup( s ); + m_cdText.setSongwriter(s); + emitChanged(); +} + + +void K3bAudioTrack::setComposer( const QString& t ) +{ + QString s( t ); + d->cdTextValidator->fixup( s ); + m_cdText.setComposer(s); + emitChanged(); +} + + +void K3bAudioTrack::setIsrc( const QString& t ) +{ + m_cdText.setIsrc(t); + emitChanged(); +} + + +void K3bAudioTrack::setCdTextMessage( const QString& t ) +{ + QString s( t ); + d->cdTextValidator->fixup( s ); + m_cdText.setMessage(s); + emitChanged(); +} + + +void K3bAudioTrack::setCdText( const K3bDevice::TrackCdText& cdtext ) +{ + m_cdText = cdtext; + emitChanged(); +} + + +K3bAudioDataSource* K3bAudioTrack::lastSource() const +{ + K3bAudioDataSource* s = m_firstSource; + while( s && s->next() ) + s = s->next(); + return s; +} + + +bool K3bAudioTrack::inList() const +{ + if( doc() ) + return ( doc()->firstTrack() == this || m_prev != 0 ); + else + return false; +} + + +K3b::Msf K3bAudioTrack::length() const +{ + K3b::Msf length; + K3bAudioDataSource* source = m_firstSource; + while( source ) { + length += source->length(); + source = source->next(); + } + return length; +} + + +KIO::filesize_t K3bAudioTrack::size() const +{ + return length().audioBytes(); +} + + +unsigned int K3bAudioTrack::trackNumber() const +{ + if( m_prev ) + return m_prev->trackNumber() + 1; + else + return 1; +} + + +K3b::Msf K3bAudioTrack::index0() const +{ + // we save the index0Offset as length of the resulting pregap + // this way the length of the track does not need to be ready + // when creating the track. + return length() - m_index0Offset; +} + + +K3b::Msf K3bAudioTrack::postGap() const +{ + if( next() ) + return m_index0Offset; + else + return 0; +} + + +void K3bAudioTrack::setIndex0( const K3b::Msf& msf ) +{ + if( msf == 0 ) + m_index0Offset = 0; + else + m_index0Offset = length() - msf; +} + + +K3bAudioTrack* K3bAudioTrack::take() +{ + if( inList() ) { + if( !m_prev ) + doc()->setFirstTrack( m_next ); + if( !m_next ) + doc()->setLastTrack( m_prev ); + + if( m_prev ) + m_prev->m_next = m_next; + if( m_next ) + m_next->m_prev = m_prev; + + m_prev = m_next = 0; + + // remove from doc + if( m_parent ) + m_parent->slotTrackRemoved(this); + m_parent = 0; + } + + return this; +} + + +void K3bAudioTrack::moveAfter( K3bAudioTrack* track ) +{ + kdDebug() << "(K3bAudioTrack::moveAfter( " << track << " )" << endl; + if( !track ) { + if( !doc() ) { + kdDebug() << "(K3bAudioTrack::moveAfter) no parent set" << endl; + return; + } + + // make sure we do not mess up the list + if( doc()->lastTrack() ) + moveAfter( doc()->lastTrack() ); + else { + doc()->setFirstTrack( take() ); + doc()->setLastTrack( this ); + } + } + else if( track == this ) { + kdDebug() << "(K3bAudioTrack::moveAfter) trying to move this after this." << endl; + return; + } + else { + // remove this from the list + take(); + + // set the new parent doc + m_parent = track->doc(); + + K3bAudioTrack* oldNext = track->m_next; + + // set track as prev + track->m_next = this; + m_prev = track; + + // set oldNext as next + if( oldNext ) + oldNext->m_prev = this; + m_next = oldNext; + + if( !m_prev ) + doc()->setFirstTrack( this ); + if( !m_next ) + doc()->setLastTrack( this ); + } + + emitChanged(); +} + + +void K3bAudioTrack::moveAhead( K3bAudioTrack* track ) +{ + if( !track ) { + if( !doc() ) { + kdDebug() << "(K3bAudioTrack::moveAfter) no parent set" << endl; + return; + } + + // make sure we do not mess up the list + if( doc()->firstTrack() ) + moveAhead( doc()->firstTrack() ); + else { + doc()->setFirstTrack( take() ); + doc()->setLastTrack( this ); + } + } + else if( track == this ) { + kdDebug() << "(K3bAudioTrack::moveAhead) trying to move this ahead of this." << endl; + return; + } + else { + // remove this from the list + take(); + + // set the new parent doc + m_parent = track->doc(); + + K3bAudioTrack* oldPrev = track->m_prev; + + // set track as next + m_next = track; + track->m_prev = this; + + // set oldPrev as prev + m_prev = oldPrev; + if( oldPrev ) + oldPrev->m_next = this; + + if( !m_prev ) + doc()->setFirstTrack( this ); + if( !m_next ) + doc()->setLastTrack( this ); + } + + emitChanged(); +} + + +void K3bAudioTrack::merge( K3bAudioTrack* trackToMerge, K3bAudioDataSource* sourceAfter ) +{ + kdDebug() << "(K3bAudioTrack::merge) " << trackToMerge << " into " << this << endl; + if( this == trackToMerge ) { + kdDebug() << "(K3bAudioTrack::merge) trying to merge this with this." << endl; + return; + } + + // remove the track to merge to make sure it does not get deleted by the doc too early + trackToMerge->take(); + + // in case we prepend all of trackToMerge's sources + if( !sourceAfter ) { + kdDebug() << "(K3bAudioTrack::merge) merging " << trackToMerge->firstSource() << endl; + if( m_firstSource ) { + trackToMerge->firstSource()->moveAhead( m_firstSource ); + } + else { + addSource( trackToMerge->firstSource()->take() ); + } + sourceAfter = m_firstSource; + } + + kdDebug() << "(K3bAudioTrack::merge) now merge the other sources." << endl; + // now merge all sources into this track + while( trackToMerge->firstSource() ) { + K3bAudioDataSource* s = trackToMerge->firstSource(); + kdDebug() << "(K3bAudioTrack::merge) merging source " << s << " from track " << s->track() << " into track " + << this << " after source " << sourceAfter << endl; + s->moveAfter( sourceAfter ); + sourceAfter = s; + } + + // TODO: should we also merge the indices? + + // now we can safely delete the track we merged + delete trackToMerge; + + kdDebug() << "(K3bAudioTrack::merge) finished" << endl; + + emitChanged(); +} + + +void K3bAudioTrack::setFirstSource( K3bAudioDataSource* source ) +{ + // reset the reading stuff since this might be a completely new source list + m_currentSource = 0; + m_alreadyReadBytes = 0; + + m_firstSource = source; + while( source ) { + source->m_track = this; + source = source->next(); + } + + emitChanged(); +} + + +void K3bAudioTrack::addSource( K3bAudioDataSource* source ) +{ + if( !source ) + return; + + K3bAudioDataSource* s = m_firstSource; + while( s && s->next() ) + s = s->next(); + if( s ) + source->moveAfter( s ); + else + setFirstSource( source->take() ); +} + + +void K3bAudioTrack::sourceChanged( K3bAudioDataSource* ) +{ + if( m_currentlyDeleting ) + return; + + // TODO: update indices + + if( m_index0Offset > length() ) + m_index0Offset = length()-1; + + emitChanged(); +} + + +int K3bAudioTrack::numberSources() const +{ + K3bAudioDataSource* source = m_firstSource; + int i = 0; + while( source ) { + source = source->next(); + ++i; + } + return i; +} + + +bool K3bAudioTrack::seek( const K3b::Msf& msf ) +{ + K3bAudioDataSource* source = m_firstSource; + + K3b::Msf pos; + while( source && pos + source->length() < msf ) { + pos += source->length(); + source = source->next(); + } + + if( source ) { + m_currentSource = source; + m_alreadyReadBytes = msf.audioBytes(); + return source->seek( msf - pos ); + } + else + return false; +} + + +int K3bAudioTrack::read( char* data, unsigned int max ) +{ + if( !m_currentSource ) { + m_currentSource = m_firstSource; + if( m_currentSource ) + m_currentSource->seek(0); + m_alreadyReadBytes = 0; + } + + int readData = m_currentSource->read( data, max ); + if( readData == 0 ) { + m_currentSource = m_currentSource->next(); + if( m_currentSource ) { + m_currentSource->seek(0); + return read( data, max ); // read from next source + } + } + + m_alreadyReadBytes += readData; + + return readData; +} + + +K3bAudioTrack* K3bAudioTrack::copy() const +{ + K3bAudioTrack* track = new K3bAudioTrack(); + + track->m_copy = m_copy; + track->m_preEmp = m_preEmp; + track->m_index0Offset = m_index0Offset; + track->m_cdText = m_cdText; + K3bAudioDataSource* source = m_firstSource; + while( source ) { + track->addSource( source->copy() ); + source = source->next(); + } + + return track; +} + + +K3bAudioTrack* K3bAudioTrack::split( const K3b::Msf& pos ) +{ + if( pos < length() ) { + // search the source + // pos will be the first sector of the new track + K3b::Msf currentPos; + K3bAudioDataSource* source = firstSource(); + while( source && currentPos + source->length() <= pos ) { + currentPos += source->length(); + source = source->next(); + } + + K3bAudioDataSource* splitSource = 0; + if( currentPos > 0 && currentPos == pos ) { + // no need to split a source + splitSource = source; + } + else { + splitSource = source->split( pos - currentPos ); + } + + // the new track should include all sources from splitSource and below + K3bAudioTrack* splitTrack = new K3bAudioTrack(); + splitTrack->m_cdText = m_cdText; + source = splitSource; + while( source ) { + K3bAudioDataSource* addSource = source; + source = source->next(); + splitTrack->addSource( addSource ); + } + + kdDebug() << "(K3bAudioTrack) moving track " << splitTrack << " after this (" << this << ") with parent " << doc() << endl; + splitTrack->moveAfter( this ); + + return splitTrack; + } + else + return 0; +} + + +K3bDevice::Track K3bAudioTrack::toCdTrack() const +{ + if( !inList() ) + return K3bDevice::Track(); + + K3b::Msf firstSector; + K3bAudioTrack* track = doc()->firstTrack(); + while( track != this ) { + firstSector += track->length(); + track = track->next(); + } + + K3bDevice::Track cdTrack( firstSector, + firstSector + length() - 1, + K3bDevice::Track::AUDIO ); + + // FIXME: auch im audiotrack copy permitted + cdTrack.setCopyPermitted( !copyProtection() ); + cdTrack.setPreEmphasis( preEmp() ); + + // FIXME: add indices != 0 + + // no index 0 for the last track. Or should we allow this??? + if( doc()->lastTrack() != this ) + cdTrack.setIndex0( index0() ); + + // FIXME: convert to QCString + // cdTrack.setIsrc( isrc() ); + + return cdTrack; +} + + +void K3bAudioTrack::debug() +{ + kdDebug() << "Track " << this << endl + << " Prev: " << m_prev << endl + << " Next: " << m_next << endl + << " Sources:" << endl; + K3bAudioDataSource* s = m_firstSource; + while( s ) { + kdDebug() << " " << s << " - Prev: " << s->prev() << " Next: " << s->next() << endl; + s = s->next(); + } +} + + + diff --git a/libk3b/projects/audiocd/k3baudiotrack.h b/libk3b/projects/audiocd/k3baudiotrack.h new file mode 100644 index 0000000..ab0ee1b --- /dev/null +++ b/libk3b/projects/audiocd/k3baudiotrack.h @@ -0,0 +1,214 @@ +/* + * + * $Id: k3baudiotrack.h 620139 2007-01-05 11:59:05Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef K3BAUDIOTRACK_H +#define K3BAUDIOTRACK_H + +#include +#include +#include +#include + +#include + +#include + +#include +#include +#include "k3b_export.h" + +class K3bAudioDecoder; +class K3bAudioDataSource; +class K3bAudioDoc; + + +/** + * @author Sebastian Trueg + */ +class LIBK3B_EXPORT K3bAudioTrack +{ + friend class K3bAudioDataSource; + friend class K3bAudioDoc; + + public: + K3bAudioTrack(); + K3bAudioTrack( K3bAudioDoc* parent ); + ~K3bAudioTrack(); + + K3bAudioDoc* doc() const { return m_parent; } + + K3bDevice::Track toCdTrack() const; + + /** + * @return length of track in frames + */ + K3b::Msf length() const; + KIO::filesize_t size() const; + + const QString& artist() const { return m_cdText.performer(); } + const QString& performer() const { return m_cdText.performer(); } + const QString& title() const { return m_cdText.title(); } + const QString& arranger() const { return m_cdText.arranger(); } + const QString& songwriter() const { return m_cdText.songwriter(); } + const QString& composer() const { return m_cdText.composer(); } + const QString& isrc() const { return m_cdText.isrc(); } + const QString& cdTextMessage() const { return m_cdText.message(); } + const K3bDevice::TrackCdText& cdText() const { return m_cdText; } + + bool copyProtection() const { return m_copy; } + bool preEmp() const { return m_preEmp; } + + /** + * @obsolete use setPerformer + **/ + void setArtist( const QString& a ); + void setPerformer( const QString& a ); + void setTitle( const QString& t ); + void setArranger( const QString& t ); + void setSongwriter( const QString& t ); + void setComposer( const QString& t ); + void setIsrc( const QString& t ); + void setCdTextMessage( const QString& t ); + + void setCdText( const K3bDevice::TrackCdText& cdtext ); + + void setPreEmp( bool b ) { m_preEmp = b; emitChanged(); } + void setCopyProtection( bool b ) { m_copy = b; emitChanged(); } + + K3b::Msf index0() const; + /** + * The length of the postgap, ie. the number of blocks with index0. + * This is always 0 for the last track. + */ + K3b::Msf postGap() const; + void setIndex0( const K3b::Msf& ); + + /** + * \return The track number starting at 1. + */ + unsigned int trackNumber() const; + + /** + * Remove this track from the list and return it. + */ + K3bAudioTrack* take(); + + /** + * Move this track after @p track. + * If @p track is null this track will be merged into the beginning + * of the docs list. + */ + void moveAfter( K3bAudioTrack* track ); + + /** + * Move this track ahead of @p track. + * If @p track is null this track will be appended to the end + * of the docs list. + */ + void moveAhead( K3bAudioTrack* track ); + + /** + * Merge @p trackToMerge into this one. + */ + void merge( K3bAudioTrack* trackToMerge, K3bAudioDataSource* sourceAfter = 0 ); + + K3bAudioTrack* prev() const { return m_prev; } + K3bAudioTrack* next() const { return m_next; } + + /** + * Use with care. + */ + void setFirstSource( K3bAudioDataSource* source ); + K3bAudioDataSource* firstSource() const { return m_firstSource; } + K3bAudioDataSource* lastSource() const; + int numberSources() const; + + /** + * Append source to the end of the sources list. + */ + void addSource( K3bAudioDataSource* source ); + + bool seek( const K3b::Msf& ); + + /** + * Read data from the track. + * + * @return number of read bytes + */ + int read( char* data, unsigned int max ); + + /** + * called by K3bAudioDataSource because of the lack of signals + */ + void sourceChanged( K3bAudioDataSource* ); + + /** + * Create a copy of this track containing copies of all the sources + * but not being part of some list. + */ + K3bAudioTrack* copy() const; + + /** + * Split the track at position pos and return the splitted track + * on success. + * The new track will be moved after this track. + * + * \param pos The position at which to split. \a pos will be the + * first frame in the new track. + */ + K3bAudioTrack* split( const K3b::Msf& pos ); + + /** + * Is this track in a list + */ + bool inList() const; + + private: + /** + * Tells the doc that the track has changed + */ + void emitChanged(); + + void debug(); + + K3bAudioDoc* m_parent; + + /** copy protection */ + bool m_copy; + bool m_preEmp; + + K3b::Msf m_index0Offset; + + K3bDevice::TrackCdText m_cdText; + + // list + K3bAudioTrack* m_prev; + K3bAudioTrack* m_next; + + K3bAudioDataSource* m_firstSource; + + + K3bAudioDataSource* m_currentSource; + long long m_alreadyReadBytes; + + bool m_currentlyDeleting; + + class Private; + Private* d; +}; + + +#endif diff --git a/libk3b/projects/audiocd/k3baudiozerodata.cpp b/libk3b/projects/audiocd/k3baudiozerodata.cpp new file mode 100644 index 0000000..f5c985d --- /dev/null +++ b/libk3b/projects/audiocd/k3baudiozerodata.cpp @@ -0,0 +1,115 @@ +/* + * + * $Id: k3baudiozerodata.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2004 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3baudiozerodata.h" +#include "k3baudiotrack.h" + +#include + +#include + + +K3bAudioZeroData::K3bAudioZeroData( const K3b::Msf& len ) + : K3bAudioDataSource(), + m_length(len), + m_writtenData(0) +{ +} + + +K3bAudioZeroData::K3bAudioZeroData( const K3bAudioZeroData& zero ) + : K3bAudioDataSource( zero ), + m_length( zero.m_length ), + m_writtenData( 0 ) +{ +} + + +K3bAudioZeroData::~K3bAudioZeroData() +{ +} + + +void K3bAudioZeroData::setLength( const K3b::Msf& msf ) +{ + if( msf > 0 ) + m_length = msf; + else + m_length = 1; // 1 frame + + m_writtenData = 0; + + emitChange(); +} + + +QString K3bAudioZeroData::type() const +{ + return i18n("Silence"); +} + + +QString K3bAudioZeroData::sourceComment() const +{ + return QString::null; +} + + +bool K3bAudioZeroData::seek( const K3b::Msf& msf ) +{ + if( msf < length() ) { + m_writtenData = msf.audioBytes(); + return true; + } + else + return false; +} + + +int K3bAudioZeroData::read( char* data, unsigned int max ) +{ + if( m_writtenData + max > length().audioBytes() ) + max = length().audioBytes() - m_writtenData; + + m_writtenData += max; + + ::memset( data, 0, max ); + + return max; +} + + +K3bAudioDataSource* K3bAudioZeroData::copy() const +{ + return new K3bAudioZeroData( *this ); +} + + +void K3bAudioZeroData::setStartOffset( const K3b::Msf& pos ) +{ + if( pos >= length() ) + setLength( 1 ); + else + setLength( length() - pos ); +} + + +void K3bAudioZeroData::setEndOffset( const K3b::Msf& pos ) +{ + if( pos < 1 ) + setLength( 1 ); + else + setLength( pos ); +} diff --git a/libk3b/projects/audiocd/k3baudiozerodata.h b/libk3b/projects/audiocd/k3baudiozerodata.h new file mode 100644 index 0000000..8cb2911 --- /dev/null +++ b/libk3b/projects/audiocd/k3baudiozerodata.h @@ -0,0 +1,55 @@ +/* + * + * $Id: k3baudiozerodata.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2004 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_AUDIO_ZERO_DATA_H_ +#define _K3B_AUDIO_ZERO_DATA_H_ + +#include "k3baudiodatasource.h" +#include "k3b_export.h" + +class LIBK3B_EXPORT K3bAudioZeroData : public K3bAudioDataSource +{ + public: + K3bAudioZeroData( const K3b::Msf& msf = 150 ); + K3bAudioZeroData( const K3bAudioZeroData& ); + ~K3bAudioZeroData(); + + K3b::Msf originalLength() const { return m_length; } + void setLength( const K3b::Msf& msf ); + + QString type() const; + QString sourceComment() const; + + bool seek( const K3b::Msf& ); + int read( char* data, unsigned int max ); + + K3bAudioDataSource* copy() const; + + /** + * Only changes the length + */ + void setStartOffset( const K3b::Msf& ); + + /** + * Only changes the length + */ + void setEndOffset( const K3b::Msf& ); + + private: + K3b::Msf m_length; + unsigned long long m_writtenData; +}; + +#endif diff --git a/libk3b/projects/datacd/Makefile.am b/libk3b/projects/datacd/Makefile.am new file mode 100644 index 0000000..dea5cb2 --- /dev/null +++ b/libk3b/projects/datacd/Makefile.am @@ -0,0 +1,35 @@ +AM_CPPFLAGS= -I$(srcdir)/.. \ + -I$(srcdir)/../../core \ + -I$(srcdir)/../../plugin \ + -I$(srcdir)/../../../libk3bdevice \ + -I$(srcdir)/../../../src \ + -I$(srcdir)/../../tools \ + -I$(srcdir)/../../jobs \ + -I$(srcdir)/../.. \ + $(all_includes) + +METASOURCES = AUTO + +noinst_LTLIBRARIES = libdata.la + +libdata_la_SOURCES = k3bdatajob.cpp \ + k3bdatadoc.cpp \ + k3bdataitem.cpp \ + k3bdiritem.cpp \ + k3bfileitem.cpp \ + k3bisoimager.cpp \ + k3bmsinfofetcher.cpp \ + k3bbootitem.cpp \ + k3bisooptions.cpp \ + k3bfilecompilationsizehandler.cpp \ + k3bsessionimportitem.cpp \ + k3bmkisofshandler.cpp \ + k3bdatapreparationjob.cpp + +include_HEADERS = k3bdatadoc.h \ + k3bdatajob.h \ + k3bdataitem.h \ + k3bdiritem.h \ + k3bfileitem.h \ + k3bbootitem.h \ + k3bisooptions.h diff --git a/libk3b/projects/datacd/k3bbootitem.cpp b/libk3b/projects/datacd/k3bbootitem.cpp new file mode 100644 index 0000000..e94830e --- /dev/null +++ b/libk3b/projects/datacd/k3bbootitem.cpp @@ -0,0 +1,58 @@ +/* + * + * $Id: k3bbootitem.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bbootitem.h" +#include "k3bdatadoc.h" +#include "k3bdiritem.h" + +#include + +#include + + +K3bBootItem::K3bBootItem( const QString& fileName, K3bDataDoc* doc, K3bDirItem* dir, const QString& k3bName ) + : K3bFileItem( fileName, doc, dir, k3bName, FILE|BOOT_IMAGE ), + m_noBoot(false), + m_bootInfoTable(false), + m_loadSegment(0), + m_loadSize(0), + m_imageType(FLOPPY) +{ + setExtraInfo( i18n("El Torito Boot image") ); +} + + +K3bBootItem::K3bBootItem( const K3bBootItem& item ) + : K3bFileItem( item ), + m_noBoot( item.m_noBoot ), + m_bootInfoTable( item.m_bootInfoTable ), + m_loadSegment( item.m_loadSegment ), + m_loadSize( item.m_loadSize ), + m_imageType( item.m_imageType ), + m_tempPath( item.m_tempPath ) +{ +} + + +K3bBootItem::~K3bBootItem() +{ + take(); +} + + +K3bDataItem* K3bBootItem::copy() const +{ + return new K3bBootItem( *this ); +} diff --git a/libk3b/projects/datacd/k3bbootitem.h b/libk3b/projects/datacd/k3bbootitem.h new file mode 100644 index 0000000..9dd8704 --- /dev/null +++ b/libk3b/projects/datacd/k3bbootitem.h @@ -0,0 +1,66 @@ +/* + * + * $Id: k3bbootitem.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_BOOT_ITEM_H_ +#define _K3B_BOOT_ITEM_H_ + +#include "k3bfileitem.h" + +class K3bBootItem : public K3bFileItem +{ + public: + K3bBootItem( const QString& fileName, K3bDataDoc* doc, K3bDirItem* dir, const QString& k3bName = 0 ); + K3bBootItem( const K3bBootItem& ); + ~K3bBootItem(); + + K3bDataItem* copy() const; + + bool isHideable() const { return false; } + + bool isBootItem() const { return true; } + + enum imageType { FLOPPY, HARDDISK, NONE }; + + void setNoBoot( bool b ) { m_noBoot = b; } + void setBootInfoTable( bool b ) { m_bootInfoTable = b; } + void setLoadSegment( int s ) { m_loadSegment = s; } + void setLoadSize( int s ) { m_loadSize = s; } + void setImageType( int t ) { m_imageType = t; } + + void setTempPath( const QString& p ) { m_tempPath = p; } + + bool noBoot() const { return m_noBoot; } + bool bootInfoTable() const { return m_bootInfoTable; } + int loadSegment() const { return m_loadSegment; } + int loadSize() const { return m_loadSize; } + int imageType() const { return m_imageType; } + + /** + * mkisofs changes boot images on disk. That is why the iso imager + * buffers them and saves the path to the buffered copy here. + */ + const QString& tempPath() const { return m_tempPath; } + + private: + bool m_noBoot; + bool m_bootInfoTable; + int m_loadSegment; + int m_loadSize; + int m_imageType; + + QString m_tempPath; +}; + +#endif diff --git a/libk3b/projects/datacd/k3bdatadoc.cpp b/libk3b/projects/datacd/k3bdatadoc.cpp new file mode 100644 index 0000000..d12c8d2 --- /dev/null +++ b/libk3b/projects/datacd/k3bdatadoc.cpp @@ -0,0 +1,1376 @@ +/* + * + * $Id: k3bdatadoc.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include "k3bdatadoc.h" +#include "k3bfileitem.h" +#include "k3bdiritem.h" +#include "k3bsessionimportitem.h" +#include "k3bdatajob.h" +#include "k3bbootitem.h" +#include "k3bspecialdataitem.h" +#include "k3bfilecompilationsizehandler.h" +#include "k3bmkisofshandler.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#include +#include +#include + + +/** + * There are two ways to fill a data project with files and folders: + * \li Use the addUrl and addUrls methods + * \li or create your own K3bDirItems and K3bFileItems. The doc will be properly updated + * by the constructors of the items. + */ +K3bDataDoc::K3bDataDoc( QObject* parent ) + : K3bDoc( parent ) +{ + m_root = 0; + + m_sizeHandler = new K3bFileCompilationSizeHandler(); +} + +K3bDataDoc::~K3bDataDoc() +{ + delete m_root; + delete m_sizeHandler; + // delete m_oldSessionSizeHandler; +} + + +bool K3bDataDoc::newDocument() +{ + clearImportedSession(); + + m_bootCataloge = 0; + m_oldSessionSize = 0; + m_bExistingItemsReplaceAll = m_bExistingItemsIgnoreAll = false; + + if( m_root ) { + while( m_root->children().getFirst() ) + removeItem( m_root->children().getFirst() ); + } + else + m_root = new K3bRootItem( this ); + + m_sizeHandler->clear(); + + m_multisessionMode = AUTO; + m_dataMode = K3b::DATA_MODE_AUTO; + + m_isoOptions = K3bIsoOptions(); + + return K3bDoc::newDocument(); +} + + +QString K3bDataDoc::name() const +{ + return m_isoOptions.volumeID(); +} + + +void K3bDataDoc::setIsoOptions( const K3bIsoOptions& o ) +{ + m_isoOptions = o; + emit changed(); +} + + +void K3bDataDoc::setVolumeID( const QString& v ) +{ + m_isoOptions.setVolumeID( v ); + emit changed(); +} + + +void K3bDataDoc::addUrls( const KURL::List& urls ) +{ + addUrls( urls, root() ); +} + + +void K3bDataDoc::addUrls( const KURL::List& l, K3bDirItem* dir ) +{ + if( !dir ) + dir = root(); + + KURL::List urls = K3b::convertToLocalUrls(l); + + for( KURL::List::ConstIterator it = urls.begin(); it != urls.end(); ++it ) { + const KURL& url = *it; + QFileInfo f( url.path() ); + QString k3bname = f.absFilePath().section( "/", -1 ); + + // filenames cannot end in backslashes (mkisofs problem. See comments in k3bisoimager.cpp (escapeGraftPoint())) + while( k3bname[k3bname.length()-1] == '\\' ) + k3bname.truncate( k3bname.length()-1 ); + + // backup dummy name + if( k3bname.isEmpty() ) + k3bname = "1"; + + K3bDirItem* newDirItem = 0; + + // rename the new item if an item with that name already exists + int cnt = 0; + bool ok = false; + while( !ok ) { + ok = true; + QString name( k3bname ); + if( cnt > 0 ) + name += QString("_%1").arg(cnt); + if( K3bDataItem* oldItem = dir->find( name ) ) { + if( f.isDir() && oldItem->isDir() ) { + // ok, just reuse the dir + newDirItem = static_cast(oldItem); + } + // directories cannot replace files in an old session (I think) + // and also directories can for sure never be replaced (only be reused as above) + // so we always rename if the old item is a dir. + else if( !oldItem->isFromOldSession() || + f.isDir() || + oldItem->isDir() ) { + ++cnt; + ok = false; + } + } + } + if( cnt > 0 ) + k3bname += QString("_%1").arg(cnt); + + // QFileInfo::exists and QFileInfo::isReadable return false for broken symlinks :( + if( f.isDir() && !f.isSymLink() ) { + if( !newDirItem ) { + newDirItem = new K3bDirItem( k3bname, this, dir ); + newDirItem->setLocalPath( url.path() ); // HACK: see k3bdiritem.h + } + + // recursively add all the files in the directory + QStringList dlist = QDir( f.absFilePath() ).entryList( QDir::All|QDir::System|QDir::Hidden ); + dlist.remove("."); + dlist.remove(".."); + KURL::List newUrls; + for( QStringList::Iterator it = dlist.begin(); it != dlist.end(); ++it ) + newUrls.append( KURL::fromPathOrURL( f.absFilePath() + "/" + *it ) ); + addUrls( newUrls, newDirItem ); + } + else if( f.isSymLink() || f.isFile() ) + (void)new K3bFileItem( url.path(), this, dir, k3bname ); + } + + emit changed(); + + setModified( true ); +} + + +bool K3bDataDoc::nameAlreadyInDir( const QString& name, K3bDirItem* dir ) +{ + if( !dir ) + return false; + else + return ( dir->find( name ) != 0 ); +} + + +K3bDirItem* K3bDataDoc::addEmptyDir( const QString& name, K3bDirItem* parent ) +{ + K3bDirItem* item = new K3bDirItem( name, this, parent ); + + setModified( true ); + + return item; +} + + +KIO::filesize_t K3bDataDoc::size() const +{ + if( m_isoOptions.doNotCacheInodes() ) + return root()->blocks().mode1Bytes() + m_oldSessionSize; + else + return m_sizeHandler->blocks( m_isoOptions.followSymbolicLinks() || + !m_isoOptions.createRockRidge() ).mode1Bytes() + m_oldSessionSize; +} + + +KIO::filesize_t K3bDataDoc::burningSize() const +{ + return size() - m_oldSessionSize; //m_oldSessionSizeHandler->size(); +} + + +K3b::Msf K3bDataDoc::length() const +{ + // 1 block consists of 2048 bytes real data + // and 1 block equals to 1 audio frame + // so this is the way to calculate: + + return K3b::Msf( size() / 2048 ); +} + + +K3b::Msf K3bDataDoc::burningLength() const +{ + return K3b::Msf( burningSize() / 2048 ); +} + + +QString K3bDataDoc::typeString() const +{ + return QString::fromLatin1("data"); +} + + +bool K3bDataDoc::loadDocumentData( QDomElement* rootElem ) +{ + if( !root() ) + newDocument(); + + QDomNodeList nodes = rootElem->childNodes(); + + if( nodes.item(0).nodeName() != "general" ) { + kdDebug() << "(K3bDataDoc) could not find 'general' section." << endl; + return false; + } + if( !readGeneralDocumentData( nodes.item(0).toElement() ) ) + return false; + + + // parse options + // ----------------------------------------------------------------- + if( nodes.item(1).nodeName() != "options" ) { + kdDebug() << "(K3bDataDoc) could not find 'options' section." << endl; + return false; + } + if( !loadDocumentDataOptions( nodes.item(1).toElement() ) ) + return false; + // ----------------------------------------------------------------- + + + + // parse header + // ----------------------------------------------------------------- + if( nodes.item(2).nodeName() != "header" ) { + kdDebug() << "(K3bDataDoc) could not find 'header' section." << endl; + return false; + } + if( !loadDocumentDataHeader( nodes.item(2).toElement() ) ) + return false; + // ----------------------------------------------------------------- + + + + // parse files + // ----------------------------------------------------------------- + if( nodes.item(3).nodeName() != "files" ) { + kdDebug() << "(K3bDataDoc) could not find 'files' section." << endl; + return false; + } + + if( m_root == 0 ) + m_root = new K3bRootItem( this ); + + QDomNodeList filesList = nodes.item(3).childNodes(); + for( uint i = 0; i < filesList.count(); i++ ) { + + QDomElement e = filesList.item(i).toElement(); + if( !loadDataItem( e, root() ) ) + return false; + } + + // ----------------------------------------------------------------- + + // + // Old versions of K3b do not properly save the boot catalog location + // and name. So to ensure we have one around even if loading an old project + // file we create a default one here. + // + if( !m_bootImages.isEmpty() && !m_bootCataloge ) + createBootCatalogeItem( m_bootImages.first()->parent() ); + + + informAboutNotFoundFiles(); + + return true; +} + + +bool K3bDataDoc::loadDocumentDataOptions( QDomElement elem ) +{ + QDomNodeList headerList = elem.childNodes(); + for( uint i = 0; i < headerList.count(); i++ ) { + + QDomElement e = headerList.item(i).toElement(); + if( e.isNull() ) + return false; + + if( e.nodeName() == "rock_ridge") + m_isoOptions.setCreateRockRidge( e.attributeNode( "activated" ).value() == "yes" ); + + else if( e.nodeName() == "joliet") + m_isoOptions.setCreateJoliet( e.attributeNode( "activated" ).value() == "yes" ); + + else if( e.nodeName() == "udf") + m_isoOptions.setCreateUdf( e.attributeNode( "activated" ).value() == "yes" ); + + else if( e.nodeName() == "joliet_allow_103_characters") + m_isoOptions.setJolietLong( e.attributeNode( "activated" ).value() == "yes" ); + + else if( e.nodeName() == "iso_allow_lowercase") + m_isoOptions.setISOallowLowercase( e.attributeNode( "activated" ).value() == "yes" ); + + else if( e.nodeName() == "iso_allow_period_at_begin") + m_isoOptions.setISOallowPeriodAtBegin( e.attributeNode( "activated" ).value() == "yes" ); + + else if( e.nodeName() == "iso_allow_31_char") + m_isoOptions.setISOallow31charFilenames( e.attributeNode( "activated" ).value() == "yes" ); + + else if( e.nodeName() == "iso_omit_version_numbers") + m_isoOptions.setISOomitVersionNumbers( e.attributeNode( "activated" ).value() == "yes" ); + + else if( e.nodeName() == "iso_omit_trailing_period") + m_isoOptions.setISOomitTrailingPeriod( e.attributeNode( "activated" ).value() == "yes" ); + + else if( e.nodeName() == "iso_max_filename_length") + m_isoOptions.setISOmaxFilenameLength( e.attributeNode( "activated" ).value() == "yes" ); + + else if( e.nodeName() == "iso_relaxed_filenames") + m_isoOptions.setISOrelaxedFilenames( e.attributeNode( "activated" ).value() == "yes" ); + + else if( e.nodeName() == "iso_no_iso_translate") + m_isoOptions.setISOnoIsoTranslate( e.attributeNode( "activated" ).value() == "yes" ); + + else if( e.nodeName() == "iso_allow_multidot") + m_isoOptions.setISOallowMultiDot( e.attributeNode( "activated" ).value() == "yes" ); + + else if( e.nodeName() == "iso_untranslated_filenames") + m_isoOptions.setISOuntranslatedFilenames( e.attributeNode( "activated" ).value() == "yes" ); + + else if( e.nodeName() == "follow_symbolic_links") + m_isoOptions.setFollowSymbolicLinks( e.attributeNode( "activated" ).value() == "yes" ); + + else if( e.nodeName() == "create_trans_tbl") + m_isoOptions.setCreateTRANS_TBL( e.attributeNode( "activated" ).value() == "yes" ); + + else if( e.nodeName() == "hide_trans_tbl") + m_isoOptions.setHideTRANS_TBL( e.attributeNode( "activated" ).value() == "yes" ); + + else if( e.nodeName() == "iso_level") + m_isoOptions.setISOLevel( e.text().toInt() ); + + else if( e.nodeName() == "discard_symlinks") + m_isoOptions.setDiscardSymlinks( e.attributeNode( "activated" ).value() == "yes" ); + + else if( e.nodeName() == "discard_broken_symlinks") + m_isoOptions.setDiscardBrokenSymlinks( e.attributeNode( "activated" ).value() == "yes" ); + + else if( e.nodeName() == "preserve_file_permissions") + m_isoOptions.setPreserveFilePermissions( e.attributeNode( "activated" ).value() == "yes" ); + + else if( e.nodeName() == "force_input_charset") + m_isoOptions.setForceInputCharset( e.attributeNode( "activated" ).value() == "yes" ); + + else if( e.nodeName() == "input_charset") + m_isoOptions.setInputCharset( e.text() ); + + else if( e.nodeName() == "do_not_cache_inodes" ) + m_isoOptions.setDoNotCacheInodes( e.attributeNode( "activated" ).value() == "yes" ); + + else if( e.nodeName() == "whitespace_treatment" ) { + if( e.text() == "strip" ) + m_isoOptions.setWhiteSpaceTreatment( K3bIsoOptions::strip ); + else if( e.text() == "extended" ) + m_isoOptions.setWhiteSpaceTreatment( K3bIsoOptions::extended ); + else if( e.text() == "extended" ) + m_isoOptions.setWhiteSpaceTreatment( K3bIsoOptions::replace ); + else + m_isoOptions.setWhiteSpaceTreatment( K3bIsoOptions::noChange ); + } + + else if( e.nodeName() == "whitespace_replace_string") + m_isoOptions.setWhiteSpaceTreatmentReplaceString( e.text() ); + + else if( e.nodeName() == "data_track_mode" ) { + if( e.text() == "mode1" ) + m_dataMode = K3b::MODE1; + else if( e.text() == "mode2" ) + m_dataMode = K3b::MODE2; + else + m_dataMode = K3b::DATA_MODE_AUTO; + } + + else if( e.nodeName() == "multisession" ) { + QString mode = e.text(); + if( mode == "start" ) + setMultiSessionMode( START ); + else if( mode == "continue" ) + setMultiSessionMode( CONTINUE ); + else if( mode == "finish" ) + setMultiSessionMode( FINISH ); + else if( mode == "none" ) + setMultiSessionMode( NONE ); + else + setMultiSessionMode( AUTO ); + } + + else if( e.nodeName() == "verify_data" ) + setVerifyData( e.attributeNode( "activated" ).value() == "yes" ); + + else + kdDebug() << "(K3bDataDoc) unknown option entry: " << e.nodeName() << endl; + } + + return true; +} + + +bool K3bDataDoc::loadDocumentDataHeader( QDomElement headerElem ) +{ + QDomNodeList headerList = headerElem.childNodes(); + for( uint i = 0; i < headerList.count(); i++ ) { + + QDomElement e = headerList.item(i).toElement(); + if( e.isNull() ) + return false; + + if( e.nodeName() == "volume_id" ) + m_isoOptions.setVolumeID( e.text() ); + + else if( e.nodeName() == "application_id" ) + m_isoOptions.setApplicationID( e.text() ); + + else if( e.nodeName() == "publisher" ) + m_isoOptions.setPublisher( e.text() ); + + else if( e.nodeName() == "preparer" ) + m_isoOptions.setPreparer( e.text() ); + + else if( e.nodeName() == "volume_set_id" ) + m_isoOptions.setVolumeSetId( e.text() ); + + else if( e.nodeName() == "volume_set_size" ) + m_isoOptions.setVolumeSetSize( e.text().toInt() ); + + else if( e.nodeName() == "volume_set_number" ) + m_isoOptions.setVolumeSetNumber( e.text().toInt() ); + + else if( e.nodeName() == "system_id" ) + m_isoOptions.setSystemId( e.text() ); + + else + kdDebug() << "(K3bDataDoc) unknown header entry: " << e.nodeName() << endl; + } + + return true; +} + + +bool K3bDataDoc::loadDataItem( QDomElement& elem, K3bDirItem* parent ) +{ + K3bDataItem* newItem = 0; + + if( elem.nodeName() == "file" ) { + QDomElement urlElem = elem.firstChild().toElement(); + if( urlElem.isNull() ) { + kdDebug() << "(K3bDataDoc) file-element without url!" << endl; + return false; + } + + QFileInfo f( urlElem.text() ); + + // We canot use exists() here since this always disqualifies broken symlinks + if( !f.isFile() && !f.isSymLink() ) + m_notFoundFiles.append( urlElem.text() ); + + // broken symlinks are not readable according to QFileInfo which is wrong in our case + else if( f.isFile() && !f.isReadable() ) + m_noPermissionFiles.append( urlElem.text() ); + + else if( !elem.attribute( "bootimage" ).isEmpty() ) { + K3bBootItem* bootItem = new K3bBootItem( urlElem.text(), + this, + parent, + elem.attributeNode( "name" ).value() ); + if( elem.attribute( "bootimage" ) == "floppy" ) + bootItem->setImageType( K3bBootItem::FLOPPY ); + else if( elem.attribute( "bootimage" ) == "harddisk" ) + bootItem->setImageType( K3bBootItem::HARDDISK ); + else + bootItem->setImageType( K3bBootItem::NONE ); + bootItem->setNoBoot( elem.attribute( "no_boot" ) == "yes" ); + bootItem->setBootInfoTable( elem.attribute( "boot_info_table" ) == "yes" ); + bootItem->setLoadSegment( elem.attribute( "load_segment" ).toInt() ); + bootItem->setLoadSize( elem.attribute( "load_size" ).toInt() ); + + newItem = bootItem; + } + + else { + newItem = new K3bFileItem( urlElem.text(), + this, + parent, + elem.attributeNode( "name" ).value() ); + } + } + else if( elem.nodeName() == "special" ) { + if( elem.attributeNode( "type" ).value() == "boot cataloge" ) + createBootCatalogeItem( parent )->setK3bName( elem.attributeNode( "name" ).value() ); + } + else if( elem.nodeName() == "directory" ) { + // This is for the VideoDVD project which already contains the *_TS folders + K3bDirItem* newDirItem = 0; + if( K3bDataItem* item = parent->find( elem.attributeNode( "name" ).value() ) ) { + if( item->isDir() ) { + newDirItem = static_cast(item); + } + else { + kdError() << "(K3bDataDoc) INVALID DOCUMENT: item " << item->k3bPath() << " saved twice" << endl; + return false; + } + } + + if( !newDirItem ) + newDirItem = new K3bDirItem( elem.attributeNode( "name" ).value(), this, parent ); + QDomNodeList childNodes = elem.childNodes(); + for( uint i = 0; i < childNodes.count(); i++ ) { + + QDomElement e = childNodes.item(i).toElement(); + if( !loadDataItem( e, newDirItem ) ) + return false; + } + + newItem = newDirItem; + } + else { + kdDebug() << "(K3bDataDoc) wrong tag in files-section: " << elem.nodeName() << endl; + return false; + } + + // load the sort weight + if( newItem ) + newItem->setSortWeight( elem.attribute( "sort_weight", "0" ).toInt() ); + + return true; +} + + +bool K3bDataDoc::saveDocumentData( QDomElement* docElem ) +{ + QDomDocument doc = docElem->ownerDocument(); + + saveGeneralDocumentData( docElem ); + + // all options + // ---------------------------------------------------------------------- + QDomElement optionsElem = doc.createElement( "options" ); + saveDocumentDataOptions( optionsElem ); + docElem->appendChild( optionsElem ); + // ---------------------------------------------------------------------- + + // the header stuff + // ---------------------------------------------------------------------- + QDomElement headerElem = doc.createElement( "header" ); + saveDocumentDataHeader( headerElem ); + docElem->appendChild( headerElem ); + + + // now do the "real" work: save the entries + // ---------------------------------------------------------------------- + QDomElement topElem = doc.createElement( "files" ); + + QPtrListIterator it( root()->children() ); + for( ; it.current(); ++it ) { + saveDataItem( it.current(), &doc, &topElem ); + } + + docElem->appendChild( topElem ); + // ---------------------------------------------------------------------- + + return true; +} + + +void K3bDataDoc::saveDocumentDataOptions( QDomElement& optionsElem ) +{ + QDomDocument doc = optionsElem.ownerDocument(); + + QDomElement topElem = doc.createElement( "rock_ridge" ); + topElem.setAttribute( "activated", isoOptions().createRockRidge() ? "yes" : "no" ); + optionsElem.appendChild( topElem ); + + topElem = doc.createElement( "joliet" ); + topElem.setAttribute( "activated", isoOptions().createJoliet() ? "yes" : "no" ); + optionsElem.appendChild( topElem ); + + topElem = doc.createElement( "udf" ); + topElem.setAttribute( "activated", isoOptions().createUdf() ? "yes" : "no" ); + optionsElem.appendChild( topElem ); + + topElem = doc.createElement( "joliet_allow_103_characters" ); + topElem.setAttribute( "activated", isoOptions().jolietLong() ? "yes" : "no" ); + optionsElem.appendChild( topElem ); + + topElem = doc.createElement( "iso_allow_lowercase" ); + topElem.setAttribute( "activated", isoOptions().ISOallowLowercase() ? "yes" : "no" ); + optionsElem.appendChild( topElem ); + + topElem = doc.createElement( "iso_allow_period_at_begin" ); + topElem.setAttribute( "activated", isoOptions().ISOallowPeriodAtBegin() ? "yes" : "no" ); + optionsElem.appendChild( topElem ); + + topElem = doc.createElement( "iso_allow_31_char" ); + topElem.setAttribute( "activated", isoOptions().ISOallow31charFilenames() ? "yes" : "no" ); + optionsElem.appendChild( topElem ); + + topElem = doc.createElement( "iso_omit_version_numbers" ); + topElem.setAttribute( "activated", isoOptions().ISOomitVersionNumbers() ? "yes" : "no" ); + optionsElem.appendChild( topElem ); + + topElem = doc.createElement( "iso_omit_trailing_period" ); + topElem.setAttribute( "activated", isoOptions().ISOomitTrailingPeriod() ? "yes" : "no" ); + optionsElem.appendChild( topElem ); + + topElem = doc.createElement( "iso_max_filename_length" ); + topElem.setAttribute( "activated", isoOptions().ISOmaxFilenameLength() ? "yes" : "no" ); + optionsElem.appendChild( topElem ); + + topElem = doc.createElement( "iso_relaxed_filenames" ); + topElem.setAttribute( "activated", isoOptions().ISOrelaxedFilenames() ? "yes" : "no" ); + optionsElem.appendChild( topElem ); + + topElem = doc.createElement( "iso_no_iso_translate" ); + topElem.setAttribute( "activated", isoOptions().ISOnoIsoTranslate() ? "yes" : "no" ); + optionsElem.appendChild( topElem ); + + topElem = doc.createElement( "iso_allow_multidot" ); + topElem.setAttribute( "activated", isoOptions().ISOallowMultiDot() ? "yes" : "no" ); + optionsElem.appendChild( topElem ); + + topElem = doc.createElement( "iso_untranslated_filenames" ); + topElem.setAttribute( "activated", isoOptions().ISOuntranslatedFilenames() ? "yes" : "no" ); + optionsElem.appendChild( topElem ); + + topElem = doc.createElement( "follow_symbolic_links" ); + topElem.setAttribute( "activated", isoOptions().followSymbolicLinks() ? "yes" : "no" ); + optionsElem.appendChild( topElem ); + + topElem = doc.createElement( "create_trans_tbl" ); + topElem.setAttribute( "activated", isoOptions().createTRANS_TBL() ? "yes" : "no" ); + optionsElem.appendChild( topElem ); + + topElem = doc.createElement( "hide_trans_tbl" ); + topElem.setAttribute( "activated", isoOptions().hideTRANS_TBL() ? "yes" : "no" ); + optionsElem.appendChild( topElem ); + + topElem = doc.createElement( "iso_level" ); + topElem.appendChild( doc.createTextNode( QString::number(isoOptions().ISOLevel()) ) ); + optionsElem.appendChild( topElem ); + + topElem = doc.createElement( "discard_symlinks" ); + topElem.setAttribute( "activated", isoOptions().discardSymlinks() ? "yes" : "no" ); + optionsElem.appendChild( topElem ); + + topElem = doc.createElement( "discard_broken_symlinks" ); + topElem.setAttribute( "activated", isoOptions().discardBrokenSymlinks() ? "yes" : "no" ); + optionsElem.appendChild( topElem ); + + topElem = doc.createElement( "preserve_file_permissions" ); + topElem.setAttribute( "activated", isoOptions().preserveFilePermissions() ? "yes" : "no" ); + optionsElem.appendChild( topElem ); + + topElem = doc.createElement( "force_input_charset" ); + topElem.setAttribute( "activated", isoOptions().forceInputCharset() ? "yes" : "no" ); + optionsElem.appendChild( topElem ); + + topElem = doc.createElement( "do_not_cache_inodes" ); + topElem.setAttribute( "activated", isoOptions().doNotCacheInodes() ? "yes" : "no" ); + optionsElem.appendChild( topElem ); + + topElem = doc.createElement( "input_charset" ); + topElem.appendChild( doc.createTextNode( isoOptions().inputCharset() ) ); + optionsElem.appendChild( topElem ); + + + topElem = doc.createElement( "whitespace_treatment" ); + switch( isoOptions().whiteSpaceTreatment() ) { + case K3bIsoOptions::strip: + topElem.appendChild( doc.createTextNode( "strip" ) ); + break; + case K3bIsoOptions::extended: + topElem.appendChild( doc.createTextNode( "extended" ) ); + break; + case K3bIsoOptions::replace: + topElem.appendChild( doc.createTextNode( "replace" ) ); + break; + default: + topElem.appendChild( doc.createTextNode( "noChange" ) ); + break; + } + optionsElem.appendChild( topElem ); + + topElem = doc.createElement( "whitespace_replace_string" ); + topElem.appendChild( doc.createTextNode( isoOptions().whiteSpaceTreatmentReplaceString() ) ); + optionsElem.appendChild( topElem ); + + topElem = doc.createElement( "data_track_mode" ); + if( m_dataMode == K3b::MODE1 ) + topElem.appendChild( doc.createTextNode( "mode1" ) ); + else if( m_dataMode == K3b::MODE2 ) + topElem.appendChild( doc.createTextNode( "mode2" ) ); + else + topElem.appendChild( doc.createTextNode( "auto" ) ); + optionsElem.appendChild( topElem ); + + + // save multisession + topElem = doc.createElement( "multisession" ); + switch( m_multisessionMode ) { + case START: + topElem.appendChild( doc.createTextNode( "start" ) ); + break; + case CONTINUE: + topElem.appendChild( doc.createTextNode( "continue" ) ); + break; + case FINISH: + topElem.appendChild( doc.createTextNode( "finish" ) ); + break; + case NONE: + topElem.appendChild( doc.createTextNode( "none" ) ); + break; + default: + topElem.appendChild( doc.createTextNode( "auto" ) ); + break; + } + optionsElem.appendChild( topElem ); + + topElem = doc.createElement( "verify_data" ); + topElem.setAttribute( "activated", verifyData() ? "yes" : "no" ); + optionsElem.appendChild( topElem ); + // ---------------------------------------------------------------------- +} + + +void K3bDataDoc::saveDocumentDataHeader( QDomElement& headerElem ) +{ + QDomDocument doc = headerElem.ownerDocument(); + + QDomElement topElem = doc.createElement( "volume_id" ); + topElem.appendChild( doc.createTextNode( isoOptions().volumeID() ) ); + headerElem.appendChild( topElem ); + + topElem = doc.createElement( "volume_set_id" ); + topElem.appendChild( doc.createTextNode( isoOptions().volumeSetId() ) ); + headerElem.appendChild( topElem ); + + topElem = doc.createElement( "volume_set_size" ); + topElem.appendChild( doc.createTextNode( QString::number(isoOptions().volumeSetSize()) ) ); + headerElem.appendChild( topElem ); + + topElem = doc.createElement( "volume_set_number" ); + topElem.appendChild( doc.createTextNode( QString::number(isoOptions().volumeSetNumber()) ) ); + headerElem.appendChild( topElem ); + + topElem = doc.createElement( "system_id" ); + topElem.appendChild( doc.createTextNode( isoOptions().systemId() ) ); + headerElem.appendChild( topElem ); + + topElem = doc.createElement( "application_id" ); + topElem.appendChild( doc.createTextNode( isoOptions().applicationID() ) ); + headerElem.appendChild( topElem ); + + topElem = doc.createElement( "publisher" ); + topElem.appendChild( doc.createTextNode( isoOptions().publisher() ) ); + headerElem.appendChild( topElem ); + + topElem = doc.createElement( "preparer" ); + topElem.appendChild( doc.createTextNode( isoOptions().preparer() ) ); + headerElem.appendChild( topElem ); + // ---------------------------------------------------------------------- +} + + +void K3bDataDoc::saveDataItem( K3bDataItem* item, QDomDocument* doc, QDomElement* parent ) +{ + if( K3bFileItem* fileItem = dynamic_cast( item ) ) { + if( m_oldSession.contains( fileItem ) ) { + kdDebug() << "(K3bDataDoc) ignoring fileitem " << fileItem->k3bName() << " from old session while saving..." << endl; + } + else { + QDomElement topElem = doc->createElement( "file" ); + topElem.setAttribute( "name", fileItem->k3bName() ); + QDomElement subElem = doc->createElement( "url" ); + subElem.appendChild( doc->createTextNode( fileItem->localPath() ) ); + topElem.appendChild( subElem ); + + if( item->sortWeight() != 0 ) + topElem.setAttribute( "sort_weight", QString::number(item->sortWeight()) ); + + parent->appendChild( topElem ); + + // add boot options as attributes to preserve compatibility to older K3b versions + if( K3bBootItem* bootItem = dynamic_cast( fileItem ) ) { + if( bootItem->imageType() == K3bBootItem::FLOPPY ) + topElem.setAttribute( "bootimage", "floppy" ); + else if( bootItem->imageType() == K3bBootItem::HARDDISK ) + topElem.setAttribute( "bootimage", "harddisk" ); + else + topElem.setAttribute( "bootimage", "none" ); + + topElem.setAttribute( "no_boot", bootItem->noBoot() ? "yes" : "no" ); + topElem.setAttribute( "boot_info_table", bootItem->bootInfoTable() ? "yes" : "no" ); + topElem.setAttribute( "load_segment", QString::number( bootItem->loadSegment() ) ); + topElem.setAttribute( "load_size", QString::number( bootItem->loadSize() ) ); + } + } + } + else if( item == m_bootCataloge ) { + QDomElement topElem = doc->createElement( "special" ); + topElem.setAttribute( "name", m_bootCataloge->k3bName() ); + topElem.setAttribute( "type", "boot cataloge" ); + + parent->appendChild( topElem ); + } + else if( K3bDirItem* dirItem = dynamic_cast( item ) ) { + QDomElement topElem = doc->createElement( "directory" ); + topElem.setAttribute( "name", dirItem->k3bName() ); + + if( item->sortWeight() != 0 ) + topElem.setAttribute( "sort_weight", QString::number(item->sortWeight()) ); + + QPtrListIterator it( dirItem->children() ); + for( ; it.current(); ++it ) { + saveDataItem( it.current(), doc, &topElem ); + } + + parent->appendChild( topElem ); + } +} + + +void K3bDataDoc::removeItem( K3bDataItem* item ) +{ + if( !item ) + return; + + if( item->isRemoveable() ) { + delete item; + } + else + kdDebug() << "(K3bDataDoc) tried to remove non-removable entry!" << endl; +} + + +void K3bDataDoc::itemRemovedFromDir( K3bDirItem*, K3bDataItem* removedItem ) +{ + // update the project size + if( !removedItem->isFromOldSession() ) + m_sizeHandler->removeFile( removedItem ); + + // update the boot item list + if( removedItem->isBootItem() ) { + m_bootImages.removeRef( static_cast( removedItem ) ); + if( m_bootImages.isEmpty() ) { + delete m_bootCataloge; + m_bootCataloge = 0; + } + } + + emit itemRemoved( removedItem ); + emit changed(); +} + + +void K3bDataDoc::itemAddedToDir( K3bDirItem*, K3bDataItem* item ) +{ + // update the project size + if( !item->isFromOldSession() ) + m_sizeHandler->addFile( item ); + + // update the boot item list + if( item->isBootItem() ) + m_bootImages.append( static_cast( item ) ); + + emit itemAdded( item ); + emit changed(); +} + + +void K3bDataDoc::moveItem( K3bDataItem* item, K3bDirItem* newParent ) +{ + if( !item || !newParent ) { + kdDebug() << "(K3bDataDoc) item or parentitem was NULL while moving." << endl; + return; + } + + if( !item->isMoveable() ) { + kdDebug() << "(K3bDataDoc) item is not movable! " << endl; + return; + } + + item->reparent( newParent ); +} + + +void K3bDataDoc::moveItems( QPtrList itemList, K3bDirItem* newParent ) +{ + if( !newParent ) { + kdDebug() << "(K3bDataDoc) tried to move items to nowhere...!" << endl; + return; + } + + QPtrListIterator it( itemList ); + for( ; it.current(); ++it ) { + // check if newParent is subdir of item + if( K3bDirItem* dirItem = dynamic_cast( it.current() ) ) { + if( dirItem->isSubItem( newParent ) ) { + continue; + } + } + + if( it.current()->isMoveable() ) + it.current()->reparent( newParent ); + } +} + + +K3bBurnJob* K3bDataDoc::newBurnJob( K3bJobHandler* hdl, QObject* parent ) +{ + return new K3bDataJob( this, hdl, parent ); +} + + +QString K3bDataDoc::treatWhitespace( const QString& path ) +{ + + // TODO: + // It could happen that two files with different names + // will have the same name after the treatment + // Perhaps we should add a number at the end or something + // similar (s.a.) + + + if( isoOptions().whiteSpaceTreatment() != K3bIsoOptions::noChange ) { + QString result = path; + + if( isoOptions().whiteSpaceTreatment() == K3bIsoOptions::replace ) { + result.replace( ' ', isoOptions().whiteSpaceTreatmentReplaceString() ); + } + else if( isoOptions().whiteSpaceTreatment() == K3bIsoOptions::strip ) { + result.remove( ' ' ); + } + else if( isoOptions().whiteSpaceTreatment() == K3bIsoOptions::extended ) { + result.truncate(0); + for( uint i = 0; i < path.length(); i++ ) { + if( path[i] == ' ' ) { + if( path[i+1] != ' ' ) + result.append( path[++i].upper() ); + } + else + result.append( path[i] ); + } + } + + kdDebug() << "(K3bDataDoc) converted " << path << " to " << result << endl; + return result; + } + else + return path; +} + + +void K3bDataDoc::prepareFilenames() +{ + m_needToCutFilenames = false; + m_needToCutFilenameItems.clear(); + + // + // if joliet is used cut the names and rename if necessary + // 64 characters for standard joliet and 103 characters for long joliet names + // + // Rockridge supports the full 255 UNIX chars and in case Rockridge is disabled we leave + // it to mkisofs for now since handling all the options to alter the ISO9660 standard it just + // too much. + // + + K3bDataItem* item = root(); + unsigned int maxlen = ( isoOptions().jolietLong() ? 103 : 64 ); + while( (item = item->nextSibling()) ) { + item->setWrittenName( treatWhitespace( item->k3bName() ) ); + + if( isoOptions().createJoliet() && item->writtenName().length() > maxlen ) { + m_needToCutFilenames = true; + item->setWrittenName( K3b::cutFilename( item->writtenName(), maxlen ) ); + m_needToCutFilenameItems.append( item ); + } + + // TODO: check the Joliet charset + } + + // + // 3. check if a directory contains items with the same name + // + prepareFilenamesInDir( root() ); +} + + +void K3bDataDoc::prepareFilenamesInDir( K3bDirItem* dir ) +{ + if( !dir ) + return; + + QPtrList sortedChildren; + QPtrListIterator it( dir->children() ); + + for( it.toLast(); it.current(); --it ) { + K3bDataItem* item = it.current(); + + if( item->isDir() ) + prepareFilenamesInDir( dynamic_cast( item ) ); + + // insertion sort + unsigned int i = 0; + while( i < sortedChildren.count() && item->writtenName() > sortedChildren.at(i)->writtenName() ) + ++i; + + sortedChildren.insert( i, item ); + } + + + if( isoOptions().createJoliet() || isoOptions().createRockRidge() ) { + QPtrList sameNameList; + while( !sortedChildren.isEmpty() ) { + + sameNameList.clear(); + + do { + sameNameList.append( sortedChildren.first() ); + sortedChildren.removeFirst(); + } while( !sortedChildren.isEmpty() && + sortedChildren.first()->writtenName() == sameNameList.first()->writtenName() ); + + if( sameNameList.count() > 1 ) { + // now we need to rename the items + unsigned int maxlen = 255; + if( isoOptions().createJoliet() ) { + if( isoOptions().jolietLong() ) + maxlen = 103; + else + maxlen = 64; + } + + int cnt = 1; + for( QPtrListIterator it( sameNameList ); + it.current(); ++it ) { + it.current()->setWrittenName( K3b::appendNumberToFilename( it.current()->writtenName(), cnt++, maxlen ) ); + } + } + } + } +} + + +void K3bDataDoc::informAboutNotFoundFiles() +{ + if( !m_notFoundFiles.isEmpty() ) { + KMessageBox::informationList( qApp->activeWindow(), i18n("Could not find the following files:"), + m_notFoundFiles, i18n("Not Found") ); + m_notFoundFiles.clear(); + } + + if( !m_noPermissionFiles.isEmpty() ) { + KMessageBox::informationList( qApp->activeWindow(), i18n("No permission to read the following files:"), + m_noPermissionFiles, i18n("No Read Permission") ); + + m_noPermissionFiles.clear(); + } +} + + +void K3bDataDoc::setMultiSessionMode( K3bDataDoc::MultiSessionMode mode ) +{ + if( m_multisessionMode == NONE || m_multisessionMode == START ) + clearImportedSession(); + + m_multisessionMode = mode; +} + + +bool K3bDataDoc::importSession( K3bDevice::Device* device ) +{ + K3bDevice::DiskInfo diskInfo = device->diskInfo(); + // DVD+RW media is reported as non-appendable + if( !diskInfo.appendable() && + !(diskInfo.mediaType() & (K3bDevice::MEDIA_DVD_PLUS_RW|K3bDevice::MEDIA_DVD_RW_OVWR)) ) + return false; + + K3bDevice::Toc toc = device->readToc(); + if( toc.isEmpty() || + toc.last().type() != K3bDevice::Track::DATA ) + return false; + + long startSec = toc.last().firstSector().lba(); + K3bIso9660 iso( device, startSec ); + + if( iso.open() ) { + // remove previously imported sessions + clearImportedSession(); + + // set multisession option + if( m_multisessionMode != FINISH && m_multisessionMode != AUTO ) + m_multisessionMode = CONTINUE; + + // since in iso9660 it is possible that two files share it's data + // simply summing the file sizes could result in wrong values + // that's why we use the size from the toc. This is more accurate + // anyway since there might be files overwritten or removed + m_oldSessionSize = toc.last().lastSector().mode1Bytes(); + + kdDebug() << "(K3bDataDoc) imported session size: " << KIO::convertSize(m_oldSessionSize) << endl; + + // the track size for DVD+RW media and DVD-RW Overwrite media has nothing to do with the filesystem + // size. in that case we need to use the filesystem's size (which is ok since it's one track anyway, + // no real multisession) + if( diskInfo.mediaType() & (K3bDevice::MEDIA_DVD_PLUS_RW|K3bDevice::MEDIA_DVD_RW_OVWR) ) { + m_oldSessionSize = iso.primaryDescriptor().volumeSpaceSize + * iso.primaryDescriptor().logicalBlockSize; + } + + // import some former settings + m_isoOptions.setCreateRockRidge( iso.firstRRDirEntry() != 0 ); + m_isoOptions.setCreateJoliet( iso.firstJolietDirEntry() != 0 ); + m_isoOptions.setVolumeID( iso.primaryDescriptor().volumeId ); + // TODO: also import some other pd fields + + const K3bIso9660Directory* rootDir = iso.firstRRDirEntry(); + // Jörg Schilling says that it is impossible to import the joliet tree for multisession +// if( !rootDir ) +// rootDir = iso.firstJolietDirEntry(); + if( !rootDir ) + rootDir = iso.firstIsoDirEntry(); + + if( rootDir ) { + createSessionImportItems( rootDir, root() ); + emit changed(); + return true; + } + else { + kdDebug() << "(K3bDataDoc::importSession) Could not find primary volume desc." << endl; + return false; + } + } + else { + kdDebug() << "(K3bDataDoc) unable to read toc." << endl; + return false; + } +} + + +void K3bDataDoc::createSessionImportItems( const K3bIso9660Directory* importDir, K3bDirItem* parent ) +{ + Q_ASSERT(importDir); + QStringList entries = importDir->entries(); + entries.remove( "." ); + entries.remove( ".." ); + for( QStringList::const_iterator it = entries.begin(); + it != entries.end(); ++it ) { + const K3bIso9660Entry* entry = importDir->entry( *it ); + K3bDataItem* oldItem = parent->find( entry->name() ); + if( entry->isDirectory() ) { + K3bDirItem* dir = 0; + if( oldItem && oldItem->isDir() ) { + dir = (K3bDirItem*)oldItem; + } + else { + // we overwrite without warning! + if( oldItem ) + removeItem( oldItem ); + dir = new K3bDirItem( entry->name(), this, parent ); + } + + dir->setRemoveable(false); + dir->setRenameable(false); + dir->setMoveable(false); + dir->setHideable(false); + dir->setWriteToCd(false); + dir->setExtraInfo( i18n("From previous session") ); + m_oldSession.append( dir ); + + createSessionImportItems( static_cast(entry), dir ); + } + else { + const K3bIso9660File* file = static_cast(entry); + + // we overwrite without warning! + if( oldItem ) + removeItem( oldItem ); + + K3bSessionImportItem* item = new K3bSessionImportItem( file, this, parent ); + item->setExtraInfo( i18n("From previous session") ); + m_oldSession.append( item ); + } + } +} + + +void K3bDataDoc::clearImportedSession() +{ + // m_oldSessionSizeHandler->clear(); + m_oldSessionSize = 0; + m_oldSession.setAutoDelete(false); + K3bDataItem* item = m_oldSession.first(); + while( !m_oldSession.isEmpty() ) { + if( item == 0 ) + item = m_oldSession.first(); + + if( item->isDir() ) { + K3bDirItem* dir = (K3bDirItem*)item; + if( dir->numDirs() + dir->numFiles() == 0 ) { + // this imported dir is not needed anymore + // since it is empty + m_oldSession.remove(); + delete dir; + } + else { + for( QPtrListIterator it( dir->children() ); it.current(); ++it ) { + if( !m_oldSession.contains(it.current()) ) { + m_oldSession.remove(); + // now the dir becomes a totally normal dir + dir->setRemoveable(true); + dir->setRenameable(true); + dir->setMoveable(true); + dir->setHideable(true); + dir->setWriteToCd(true); + dir->setExtraInfo( "" ); + break; + } + } + } + } + else { + m_oldSession.remove(); + delete item; + } + + item = m_oldSession.next(); + } + + m_multisessionMode = AUTO; + + emit changed(); +} + + +K3bDirItem* K3bDataDoc::bootImageDir() +{ + K3bDataItem* b = m_root->find( "boot" ); + if( !b ) { + b = new K3bDirItem( "boot", this, m_root ); + setModified( true ); + } + + // if we cannot create the dir because there is a file named boot just use the root dir + if( !b->isDir() ) + return m_root; + else + return static_cast(b); +} + + +K3bBootItem* K3bDataDoc::createBootItem( const QString& filename, K3bDirItem* dir ) +{ + if( !dir ) + dir = bootImageDir(); + + K3bBootItem* boot = new K3bBootItem( filename, this, dir ); + + if( !m_bootCataloge ) + createBootCatalogeItem(dir); + + return boot; +} + + +K3bDataItem* K3bDataDoc::createBootCatalogeItem( K3bDirItem* dir ) +{ + if( !m_bootCataloge ) { + QString newName = "boot.catalog"; + int i = 0; + while( dir->alreadyInDirectory( "boot.catalog" ) ) { + ++i; + newName = QString( "boot%1.catalog" ).arg(i); + } + + K3bSpecialDataItem* b = new K3bSpecialDataItem( this, 0, dir, newName ); + m_bootCataloge = b; + m_bootCataloge->setRemoveable(false); + m_bootCataloge->setHideable(false); + m_bootCataloge->setWriteToCd(false); + m_bootCataloge->setExtraInfo( i18n("El Torito boot catalog file") ); + b->setMimeType( i18n("Boot catalog") ); + } + else + m_bootCataloge->reparent( dir ); + + return m_bootCataloge; +} + + +QValueList K3bDataDoc::findItemByLocalPath( const QString& path ) const +{ + Q_UNUSED( path ); + return QValueList(); +} + + +bool K3bDataDoc::sessionImported() const +{ + return !m_oldSession.isEmpty(); +} + +#include "k3bdatadoc.moc" diff --git a/libk3b/projects/datacd/k3bdatadoc.h b/libk3b/projects/datacd/k3bdatadoc.h new file mode 100644 index 0000000..e09177a --- /dev/null +++ b/libk3b/projects/datacd/k3bdatadoc.h @@ -0,0 +1,297 @@ +/* + * + * $Id: k3bdatadoc.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef K3BDATADOC_H +#define K3BDATADOC_H + +#include +#include + +#include "k3bisooptions.h" + +#include +#include +#include + +#include +#include +#include "k3b_export.h" + +class K3bDataItem; +class K3bRootItem; +class K3bDirItem; +class K3bFileItem; +class K3bJob; +class K3bBootItem; +class K3bFileCompilationSizeHandler; + +class KProgressDialog; +//class K3bView; +class KConfig; +class QString; +class QStringList; +class QWidget; +class QDomDocument; +class QDomElement; +class K3bIso9660Directory; + +namespace K3bDevice { + class Device; + class DeviceHandler; +} + + +/** + *@author Sebastian Trueg + */ + +class LIBK3B_EXPORT K3bDataDoc : public K3bDoc +{ + Q_OBJECT + + public: + K3bDataDoc( QObject* parent = 0 ); + virtual ~K3bDataDoc(); + + virtual int type() const { return DATA; } + virtual QString typeString() const; + + virtual QString name() const; + + enum MultiSessionMode { + /** + * Let the K3bDataJob decide if to close the CD or not. + * The decision is based on the state of the inserted media + * (appendable/closed), the size of the project (will it fill + * up the CD?), and the free space on the inserted media. + */ + AUTO, + NONE, + START, + CONTINUE, + FINISH + }; + + K3bRootItem* root() const { return m_root; } + + virtual bool newDocument(); + virtual KIO::filesize_t size() const; + + /** + * This is used for multisession where size() also returnes the imported session's size + */ + virtual KIO::filesize_t burningSize() const; + virtual K3b::Msf length() const; + virtual K3b::Msf burningLength() const; + + /** + * Simply deletes the item if it is removable (meaning isRemovable() returns true. + * Be aware that you can remove items simply by deleting them even if isRemovable() + * returns false. + */ + void removeItem( K3bDataItem* item ); + + /** + * Simply calls reparent. + */ + void moveItem( K3bDataItem* item, K3bDirItem* newParent ); + void moveItems( QPtrList itemList, K3bDirItem* newParent ); + + K3bDirItem* addEmptyDir( const QString& name, K3bDirItem* parent ); + + QString treatWhitespace( const QString& ); + + virtual K3bBurnJob* newBurnJob( K3bJobHandler* hdl, QObject* parent = 0 ); + + MultiSessionMode multiSessionMode() const { return m_multisessionMode; } + void setMultiSessionMode( MultiSessionMode mode ); + + int dataMode() const { return m_dataMode; } + void setDataMode( int m ) { m_dataMode = m; } + + void setVerifyData( bool b ) { m_verifyData = b; } + bool verifyData() const { return m_verifyData; } + + static bool nameAlreadyInDir( const QString&, K3bDirItem* ); + + /** + * Most of the options that map to the mkisofs parameters are grouped + * together in the K3bIsoOptions class to allow easy saving to and loading + * from a KConfig object. + */ + const K3bIsoOptions& isoOptions() const { return m_isoOptions; } + void setIsoOptions( const K3bIsoOptions& ); + + const QPtrList& bootImages() { return m_bootImages; } + K3bDataItem* bootCataloge() { return m_bootCataloge; } + + K3bDirItem* bootImageDir(); + + /** + * Create a boot item and also create a boot cataloge file in case none + * exists in the project. + * + * Calling this method has the same effect like creating a new K3bBootItem + * instance manually and then calling createBootCatalogeItem. + * + * \return The new boot item on success or 0 in case a file with the same + * name already exists. + */ + K3bBootItem* createBootItem( const QString& filename, K3bDirItem* bootDir = 0 ); + + /** + * Create a new boot catalog item. + * For now this is not called automatically for internal reasons. + * + * Call this if you create boot items manually instead of using createBootItem. + * + * The boot catalog is automatically deleted once the last boot item is removed + * from the doc. + * + * \return The new boot catalog item or the old one if it already exists. + */ + K3bDataItem* createBootCatalogeItem( K3bDirItem* bootDir ); + + /** + * This will prepare the filenames as written to the image. + * These filenames are saved in K3bDataItem::writtenName + */ + void prepareFilenames(); + + /** + * Returns true if filenames need to be cut due to the limitations of Joliet. + * + * This is only valid after a call to @p prepareFilenames() + */ + bool needToCutFilenames() const { return m_needToCutFilenames; } + + const QValueList& needToCutFilenameItems() const { return m_needToCutFilenameItems; } + + /** + * Imports a session into the project. This will create K3bSessionImportItems + * and properly set the imported session size. + * Some settings will be adjusted to the imported session (joliet, rr). + * + * Be aware that this method is blocking. + * + * \return true if the old session was successfully imported, false if no + * session could be found. + * + * \see clearImportedSession() + */ + bool importSession( K3bDevice::Device* ); + + bool sessionImported() const; + + /** + * Searches for an item by it's local path. + * + * NOT IMPLEMENTED YET! + * + * \return The items that correspond to the specified local path. + */ + QValueList findItemByLocalPath( const QString& path ) const; + + public slots: + virtual void addUrls( const KURL::List& urls ); + + /** + * Add urls syncroneously + * This method adds files recursively including symlinks, hidden, and system files. + * If a file already exists the new file's name will be appended a number. + */ + virtual void addUrls( const KURL::List& urls, K3bDirItem* dir ); + + void clearImportedSession(); + + /** + * Just a convience method to prevent using setIsoOptions for this + * often used value. + */ + void setVolumeID( const QString& ); + + signals: + void itemRemoved( K3bDataItem* ); + void itemAdded( K3bDataItem* ); + + protected: + /** reimplemented from K3bDoc */ + virtual bool loadDocumentData( QDomElement* root ); + /** reimplemented from K3bDoc */ + virtual bool saveDocumentData( QDomElement* ); + + void saveDocumentDataOptions( QDomElement& optionsElem ); + void saveDocumentDataHeader( QDomElement& headerElem ); + bool loadDocumentDataOptions( QDomElement optionsElem ); + bool loadDocumentDataHeader( QDomElement optionsElem ); + + K3bFileCompilationSizeHandler* m_sizeHandler; + + // K3bFileCompilationSizeHandler* m_oldSessionSizeHandler; + KIO::filesize_t m_oldSessionSize; + + private: + void prepareFilenamesInDir( K3bDirItem* dir ); + void createSessionImportItems( const K3bIso9660Directory*, K3bDirItem* parent ); + + /** + * used by K3bDirItem to inform about removed items. + */ + void itemRemovedFromDir( K3bDirItem* parent, K3bDataItem* removedItem ); + void itemAddedToDir( K3bDirItem* parent, K3bDataItem* addedItem ); + + /** + * load recursivly + */ + bool loadDataItem( QDomElement& e, K3bDirItem* parent ); + /** + * save recursivly + */ + void saveDataItem( K3bDataItem* item, QDomDocument* doc, QDomElement* parent ); + + void informAboutNotFoundFiles(); + + QStringList m_notFoundFiles; + QStringList m_noPermissionFiles; + + K3bRootItem* m_root; + + int m_dataMode; + + bool m_verifyData; + + KIO::filesize_t m_size; + + K3bIsoOptions m_isoOptions; + + MultiSessionMode m_multisessionMode; + QPtrList m_oldSession; + + // boot cd stuff + K3bDataItem* m_bootCataloge; + QPtrList m_bootImages; + + bool m_bExistingItemsReplaceAll; + bool m_bExistingItemsIgnoreAll; + + bool m_needToCutFilenames; + QValueList m_needToCutFilenameItems; + + friend class K3bMixedDoc; + friend class K3bDirItem; +}; + +#endif diff --git a/libk3b/projects/datacd/k3bdataitem.cpp b/libk3b/projects/datacd/k3bdataitem.cpp new file mode 100644 index 0000000..6f2a861 --- /dev/null +++ b/libk3b/projects/datacd/k3bdataitem.cpp @@ -0,0 +1,264 @@ +/* + * + * $Id: k3bdataitem.cpp 659634 2007-04-30 14:51:32Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include "k3bdataitem.h" +#include "k3bdiritem.h" +#include "k3bdatadoc.h" +#include + +#include + + +class K3bDataItem::Private +{ +public: + int flags; +}; + + +K3bDataItem::K3bDataItem( K3bDataDoc* doc, K3bDataItem* parent, int flags ) + : m_bHideOnRockRidge(false), + m_bHideOnJoliet(false), + m_bRemoveable(true), + m_bRenameable(true), + m_bMovable(true), + m_bHideable(true), + m_bWriteToCd(true), + m_sortWeight(0) +{ + d = new Private; + d->flags = flags; + + m_doc = doc; + m_bHideOnRockRidge = m_bHideOnJoliet = false; + + if( parent ) + m_parentDir = parent->getDirItem(); + else + m_parentDir = 0; +} + + +K3bDataItem::K3bDataItem( const K3bDataItem& item ) + : m_k3bName( item.m_k3bName ), + m_doc( 0 ), + m_parentDir( 0 ), + m_bHideOnRockRidge( item.m_bHideOnRockRidge ), + m_bHideOnJoliet( item.m_bHideOnJoliet ), + m_bRemoveable( item.m_bRemoveable ), + m_bRenameable( item.m_bRenameable ), + m_bMovable( item.m_bMovable ), + m_bHideable( item.m_bHideable ), + m_bWriteToCd( item.m_bWriteToCd ), + m_extraInfo( item.m_extraInfo ), + m_sortWeight( item.m_sortWeight ) +{ + d = new Private; + d->flags = item.d->flags; +} + + +K3bDataItem::~K3bDataItem() +{ + delete d; +} + + +void K3bDataItem::setFlags( int flags ) +{ + d->flags = flags; +} + + +bool K3bDataItem::isBootItem() const +{ + return d->flags & BOOT_IMAGE; +} + + +KIO::filesize_t K3bDataItem::size() const +{ + return itemSize( m_doc + ? m_doc->isoOptions().followSymbolicLinks() || + !m_doc->isoOptions().createRockRidge() + : false ); +} + + +K3b::Msf K3bDataItem::blocks() const +{ + return itemBlocks( m_doc + ? m_doc->isoOptions().followSymbolicLinks() || + !m_doc->isoOptions().createRockRidge() + : false ); +} + + +K3b::Msf K3bDataItem::itemBlocks( bool followSymbolicLinks ) const +{ + return (long)::ceil( (double)itemSize( followSymbolicLinks ) / 2048.0 ); +} + + +void K3bDataItem::setK3bName( const QString& name ) { + if ( name != m_k3bName ) { + // test for not-allowed characters + if( name.contains('/') ) { + kdDebug() << "(K3bDataItem) name contained invalid characters!" << endl; + return; + } + + if( parent() ) { + K3bDataItem* item = parent()->find( name ); + if( item && item != this ) { + kdDebug() << "(K3bDataItem) item with that name already exists." << endl; + return; + } + } + + m_k3bName = name; + m_doc->setModified(); +} +} + + +const QString& K3bDataItem::k3bName() const +{ + return m_k3bName; +} + + +K3bDataItem* K3bDataItem::take() +{ + if( parent() ) + parent()->takeDataItem( this ); + + return this; +} + + +QString K3bDataItem::k3bPath() const +{ + if( !getParent() ) + return QString::null; // the root item is the only one not having a parent + else if( isDir() ) + return getParent()->k3bPath() + k3bName() + "/"; + else + return getParent()->k3bPath() + k3bName(); +} + + +QString K3bDataItem::writtenPath() const +{ + if( !getParent() ) + return QString::null; // the root item is the only one not having a parent + else if( isDir() ) + return getParent()->writtenPath() + writtenName() + "/"; + else + return getParent()->writtenPath() + writtenName(); +} + + +QString K3bDataItem::iso9660Path() const +{ + if( !getParent() ) + return QString::null; // the root item is the only one not having a parent + else if( isDir() ) + return getParent()->iso9660Path() + iso9660Name() + "/"; + else + return getParent()->iso9660Path() + iso9660Name(); +} + + +K3bDataItem* K3bDataItem::nextSibling() const +{ + K3bDataItem* item = const_cast(this); // urg, but we know that we don't mess with it, so... + K3bDirItem* parentItem = getParent(); + + while( parentItem ) { + if( K3bDataItem* i = parentItem->nextChild( item ) ) + return i; + + item = parentItem; + parentItem = item->getParent(); + } + + return 0; +} + + +void K3bDataItem::reparent( K3bDirItem* newParent ) +{ + // addDataItem will do all the stuff including taking this + newParent->addDataItem( this ); +} + + +bool K3bDataItem::hideOnRockRidge() const +{ + if( !isHideable() ) + return false; + if( getParent() ) + return m_bHideOnRockRidge || getParent()->hideOnRockRidge(); + else + return m_bHideOnRockRidge; +} + + +bool K3bDataItem::hideOnJoliet() const +{ + if( !isHideable() ) + return false; + if( getParent() ) + return m_bHideOnJoliet || getParent()->hideOnJoliet(); + else + return m_bHideOnJoliet; +} + + +void K3bDataItem::setHideOnRockRidge( bool b ) +{ + // there is no use in changing the value if + // it is already set by the parent + if( ( !getParent() || !getParent()->hideOnRockRidge() ) && + b != m_bHideOnRockRidge ) { + m_bHideOnRockRidge = b; + if ( m_doc ) + m_doc->setModified(); +} +} + + +void K3bDataItem::setHideOnJoliet( bool b ) +{ + // there is no use in changing the value if + // it is already set by the parent + if( ( !getParent() || !getParent()->hideOnJoliet() ) && + b != m_bHideOnJoliet ) { + m_bHideOnJoliet = b; + if ( m_doc ) + m_doc->setModified(); +} +} + + +int K3bDataItem::depth() const +{ + if( getParent() ) + return getParent()->depth() + 1; + else + return 0; +} diff --git a/libk3b/projects/datacd/k3bdataitem.h b/libk3b/projects/datacd/k3bdataitem.h new file mode 100644 index 0000000..36cdf05 --- /dev/null +++ b/libk3b/projects/datacd/k3bdataitem.h @@ -0,0 +1,225 @@ +/* + * + * $Id: k3bdataitem.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef K3BDATAITEM_H +#define K3BDATAITEM_H + + +class K3bDirItem; +class K3bDataDoc; + +#include + +#include + +#include +#include "k3b_export.h" + + +/** + *@author Sebastian Trueg + */ +class LIBK3B_EXPORT K3bDataItem +{ + public: + K3bDataItem( K3bDataDoc* doc, K3bDataItem* parent = 0, int flags = 0 ); + + /** + * Default copy constructor. + * + * The result is an exact copy except that no parent dir it set and, thus, also no doc. + */ + K3bDataItem( const K3bDataItem& ); + + virtual ~K3bDataItem(); + + /** + * Return an exact copy of this data item. + * + * The result is an exact copy except that no parent dir it set and, thus, also no doc. + * + * Implementations should use the default constructor. + */ + virtual K3bDataItem* copy() const = 0; + + K3bDirItem* parent() { return m_parentDir; } + K3bDirItem* getParent() const { return m_parentDir; } + + /** + * Remove this item from it's parent and return a pointer to it. + */ + K3bDataItem* take(); + + K3bDataDoc* doc() const { return m_doc; } + virtual const QString& k3bName() const; + virtual void setK3bName( const QString& ); + + /** + * returns the path as defined by the k3b-hierachy, NOT starting with a slash + * (since this is used for graft-points!) + * directories have a trailing "/" + */ + virtual QString k3bPath() const; + + /** + * Returns the name of the item as used on the CD or DVD image. + * + * This is only valid after a call to @p K3bDataDoc::prepareFilenames() + */ + const QString& writtenName() const { return m_writtenName; } + + /** + * \return the pure name used in the Iso9660 tree. + * + * This is only valid after a call to @p K3bDataDoc::prepareFilenames() + */ + const QString& iso9660Name() const { return m_rawIsoName; } + + /** + * Returns the path of the item as written to the CD or DVD image. + * + * This is suited to be used for mkisofs graftpoints. + * + * This is only valid after a call to @p K3bDataDoc::prepareFilenames() + */ + virtual QString writtenPath() const; + + virtual QString iso9660Path() const; + + /** + * Used to set the written name by @p K3bDataDoc::prepareFilenames() + */ + void setWrittenName( const QString& s ) { m_writtenName = s; } + + /** + * Used to set the pure Iso9660 name by @p K3bDataDoc::prepareFilenames() + */ + void setIso9660Name( const QString& s ) { m_rawIsoName = s; } + + virtual K3bDataItem* nextSibling() const; + + /** returns the path to the file on the local filesystem */ + virtual QString localPath() const { return QString::null; } + + /** + * The size of the item + */ + KIO::filesize_t size() const; + + /** + * \return The number of blocks (2048 bytes) occupied by this item. + * This value equals to ceil(size()/2048) + */ + K3b::Msf blocks() const; + + /** + * \returne the dir of the item (or the item itself if it is a dir) + */ + virtual K3bDirItem* getDirItem() const { return getParent(); } + + virtual void reparent( K3bDirItem* ); + + // FIXME: use all these flags and make the isXXX methods + // non-virtual. Then move the parent()->addDataItem call + // to the K3bDataItem constructor + enum ItemFlags { + DIR = 0x1, + FILE = 0x2, + SPECIALFILE = 0x4, + SYMLINK = 0x8, + OLD_SESSION = 0x10, + BOOT_IMAGE = 0x11 + }; + + int flags() const; + + virtual bool isDir() const { return false; } + virtual bool isFile() const { return false; } + virtual bool isSpecialFile() const { return false; } + virtual bool isSymLink() const { return false; } + virtual bool isFromOldSession() const { return false; } + bool isBootItem() const; + + bool hideOnRockRidge() const; + bool hideOnJoliet() const; + + virtual void setHideOnRockRidge( bool b ); + virtual void setHideOnJoliet( bool b ); + + virtual long sortWeight() const { return m_sortWeight; } + virtual void setSortWeight( long w ) { m_sortWeight = w; } + + virtual int depth() const; + + virtual bool isValid() const { return true; } + + // these are all needed for special fileitems like + // imported sessions or the movix filesystem + virtual bool isRemoveable() const { return m_bRemoveable; } + virtual bool isMoveable() const { return m_bMovable; } + virtual bool isRenameable() const { return m_bRenameable; } + virtual bool isHideable() const { return m_bHideable; } + virtual bool writeToCd() const { return m_bWriteToCd; } + virtual const QString& extraInfo() const { return m_extraInfo; } + + void setRenameable( bool b ) { m_bRenameable = b; } + void setMoveable( bool b ) { m_bMovable = b; } + void setRemoveable( bool b ) { m_bRemoveable = b; } + void setHideable( bool b ) { m_bHideable = b; } + void setWriteToCd( bool b ) { m_bWriteToCd = b; } + void setExtraInfo( const QString& i ) { m_extraInfo = i; } + + protected: + virtual KIO::filesize_t itemSize( bool followSymlinks ) const = 0; + + /** + * \param followSymlinks If true symlinks will be followed and their + * size equals the size of the file they are + * pointing to. + * + * \return The number of blocks (2048 bytes) occupied by this item. + */ + virtual K3b::Msf itemBlocks( bool followSymlinks ) const; + + QString m_k3bName; + + void setFlags( int flags ); + + private: + class Private; + Private* d; + + QString m_writtenName; + QString m_rawIsoName; + + K3bDataDoc* m_doc; + K3bDirItem* m_parentDir; + + bool m_bHideOnRockRidge; + bool m_bHideOnJoliet; + bool m_bRemoveable; + bool m_bRenameable; + bool m_bMovable; + bool m_bHideable; + bool m_bWriteToCd; + QString m_extraInfo; + + long m_sortWeight; + + friend class K3bDirItem; +}; + +#endif diff --git a/libk3b/projects/datacd/k3bdatajob.cpp b/libk3b/projects/datacd/k3bdatajob.cpp new file mode 100644 index 0000000..7009a43 --- /dev/null +++ b/libk3b/projects/datacd/k3bdatajob.cpp @@ -0,0 +1,972 @@ +/* + * + * $Id: k3bdatajob.cpp 690187 2007-07-20 09:18:03Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include "k3bdatajob.h" +#include "k3bdatadoc.h" +#include "k3bisoimager.h" +#include "k3bmsinfofetcher.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + + + +class K3bDataJob::Private +{ +public: + Private() + : usedWritingApp(K3b::CDRECORD), + verificationJob(0) { + } + + K3bDataDoc* doc; + + bool initializingImager; + bool imageFinished; + bool canceled; + + KTempFile* tocFile; + + int usedDataMode; + int usedWritingApp; + int usedWritingMode; + K3bDataDoc::MultiSessionMode usedMultiSessionMode; + + int copies; + int copiesDone; + + K3bVerificationJob* verificationJob; + + K3bFileSplitter imageFile; + K3bActivePipe pipe; +}; + + +K3bDataJob::K3bDataJob( K3bDataDoc* doc, K3bJobHandler* hdl, QObject* parent ) + : K3bBurnJob( hdl, parent ) +{ + d = new Private; + + d->doc = doc; + m_writerJob = 0; + d->tocFile = 0; + + m_isoImager = 0; + + m_msInfoFetcher = new K3bMsInfoFetcher( this, this ); + connect( m_msInfoFetcher, SIGNAL(finished(bool)), this, SLOT(slotMsInfoFetched(bool)) ); + connect( m_msInfoFetcher, SIGNAL(infoMessage(const QString&, int)), this, SIGNAL(infoMessage(const QString&, int)) ); + connect( m_msInfoFetcher, SIGNAL(debuggingOutput(const QString&, const QString&)), + this, SIGNAL(debuggingOutput(const QString&, const QString&)) ); + + d->imageFinished = true; +} + +K3bDataJob::~K3bDataJob() +{ + delete d->tocFile; + delete d; +} + + +K3bDoc* K3bDataJob::doc() const +{ + return d->doc; +} + + +K3bDevice::Device* K3bDataJob::writer() const +{ + if( doc()->onlyCreateImages() ) + return 0; // no writer needed -> no blocking on K3bBurnJob + else + return doc()->burner(); +} + + +void K3bDataJob::start() +{ + jobStarted(); + + d->canceled = false; + d->imageFinished = false; + d->copies = d->doc->copies(); + d->copiesDone = 0; + d->usedMultiSessionMode = d->doc->multiSessionMode(); + + prepareImager(); + + if( d->doc->dummy() ) { + d->doc->setVerifyData( false ); + d->copies = 1; + } + + emit newTask( i18n("Preparing data") ); + + // there is no harm in setting these even if we write on-the-fly + d->imageFile.setName( d->doc->tempDir() ); + d->pipe.readFromIODevice( &d->imageFile ); + + if( d->usedMultiSessionMode == K3bDataDoc::AUTO && !d->doc->onlyCreateImages() ) + determineMultiSessionMode(); + else + prepareWriting(); +} + + +void K3bDataJob::prepareWriting() +{ + if( !d->doc->onlyCreateImages() && + ( d->usedMultiSessionMode == K3bDataDoc::CONTINUE || + d->usedMultiSessionMode == K3bDataDoc::FINISH ) ) { + // no sense continuing the same session twice + // FIXME: why not? + d->copies = 1; + + m_msInfoFetcher->setDevice( d->doc->burner() ); + + if( !waitForMedium() ) { + cancel(); + return; + } + + if( K3b::isMounted( d->doc->burner() ) ) { + emit infoMessage( i18n("Unmounting disk"), INFO ); + K3b::unmount( d->doc->burner() ); + } + + m_msInfoFetcher->start(); + } + else { + m_isoImager->setMultiSessionInfo( QString::null ); + prepareData(); + + d->initializingImager = true; + m_isoImager->init(); + } +} + + +void K3bDataJob::slotMsInfoFetched(bool success) +{ + if( success ) { + // we call this here since in ms mode we might want to check + // the last track's datamode + prepareData(); + + if( d->usedWritingApp == K3b::CDRDAO ) // cdrdao seems to write a 150 blocks pregap that is not used by cdrecord + m_isoImager->setMultiSessionInfo( QString("%1,%2").arg(m_msInfoFetcher->lastSessionStart()).arg(m_msInfoFetcher->nextSessionStart()+150), d->doc->burner() ); + else + m_isoImager->setMultiSessionInfo( m_msInfoFetcher->msInfo(), d->doc->burner() ); + + d->initializingImager = true; + m_isoImager->init(); + } + else { + // the MsInfoFetcher already emitted failure info + cancelAll(); + jobFinished( false ); + } +} + + +void K3bDataJob::writeImage() +{ + d->initializingImager = false; + + emit burning(false); + + // get image file path + if( d->doc->tempDir().isEmpty() ) + d->doc->setTempDir( K3b::findUniqueFilePrefix( d->doc->isoOptions().volumeID() ) + ".iso" ); + + // TODO: check if the image file is part of the project and if so warn the user + // and append some number to make the path unique. + + emit newTask( i18n("Creating image file") ); + emit newSubTask( i18n("Track 1 of 1") ); + emit infoMessage( i18n("Creating image file in %1").arg(d->doc->tempDir()), INFO ); + + m_isoImager->writeToImageFile( d->doc->tempDir() ); + m_isoImager->start(); +} + + +bool K3bDataJob::startOnTheFlyWriting() +{ + if( prepareWriterJob() ) { + if( startWriterJob() ) { + // try a direct connection between the processes + if( m_writerJob->fd() != -1 ) + m_isoImager->writeToFd( m_writerJob->fd() ); + d->initializingImager = false; + m_isoImager->start(); + return true; + } + } + return false; +} + + +void K3bDataJob::cancel() +{ + emit infoMessage( i18n("Writing canceled."), K3bJob::ERROR ); + emit canceled(); + + if( m_writerJob && m_writerJob->active() ) { + // + // lets wait for the writer job to finish + // and let it finish the job for good. + // + cancelAll(); + } + else { + // + // Just cancel all and return + // This is bad design as we should wait for all subjobs to finish + // + cancelAll(); + jobFinished( false ); + } +} + + +void K3bDataJob::slotIsoImagerPercent( int p ) +{ + if( d->doc->onlyCreateImages() ) { + emit subPercent( p ); + emit percent( p ); + } + else if( !d->doc->onTheFly() ) { + double totalTasks = d->copies; + double tasksDone = d->copiesDone; // =0 when creating an image + if( d->doc->verifyData() ) { + totalTasks*=2; + tasksDone*=2; + } + if( !d->doc->onTheFly() ) { + totalTasks+=1.0; + } + + emit subPercent( p ); + emit percent( (int)((100.0*tasksDone + (double)p) / totalTasks) ); + } +} + + +void K3bDataJob::slotIsoImagerFinished( bool success ) +{ + if( d->initializingImager ) { + if( success ) { + if( d->doc->onTheFly() && !d->doc->onlyCreateImages() ) { + if( !startOnTheFlyWriting() ) { + cancelAll(); + jobFinished( false ); + } + } + else { + writeImage(); + } + } + else { + if( m_isoImager->hasBeenCanceled() ) + emit canceled(); + jobFinished( false ); + } + } + else { + // tell the writer that there won't be more data + if( d->doc->onTheFly() && m_writerJob ) + m_writerJob->closeFd(); + + if( !d->doc->onTheFly() || + d->doc->onlyCreateImages() ) { + + if( success ) { + emit infoMessage( i18n("Image successfully created in %1").arg(d->doc->tempDir()), K3bJob::SUCCESS ); + d->imageFinished = true; + + if( d->doc->onlyCreateImages() ) { + jobFinished( true ); + } + else { + if( prepareWriterJob() ) { + startWriterJob(); + d->pipe.writeToFd( m_writerJob->fd(), true ); + d->pipe.open(true); + } + } + } + else { + if( m_isoImager->hasBeenCanceled() ) + emit canceled(); + else + emit infoMessage( i18n("Error while creating ISO image"), ERROR ); + + cancelAll(); + jobFinished( false ); + } + } + else if( !success ) { // on-the-fly + // + // In case the imager failed let's make sure the writer does not emit an unusable + // error message. + // + if( m_writerJob && m_writerJob->active() ) + m_writerJob->setSourceUnreadable( true ); + + // there is one special case which we need to handle here: the iso imager might be canceled + // FIXME: the iso imager should not be able to cancel itself + if( m_isoImager->hasBeenCanceled() && !this->hasBeenCanceled() ) + cancel(); + } + } +} + + +bool K3bDataJob::startWriterJob() +{ + if( d->doc->dummy() ) + emit newTask( i18n("Simulating") ); + else if( d->copies > 1 ) + emit newTask( i18n("Writing Copy %1").arg(d->copiesDone+1) ); + else + emit newTask( i18n("Writing") ); + + // if we append a new session we asked for an appendable cd already + if( d->usedMultiSessionMode == K3bDataDoc::NONE || + d->usedMultiSessionMode == K3bDataDoc::START ) { + + if( !waitForMedium() ) { + return false; + } + } + + emit burning(true); + m_writerJob->start(); + return true; +} + + +void K3bDataJob::slotWriterJobPercent( int p ) +{ + double totalTasks = d->copies; + double tasksDone = d->copiesDone; + if( d->doc->verifyData() ) { + totalTasks*=2; + tasksDone*=2; + } + if( !d->doc->onTheFly() ) { + totalTasks+=1.0; + tasksDone+=1.0; + } + + emit percent( (int)((100.0*tasksDone + (double)p) / totalTasks) ); +} + + +void K3bDataJob::slotWriterNextTrack( int t, int tt ) +{ + emit newSubTask( i18n("Writing Track %1 of %2").arg(t).arg(tt) ); +} + + +void K3bDataJob::slotWriterJobFinished( bool success ) +{ + d->pipe.close(); + + // + // This is a little workaround for the bad cancellation handling in this job + // see cancel() + // + if( d->canceled ) { + if( active() ) + jobFinished( false ); + } + + if( success ) { + // allright + // the writerJob should have emited the "simulation/writing successful" signal + + if( d->doc->verifyData() ) { + if( !d->verificationJob ) { + d->verificationJob = new K3bVerificationJob( this, this ); + connect( d->verificationJob, SIGNAL(infoMessage(const QString&, int)), + this, SIGNAL(infoMessage(const QString&, int)) ); + connect( d->verificationJob, SIGNAL(newTask(const QString&)), + this, SIGNAL(newSubTask(const QString&)) ); + connect( d->verificationJob, SIGNAL(newSubTask(const QString&)), + this, SIGNAL(newSubTask(const QString&)) ); + connect( d->verificationJob, SIGNAL(percent(int)), + this, SLOT(slotVerificationProgress(int)) ); + connect( d->verificationJob, SIGNAL(percent(int)), + this, SIGNAL(subPercent(int)) ); + connect( d->verificationJob, SIGNAL(finished(bool)), + this, SLOT(slotVerificationFinished(bool)) ); + connect( d->verificationJob, SIGNAL(debuggingOutput(const QString&, const QString&)), + this, SIGNAL(debuggingOutput(const QString&, const QString&)) ); + + } + d->verificationJob->clear(); + d->verificationJob->setDevice( d->doc->burner() ); + d->verificationJob->setGrownSessionSize( m_isoImager->size() ); + d->verificationJob->addTrack( 0, m_isoImager->checksum(), m_isoImager->size() ); + + emit burning(false); + + emit newTask( i18n("Verifying written data") ); + + d->verificationJob->start(); + } + else { + d->copiesDone++; + + if( d->copiesDone < d->copies ) { + K3bDevice::eject( d->doc->burner() ); + + bool failed = false; + if( d->doc->onTheFly() ) + failed = !startOnTheFlyWriting(); + else + failed = !startWriterJob(); + + if( failed ) { + cancel(); + } + else if( !d->doc->onTheFly() ) { + d->pipe.writeToFd( m_writerJob->fd(), true ); + d->pipe.open(true); + } + } + else { + cleanup(); + jobFinished(true); + } + } + } + else { + cancelAll(); + jobFinished( false ); + } +} + + +void K3bDataJob::slotVerificationProgress( int p ) +{ + double totalTasks = d->copies*2; + double tasksDone = d->copiesDone*2 + 1; // the writing of the current copy has already been finished + + if( !d->doc->onTheFly() ) { + totalTasks+=1.0; + tasksDone+=1.0; + } + + emit percent( (int)((100.0*tasksDone + (double)p) / totalTasks) ); +} + + +void K3bDataJob::slotVerificationFinished( bool success ) +{ + d->copiesDone++; + + // reconnect our imager which we deconnected for the verification + connectImager(); + + if( k3bcore->globalSettings()->ejectMedia() || d->copiesDone < d->copies ) + K3bDevice::eject( d->doc->burner() ); + + if( !d->canceled && d->copiesDone < d->copies ) { + bool failed = false; + if( d->doc->onTheFly() ) + failed = !startOnTheFlyWriting(); + else + failed = !startWriterJob(); + + if( failed ) + cancel(); + else if( !d->doc->onTheFly() ) { + d->pipe.writeToFd( m_writerJob->fd(), true ); + d->pipe.open(true); + } + } + else { + cleanup(); + jobFinished( success ); + } +} + + +void K3bDataJob::setWriterJob( K3bAbstractWriter* writer ) +{ + // FIXME: progressedsize for multiple copies + m_writerJob = writer; + connect( m_writerJob, SIGNAL(infoMessage(const QString&, int)), this, SIGNAL(infoMessage(const QString&, int)) ); + connect( m_writerJob, SIGNAL(percent(int)), this, SLOT(slotWriterJobPercent(int)) ); + connect( m_writerJob, SIGNAL(processedSize(int, int)), this, SIGNAL(processedSize(int, int)) ); + connect( m_writerJob, SIGNAL(subPercent(int)), this, SIGNAL(subPercent(int)) ); + connect( m_writerJob, SIGNAL(processedSubSize(int, int)), this, SIGNAL(processedSubSize(int, int)) ); + connect( m_writerJob, SIGNAL(nextTrack(int, int)), this, SLOT(slotWriterNextTrack(int, int)) ); + connect( m_writerJob, SIGNAL(buffer(int)), this, SIGNAL(bufferStatus(int)) ); + connect( m_writerJob, SIGNAL(deviceBuffer(int)), this, SIGNAL(deviceBuffer(int)) ); + connect( m_writerJob, SIGNAL(writeSpeed(int, int)), this, SIGNAL(writeSpeed(int, int)) ); + connect( m_writerJob, SIGNAL(finished(bool)), this, SLOT(slotWriterJobFinished(bool)) ); + connect( m_writerJob, SIGNAL(newSubTask(const QString&)), this, SIGNAL(newSubTask(const QString&)) ); + connect( m_writerJob, SIGNAL(debuggingOutput(const QString&, const QString&)), + this, SIGNAL(debuggingOutput(const QString&, const QString&)) ); +} + + +void K3bDataJob::setImager( K3bIsoImager* imager ) +{ + if( m_isoImager != imager ) { + delete m_isoImager; + + m_isoImager = imager; + + connectImager(); + } +} + + +void K3bDataJob::connectImager() +{ + m_isoImager->disconnect( this ); + connect( m_isoImager, SIGNAL(infoMessage(const QString&, int)), this, SIGNAL(infoMessage(const QString&, int)) ); + connect( m_isoImager, SIGNAL(percent(int)), this, SLOT(slotIsoImagerPercent(int)) ); + connect( m_isoImager, SIGNAL(finished(bool)), this, SLOT(slotIsoImagerFinished(bool)) ); + connect( m_isoImager, SIGNAL(debuggingOutput(const QString&, const QString&)), + this, SIGNAL(debuggingOutput(const QString&, const QString&)) ); +} + + +void K3bDataJob::prepareImager() +{ + if( !m_isoImager ) + setImager( new K3bIsoImager( d->doc, this, this ) ); +} + + +bool K3bDataJob::prepareWriterJob() +{ + if( m_writerJob ) + return true; + + // It seems as if cdrecord is not able to append sessions in dao mode whereas cdrdao is + if( d->usedWritingApp == K3b::CDRECORD ) { + K3bCdrecordWriter* writer = new K3bCdrecordWriter( d->doc->burner(), this, this ); + + // cdrecord manpage says that "not all" writers are able to write + // multisession disks in dao mode. That means there are writers that can. + + // Does it really make sence to write DAta ms cds in DAO mode since writing the + // first session of a cd-extra in DAO mode is no problem with my writer while + // writing the second data session is only possible in TAO mode. + if( d->usedWritingMode == K3b::DAO && + d->usedMultiSessionMode != K3bDataDoc::NONE ) + emit infoMessage( i18n("Most writers do not support writing " + "multisession CDs in DAO mode."), INFO ); + + writer->setWritingMode( d->usedWritingMode ); + writer->setSimulate( d->doc->dummy() ); + writer->setBurnSpeed( d->doc->speed() ); + + // multisession + if( d->usedMultiSessionMode == K3bDataDoc::START || + d->usedMultiSessionMode == K3bDataDoc::CONTINUE ) { + writer->addArgument("-multi"); + } + + if( d->doc->onTheFly() && + ( d->usedMultiSessionMode == K3bDataDoc::CONTINUE || + d->usedMultiSessionMode == K3bDataDoc::FINISH ) ) + writer->addArgument("-waiti"); + + if( d->usedDataMode == K3b::MODE1 ) + writer->addArgument( "-data" ); + else { + if( k3bcore->externalBinManager()->binObject("cdrecord") && + k3bcore->externalBinManager()->binObject("cdrecord")->hasFeature( "xamix" ) ) + writer->addArgument( "-xa" ); + else + writer->addArgument( "-xa1" ); + } + + writer->addArgument( QString("-tsize=%1s").arg(m_isoImager->size()) )->addArgument("-"); + + setWriterJob( writer ); + } + else { + // create cdrdao job + K3bCdrdaoWriter* writer = new K3bCdrdaoWriter( d->doc->burner(), this, this ); + writer->setCommand( K3bCdrdaoWriter::WRITE ); + writer->setSimulate( d->doc->dummy() ); + writer->setBurnSpeed( d->doc->speed() ); + // multisession + writer->setMulti( d->usedMultiSessionMode == K3bDataDoc::START || + d->usedMultiSessionMode == K3bDataDoc::CONTINUE ); + + // now write the tocfile + if( d->tocFile ) delete d->tocFile; + d->tocFile = new KTempFile( QString::null, "toc" ); + d->tocFile->setAutoDelete(true); + + if( QTextStream* s = d->tocFile->textStream() ) { + if( d->usedDataMode == K3b::MODE1 ) { + *s << "CD_ROM" << "\n"; + *s << "\n"; + *s << "TRACK MODE1" << "\n"; + } + else { + *s << "CD_ROM_XA" << "\n"; + *s << "\n"; + *s << "TRACK MODE2_FORM1" << "\n"; + } + + *s << "DATAFILE \"-\" " << m_isoImager->size()*2048 << "\n"; + + d->tocFile->close(); + } + else { + kdDebug() << "(K3bDataJob) could not write tocfile." << endl; + emit infoMessage( i18n("IO Error"), ERROR ); + cancelAll(); + return false; + } + + writer->setTocFile( d->tocFile->name() ); + + setWriterJob( writer ); + } + + return true; +} + + +void K3bDataJob::prepareData() +{ + // we don't need this when only creating image and it is possible + // that the burn device is null + if( d->doc->onlyCreateImages() ) + return; + + // first of all we determine the data mode + if( d->doc->dataMode() == K3b::DATA_MODE_AUTO ) { + if( !d->doc->onlyCreateImages() && + ( d->usedMultiSessionMode == K3bDataDoc::CONTINUE || + d->usedMultiSessionMode == K3bDataDoc::FINISH ) ) { + + // try to get the last track's datamode + // we already asked for an appendable cdr when fetching + // the ms info + kdDebug() << "(K3bDataJob) determining last track's datamode..." << endl; + + // FIXME: use a devicethread + K3bDevice::Toc toc = d->doc->burner()->readToc(); + if( toc.isEmpty() ) { + kdDebug() << "(K3bDataJob) could not retrieve toc." << endl; + emit infoMessage( i18n("Unable to determine the last track's datamode. Using default."), ERROR ); + d->usedDataMode = K3b::MODE2; + } + else { + if( toc[toc.count()-1].mode() == K3bDevice::Track::MODE1 ) + d->usedDataMode = K3b::MODE1; + else + d->usedDataMode = K3b::MODE2; + + kdDebug() << "(K3bDataJob) using datamode: " + << (d->usedDataMode == K3b::MODE1 ? "mode1" : "mode2") + << endl; + } + } + else if( d->usedMultiSessionMode == K3bDataDoc::NONE ) + d->usedDataMode = K3b::MODE1; + else + d->usedDataMode = K3b::MODE2; + } + else + d->usedDataMode = d->doc->dataMode(); + + + // determine the writing mode + if( d->doc->writingMode() == K3b::WRITING_MODE_AUTO ) { + // TODO: put this into the cdreocrdwriter and decide based on the size of the + // track + if( writer()->dao() && d->usedDataMode == K3b::MODE1 && + d->usedMultiSessionMode == K3bDataDoc::NONE ) + d->usedWritingMode = K3b::DAO; + else + d->usedWritingMode = K3b::TAO; + } + else + d->usedWritingMode = d->doc->writingMode(); + + + // cdrecord seems to have problems writing xa 1 disks in dao mode? At least on my system! + if( writingApp() == K3b::DEFAULT ) { + if( d->usedWritingMode == K3b::DAO ) { + if( d->usedMultiSessionMode != K3bDataDoc::NONE ) + d->usedWritingApp = K3b::CDRDAO; + else if( d->usedDataMode == K3b::MODE2 ) + d->usedWritingApp = K3b::CDRDAO; + else + d->usedWritingApp = K3b::CDRECORD; + } + else + d->usedWritingApp = K3b::CDRECORD; + } + else + d->usedWritingApp = writingApp(); +} + + +void K3bDataJob::determineMultiSessionMode() +{ + // + // THIS IS ONLY CALLED IF d->doc->multiSessionMode() == K3bDataDoc::AUTO! + // + + if( d->doc->writingMode() == K3b::WRITING_MODE_AUTO || + d->doc->writingMode() == K3b::TAO ) { + emit newSubTask( i18n("Searching for old session") ); + + // + // Wait for the medium. + // In case an old session was imported we always want to continue or finish a multisession CD/DVD. + // Otherwise we wait for everything we could handle and decide what to do in + // determineMultiSessionMode( K3bDevice::DeviceHandler* ) below. + // + + int wantedMediaState = K3bDevice::STATE_INCOMPLETE|K3bDevice::STATE_EMPTY; + if( d->doc->sessionImported() ) + wantedMediaState = K3bDevice::STATE_INCOMPLETE; + + int m = waitForMedia( d->doc->burner(), + wantedMediaState, + K3bDevice::MEDIA_WRITABLE_CD ); + + if( m < 0 ) + cancel(); + else { + // now we need to determine the media's size + connect( K3bDevice::sendCommand( K3bDevice::DeviceHandler::NG_DISKINFO, d->doc->burner() ), + SIGNAL(finished(K3bDevice::DeviceHandler*)), + this, + SLOT(slotDetermineMultiSessionMode(K3bDevice::DeviceHandler*)) ); + } + } + else { + // we need TAO for multisession + d->usedMultiSessionMode = K3bDataDoc::NONE; + + // carry on with the writing + prepareWriting(); + } +} + + +void K3bDataJob::slotDetermineMultiSessionMode( K3bDevice::DeviceHandler* dh ) +{ + // + // This is a little workaround for the bad cancellation handling in this job + // see cancel() + // + if( d->canceled ) { + if( active() ) { + cleanup(); + jobFinished( false ); + } + } + else { + d->usedMultiSessionMode = getMultiSessionMode( dh->diskInfo() ); + + // carry on with the writing + prepareWriting(); + } +} + + +K3bDataDoc::MultiSessionMode K3bDataJob::getMultiSessionMode( const K3bDevice::DiskInfo& info ) +{ + if( info.appendable() ) { + // + // 3 cases: + // 1. the project does not fit -> no multisession (resulting in asking for another media above) + // 2. the project does fit and fills up the CD -> finish multisession + // 3. the project does fit and does not fill up the CD -> continue multisession + // + // In case a session has been imported we do not consider NONE at all. + // + if( d->doc->size() > info.remainingSize().mode1Bytes() && !d->doc->sessionImported() ) + d->usedMultiSessionMode = K3bDataDoc::NONE; + else if( d->doc->size() >= info.remainingSize().mode1Bytes()*9/10 ) + d->usedMultiSessionMode = K3bDataDoc::FINISH; + else + d->usedMultiSessionMode = K3bDataDoc::CONTINUE; + } + + else if( info.empty() ) { + // + // We only close the CD if the project fills up the CD almost completely (90%) + // + if( d->doc->size() >= info.capacity().mode1Bytes()*9/10 || + d->doc->writingMode() == K3b::DAO ) + d->usedMultiSessionMode = K3bDataDoc::NONE; + else + d->usedMultiSessionMode = K3bDataDoc::START; + } + + else { // complete (WE SHOULD ACTUALLY NEVER GET HERE SINCE WE WAIT FOR AN EMPTY/APPENDABLE CD ABOVE!) + // + // Now we decide only based on the project size. + // let's just use a 680 MB CD as our reference + // + if( d->doc->size()/1024/1024 >= 680*9/10 || + d->doc->writingMode() == K3b::DAO ) + d->usedMultiSessionMode = K3bDataDoc::NONE; + else + d->usedMultiSessionMode = K3bDataDoc::START; + } + + return d->usedMultiSessionMode; +} + + +void K3bDataJob::cancelAll() +{ + d->canceled = true; + + m_isoImager->cancel(); + m_msInfoFetcher->cancel(); + if( m_writerJob ) + m_writerJob->cancel(); + if( d->verificationJob ) + d->verificationJob->cancel(); + + d->pipe.close(); + + cleanup(); +} + + +bool K3bDataJob::waitForMedium() +{ + emit newSubTask( i18n("Waiting for a medium") ); + if( waitForMedia( d->doc->burner(), + d->usedMultiSessionMode == K3bDataDoc::CONTINUE || + d->usedMultiSessionMode == K3bDataDoc::FINISH ? + K3bDevice::STATE_INCOMPLETE : + K3bDevice::STATE_EMPTY, + K3bDevice::MEDIA_WRITABLE_CD ) < 0 ) { + return false; + } + else + return !d->canceled; +} + + +QString K3bDataJob::jobDescription() const +{ + if( d->doc->onlyCreateImages() ) { + return i18n("Creating Data Image File"); + } + else if( d->doc->multiSessionMode() == K3bDataDoc::NONE || + d->doc->multiSessionMode() == K3bDataDoc::AUTO ) { + return i18n("Writing Data CD") + + ( d->doc->isoOptions().volumeID().isEmpty() + ? QString::null + : QString( " (%1)" ).arg(d->doc->isoOptions().volumeID()) ); + } + else { + return i18n("Writing Multisession CD") + + ( d->doc->isoOptions().volumeID().isEmpty() + ? QString::null + : QString( " (%1)" ).arg(d->doc->isoOptions().volumeID()) ); + } +} + + +QString K3bDataJob::jobDetails() const +{ + if( d->doc->copies() > 1 && + !d->doc->dummy() && + !(d->doc->multiSessionMode() == K3bDataDoc::CONTINUE || + d->doc->multiSessionMode() == K3bDataDoc::FINISH) ) + return i18n("ISO9660 Filesystem (Size: %1) - %n copy", + "ISO9660 Filesystem (Size: %1) - %n copies", + d->doc->copies() ) + .arg(KIO::convertSize( d->doc->size() )); + else + return i18n("ISO9660 Filesystem (Size: %1)") + .arg(KIO::convertSize( d->doc->size() )); +} + + +K3bDataDoc::MultiSessionMode K3bDataJob::usedMultiSessionMode() const +{ + return d->usedMultiSessionMode; +} + + +void K3bDataJob::cleanup() +{ + if( !d->doc->onTheFly() && d->doc->removeImages() ) { + if( QFile::exists( d->doc->tempDir() ) ) { + d->imageFile.remove(); + emit infoMessage( i18n("Removed image file %1").arg(d->doc->tempDir()), K3bJob::SUCCESS ); + } + } + + if( d->tocFile ) { + delete d->tocFile; + d->tocFile = 0; + } +} + + +bool K3bDataJob::hasBeenCanceled() const +{ + return d->canceled; +} + +#include "k3bdatajob.moc" diff --git a/libk3b/projects/datacd/k3bdatajob.h b/libk3b/projects/datacd/k3bdatajob.h new file mode 100644 index 0000000..58de969 --- /dev/null +++ b/libk3b/projects/datacd/k3bdatajob.h @@ -0,0 +1,111 @@ +/* + * + * $Id: k3bdatajob.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef K3BDATAJOB_H +#define K3BDATAJOB_H + +#include +#include + +#include + +class QString; +class QDataStream; +class K3bAbstractWriter; +class K3bIsoImager; +class KTempFile; +class K3bMsInfoFetcher; + +namespace K3bDevice { + class DeviceHandler; + class DiskInfo; +} + +/** + *@author Sebastian Trueg + */ +class K3bDataJob : public K3bBurnJob +{ + Q_OBJECT + + public: + K3bDataJob( K3bDataDoc*, K3bJobHandler*, QObject* parent = 0 ); + virtual ~K3bDataJob(); + + K3bDoc* doc() const; + K3bDevice::Device* writer() const; + + virtual bool hasBeenCanceled() const; + + virtual QString jobDescription() const; + virtual QString jobDetails() const; + + public slots: + void cancel(); + void start(); + + /** + * Used to specify a non-default writer. + * If this does notget called K3bDataJob determines + * the writer itself. + */ + void setWriterJob( K3bAbstractWriter* ); + void setImager( K3bIsoImager* ); + + protected slots: + void slotIsoImagerFinished( bool success ); + void slotIsoImagerPercent(int); + void slotWriterJobPercent( int p ); + void slotWriterNextTrack( int t, int tt ); + void slotWriterJobFinished( bool success ); + void slotVerificationProgress( int ); + void slotVerificationFinished( bool ); + void slotMsInfoFetched(bool); + void slotDetermineMultiSessionMode( K3bDevice::DeviceHandler* dh ); + void writeImage(); + void cancelAll(); + + /** + * Just a little helper method that makes subclassing easier. + * Basically used for DVD writing. + */ + virtual bool waitForMedium(); + + protected: + virtual void prepareData(); + virtual bool prepareWriterJob(); + virtual void prepareImager(); + virtual void determineMultiSessionMode(); + virtual K3bDataDoc::MultiSessionMode getMultiSessionMode( const K3bDevice::DiskInfo& ); + virtual void cleanup(); + + K3bDataDoc::MultiSessionMode usedMultiSessionMode() const; + + K3bAbstractWriter* m_writerJob; + K3bIsoImager* m_isoImager; + K3bMsInfoFetcher* m_msInfoFetcher; + + private: + bool startWriterJob(); + bool startOnTheFlyWriting(); + void prepareWriting(); + void connectImager(); + + class Private; + Private* d; +}; + +#endif diff --git a/libk3b/projects/datacd/k3bdatapreparationjob.cpp b/libk3b/projects/datacd/k3bdatapreparationjob.cpp new file mode 100644 index 0000000..dd29d6d --- /dev/null +++ b/libk3b/projects/datacd/k3bdatapreparationjob.cpp @@ -0,0 +1,283 @@ +/* + * + * $Id: sourceheader 511311 2006-02-19 14:51:05Z trueg $ + * Copyright (C) 2006 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bdatapreparationjob.h" +#include "k3bdatadoc.h" +#include "k3bisooptions.h" + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + + +class K3bDataPreparationJob::Private : public K3bThread +{ +public: + Private( K3bDataDoc* doc ); + + void run(); + void cancel(); + + K3bDataDoc* doc; + + QValueList nonExistingItems; + QString listOfRenamedItems; + QValueList folderSymLinkItems; + + K3bThreadJob* threadJob; + + bool canceled; +}; + + +K3bDataPreparationJob::Private::Private( K3bDataDoc* _doc ) + : doc(_doc) +{ +} + + +void K3bDataPreparationJob::Private::run() +{ + emitStarted(); + + // clean up + nonExistingItems.clear(); + listOfRenamedItems.truncate(0); + folderSymLinkItems.clear(); + + // initialize filenames in the project + doc->prepareFilenames(); + + // create the message string for the renamed files + if( doc->needToCutFilenames() ) { + int maxlines = 10; + QValueList::const_iterator it; + for( it = doc->needToCutFilenameItems().begin(); + maxlines > 0 && it != doc->needToCutFilenameItems().end(); + ++it, --maxlines ) { + K3bDataItem* item = *it; + listOfRenamedItems += i18n("%1 renamed to %2") + .arg( KStringHandler::csqueeze( item->k3bName(), 30 ) ) + .arg( KStringHandler::csqueeze( item->writtenName(), 30 ) ); + listOfRenamedItems += "
"; + } + if( it != doc->needToCutFilenameItems().end() ) + listOfRenamedItems += "..."; + } + + // + // Check for missing files and folder symlinks + // + K3bDataItem* item = doc->root(); + while( (item = item->nextSibling()) ) { + + if( item->isSymLink() ) { + if( doc->isoOptions().followSymbolicLinks() ) { + QFileInfo f( K3b::resolveLink( item->localPath() ) ); + if( !f.exists() ) { + nonExistingItems.append( item ); + } + else if( f.isDir() ) { + folderSymLinkItems.append( item ); + } + } + } + else if( item->isFile() && !QFile::exists( item->localPath() ) ) { + nonExistingItems.append( item ); + } + + if( canceled ) { + emitCanceled(); + emitFinished(false); + return; + } + } + + + emitFinished( true ); +} + + +void K3bDataPreparationJob::Private::cancel() +{ + canceled = true; +} + + + + +static QString createItemsString( const QValueList& items, unsigned int max ) +{ + QString s; + unsigned int cnt = 0; + for( QValueList::const_iterator it = items.begin(); + it != items.end(); ++it ) { + + s += KStringHandler::csqueeze( (*it)->localPath(), 60 ); + + ++cnt; + if( cnt >= max || it == items.end() ) + break; + + s += "
"; + } + + if( items.count() > max ) + s += "..."; + + return s; +} + + +K3bDataPreparationJob::K3bDataPreparationJob( K3bDataDoc* doc, K3bJobHandler* hdl, QObject* parent ) + : K3bJob( hdl, parent ) +{ + d = new Private( doc ); + d->threadJob = new K3bThreadJob( d, this, this ); + connectSubJob( d->threadJob, SLOT(slotWorkDone(bool)), K3bJob::DEFAULT_SIGNAL_CONNECTION ); +} + + +K3bDataPreparationJob::~K3bDataPreparationJob() +{ + delete d; +} + + +void K3bDataPreparationJob::start() +{ + if( !active() ) { + d->canceled = false; + jobStarted(); + d->threadJob->start(); + } +} + + +void K3bDataPreparationJob::slotWorkDone( bool success ) +{ + if( success ) { + if( !d->listOfRenamedItems.isEmpty() ) { + if( !questionYesNo( "

" + i18n("Some filenames need to be shortened due to the %1 char restriction " + "of the Joliet extensions. If the Joliet extensions are disabled filenames " + "do not have to be shortened but long filenames will not be available on " + "Windows systems.") + .arg( d->doc->isoOptions().jolietLong() ? 103 : 64 ) + + "

" + d->listOfRenamedItems, + i18n("Warning"), + i18n("Shorten Filenames"), + i18n("Disable Joliet extensions") ) ) { + // No -> disable joliet + // for now we enable RockRidge to be sure we did not lie above (keep long filenames) + K3bIsoOptions op = d->doc->isoOptions(); + op.setCreateJoliet( false ); + op.setCreateRockRidge( true ); + d->doc->setIsoOptions( op ); + d->doc->prepareFilenames(); + } + } + + // + // The joliet extension encodes the volume desc in UCS-2, i.e. uses 16 bit for each char. + // Thus, the max length here is 16. + // + if( d->doc->isoOptions().createJoliet() && + d->doc->isoOptions().volumeID().length() > 16 ) { + if( !questionYesNo( "

" + i18n("The Joliet extensions (which are needed for long filenames on Windows systems) " + "restrict the length of the volume descriptior (the name of the filesystem) " + "to %1 characters. The selected descriptor '%2' is longer than that. Do you " + "want it to be cut or do you want to go back and change it manually?") + .arg( 16 ).arg( d->doc->isoOptions().volumeID() ), + i18n("Warning"), + i18n("Cut volume descriptor in the Joliet tree"), + i18n("Cancel and go back") ) ) { + d->canceled = true; + emit canceled(); + jobFinished( false ); + return; + } + } + + // + // Check for missing files + // + if( !d->nonExistingItems.isEmpty() ) { + if( questionYesNo( "

" + i18n("The following files could not be found. Do you want to remove them from the " + "project and continue without adding them to the image?") + + "

" + createItemsString( d->nonExistingItems, 10 ), + i18n("Warning"), + i18n("Remove missing files and continue"), + i18n("Cancel and go back") ) ) { + for( QValueList::const_iterator it = d->nonExistingItems.begin(); + it != d->nonExistingItems.end(); ++it ) { + delete *it; + } + } + else { + d->canceled = true; + emit canceled(); + jobFinished(false); + return; + } + } + + // + // Warn about symlinks to folders + // + if( d->doc->isoOptions().followSymbolicLinks() && !d->folderSymLinkItems.isEmpty() ) { + if( !questionYesNo( "

" + i18n("K3b is not able to follow symbolic links to folders after they have been added " + "to the project. Do you want to continue " + "without writing the symbolic links to the image?") + + "

" + createItemsString( d->folderSymLinkItems, 10 ), + i18n("Warning"), + i18n("Discard symbolic links to folders"), + i18n("Cancel and go back") ) ) { + d->canceled = true; + emit canceled(); + jobFinished(false); + return; + } + } + + jobFinished( true ); + } + else { + if( d->canceled ) + emit canceled(); + jobFinished(false); + } +} + + +void K3bDataPreparationJob::cancel() +{ + d->cancel(); +} + + +bool K3bDataPreparationJob::hasBeenCanceled() const +{ + return d->canceled; +} + +#include "k3bdatapreparationjob.moc" diff --git a/libk3b/projects/datacd/k3bdatapreparationjob.h b/libk3b/projects/datacd/k3bdatapreparationjob.h new file mode 100644 index 0000000..1c83a42 --- /dev/null +++ b/libk3b/projects/datacd/k3bdatapreparationjob.h @@ -0,0 +1,51 @@ +/* + * + * $Id: sourceheader 511311 2006-02-19 14:51:05Z trueg $ + * Copyright (C) 2006 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_DATA_PREPARATION_JOB_H_ +#define _K3B_DATA_PREPARATION_JOB_H_ + +#include + + +class K3bDataDoc; +class K3bJobHandler; + +/** + * The K3bDataPreparationJob performs some checks on the data in a data project + * It is used by th K3bIsoImager. + */ +class K3bDataPreparationJob : public K3bJob +{ + Q_OBJECT + + public: + K3bDataPreparationJob( K3bDataDoc* doc, K3bJobHandler* hdl, QObject* parent ); + ~K3bDataPreparationJob(); + + bool hasBeenCanceled() const; + + public slots: + void start(); + void cancel(); + + private slots: + void slotWorkDone( bool success ); + + private: + class Private; + Private* d; +}; + +#endif diff --git a/libk3b/projects/datacd/k3bdiritem.cpp b/libk3b/projects/datacd/k3bdiritem.cpp new file mode 100644 index 0000000..3ea3236 --- /dev/null +++ b/libk3b/projects/datacd/k3bdiritem.cpp @@ -0,0 +1,406 @@ +/* + * + * $Id: k3bdiritem.cpp 652578 2007-04-11 14:21:04Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include "k3bdiritem.h" +#include "k3bdatadoc.h" +#include "k3bsessionimportitem.h" +#include "k3bfileitem.h" + +#include +#include + +#include + + +K3bDirItem::K3bDirItem(const QString& name, K3bDataDoc* doc, K3bDirItem* parentDir) + : K3bDataItem( doc, parentDir ), + m_size(0), + m_followSymlinksSize(0), + m_blocks(0), + m_followSymlinksBlocks(0), + m_files(0), + m_dirs(0) +{ + m_k3bName = name; + + // add automagically like a qlistviewitem + if( parent() ) + parent()->addDataItem( this ); +} + + +K3bDirItem::K3bDirItem( const K3bDirItem& item ) + : K3bDataItem( item ), + m_size(0), + m_followSymlinksSize(0), + m_blocks(0), + m_followSymlinksBlocks(0), + m_files(0), + m_dirs(0), + m_localPath( item.m_localPath ) +{ + for( QPtrListIterator it( item.children() ); *it; ++it ) + addDataItem( (*it)->copy() ); +} + +K3bDirItem::~K3bDirItem() +{ + // delete all children + // doing this by hand is much saver than using the + // auto-delete feature since some of the items' destructors + // may change the list + K3bDataItem* i = m_children.first(); + while( i ) { + // it is important to use takeDataItem here to be sure + // the size gets updated properly + takeDataItem(i); + delete i; + i = m_children.first(); + } + + // this has to be done after deleting the children + // because the directory itself has a size of 0 in K3b + // and all it's files' sizes have already been substracted + take(); +} + + +K3bDataItem* K3bDirItem::copy() const +{ + return new K3bDirItem( *this ); +} + + +K3bDirItem* K3bDirItem::getDirItem() const +{ + return const_cast(this); +} + +K3bDirItem* K3bDirItem::addDataItem( K3bDataItem* item ) +{ + // check if we are a subdir of item + if( K3bDirItem* dirItem = dynamic_cast(item) ) { + if( dirItem->isSubItem( this ) ) { + kdDebug() << "(K3bDirItem) trying to move a dir item down in it's own tree." << endl; + return this; + } + } + + if( m_children.findRef( item ) == -1 ) { + if( item->isFile() ) { + // do we replace an old item? + QString name = item->k3bName(); + int cnt = 1; + while( K3bDataItem* oldItem = find( name ) ) { + if( !oldItem->isDir() && oldItem->isFromOldSession() ) { + // in this case we remove this item from it's parent and save it in the new one + // to be able to recover it + oldItem->take(); + static_cast(oldItem)->setReplaceItem( static_cast(item) ); + static_cast(item)->setReplacedItemFromOldSession( oldItem ); + break; + } + else { + // + // add a counter to the filename + // + if( item->k3bName()[item->k3bName().length()-4] == '.' ) + name = item->k3bName().left( item->k3bName().length()-4 ) + QString::number(cnt++) + item->k3bName().right(4); + else + name = item->k3bName() + QString::number(cnt++); + } + } + item->setK3bName( name ); + } + + m_children.append( item->take() ); + updateSize( item, false ); + if( item->isDir() ) + updateFiles( ((K3bDirItem*)item)->numFiles(), ((K3bDirItem*)item)->numDirs()+1 ); + else + updateFiles( 1, 0 ); + + item->m_parentDir = this; + + // inform the doc + if( doc() ) + doc()->itemAddedToDir( this, item ); + } + + return this; +} + + +K3bDataItem* K3bDirItem::takeDataItem( K3bDataItem* item ) +{ + int x = m_children.findRef( item ); + if( x > -1 ) { + K3bDataItem* item = m_children.take(); + updateSize( item, true ); + if( item->isDir() ) + updateFiles( -1*((K3bDirItem*)item)->numFiles(), -1*((K3bDirItem*)item)->numDirs()-1 ); + else + updateFiles( -1, 0 ); + + item->m_parentDir = 0; + + // inform the doc + if( doc() ) + doc()->itemRemovedFromDir( this, item ); + + if( item->isFile() ) { + // restore the item imported from an old session + if( static_cast(item)->replaceItemFromOldSession() ) + addDataItem( static_cast(item)->replaceItemFromOldSession() ); + } + + return item; + } + else + return 0; +} + + +K3bDataItem* K3bDirItem::nextSibling() const +{ + if( !m_children.isEmpty() ) + return m_children.getFirst(); + else + return K3bDataItem::nextSibling(); +} + + +K3bDataItem* K3bDirItem::nextChild( K3bDataItem* prev ) const +{ + // search for prev in children + if( m_children.findRef( prev ) < 0 ) { + return 0; + } + else + return m_children.next(); +} + + +bool K3bDirItem::alreadyInDirectory( const QString& filename ) const +{ + return (find( filename ) != 0); +} + + +K3bDataItem* K3bDirItem::find( const QString& filename ) const +{ + for( QPtrListIterator it( m_children ); it.current(); ++it ) { + if( it.current()->k3bName() == filename ) + return it.current(); + } + return 0; +} + + +K3bDataItem* K3bDirItem::findByPath( const QString& p ) +{ + if( p.isEmpty() || p == "/" ) + return this; + + QString path = p; + if( path.startsWith("/") ) + path = path.mid(1); + int pos = path.find( "/" ); + if( pos < 0 ) + return find( path ); + else { + // do it recursivly + K3bDataItem* item = find( path.left(pos) ); + if( item && item->isDir() ) + return ((K3bDirItem*)item)->findByPath( path.mid( pos+1 ) ); + else + return 0; + } +} + + +bool K3bDirItem::mkdir( const QString& dirPath ) +{ + // + // An absolut path always starts at the root item + // + if( dirPath[0] == '/' ) { + if( parent() ) + return parent()->mkdir( dirPath ); + else + return mkdir( dirPath.mid( 1 ) ); + } + + if( findByPath( dirPath ) ) + return false; + + QString restPath; + QString dirName; + int pos = dirPath.find( '/' ); + if( pos == -1 ) { + dirName = dirPath; + } + else { + dirName = dirPath.left( pos ); + restPath = dirPath.mid( pos+1 ); + } + + K3bDataItem* dir = find( dirName ); + if( !dir ) + dir = new K3bDirItem( dirName, doc(), this ); + else if( !dir->isDir() ) + return false; + + if( !restPath.isEmpty() ) + return static_cast(dir)->mkdir( restPath ); + + return true; +} + + +KIO::filesize_t K3bDirItem::itemSize( bool followsylinks ) const +{ + if( followsylinks ) + return m_followSymlinksSize; + else + return m_size; +} + + +K3b::Msf K3bDirItem::itemBlocks( bool followSymlinks ) const +{ + if( followSymlinks ) + return m_followSymlinksBlocks; + else + return m_blocks; +} + + +bool K3bDirItem::isSubItem( K3bDataItem* item ) const +{ + if( dynamic_cast(item) == this ) + return true; + + K3bDirItem* d = item->parent(); + while( d ) { + if( d == this ) { + return true; + } + d = d->parent(); + } + + return false; +} + + +long K3bDirItem::numFiles() const +{ + return m_files; +} + + +long K3bDirItem::numDirs() const +{ + return m_dirs; +} + + +bool K3bDirItem::isRemoveable() const +{ + if( !K3bDataItem::isRemoveable() ) + return false; + + for( QPtrListIterator it( m_children ); it.current(); ++it ) { + if( !it.current()->isRemoveable() ) + return false; + } + + return true; +} + + +void K3bDirItem::updateSize( K3bDataItem* item, bool removed ) +{ + if ( !item->isFromOldSession() ) { + if( removed ) { + m_followSymlinksSize -= item->itemSize( true ); + m_size -= item->itemSize( false ); + m_followSymlinksBlocks -= item->itemBlocks( true ).lba(); + m_blocks -= item->itemBlocks( false ).lba(); + } + else { + m_followSymlinksSize += item->itemSize( true ); + m_size += item->itemSize( false ); + m_followSymlinksBlocks += item->itemBlocks( true ).lba(); + m_blocks += item->itemBlocks( false ).lba(); + } + } + + if( parent() ) + parent()->updateSize( item, removed ); +} + +void K3bDirItem::updateFiles( long files, long dirs ) +{ + m_files += files; + m_dirs += dirs; + if( parent() ) + parent()->updateFiles( files, dirs ); +} + + +bool K3bDirItem::isFromOldSession() const +{ + for( QPtrListIterator it( m_children ); it.current(); ++it ) { + if( (*it)->isFromOldSession() ) + return true; + } + return false; +} + + +bool K3bDirItem::writeToCd() const +{ + // check if this dir contains items to write + for( QPtrListIterator it( m_children ); it.current(); ++it ) { + if( (*it)->writeToCd() ) + return true; + } + return K3bDataItem::writeToCd(); +} + + +K3bRootItem::K3bRootItem( K3bDataDoc* doc ) + : K3bDirItem( "root", doc, 0 ) +{ +} + + +K3bRootItem::~K3bRootItem() +{ +} + + +const QString& K3bRootItem::k3bName() const +{ + return doc()->isoOptions().volumeID(); +} + + +void K3bRootItem::setK3bName( const QString& text ) +{ + doc()->setVolumeID( text ); +} diff --git a/libk3b/projects/datacd/k3bdiritem.h b/libk3b/projects/datacd/k3bdiritem.h new file mode 100644 index 0000000..a64b4fd --- /dev/null +++ b/libk3b/projects/datacd/k3bdiritem.h @@ -0,0 +1,155 @@ +/* + * + * $Id: k3bdiritem.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef K3BDIRITEM_H +#define K3BDIRITEM_H + + +#include +#include + +#include + +#include "k3bdataitem.h" +#include "k3b_export.h" +class K3bDataDoc; + +/** + *@author Sebastian Trueg + */ + +class LIBK3B_EXPORT K3bDirItem : public K3bDataItem +{ + public: + K3bDirItem( const QString& name, K3bDataDoc*, K3bDirItem* parentDir = 0 ); + + /** + * Default copy constructor. Copies the dir including all children. However, none of the + * children will have set a doc and the copy dir will not have set a parent dir. + */ + K3bDirItem( const K3bDirItem& ); + + virtual ~K3bDirItem(); + + K3bDataItem* copy() const; + + K3bDirItem* getDirItem() const; + + const QPtrList& children() const { return m_children; } + K3bDirItem* addDataItem( K3bDataItem* item ); + K3bDataItem* takeDataItem( K3bDataItem* item ); + + K3bDataItem* nextSibling() const; + K3bDataItem* nextChild( K3bDataItem* ) const; + + bool alreadyInDirectory( const QString& fileName ) const; + K3bDataItem* find( const QString& filename ) const; + K3bDataItem* findByPath( const QString& ); + + long numFiles() const; + long numDirs() const; + + bool isEmpty() const { return ( numDirs() + numFiles() == 0 ); } + + /** + * returns true if item is a subItem of + * this dir item + * (returns also true if item == this + */ + bool isSubItem( K3bDataItem* item ) const; + + bool isDir() const { return true; } + + virtual bool isRemoveable() const; + + /** + * \return true if some child is from an old session. + */ + virtual bool isFromOldSession() const; + + /** + * Recursively creates a directory. + */ + bool mkdir( const QString& dir ); + + void setLocalPath( const QString& p ) { m_localPath = p; } + QString localPath() const { return m_localPath; } + + /** + * \reimplemented + */ + bool writeToCd() const; + + protected: + /** + * Normally one does not use this method but K3bDataItem::size() + * + * This method does not take into account the possibility to share the data + * between files with the same inode in an iso9660 filesystem. + * For that one has to use K3bFileCompilationSizeHandler. + */ + KIO::filesize_t itemSize( bool followSymlinks ) const; + + /* + * Normally one does not use this method but K3bDataItem::blocks() + */ + K3b::Msf itemBlocks( bool followSymlinks ) const; + + private: + /** + * this recursivly updates the size of the directories. + * The size of this dir and the parent dir is updated. + * These values are just used for user information. + */ + void updateSize( K3bDataItem*, bool removed = false ); + /** + * Updates the number of files and directories. These values are + * just used for user information. + */ + void updateFiles( long files, long dirs ); + + mutable QPtrList m_children; + + // size of the items simply added + KIO::filesize_t m_size; + KIO::filesize_t m_followSymlinksSize; + + // number of blocks (2048 bytes) used by all the items + long m_blocks; + long m_followSymlinksBlocks; + + long m_files; + long m_dirs; + + // HACK: store the original path to be able to use it's permissions + // ´remove this once we have a backup project + QString m_localPath; +}; + + +class K3bRootItem : public K3bDirItem +{ + public: + K3bRootItem( K3bDataDoc* ); + ~K3bRootItem(); + + const QString& k3bName() const; + void setK3bName( const QString& ); + + bool isMoveable() const { return false; } + bool isRemoveable() const { return false; } +}; +#endif diff --git a/libk3b/projects/datacd/k3bfilecompilationsizehandler.cpp b/libk3b/projects/datacd/k3bfilecompilationsizehandler.cpp new file mode 100644 index 0000000..0ddab76 --- /dev/null +++ b/libk3b/projects/datacd/k3bfilecompilationsizehandler.cpp @@ -0,0 +1,228 @@ +/* + * + * $Id: k3bfilecompilationsizehandler.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bfilecompilationsizehandler.h" +#include "k3bfileitem.h" + +#include + +#include +#include +#include + + +// TODO: remove the items from the project if the savedSize differs +// with some info-widget: "Files xxx have changed on disk. Removing them from the project." +// or we just update the sizes! + + +static long usedBlocks( const KIO::filesize_t& bytes ) +{ + if( bytes % 2048 ) + return bytes/2048 + 1; + else + return bytes/2048; +} + + +class InodeInfo +{ +public: + InodeInfo() { + number = 0; + savedSize = 0; + } + + /** + * How often has the file with + * the corresponding inode been added + */ + int number; + + /** + * The size of the first added file. This has to be saved + * to check further addings and to avoid the following situation: + * A file with inode 1 is added, then deleted. Another file is created + * at inode 1 and added to the project. Now the first file gets + * removed and then the second. If we had not saved the size we would + * have added the size of the first and removed the size of the second + * file resulting in a corrupted project size. + * This way we always use the size of the first added file and may + * warn the user if sizes differ. + */ + KIO::filesize_t savedSize; + + KIO::filesize_t completeSize() const { return savedSize*number; } + + /** + * In an iso9660 filesystem a file occupies complete blocks of 2048 bytes. + */ + K3b::Msf blocks() const { return K3b::Msf( usedBlocks(savedSize) ); } + + QPtrList items; +}; + + +class K3bFileCompilationSizeHandler::Private +{ +public: + Private() + : size(0) { + } + + void clear() { + inodeMap.clear(); + size = 0; + blocks = 0; + } + + void addFile( K3bFileItem* item, bool followSymlinks ) { + InodeInfo& inodeInfo = inodeMap[item->localId(followSymlinks)]; + + inodeInfo.items.append( item ); + + if( inodeInfo.number == 0 ) { + inodeInfo.savedSize = item->itemSize( followSymlinks ); + + size += inodeInfo.savedSize; + blocks += inodeInfo.blocks(); + } + + inodeInfo.number++; + } + + void addSpecialItem( K3bDataItem* item ) { + // special files do not have a corresponding local file + // so we just add their k3bSize + size += item->size(); + blocks += usedBlocks(item->size()); + specialItems.append( item ); + } + + void removeFile( K3bFileItem* item, bool followSymlinks ) { + InodeInfo& inodeInfo = inodeMap[item->localId(followSymlinks)]; + + if( inodeInfo.items.findRef( item ) == -1 ) { + kdError() << "(K3bFileCompilationSizeHandler) " + << item->localPath() + << " has been removed without being added!" << endl; + } + else { + if( item->itemSize(followSymlinks) != inodeInfo.savedSize ) { + kdError() << "(K3bFileCompilationSizeHandler) savedSize differs!" << endl; + } + + inodeInfo.items.removeRef( item ); + inodeInfo.number--; + if( inodeInfo.number == 0 ) { + size -= inodeInfo.savedSize; + blocks -= inodeInfo.blocks(); + } + } + } + + void removeSpecialItem( K3bDataItem* item ) { + // special files do not have a corresponding local file + // so we just substract their k3bSize + if( specialItems.findRef( item ) == -1 ) { + kdError() << "(K3bFileCompilationSizeHandler) Special item " + << item->k3bName() + << " has been removed without being added!" << endl; + } + else { + specialItems.removeRef( item ); + size -= item->size(); + blocks -= usedBlocks(item->size()); + } + } + + + /** + * This maps from inodes to the number of occurrences of the inode. + */ + QMap inodeMap; + + KIO::filesize_t size; + K3b::Msf blocks; + + QPtrList specialItems; +}; + + + +K3bFileCompilationSizeHandler::K3bFileCompilationSizeHandler() +{ + d_symlinks = new Private; + d_noSymlinks = new Private; +} + +K3bFileCompilationSizeHandler::~K3bFileCompilationSizeHandler() +{ + delete d_symlinks; + delete d_noSymlinks; +} + + +const KIO::filesize_t& K3bFileCompilationSizeHandler::size( bool followSymlinks ) const +{ + if( followSymlinks ) + return d_noSymlinks->size; + else + return d_symlinks->size; +} + + +const K3b::Msf& K3bFileCompilationSizeHandler::blocks( bool followSymlinks ) const +{ + if( followSymlinks ) + return d_noSymlinks->blocks; + else + return d_symlinks->blocks; +} + + +void K3bFileCompilationSizeHandler::addFile( K3bDataItem* item ) +{ + if( item->isSpecialFile() ) { + d_symlinks->addSpecialItem( item ); + d_noSymlinks->addSpecialItem( item ); + } + else if( item->isFile() ) { + K3bFileItem* fileItem = static_cast( item ); + d_symlinks->addFile( fileItem, false ); + d_noSymlinks->addFile( fileItem, true ); + } +} + + +void K3bFileCompilationSizeHandler::removeFile( K3bDataItem* item ) +{ + if( item->isSpecialFile() ) { + d_symlinks->removeSpecialItem( item ); + d_noSymlinks->removeSpecialItem( item ); + } + else if( item->isFile() ) { + K3bFileItem* fileItem = static_cast( item ); + d_symlinks->removeFile( fileItem, false ); + d_noSymlinks->removeFile( fileItem, true ); + } +} + + +void K3bFileCompilationSizeHandler::clear() +{ + d_symlinks->clear(); + d_noSymlinks->clear(); +} diff --git a/libk3b/projects/datacd/k3bfilecompilationsizehandler.h b/libk3b/projects/datacd/k3bfilecompilationsizehandler.h new file mode 100644 index 0000000..c996657 --- /dev/null +++ b/libk3b/projects/datacd/k3bfilecompilationsizehandler.h @@ -0,0 +1,73 @@ +/* + * + * $Id: k3bfilecompilationsizehandler.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_FILECOMPILATION_SIZE_HANDLER_H_ +#define _K3B_FILECOMPILATION_SIZE_HANDLER_H_ + + +#include +#include + +class K3bDataItem; + + +/** + * This class maintains a map of indoes and the number + * of files in the doc that belong to that inode. + * This way a more accurate size calculation is possible + * + * It has to be noted that the sizes of the directories + * are only locally true. That means that in some cases + * the root directory of the project may show a much + * higher size than calculated by this class. + */ +class K3bFileCompilationSizeHandler +{ + public: + K3bFileCompilationSizeHandler(); + ~K3bFileCompilationSizeHandler(); + + /** + * This does NOT equal blocks() * 2048. + * This is the sum of the actual file sizes. + */ + const KIO::filesize_t& size( bool followSymlinks = false ) const; + + /** + * Number of blocks the files will occupy. + */ + const K3b::Msf& blocks( bool followSymlinks = false ) const; + + /** + * This will increase the counter for the inode of + * the file in url and update the totel size. + */ + void addFile( K3bDataItem* ); + + /** + * This will decrease the counter for the inode of + * the file in url and update the totel size. + */ + void removeFile( K3bDataItem* ); + + void clear(); + + private: + class Private; + Private* d_symlinks; + Private* d_noSymlinks; +}; + +#endif diff --git a/libk3b/projects/datacd/k3bfileitem.cpp b/libk3b/projects/datacd/k3bfileitem.cpp new file mode 100644 index 0000000..d9e288f --- /dev/null +++ b/libk3b/projects/datacd/k3bfileitem.cpp @@ -0,0 +1,300 @@ +/* + * + * $Id: k3bfileitem.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include +#include + +#include "k3bfileitem.h" +#include "k3bdatadoc.h" +#include "k3bdiritem.h" +#include "k3bisooptions.h" +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + + +bool operator==( const K3bFileItem::Id& id1, const K3bFileItem::Id& id2 ) +{ + return ( id1.device == id2.device && id1.inode == id2.inode ); +} + + +bool operator<( const K3bFileItem::Id& id1, const K3bFileItem::Id& id2 ) +{ + if( id1.device == id2.device ) + return ( id1.inode < id2.inode ); + else + return ( id1.device < id2.device ); +} + + +bool operator>( const K3bFileItem::Id& id1, const K3bFileItem::Id& id2 ) +{ + return !( id2 < id1 || id1 == id2 ); +} + + + +K3bFileItem::K3bFileItem( const QString& filePath, K3bDataDoc* doc, K3bDirItem* dir, const QString& k3bName, int flags ) + : K3bDataItem( doc, dir, flags ), + m_replacedItemFromOldSession(0), + m_localPath(filePath) +{ + if( k3bName.isEmpty() ) + m_k3bName = filePath.section( '/', -1 ); + else + m_k3bName = k3bName; + + // we determine the size here to avoid problems with removed or renamed files + // we need to use lstat here since for symlinks both KDE and QT return the size of the file pointed to + // instead the size of the link. + k3b_struct_stat statBuf; + if( k3b_lstat( QFile::encodeName(filePath), &statBuf ) ) { + m_size = K3b::filesize( filePath ); + m_id.inode = 0; + m_id.device = 0; + m_bSymLink = false; + + kdError() << "(KFileItem) lstat failed: " << strerror(errno) << endl; + + // since we have no proper inode info, disable the inode caching in the doc + if( doc ) { + K3bIsoOptions o( doc->isoOptions() ); + o.setDoNotCacheInodes( true ); + doc->setIsoOptions( o ); + } + } + else { + m_size = (KIO::filesize_t)statBuf.st_size; + + m_bSymLink = S_ISLNK(statBuf.st_mode); + + // + // integrate the device number into the inode since files on different + // devices may have the same inode number! + // + m_id.inode = statBuf.st_ino; + m_id.device = statBuf.st_dev; + } + + m_idFollowed = m_id; + m_sizeFollowed = m_size; + + if( isSymLink() ) { + k3b_struct_stat statBuf; + if( k3b_stat( QFile::encodeName(filePath), &statBuf ) == 0 ) { + m_idFollowed.inode = statBuf.st_ino; + m_idFollowed.device = statBuf.st_dev; + + m_sizeFollowed = (KIO::filesize_t)statBuf.st_size; + } + } + + // add automagically like a qlistviewitem + if( parent() ) + parent()->addDataItem( this ); +} + + +K3bFileItem::K3bFileItem( const k3b_struct_stat* stat, + const k3b_struct_stat* followedStat, + const QString& filePath, K3bDataDoc* doc, K3bDirItem* dir, const QString& k3bName ) + : K3bDataItem( doc, dir ), + m_replacedItemFromOldSession(0), + m_localPath(filePath) +{ + if( k3bName.isEmpty() ) + m_k3bName = filePath.section( '/', -1 ); + else + m_k3bName = k3bName; + + m_size = (KIO::filesize_t)stat->st_size; + m_bSymLink = S_ISLNK(stat->st_mode); + + // + // integrate the device number into the inode since files on different + // devices may have the same inode number! + // + m_id.inode = stat->st_ino; + m_id.device = stat->st_dev; + + if( isSymLink() ) { + m_idFollowed.inode = followedStat->st_ino; + m_idFollowed.device = followedStat->st_dev; + + m_sizeFollowed = (KIO::filesize_t)followedStat->st_size; + } + else { + m_idFollowed = m_id; + m_sizeFollowed = m_size; + } + + if( parent() ) + parent()->addDataItem( this ); +} + + +K3bFileItem::K3bFileItem( const K3bFileItem& item ) + : K3bDataItem( item ), + m_replacedItemFromOldSession(0), + m_size( item.m_size ), + m_sizeFollowed( item.m_sizeFollowed ), + m_id( item.m_id ), + m_idFollowed( item.m_idFollowed ), + m_localPath( item.m_localPath ), + m_bSymLink( item.m_bSymLink ) +{ +} + + +K3bFileItem::~K3bFileItem() +{ + // remove this from parentdir + take(); +} + + +K3bDataItem* K3bFileItem::copy() const +{ + return new K3bFileItem( *this ); +} + + +KIO::filesize_t K3bFileItem::itemSize( bool followSymlinks ) const +{ + if( followSymlinks ) + return m_sizeFollowed; + else + return m_size; +} + + +K3bFileItem::Id K3bFileItem::localId() const +{ + return localId( doc() ? doc()->isoOptions().followSymbolicLinks() || !doc()->isoOptions().createRockRidge() : false ); +} + + +K3bFileItem::Id K3bFileItem::localId( bool followSymlinks ) const +{ + if( followSymlinks ) + return m_idFollowed; + else + return m_id; +} + + +bool K3bFileItem::exists() const +{ + return true; +} + +QString K3bFileItem::absIsoPath() +{ + // return m_dir->absIsoPath() + m_isoName; + return QString::null; +} + + +QString K3bFileItem::localPath() const +{ + return m_localPath; +} + +K3bDirItem* K3bFileItem::getDirItem() const +{ + return getParent(); +} + + +bool K3bFileItem::isSymLink() const +{ + return m_bSymLink; +} + + +QString K3bFileItem::linkDest() const +{ + return QFileInfo( localPath() ).readLink(); +} + + +bool K3bFileItem::isValid() const +{ + if( isSymLink() ) { + + // this link is not valid if we cannot follow it if we want to + if( doc()->isoOptions().followSymbolicLinks() ) { + return QFile::exists( K3b::resolveLink( localPath() ) ); + } + + QString dest = linkDest(); + + if( dest[0] == '/' ) + return false; // absolut links can never be part of the compilation! + + // parse the link + K3bDirItem* dir = getParent(); + + QStringList tokens = QStringList::split( QRegExp("/+"), dest ); // two slashes or more do the same as one does! + + unsigned int i = 0; + while( i < tokens.size() ) { + if( tokens[i] == "." ) { + // ignore it + } + else if( tokens[i] == ".." ) { + // change the directory + dir = dir->parent(); + if( dir == 0 ) + return false; + } + else { + // search for the item in dir + K3bDataItem* d = dir->find( tokens[i] ); + if( d == 0 ) + return false; + + if( d->isDir() ) { + // change directory + dir = (K3bDirItem*)d; + } + else { + if( i+1 != tokens.size() ) + return false; // if di is a file we need to be at the last token + else + return (dest[dest.length()-1] != '/'); // if the link destination ends with a slash + // it can only point to a directory! + } + } + + i++; + } + + return true; + } + else + return true; +} diff --git a/libk3b/projects/datacd/k3bfileitem.h b/libk3b/projects/datacd/k3bfileitem.h new file mode 100644 index 0000000..f23644f --- /dev/null +++ b/libk3b/projects/datacd/k3bfileitem.h @@ -0,0 +1,124 @@ +/* + * + * $Id: k3bfileitem.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef K3BFILEITEM_H +#define K3BFILEITEM_H + + +#include "k3bdataitem.h" +#include + +#include +#include + +#include "k3b_export.h" + +class K3bDataDoc; +class K3bDirItem; + + +/** + *@author Sebastian Trueg + */ +class LIBK3B_EXPORT K3bFileItem : public K3bDataItem +{ +public: + /** + * Creates a new K3bFileItem + */ + K3bFileItem( const QString& fileName, K3bDataDoc* doc, K3bDirItem* dir, const QString& k3bName = 0, int flags = 0 ); + + /** + * Constructor for optimized file item creation which does no additional stat. + * + * Used by K3b to speedup file item creation. + */ + K3bFileItem( const k3b_struct_stat* stat, + const k3b_struct_stat* followedStat, + const QString& fileName, K3bDataDoc* doc, K3bDirItem* dir, const QString& k3bName = 0 ); + + /** + * Default copy constructor + * Creates a copy of the fileitem. The copy, however, is not an exact duplicate of this item. + * The copy does not have a parent dir set and any old session items are set to 0. + */ + K3bFileItem( const K3bFileItem& ); + + virtual ~K3bFileItem(); + + virtual K3bDataItem* copy() const; + + bool exists() const; + + QString absIsoPath(); + + /** reimplemented from K3bDataItem */ + QString localPath() const; + + /** + * Identification of the files on the local device. + */ + struct Id { + dev_t device; + ino_t inode; + }; + + /** + * This is not the normal inode number but it also contains + * the device number. + */ + Id localId() const; + + /** + * The id of the file the symlink is pointing to + */ + Id localId( bool followSymlinks ) const; + + K3bDirItem* getDirItem() const; + + bool isSymLink() const; + QString linkDest() const; + bool isFile() const { return true; } + + /** returns true if the item is not a link or + * if the link's destination is part of the compilation */ + bool isValid() const; + + K3bDataItem* replaceItemFromOldSession() const { return m_replacedItemFromOldSession; } + void setReplacedItemFromOldSession( K3bDataItem* item ) { m_replacedItemFromOldSession = item; } + + /** + * Normally one does not use this method but K3bDataItem::size() + */ + KIO::filesize_t itemSize( bool followSymlinks ) const; + + private: + K3bDataItem* m_replacedItemFromOldSession; + + KIO::filesize_t m_size; + KIO::filesize_t m_sizeFollowed; + Id m_id; + Id m_idFollowed; + + QString m_localPath; + bool m_bSymLink; +}; + +bool operator==( const K3bFileItem::Id&, const K3bFileItem::Id& ); +bool operator<( const K3bFileItem::Id&, const K3bFileItem::Id& ); +bool operator>( const K3bFileItem::Id&, const K3bFileItem::Id& ); + +#endif diff --git a/libk3b/projects/datacd/k3bisoimager.cpp b/libk3b/projects/datacd/k3bisoimager.cpp new file mode 100644 index 0000000..f44d3ab --- /dev/null +++ b/libk3b/projects/datacd/k3bisoimager.cpp @@ -0,0 +1,1187 @@ +/* + * + * $Id: k3bisoimager.cpp 655085 2007-04-17 17:48:36Z trueg $ + * Copyright (C) 2003-2007 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include +#include + +#include "k3bisoimager.h" +#include "k3bdiritem.h" +#include "k3bbootitem.h" +#include "k3bdatadoc.h" +#include "k3bdatapreparationjob.h" +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + + +int K3bIsoImager::s_imagerSessionCounter = 0; + + +class K3bIsoImager::Private +{ +public: + Private() + : pipe(0) { + } + + ~Private() { + delete pipe; + } + + QString imagePath; + K3bFileSplitter imageFile; + const K3bExternalBin* mkisofsBin; + + enum LinkHandling { + KEEP_ALL, + FOLLOW, + DISCARD_ALL, + DISCARD_BROKEN + }; + + int usedLinkHandling; + + bool knownError; + + K3bActivePipe* pipe; + K3bDataPreparationJob* dataPreparationJob; +}; + + +K3bIsoImager::K3bIsoImager( K3bDataDoc* doc, K3bJobHandler* hdl, QObject* parent, const char* name ) + : K3bJob( hdl, parent, name ), + m_pathSpecFile(0), + m_rrHideFile(0), + m_jolietHideFile(0), + m_sortWeightFile(0), + m_process( 0 ), + m_processExited(false), + m_doc( doc ), + m_noDeepDirectoryRelocation( false ), + m_importSession( false ), + m_device(0), + m_mkisofsPrintSizeResult( 0 ), + m_fdToWriteTo(-1) +{ + d = new Private(); + d->dataPreparationJob = new K3bDataPreparationJob( doc, this, this ); + connectSubJob( d->dataPreparationJob, + SLOT(slotDataPreparationDone(bool)), + DEFAULT_SIGNAL_CONNECTION ); +} + + +K3bIsoImager::~K3bIsoImager() +{ + cleanup(); + delete d; +} + + +bool K3bIsoImager::active() const +{ + return K3bJob::active(); +} + + +void K3bIsoImager::writeToFd( int fd ) +{ + m_fdToWriteTo = fd; +} + + +void K3bIsoImager::writeToImageFile( const QString& path ) +{ + d->imagePath = path; + m_fdToWriteTo = -1; +} + + +void K3bIsoImager::slotReceivedStderr( const QString& line ) +{ + parseMkisofsOutput( line ); + emit debuggingOutput( "mkisofs", line ); +} + + +void K3bIsoImager::handleMkisofsProgress( int p ) +{ + emit percent( p ); +} + + +void K3bIsoImager::handleMkisofsInfoMessage( const QString& line, int type ) +{ + emit infoMessage( line, type ); + if( type == ERROR ) + d->knownError = true; +} + + +void K3bIsoImager::slotProcessExited( KProcess* p ) +{ + kdDebug() << k_funcinfo << endl; + + m_processExited = true; + + d->pipe->close(); + + emit debuggingOutput( "K3bIsoImager", + QString("Pipe throughput: %1 bytes read, %2 bytes written.") + .arg(d->pipe->bytesRead()).arg(d->pipe->bytesWritten()) ); + + if( d->imageFile.isOpen() ) { + d->imageFile.close(); + + if( m_canceled || p->exitStatus() != 0 ) { + d->imageFile.remove(); + emit infoMessage( i18n("Removed incomplete image file %1.").arg(d->imageFile.name()), WARNING ); + } + } + + if( m_canceled ) { + emit canceled(); + jobFinished(false); + } + else { + if( p->normalExit() ) { + if( p->exitStatus() == 0 ) { + jobFinished( !mkisofsReadError() ); + } + else { + switch( p->exitStatus() ) { + case 104: + // connection reset by peer + // This only happens if cdrecord does not finish successfully + // so we may leave the error handling to it meaning we handle this + // as a known error + break; + + case 2: + // mkisofs seems to have a bug that prevents to use filenames + // that contain one or more backslashes + // mkisofs 1.14 has the bug, 1.15a40 not + // TODO: find out the version that fixed the bug + if( m_containsFilesWithMultibleBackslashes && + !k3bcore->externalBinManager()->binObject( "mkisofs" )->hasFeature( "backslashed_filenames" ) ) { + emit infoMessage( i18n("Due to a bug in mkisofs <= 1.15a40, K3b is unable to handle " + "filenames that contain more than one backslash:"), ERROR ); + + break; + } + // otherwise just fall through + + default: + if( !d->knownError && !mkisofsReadError() ) { + emit infoMessage( i18n("%1 returned an unknown error (code %2).").arg("mkisofs").arg(p->exitStatus()), + K3bJob::ERROR ); + emit infoMessage( i18n("Please send me an email with the last output."), K3bJob::ERROR ); + } + } + + jobFinished( false ); + } + } + else { + emit infoMessage( i18n("%1 did not exit cleanly.").arg("mkisofs"), ERROR ); + jobFinished( false ); + } + } + + cleanup(); +} + + +void K3bIsoImager::cleanup() +{ + // remove all temp files + delete m_pathSpecFile; + delete m_rrHideFile; + delete m_jolietHideFile; + delete m_sortWeightFile; + + // remove boot-images-temp files + for( QStringList::iterator it = m_tempFiles.begin(); + it != m_tempFiles.end(); ++it ) + QFile::remove( *it ); + m_tempFiles.clear(); + + m_pathSpecFile = m_jolietHideFile = m_rrHideFile = m_sortWeightFile = 0; + + delete m_process; + m_process = 0; + + clearDummyDirs(); +} + + +void K3bIsoImager::init() +{ + jobStarted(); + + cleanup(); + + d->dataPreparationJob->start(); +} + + +void K3bIsoImager::slotDataPreparationDone( bool success ) +{ + if( success ) { + // + // We always calculate the image size. It does not take long and at least the mixed job needs it + // anyway + // + startSizeCalculation(); + } + else { + if( d->dataPreparationJob->hasBeenCanceled() ) { + m_canceled = true; + emit canceled(); + } + jobFinished( false ); + } +} + + +void K3bIsoImager::calculateSize() +{ + jobStarted(); + startSizeCalculation(); +} + + +void K3bIsoImager::startSizeCalculation() +{ + d->mkisofsBin = initMkisofs(); + if( !d->mkisofsBin ) { + jobFinished( false ); + return; + } + + initVariables(); + + delete m_process; + m_process = new K3bProcess(); + m_process->setRunPrivileged(true); + m_process->setSplitStdout(true); + + emit debuggingOutput( "Used versions", "mkisofs: " + d->mkisofsBin->version ); + + *m_process << d->mkisofsBin; + + if( !prepareMkisofsFiles() || + !addMkisofsParameters(true) ) { + cleanup(); + jobFinished( false ); + return; + } + + // add empty dummy dir since one path-spec is needed + // ??? Seems it is not needed after all. At least mkisofs 1.14 and above don't need it. ??? + // *m_process << dummyDir(); + + kdDebug() << "***** mkisofs calculate size parameters:\n"; + const QValueList& args = m_process->args(); + QString s; + for( QValueList::const_iterator it = args.begin(); it != args.end(); ++it ) { + s += *it + " "; + } + kdDebug() << s << endl << flush; + emit debuggingOutput("mkisofs calculate size command:", s); + + // since output changed during mkisofs version changes we grab both + // stdout and stderr + + // mkisofs version >= 1.15 (don't know about 1.14!) + // the extends on stdout (as lonely number) + // and error and warning messages on stderr + + // mkisofs >= 1.13 + // everything is written to stderr + // last line is: "Total extents scheduled to be written = XXXXX" + + // TODO: use K3bProcess::OutputCollector instead iof our own two slots. + + connect( m_process, SIGNAL(receivedStderr(KProcess*, char*, int)), + this, SLOT(slotCollectMkisofsPrintSizeStderr(KProcess*, char*, int)) ); + connect( m_process, SIGNAL(stdoutLine(const QString&)), + this, SLOT(slotCollectMkisofsPrintSizeStdout(const QString&)) ); + connect( m_process, SIGNAL(processExited(KProcess*)), + this, SLOT(slotMkisofsPrintSizeFinished()) ); + + // we also want error messages + connect( m_process, SIGNAL(stderrLine( const QString& )), + this, SLOT(slotReceivedStderr( const QString& )) ); + + m_collectedMkisofsPrintSizeStdout = QString::null; + m_collectedMkisofsPrintSizeStderr = QString::null; + m_mkisofsPrintSizeResult = 0; + + if( !m_process->start( KProcess::NotifyOnExit, KProcess::AllOutput ) ) { + emit infoMessage( i18n("Could not start %1.").arg("mkisofs"), K3bJob::ERROR ); + cleanup(); + + jobFinished( false ); + return; + } +} + + +void K3bIsoImager::slotCollectMkisofsPrintSizeStderr(KProcess*, char* data , int len) +{ + emit debuggingOutput( "mkisofs", QString::fromLocal8Bit( data, len ) ); + m_collectedMkisofsPrintSizeStderr.append( QString::fromLocal8Bit( data, len ) ); +} + + +void K3bIsoImager::slotCollectMkisofsPrintSizeStdout( const QString& line ) +{ + // newer versions of mkisofs outut additional lines of junk before the size :( + // so we only use the last line + emit debuggingOutput( "mkisofs", line ); + m_collectedMkisofsPrintSizeStdout = line; +} + + +void K3bIsoImager::slotMkisofsPrintSizeFinished() +{ + if( m_canceled ) { + emit canceled(); + jobFinished( false ); + return; + } + + bool success = true; + + // if m_collectedMkisofsPrintSizeStdout is not empty we have a recent version of + // mkisofs and parsing is very easy (s.o.) + if( !m_collectedMkisofsPrintSizeStdout.isEmpty() ) { + kdDebug() << "(K3bIsoImager) iso size: " << m_collectedMkisofsPrintSizeStdout << endl; + m_mkisofsPrintSizeResult = m_collectedMkisofsPrintSizeStdout.toInt( &success ); + } + else { + // parse the stderr output + // I hope parsing the last line is enough! + int pos = m_collectedMkisofsPrintSizeStderr.findRev( "extents scheduled to be written" ); + + if( pos == -1 ) + success = false; + else + m_mkisofsPrintSizeResult = m_collectedMkisofsPrintSizeStderr.mid( pos+33 ).toInt( &success ); + } + + emit debuggingOutput( "K3bIsoImager", + QString("mkisofs print size result: %1 (%2 bytes)") + .arg(m_mkisofsPrintSizeResult) + .arg(Q_UINT64(m_mkisofsPrintSizeResult)*2048ULL) ); + + cleanup(); + + + if( success ) { + jobFinished( true ); + } + else { + m_mkisofsPrintSizeResult = 0; + kdDebug() << "(K3bIsoImager) Parsing mkisofs -print-size failed: " << m_collectedMkisofsPrintSizeStdout << endl; + emit infoMessage( i18n("Could not determine size of resulting image file."), ERROR ); + jobFinished( false ); + } +} + + +void K3bIsoImager::initVariables() +{ + m_containsFilesWithMultibleBackslashes = false; + m_processExited = false; + m_canceled = false; + d->knownError = false; + + // determine symlink handling + // follow links superseeds discard all links which superseeds discard broken links + // without rockridge we follow the links or discard all + if( m_doc->isoOptions().followSymbolicLinks() ) + d->usedLinkHandling = Private::FOLLOW; + else if( m_doc->isoOptions().discardSymlinks() ) + d->usedLinkHandling = Private::DISCARD_ALL; + else if( m_doc->isoOptions().createRockRidge() ) { + if( m_doc->isoOptions().discardBrokenSymlinks() ) + d->usedLinkHandling = Private::DISCARD_BROKEN; + else + d->usedLinkHandling = Private::KEEP_ALL; + } + else { + d->usedLinkHandling = Private::FOLLOW; + } + + m_sessionNumber = s_imagerSessionCounter++; +} + + +void K3bIsoImager::start() +{ + jobStarted(); + + cleanup(); + + d->mkisofsBin = initMkisofs(); + if( !d->mkisofsBin ) { + jobFinished( false ); + return; + } + + initVariables(); + + m_process = new K3bProcess(); + m_process->setRunPrivileged(true); + + *m_process << d->mkisofsBin; + + // prepare the filenames as written to the image + m_doc->prepareFilenames(); + + if( !prepareMkisofsFiles() || + !addMkisofsParameters() ) { + cleanup(); + jobFinished( false ); + return; + } + + connect( m_process, SIGNAL(processExited(KProcess*)), + this, SLOT(slotProcessExited(KProcess*)) ); + + connect( m_process, SIGNAL(stderrLine( const QString& )), + this, SLOT(slotReceivedStderr( const QString& )) ); + + // + // Check the image file + if( m_fdToWriteTo == -1 ) { + d->imageFile.setName( d->imagePath ); + if( !d->imageFile.open( IO_WriteOnly ) ) { + emit infoMessage( i18n("Could not open %1 for writing").arg(d->imagePath), ERROR ); + cleanup(); + jobFinished(false); + return; + } + } + + // + // Open the active pipe which does the streaming + delete d->pipe; + if( m_doc->verifyData() ) + d->pipe = new K3bChecksumPipe(); + else + d->pipe = new K3bActivePipe(); + + if( m_fdToWriteTo == -1 ) + d->pipe->writeToIODevice( &d->imageFile ); + else + d->pipe->writeToFd( m_fdToWriteTo ); + d->pipe->open(); + m_process->writeToFd( d->pipe->in() ); + + + kdDebug() << "***** mkisofs parameters:\n"; + const QValueList& args = m_process->args(); + QString s; + for( QValueList::const_iterator it = args.begin(); it != args.end(); ++it ) { + s += *it + " "; + } + kdDebug() << s << endl << flush; + emit debuggingOutput("mkisofs command:", s); + + if( !m_process->start( KProcess::NotifyOnExit, KProcess::AllOutput) ) { + // something went wrong when starting the program + // it "should" be the executable + kdDebug() << "(K3bIsoImager) could not start mkisofs" << endl; + emit infoMessage( i18n("Could not start %1.").arg("mkisofs"), K3bJob::ERROR ); + jobFinished( false ); + cleanup(); + } +} + + +void K3bIsoImager::cancel() +{ + m_canceled = true; + + if( m_process && !m_processExited ) { + m_process->kill(); + } + else if( active() ) { + emit canceled(); + jobFinished(false); + } +} + + +void K3bIsoImager::setMultiSessionInfo( const QString& info, K3bDevice::Device* dev ) +{ + m_multiSessionInfo = info; + m_device = dev; +} + + +// iso9660 + RR use some latin1 variant. So we need to cut the desc fields +// counting 8bit chars. The GUI should take care of restricting the length +// and the charset +static void truncateTheHardWay( QString& s, int max ) +{ + QCString cs = s.utf8(); + cs.truncate(max); + s = QString::fromUtf8( cs ); +} + + +bool K3bIsoImager::addMkisofsParameters( bool printSize ) +{ + // add multisession info + if( !m_multiSessionInfo.isEmpty() ) { + *m_process << "-cdrecord-params" << m_multiSessionInfo; + if( m_device ) + *m_process << "-prev-session" << m_device->blockDeviceName(); + } + + // add the arguments + *m_process << "-gui"; + *m_process << "-graft-points"; + + if( printSize ) + *m_process << "-print-size" << "-quiet"; + + if( !m_doc->isoOptions().volumeID().isEmpty() ) { + QString s = m_doc->isoOptions().volumeID(); + truncateTheHardWay(s, 32); // ensure max length + *m_process << "-volid" << s; + } + else { + emit infoMessage( i18n("No volume id specified. Using default."), WARNING ); + *m_process << "-volid" << "CDROM"; + } + + QString s = m_doc->isoOptions().volumeSetId(); + truncateTheHardWay(s, 128); // ensure max length + *m_process << "-volset" << s; + + s = m_doc->isoOptions().applicationID(); + truncateTheHardWay(s, 128); // ensure max length + *m_process << "-appid" << s; + + s = m_doc->isoOptions().publisher(); + truncateTheHardWay(s, 128); // ensure max length + *m_process << "-publisher" << s; + + s = m_doc->isoOptions().preparer(); + truncateTheHardWay(s, 128); // ensure max length + *m_process << "-preparer" << s; + + s = m_doc->isoOptions().systemId(); + truncateTheHardWay(s, 32); // ensure max length + *m_process << "-sysid" << s; + + s = m_doc->isoOptions().abstractFile(); + truncateTheHardWay(s, 37); // ensure max length + if ( !s.isEmpty() ) + *m_process << "-abstract" << s; + + s = m_doc->isoOptions().copyrightFile(); + truncateTheHardWay(s, 37); // ensure max length + if ( !s.isEmpty() ) + *m_process << "-copyright" << s; + + s = m_doc->isoOptions().bibliographFile(); + truncateTheHardWay(s, 37); // ensure max length + if ( !s.isEmpty() ) + *m_process << "-biblio" << s; + + int volsetSize = m_doc->isoOptions().volumeSetSize(); + int volsetSeqNo = m_doc->isoOptions().volumeSetNumber(); + if( volsetSeqNo > volsetSize ) { + kdDebug() << "(K3bIsoImager) invalid volume set sequence number: " << volsetSeqNo + << " with volume set size: " << volsetSize << endl; + volsetSeqNo = volsetSize; + } + *m_process << "-volset-size" << QString::number(volsetSize); + *m_process << "-volset-seqno" << QString::number(volsetSeqNo); + + if( m_sortWeightFile ) { + *m_process << "-sort" << m_sortWeightFile->name(); + } + + if( m_doc->isoOptions().createRockRidge() ) { + if( m_doc->isoOptions().preserveFilePermissions() ) + *m_process << "-rock"; + else + *m_process << "-rational-rock"; + if( m_rrHideFile ) + *m_process << "-hide-list" << m_rrHideFile->name(); + } + + if( m_doc->isoOptions().createJoliet() ) { + *m_process << "-joliet"; + if( m_doc->isoOptions().jolietLong() ) + *m_process << "-joliet-long"; + if( m_jolietHideFile ) + *m_process << "-hide-joliet-list" << m_jolietHideFile->name(); + } + + if( m_doc->isoOptions().doNotCacheInodes() ) + *m_process << "-no-cache-inodes"; + + // + // Check if we have files > 2 GB and enable udf in that case. + // + bool filesGreaterThan2Gb = false; + K3bDataItem* item = m_doc->root(); + while( (item = item->nextSibling()) ) { + if( item->isFile() && item->size() > 2LL*1024LL*1024LL*1024LL ) { + filesGreaterThan2Gb = true; + break; + } + } + + if( filesGreaterThan2Gb ) { + emit infoMessage( i18n("Found files bigger than 2 GB. These files will only be fully accessible if mounted with UDF."), + WARNING ); + + // in genisoimage 1.1.3 "they" silently introduced this aweful parameter + if ( d->mkisofsBin->hasFeature( "genisoimage" ) && d->mkisofsBin->version >= K3bVersion( 1, 1, 3 ) ) { + *m_process << "-allow-limited-size"; + } + } + + bool udf = m_doc->isoOptions().createUdf(); + if( !udf && filesGreaterThan2Gb ) { + emit infoMessage( i18n("Enabling UDF extension."), INFO ); + udf = true; + } + if( udf ) + *m_process << "-udf"; + + if( m_doc->isoOptions().ISOuntranslatedFilenames() ) { + *m_process << "-untranslated-filenames"; + } + else { + if( m_doc->isoOptions().ISOallowPeriodAtBegin() ) + *m_process << "-allow-leading-dots"; + if( m_doc->isoOptions().ISOallow31charFilenames() ) + *m_process << "-full-iso9660-filenames"; + if( m_doc->isoOptions().ISOomitVersionNumbers() && !m_doc->isoOptions().ISOmaxFilenameLength() ) + *m_process << "-omit-version-number"; + if( m_doc->isoOptions().ISOrelaxedFilenames() ) + *m_process << "-relaxed-filenames"; + if( m_doc->isoOptions().ISOallowLowercase() ) + *m_process << "-allow-lowercase"; + if( m_doc->isoOptions().ISOnoIsoTranslate() ) + *m_process << "-no-iso-translate"; + if( m_doc->isoOptions().ISOallowMultiDot() ) + *m_process << "-allow-multidot"; + if( m_doc->isoOptions().ISOomitTrailingPeriod() ) + *m_process << "-omit-period"; + } + + if( m_doc->isoOptions().ISOmaxFilenameLength() ) + *m_process << "-max-iso9660-filenames"; + + if( m_noDeepDirectoryRelocation ) + *m_process << "-disable-deep-relocation"; + + // We do our own following +// if( m_doc->isoOptions().followSymbolicLinks() || !m_doc->isoOptions().createRockRidge() ) +// *m_process << "-follow-links"; + + if( m_doc->isoOptions().createTRANS_TBL() ) + *m_process << "-translation-table"; + if( m_doc->isoOptions().hideTRANS_TBL() ) + *m_process << "-hide-joliet-trans-tbl"; + + *m_process << "-iso-level" << QString::number(m_doc->isoOptions().ISOLevel()); + + if( m_doc->isoOptions().forceInputCharset() ) + *m_process << "-input-charset" << m_doc->isoOptions().inputCharset(); + + *m_process << "-path-list" << QFile::encodeName(m_pathSpecFile->name()); + + + // boot stuff + if( !m_doc->bootImages().isEmpty() ) { + bool first = true; + for( QPtrListIterator it( m_doc->bootImages() ); + *it; ++it ) { + if( !first ) + *m_process << "-eltorito-alt-boot"; + + K3bBootItem* bootItem = *it; + + *m_process << "-eltorito-boot"; + *m_process << bootItem->writtenPath(); + + if( bootItem->imageType() == K3bBootItem::HARDDISK ) { + *m_process << "-hard-disk-boot"; + } + else if( bootItem->imageType() == K3bBootItem::NONE ) { + *m_process << "-no-emul-boot"; + if( bootItem->loadSegment() > 0 ) + *m_process << "-boot-load-seg" << QString::number(bootItem->loadSegment()); + if( bootItem->loadSize() > 0 ) + *m_process << "-boot-load-size" << QString::number(bootItem->loadSize()); + } + + if( bootItem->imageType() != K3bBootItem::NONE && bootItem->noBoot() ) + *m_process << "-no-boot"; + if( bootItem->bootInfoTable() ) + *m_process << "-boot-info-table"; + + first = false; + } + + *m_process << "-eltorito-catalog" << m_doc->bootCataloge()->writtenPath(); + } + + + // additional parameters from config + const QStringList& params = k3bcore->externalBinManager()->binObject( "mkisofs" )->userParameters(); + for( QStringList::const_iterator it = params.begin(); it != params.end(); ++it ) + *m_process << *it; + + return true; +} + + +int K3bIsoImager::writePathSpec() +{ + delete m_pathSpecFile; + m_pathSpecFile = new KTempFile(); + m_pathSpecFile->setAutoDelete(true); + + if( QTextStream* t = m_pathSpecFile->textStream() ) { + // recursive path spec writing + int num = writePathSpecForDir( m_doc->root(), *t ); + + m_pathSpecFile->close(); + + return num; + } + else + return -1; +} + + +int K3bIsoImager::writePathSpecForDir( K3bDirItem* dirItem, QTextStream& stream ) +{ + if( !m_noDeepDirectoryRelocation && dirItem->depth() > 7 ) { + kdDebug() << "(K3bIsoImager) found directory depth > 7. Enabling no deep directory relocation." << endl; + m_noDeepDirectoryRelocation = true; + } + + // now create the graft points + int num = 0; + for( QPtrListIterator it( dirItem->children() ); it.current(); ++it ) { + K3bDataItem* item = it.current(); + bool writeItem = item->writeToCd(); + + if( item->isSymLink() ) { + if( d->usedLinkHandling == Private::DISCARD_ALL || + ( d->usedLinkHandling == Private::DISCARD_BROKEN && + !item->isValid() ) ) + writeItem = false; + + else if( d->usedLinkHandling == Private::FOLLOW ) { + QFileInfo f( K3b::resolveLink( item->localPath() ) ); + if( !f.exists() ) { + emit infoMessage( i18n("Could not follow link %1 to non-existing file %2. Skipping...") + .arg(item->k3bName()) + .arg(f.filePath()), WARNING ); + writeItem = false; + } + else if( f.isDir() ) { + emit infoMessage( i18n("Ignoring link %1 to folder %2. K3b is unable to follow links to folders.") + .arg(item->k3bName()) + .arg(f.filePath()), WARNING ); + writeItem = false; + } + } + } + else if( item->isFile() ) { + QFileInfo f( item->localPath() ); + if( !f.exists() ) { + emit infoMessage( i18n("Could not find file %1. Skipping...").arg(item->localPath()), WARNING ); + writeItem = false; + } + else if( !f.isReadable() ) { + emit infoMessage( i18n("Could not read file %1. Skipping...").arg(item->localPath()), WARNING ); + writeItem = false; + } + } + + if( writeItem ) { + num++; + + // some versions of mkisofs seem to have a bug that prevents to use filenames + // that contain one or more backslashes + if( item->writtenPath().contains("\\") ) + m_containsFilesWithMultibleBackslashes = true; + + + if( item->isDir() ) { + stream << escapeGraftPoint( item->writtenPath() ) + << "=" + << escapeGraftPoint( dummyDir( static_cast(item) ) ) << "\n"; + + int x = writePathSpecForDir( dynamic_cast(item), stream ); + if( x >= 0 ) + num += x; + else + return -1; + } + else { + writePathSpecForFile( static_cast(item), stream ); + } + } + } + + return num; +} + + +void K3bIsoImager::writePathSpecForFile( K3bFileItem* item, QTextStream& stream ) +{ + stream << escapeGraftPoint( item->writtenPath() ) + << "="; + + if( m_doc->bootImages().containsRef( dynamic_cast(item) ) ) { // boot-image-backup-hack + + // create temp file + KTempFile temp; + QString tempPath = temp.name(); + temp.unlink(); + + if( !KIO::NetAccess::copy( KURL(item->localPath()), KURL::fromPathOrURL(tempPath) ) ) { + emit infoMessage( i18n("Failed to backup boot image file %1").arg(item->localPath()), ERROR ); + return; + } + + static_cast(item)->setTempPath( tempPath ); + + m_tempFiles.append(tempPath); + stream << escapeGraftPoint( tempPath ) << "\n"; + } + else if( item->isSymLink() && d->usedLinkHandling == Private::FOLLOW ) + stream << escapeGraftPoint( K3b::resolveLink( item->localPath() ) ) << "\n"; + else + stream << escapeGraftPoint( item->localPath() ) << "\n"; +} + + +bool K3bIsoImager::writeRRHideFile() +{ + delete m_rrHideFile; + m_rrHideFile = new KTempFile(); + m_rrHideFile->setAutoDelete(true); + + if( QTextStream* t = m_rrHideFile->textStream() ) { + + K3bDataItem* item = m_doc->root(); + while( item ) { + if( item->hideOnRockRidge() ) { + if( !item->isDir() ) // hiding directories does not work (all dirs point to the dummy-dir) + *t << escapeGraftPoint( item->localPath() ) << endl; + } + item = item->nextSibling(); + } + + m_rrHideFile->close(); + return true; + } + else + return false; +} + + +bool K3bIsoImager::writeJolietHideFile() +{ + delete m_jolietHideFile; + m_jolietHideFile = new KTempFile(); + m_jolietHideFile->setAutoDelete(true); + + if( QTextStream* t = m_jolietHideFile->textStream() ) { + + K3bDataItem* item = m_doc->root(); + while( item ) { + if( item->hideOnRockRidge() ) { + if( !item->isDir() ) // hiding directories does not work (all dirs point to the dummy-dir but we could introduce a second hidden dummy dir) + *t << escapeGraftPoint( item->localPath() ) << endl; + } + item = item->nextSibling(); + } + + m_jolietHideFile->close(); + return true; + } + else + return false; +} + + +bool K3bIsoImager::writeSortWeightFile() +{ + delete m_sortWeightFile; + m_sortWeightFile = new KTempFile(); + m_sortWeightFile->setAutoDelete(true); + + if( QTextStream* t = m_sortWeightFile->textStream() ) { + // + // We need to write the local path in combination with the sort weight + // mkisofs will take care of multiple entries for one local file and always + // use the highest weight + // + K3bDataItem* item = m_doc->root(); + while( (item = item->nextSibling()) ) { // we skip the root here + if( item->sortWeight() != 0 ) { + if( m_doc->bootImages().containsRef( dynamic_cast(item) ) ) { // boot-image-backup-hack + *t << escapeGraftPoint( static_cast(item)->tempPath() ) << " " << item->sortWeight() << endl; + } + else if( item->isDir() ) { + // + // Since we use dummy dirs for all directories in the filesystem and mkisofs uses the local path + // for sorting we need to create a different dummy dir for every sort weight value. + // + *t << escapeGraftPoint( dummyDir( static_cast(item) ) ) << " " << item->sortWeight() << endl; + } + else + *t << escapeGraftPoint( item->localPath() ) << " " << item->sortWeight() << endl; + } + } + + m_sortWeightFile->close(); + return true; + } + else + return false; +} + + +QString K3bIsoImager::escapeGraftPoint( const QString& str ) +{ + QString enc = str; + + // + // mkisofs manpage (-graft-points) is incorrect (as of mkisofs 2.01.01) + // + // Actually an equal sign needs to be escaped with one backslash only + // Single backslashes inside a filename can be used without change + // while single backslashes at the end of a filename need to be escaped + // with two backslashes. + // + // There is one more problem though: the name in the iso tree can never + // in any number of backslashes. mkisofs simply cannot handle it. So we + // need to remove these slashes somewhere or ignore those files (we do + // that in K3bDataDoc::addUrls) + // + + // + // we do not use QString::replace to have full control + // this might be slow since QString::insert is slow but we don't care + // since this is only called to prepare the iso creation which is not + // time critical. :) + // + + unsigned int pos = 0; + while( pos < enc.length() ) { + // escape every equal sign with one backslash + if( enc[pos] == '=' ) { + enc.insert( pos, "\\" ); + pos += 2; + } + else if( enc[pos] == '\\' ) { + // escape every occurrence of two backslashes with two backslashes + if( pos+1 < enc.length() && enc[pos+1] == '\\' ) { + enc.insert( pos, "\\\\" ); + pos += 4; + } + // escape the last single backslash in the filename (see above) + else if( pos == enc.length()-1 ) { + enc.insert( pos, "\\" ); + pos += 2; + } + else + ++pos; + } + else + ++pos; + } + +// enc.replace( "\\\\", "\\\\\\\\" ); +// enc.replace( "=", "\\=" ); + + return enc; +} + + +bool K3bIsoImager::prepareMkisofsFiles() +{ + // write path spec file + // ---------------------------------------------------- + int num = writePathSpec(); + if( num < 0 ) { + emit infoMessage( i18n("Could not write temporary file"), K3bJob::ERROR ); + return false; + } + else if( num == 0 ) { + emit infoMessage( i18n("No files to be written."), K3bJob::ERROR ); + return false; + } + + if( m_doc->isoOptions().createRockRidge() ) { + if( !writeRRHideFile() ) { + emit infoMessage( i18n("Could not write temporary file"), K3bJob::ERROR ); + return false; + } + } + + if( m_doc->isoOptions().createJoliet() ) { + if( !writeJolietHideFile() ) { + emit infoMessage( i18n("Could not write temporary file"), K3bJob::ERROR ); + return false ; + } + } + + if( !writeSortWeightFile() ) { + emit infoMessage( i18n("Could not write temporary file"), K3bJob::ERROR ); + return false; + } + + return true; +} + + +QString K3bIsoImager::dummyDir( K3bDirItem* dir ) +{ + // + // since we use virtual folders in order to have folders with different weight factors and different + // permissions we create different dummy dirs to be passed to mkisofs + // + + QDir _appDir( locateLocal( "appdata", "temp/" ) ); + + // + // create a unique isoimager session id + // This might become important in case we will allow multiple instances of the isoimager + // to run at the same time. + // + QString jobId = qApp->sessionId() + "_" + QString::number( m_sessionNumber ); + + if( !_appDir.cd( jobId ) ) { + _appDir.mkdir( jobId ); + _appDir.cd( jobId ); + } + + QString name( "dummydir_" ); + name += QString::number( dir->sortWeight() ); + + bool perm = false; + k3b_struct_stat statBuf; + if( !dir->localPath().isEmpty() ) { + // permissions + if( k3b_stat( QFile::encodeName(dir->localPath()), &statBuf ) == 0 ) { + name += "_"; + name += QString::number( statBuf.st_uid ); + name += "_"; + name += QString::number( statBuf.st_gid ); + name += "_"; + name += QString::number( statBuf.st_mode ); + name += "_"; + name += QString::number( statBuf.st_mtime ); + + perm = true; + } + } + + + if( !_appDir.cd( name ) ) { + + kdDebug() << "(K3bIsoImager) creating dummy dir: " << _appDir.absPath() << "/" << name << endl; + + _appDir.mkdir( name ); + _appDir.cd( name ); + + if( perm ) { + ::chmod( QFile::encodeName( _appDir.absPath() ), statBuf.st_mode ); + ::chown( QFile::encodeName( _appDir.absPath() ), statBuf.st_uid, statBuf.st_gid ); + struct utimbuf tb; + tb.actime = tb.modtime = statBuf.st_mtime; + ::utime( QFile::encodeName( _appDir.absPath() ), &tb ); + } + } + + return _appDir.absPath() + "/"; +} + + +void K3bIsoImager::clearDummyDirs() +{ + QString jobId = qApp->sessionId() + "_" + QString::number( m_sessionNumber ); + QDir appDir( locateLocal( "appdata", "temp/" ) ); + if( appDir.cd( jobId ) ) { + QStringList dummyDirEntries = appDir.entryList( "dummydir*", QDir::Dirs ); + for( QStringList::iterator it = dummyDirEntries.begin(); it != dummyDirEntries.end(); ++it ) + appDir.rmdir( *it ); + appDir.cdUp(); + appDir.rmdir( jobId ); + } +} + + +QCString K3bIsoImager::checksum() const +{ + if( K3bChecksumPipe* p = dynamic_cast( d->pipe ) ) + return p->checksum(); + else + return QCString(); +} + + +bool K3bIsoImager::hasBeenCanceled() const +{ + return m_canceled; +} + +#include "k3bisoimager.moc" diff --git a/libk3b/projects/datacd/k3bisoimager.h b/libk3b/projects/datacd/k3bisoimager.h new file mode 100644 index 0000000..82501ba --- /dev/null +++ b/libk3b/projects/datacd/k3bisoimager.h @@ -0,0 +1,188 @@ +/* + * + * $Id: k3bisoimager.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef K3B_ISO_IMAGER_H +#define K3B_ISO_IMAGER_H + +#include +#include "k3bmkisofshandler.h" + +#include +#include + +class K3bDataDoc; +class K3bDirItem; +class K3bDataItem; +class K3bFileItem; +class QTextStream; +class K3bProcess; +class KProcess; +class K3bDevice::Device; +class KTempFile; + + +class K3bIsoImager : public K3bJob, public K3bMkisofsHandler +{ + Q_OBJECT + + public: + K3bIsoImager( K3bDataDoc*, K3bJobHandler*, QObject* parent = 0, const char* name = 0 ); + virtual ~K3bIsoImager(); + + virtual bool active() const; + + int size() const { return m_mkisofsPrintSizeResult; } + + virtual bool hasBeenCanceled() const; + + /** + * Get the checksum calculated during the creation of the image. + */ + QCString checksum() const; + + public slots: + /** + * Starts the actual image creation. Always run init() + * before starting the image creation + */ + virtual void start(); + virtual void cancel(); + + /** + * Initialize the image creator. This calculates the image size and performs + * some checks on the project. + * + * The initialization process also finishes with the finished() signal just + * like a normal job operation. Get the calculated image size via size() + */ + virtual void init(); + + /** + * Only calculates the size of the image without the additional checks in + * init() + * + * Use this if you need to recalculate the image size for example if the + * multisession info changed. + */ + virtual void calculateSize(); + + /** + * lets the isoimager write directly into fd instead of writing + * to an image file. + * Be aware that this only makes sense before starting the job. + * To disable just set @p fd to -1 + */ + void writeToFd( int fd ); + + void writeToImageFile( const QString& path ); + + /** + * If dev == 0 K3bIsoImager will ignore the data in the previous session. + * This is usable for CD-Extra. + */ + void setMultiSessionInfo( const QString&, K3bDevice::Device* dev = 0 ); + + K3bDevice::Device* device() const { return m_device; } + K3bDataDoc* doc() const { return m_doc; } + + protected: + virtual void handleMkisofsProgress( int ); + virtual void handleMkisofsInfoMessage( const QString&, int ); + + virtual bool addMkisofsParameters( bool printSize = false ); + + /** + * calls writePathSpec, writeRRHideFile, and writeJolietHideFile + */ + bool prepareMkisofsFiles(); + + /** + * The dummy dir is used to create dirs on the iso-filesystem. + * + * @return an empty dummy dir for use with K3bDirItems. + */ + QString dummyDir( K3bDirItem* ); + + void outputData(); + void initVariables(); + virtual void cleanup(); + void clearDummyDirs(); + + /** + * @returns The number of entries written or -1 on error + */ + virtual int writePathSpec(); + bool writeRRHideFile(); + bool writeJolietHideFile(); + bool writeSortWeightFile(); + + // used by writePathSpec + virtual int writePathSpecForDir( K3bDirItem* dirItem, QTextStream& stream ); + virtual void writePathSpecForFile( K3bFileItem*, QTextStream& stream ); + QString escapeGraftPoint( const QString& str ); + + KTempFile* m_pathSpecFile; + KTempFile* m_rrHideFile; + KTempFile* m_jolietHideFile; + KTempFile* m_sortWeightFile; + + K3bProcess* m_process; + + bool m_processExited; + bool m_canceled; + + protected slots: + virtual void slotReceivedStderr( const QString& ); + virtual void slotProcessExited( KProcess* ); + + private slots: + void slotCollectMkisofsPrintSizeStderr(KProcess*, char*, int); + void slotCollectMkisofsPrintSizeStdout( const QString& ); + void slotMkisofsPrintSizeFinished(); + void slotDataPreparationDone( bool success ); + + private: + void startSizeCalculation(); + + class Private; + Private* d; + + K3bDataDoc* m_doc; + + bool m_noDeepDirectoryRelocation; + + bool m_importSession; + QString m_multiSessionInfo; + K3bDevice::Device* m_device; + + // used for mkisofs -print-size parsing + QString m_collectedMkisofsPrintSizeStdout; + QString m_collectedMkisofsPrintSizeStderr; + int m_mkisofsPrintSizeResult; + + QStringList m_tempFiles; + + int m_fdToWriteTo; + + bool m_containsFilesWithMultibleBackslashes; + + // used to create a unique session id + static int s_imagerSessionCounter; + + int m_sessionNumber; +}; + + +#endif diff --git a/libk3b/projects/datacd/k3bisooptions.cpp b/libk3b/projects/datacd/k3bisooptions.cpp new file mode 100644 index 0000000..bd7314d --- /dev/null +++ b/libk3b/projects/datacd/k3bisooptions.cpp @@ -0,0 +1,216 @@ +/* + * + * $Id: k3bisooptions.cpp 639665 2007-03-05 16:29:52Z trueg $ + * Copyright (C) 2003-2007 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bisooptions.h" +#include +#include +#include + +#include +#include +#include + + +K3bIsoOptions::K3bIsoOptions() + : m_volumeID( "K3b data project" ), + m_applicationID( QString("K3B THE CD KREATOR (C) 1998-2006 SEBASTIAN TRUEG AND THE K3B TEAM") ), + m_systemId( K3b::systemName().upper() ), + m_inputCharset( "iso8859-1" ), + m_whiteSpaceTreatmentReplaceString( "_" ) +{ + m_bForceInputCharset = false; + + m_createRockRidge = true; + m_createJoliet = true; + m_createUdf = false; + m_ISOallowLowercase = false; + m_ISOallowPeriodAtBegin = false; + m_ISOallow31charFilenames = true; + m_ISOomitVersionNumbers = false; + m_ISOomitTrailingPeriod = false; + m_ISOmaxFilenameLength = false; + m_ISOrelaxedFilenames = false; + m_ISOnoIsoTranslate = false; + m_ISOallowMultiDot = false; + m_ISOuntranslatedFilenames = false; + m_followSymbolicLinks = false; + m_createTRANS_TBL = false; + m_hideTRANS_TBL = false; + m_jolietLong = true; + + m_doNotCacheInodes = true; + + m_isoLevel = 2; + + m_discardSymlinks = false; + m_discardBrokenSymlinks = false; + + m_preserveFilePermissions = false; + + m_whiteSpaceTreatment = noChange; + + m_volumeSetSize = 1; + m_volumeSetNumber = 1; +} + + +void K3bIsoOptions::save( KConfigBase* c, bool saveVolumeDesc ) +{ + if( saveVolumeDesc ) { + c->writeEntry( "volume id", m_volumeID ); + c->writeEntry( "application id", m_applicationID ); + c->writeEntry( "preparer", m_preparer ); + c->writeEntry( "publisher", m_publisher ); + c->writeEntry( "system id", m_systemId ); + c->writeEntry( "volume set id", m_volumeSetId ); + c->writeEntry( "volume set size", m_volumeSetSize ); + c->writeEntry( "volume set number", m_volumeSetNumber ); + c->writeEntry( "abstract file", m_abstractFile ); + c->writeEntry( "copyright file", m_copyrightFile ); + c->writeEntry( "bibliograph file", m_bibliographFile ); + } + + c->writeEntry( "rock_ridge", m_createRockRidge ); + c->writeEntry( "joliet", m_createJoliet ); + c->writeEntry( "udf", m_createUdf ); + + // save iso-level + c->writeEntry( "iso_level", m_isoLevel ); + + c->writeEntry( "create TRANS_TBL", m_createTRANS_TBL ); + c->writeEntry( "hide TRANS_TBL", m_hideTRANS_TBL ); + c->writeEntry( "untranslated filenames", m_ISOuntranslatedFilenames ); + c->writeEntry( "allow 31 character filenames", m_ISOallow31charFilenames ); + c->writeEntry( "max ISO filenames", m_ISOmaxFilenameLength ); + c->writeEntry( "allow beginning period", m_ISOallowPeriodAtBegin ); + c->writeEntry( "relaxed filenames", m_ISOrelaxedFilenames ); + c->writeEntry( "omit version numbers", m_ISOomitVersionNumbers ); + c->writeEntry( "omit trailing period", m_ISOomitTrailingPeriod ); + c->writeEntry( "no iSO translation", m_ISOnoIsoTranslate ); + c->writeEntry( "allow multiple dots", m_ISOallowMultiDot ); + c->writeEntry( "allow lowercase filenames", m_ISOallowLowercase ); + // c->writeEntry( "follow symbolic links", m_followSymbolicLinks ); + + c->writeEntry( "joliet long", m_jolietLong ); + + c->writeEntry( "force input charset", m_bForceInputCharset ); + c->writeEntry( "input charset", m_inputCharset ); + + c->writeEntry( "do not cache inodes", m_doNotCacheInodes ); + + // save whitespace-treatment + switch( m_whiteSpaceTreatment ) { + case strip: + c->writeEntry( "white_space_treatment", "strip" ); + break; + case extended: + c->writeEntry( "white_space_treatment", "extended" ); + break; + case replace: + c->writeEntry( "white_space_treatment", "replace" ); + break; + default: + c->writeEntry( "white_space_treatment", "noChange" ); + } + + c->writeEntry( "whitespace replace string", m_whiteSpaceTreatmentReplaceString ); + + c->writeEntry( "discard symlinks", discardSymlinks() ); + c->writeEntry( "discard broken symlinks", discardBrokenSymlinks() ); + + c->writeEntry( "preserve file permissions", m_preserveFilePermissions ); +} + + +K3bIsoOptions K3bIsoOptions::load( KConfigBase* c, bool loadVolumeDesc ) +{ + K3bIsoOptions options; + + if( loadVolumeDesc ) { + options.setVolumeID( c->readEntry( "volume id", options.volumeID() ) ); + options.setApplicationID( c->readEntry( "application id", options.applicationID() ) ); + options.setPreparer( c->readEntry( "preparer", options.preparer() ) ); + options.setPublisher( c->readEntry( "publisher", options.publisher() ) ); + options.setSystemId( c->readEntry( "system id", options.systemId() ) ); + options.setVolumeSetId( c->readEntry( "volume set id", options.volumeSetId() ) ); + options.setVolumeSetSize( c->readNumEntry( "volume set size", options.volumeSetSize() ) ); + options.setVolumeSetNumber( c->readNumEntry( "volume set number", options.volumeSetNumber() ) ); + options.setAbstractFile( c->readEntry( "abstract file", options.abstractFile() ) ); + options.setCoprightFile( c->readEntry( "copyright file", options.copyrightFile() ) ); + options.setBibliographFile( c->readEntry( "bibliograph file", options.bibliographFile() ) ); + } + + options.setForceInputCharset( c->readBoolEntry( "force input charset", options.forceInputCharset() ) ); + if( options.forceInputCharset() ) + options.setInputCharset( c->readEntry( "input charset", options.inputCharset() ) ); + + options.setCreateRockRidge( c->readBoolEntry( "rock_ridge", options.createRockRidge() ) ); + options.setCreateJoliet( c->readBoolEntry( "joliet", options.createJoliet() ) ); + options.setCreateUdf( c->readBoolEntry( "udf", options.createUdf() ) ); + + options.setISOLevel( c->readNumEntry( "iso_level", options.ISOLevel() ) ); + + options.setCreateTRANS_TBL( c->readBoolEntry( "create TRANS_TBL", options.createTRANS_TBL() ) ); + options.setHideTRANS_TBL( c->readBoolEntry( "hide TRANS_TBL", options.hideTRANS_TBL() ) ); + + // + // We need to use the memeber variables here instead of the access methods + // which do not return the actual value of the member variables but the value + // representing the use in mkisofs (i.e. ISOomitVersionNumbers is also enabled + // if ISOmaxFilenameLength is enabled. + // + options.setISOuntranslatedFilenames( c->readBoolEntry( "untranslated filenames", options.m_ISOuntranslatedFilenames ) ); + options.setISOallow31charFilenames( c->readBoolEntry( "allow 31 character filenames", options.m_ISOallow31charFilenames ) ); + options.setISOmaxFilenameLength( c->readBoolEntry( "max ISO filenames", options.m_ISOmaxFilenameLength ) ); + options.setISOallowPeriodAtBegin( c->readBoolEntry( "allow beginning period", options.m_ISOallowPeriodAtBegin ) ); + options.setISOrelaxedFilenames( c->readBoolEntry( "relaxed filenames", options.m_ISOrelaxedFilenames ) ); + options.setISOomitVersionNumbers( c->readBoolEntry( "omit version numbers", options.m_ISOomitVersionNumbers ) ); + options.setISOnoIsoTranslate( c->readBoolEntry( "no iSO translation", options.m_ISOnoIsoTranslate ) ); + options.setISOallowMultiDot( c->readBoolEntry( "allow multiple dots", options.m_ISOallowMultiDot ) ); + options.setISOallowLowercase( c->readBoolEntry( "allow lowercase filenames", options.m_ISOallowLowercase ) ); + options.setISOomitTrailingPeriod( c->readBoolEntry( "omit trailing period", options.m_ISOomitTrailingPeriod ) ); + + // options.setFollowSymbolicLinks( c->readBoolEntry( "follow symbolic links", options.m_followSymbolicLinks ) ); + + options.setJolietLong( c->readBoolEntry( "joliet long", options.jolietLong() ) ); + + options.setDoNotCacheInodes( c->readBoolEntry( "do not cache inodes", options.doNotCacheInodes() ) ); + + QString w = c->readEntry( "white_space_treatment", "noChange" ); + if( w == "replace" ) + options.setWhiteSpaceTreatment( replace ); + else if( w == "strip" ) + options.setWhiteSpaceTreatment( strip ); + else if( w == "extended" ) + options.setWhiteSpaceTreatment( extended ); + else + options.setWhiteSpaceTreatment( noChange ); + + options.setWhiteSpaceTreatmentReplaceString( c->readEntry( "whitespace replace string", options.whiteSpaceTreatmentReplaceString() ) ); + + options.setDiscardSymlinks( c->readBoolEntry("discard symlinks", options.discardSymlinks() ) ); + options.setDiscardBrokenSymlinks( c->readBoolEntry("discard broken symlinks", options.discardBrokenSymlinks() ) ); + + options.setPreserveFilePermissions( c->readBoolEntry( "preserve file permissions", options.preserveFilePermissions() ) ); + + return options; +} + + +K3bIsoOptions K3bIsoOptions::defaults() +{ + // let the constructor create defaults + return K3bIsoOptions(); +} diff --git a/libk3b/projects/datacd/k3bisooptions.h b/libk3b/projects/datacd/k3bisooptions.h new file mode 100644 index 0000000..254c998 --- /dev/null +++ b/libk3b/projects/datacd/k3bisooptions.h @@ -0,0 +1,183 @@ +/* + * + * $Id: k3bisooptions.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef K3B_ISO_OPTIONS_H +#define K3B_ISO_OPTIONS_H + +#include +#include "k3b_export.h" + +class KConfigBase; + + +class LIBK3B_EXPORT K3bIsoOptions +{ + public: + K3bIsoOptions(); + + bool forceInputCharset() const { return m_bForceInputCharset; } + const QString& inputCharset() const { return m_inputCharset; } + + void setForceInputCharset( bool b ) { m_bForceInputCharset = b; } + void setInputCharset( const QString& cs ) { m_inputCharset = cs; } + + + // -- mkisofs-options ---------------------------------------------------------------------- + bool createRockRidge() const { return m_createRockRidge; } + bool createJoliet() const { return m_createJoliet; } + bool createUdf() const { return m_createUdf; } + bool ISOallowLowercase() const { return m_ISOallowLowercase || ISOuntranslatedFilenames(); } + bool ISOallowPeriodAtBegin() const { return m_ISOallowPeriodAtBegin || ISOuntranslatedFilenames(); } + bool ISOallow31charFilenames() const { return m_ISOallow31charFilenames || ISOmaxFilenameLength() || ISOuntranslatedFilenames(); } + bool ISOomitVersionNumbers() const { return m_ISOomitVersionNumbers || ISOmaxFilenameLength(); } + bool ISOomitTrailingPeriod() const { return m_ISOomitTrailingPeriod || ISOuntranslatedFilenames(); } + bool ISOmaxFilenameLength() const { return m_ISOmaxFilenameLength || ISOuntranslatedFilenames(); } + bool ISOrelaxedFilenames() const { return m_ISOrelaxedFilenames || ISOuntranslatedFilenames(); } + bool ISOnoIsoTranslate() const { return m_ISOnoIsoTranslate; } + bool ISOallowMultiDot() const { return m_ISOallowMultiDot || ISOuntranslatedFilenames(); } + bool ISOuntranslatedFilenames() const { return m_ISOuntranslatedFilenames; } + bool followSymbolicLinks() const { return m_followSymbolicLinks; } + bool createTRANS_TBL() const { return m_createTRANS_TBL; } + bool hideTRANS_TBL() const { return m_hideTRANS_TBL; } + bool jolietLong() const { return m_jolietLong; } + + bool preserveFilePermissions() const { return m_preserveFilePermissions; } + + int ISOLevel() const { return m_isoLevel; } + const QString& systemId() const { return m_systemId; } + const QString& applicationID() const { return m_applicationID; } + const QString& volumeID() const { return m_volumeID; } + const QString& volumeSetId() const { return m_volumeSetId; } + int volumeSetSize() const { return m_volumeSetSize; } + int volumeSetNumber() const { return m_volumeSetNumber; } + const QString& publisher() const { return m_publisher; } + const QString& preparer() const { return m_preparer; } + const QString& abstractFile() const { return m_abstractFile; } + const QString& copyrightFile() const { return m_copyrightFile; } + const QString& bibliographFile() const { return m_bibliographFile; } + + void setCreateRockRidge( bool b ) { m_createRockRidge = b; } + void setCreateJoliet( bool b ) { m_createJoliet = b; } + void setCreateUdf( bool b ) { m_createUdf = b; } + void setISOallowLowercase( bool b ) { m_ISOallowLowercase = b; } + void setISOallowPeriodAtBegin( bool b ) { m_ISOallowPeriodAtBegin = b; } + void setISOallow31charFilenames( bool b ) { m_ISOallow31charFilenames = b; } + void setISOomitVersionNumbers( bool b ) { m_ISOomitVersionNumbers = b; } + void setISOomitTrailingPeriod( bool b ) { m_ISOomitTrailingPeriod = b; } + void setISOmaxFilenameLength( bool b ) { m_ISOmaxFilenameLength = b; } + void setISOrelaxedFilenames( bool b ) { m_ISOrelaxedFilenames = b; } + void setISOnoIsoTranslate( bool b ) { m_ISOnoIsoTranslate = b; } + void setISOallowMultiDot( bool b ) { m_ISOallowMultiDot = b; } + void setISOuntranslatedFilenames( bool b ) { m_ISOuntranslatedFilenames = b; } + void setFollowSymbolicLinks( bool b ) { m_followSymbolicLinks = b; } + void setCreateTRANS_TBL( bool b ) { m_createTRANS_TBL = b; } + void setHideTRANS_TBL( bool b ) { m_hideTRANS_TBL = b; } + void setJolietLong( bool b ) { m_jolietLong = b; } + + void setISOLevel( int i ) { m_isoLevel = i; } + void setSystemId( const QString& s ) { m_systemId = s; } + void setApplicationID( const QString& s ) { m_applicationID = s; } + + /** + * Set the filesystems volume id. + * + * max length for this field is 32 chars. + */ + void setVolumeID( const QString& s ) { m_volumeID = s; } + void setVolumeSetId( const QString& s ) { m_volumeSetId = s; } + void setVolumeSetSize( int size ) { m_volumeSetSize = size; } + void setVolumeSetNumber( int n ) { m_volumeSetNumber = n; } + void setPublisher( const QString& s ) { m_publisher = s; } + void setPreparer( const QString& s ) { m_preparer = s; } + void setAbstractFile( const QString& s ) { m_abstractFile = s; } + void setCoprightFile( const QString& s ) { m_copyrightFile = s; } + void setBibliographFile( const QString& s ) { m_bibliographFile = s; } + + void setPreserveFilePermissions( bool b ) { m_preserveFilePermissions = b; } + // ----------------------------------------------------------------- mkisofs-options ----------- + + enum whiteSpaceTreatments { noChange = 0, replace = 1, strip = 2, extended = 3 }; + + void setWhiteSpaceTreatment( int i ) { m_whiteSpaceTreatment = i; } + int whiteSpaceTreatment() const { return m_whiteSpaceTreatment; } + const QString& whiteSpaceTreatmentReplaceString() const { return m_whiteSpaceTreatmentReplaceString; } + void setWhiteSpaceTreatmentReplaceString( const QString& s ) { m_whiteSpaceTreatmentReplaceString = s; } + + bool discardSymlinks() const { return m_discardSymlinks; } + void setDiscardSymlinks( bool b ) { m_discardSymlinks = b; } + + bool discardBrokenSymlinks() const { return m_discardBrokenSymlinks; } + void setDiscardBrokenSymlinks( bool b ) { m_discardBrokenSymlinks = b; } + + bool doNotCacheInodes() const { return m_doNotCacheInodes; } + void setDoNotCacheInodes( bool b ) { m_doNotCacheInodes = b; } + + void save( KConfigBase* c, bool saveVolumeDesc = true ); + + static K3bIsoOptions load( KConfigBase* c, bool loadVolumeDesc = true ); + static K3bIsoOptions defaults(); + + private: + // volume descriptor + QString m_volumeID; + QString m_applicationID; + QString m_preparer; + QString m_publisher; + QString m_systemId; + QString m_volumeSetId; + QString m_abstractFile; + QString m_copyrightFile; + QString m_bibliographFile; + + int m_volumeSetSize; + int m_volumeSetNumber; + + bool m_bForceInputCharset; + QString m_inputCharset; + + // mkisofs options ------------------------------------- + bool m_createRockRidge; // -r or -R + bool m_createJoliet; // -J + bool m_createUdf; // -udf + bool m_ISOallowLowercase; // -allow-lowercase + bool m_ISOallowPeriodAtBegin; // -L + bool m_ISOallow31charFilenames; // -I + bool m_ISOomitVersionNumbers; // -N + bool m_ISOomitTrailingPeriod; // -d + bool m_ISOmaxFilenameLength; // -max-iso9660-filenames (forces -N) + bool m_ISOrelaxedFilenames; // -relaxed-filenames + bool m_ISOnoIsoTranslate; // -no-iso-translate + bool m_ISOallowMultiDot; // -allow-multidot + bool m_ISOuntranslatedFilenames; // -U (forces -d, -I, -L, -N, -relaxed-filenames, -allow-lowercase, -allow-multidot, -no-iso-translate) + bool m_followSymbolicLinks; // -f + bool m_createTRANS_TBL; // -T + bool m_hideTRANS_TBL; // -hide-joliet-trans-tbl + + bool m_preserveFilePermissions; // if true -R instead of -r is used + bool m_jolietLong; + + bool m_doNotCacheInodes; + + int m_isoLevel; + + + int m_whiteSpaceTreatment; + QString m_whiteSpaceTreatmentReplaceString; + + bool m_discardSymlinks; + bool m_discardBrokenSymlinks; +}; + +#endif diff --git a/libk3b/projects/datacd/k3bmkisofshandler.cpp b/libk3b/projects/datacd/k3bmkisofshandler.cpp new file mode 100644 index 0000000..a3579ec --- /dev/null +++ b/libk3b/projects/datacd/k3bmkisofshandler.cpp @@ -0,0 +1,150 @@ +/* + * + * $Id: k3bmkisofshandler.cpp 802340 2008-04-29 07:43:07Z trueg $ + * Copyright (C) 2005 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bmkisofshandler.h" + +#include +#include +#include + +#include +#include + +#include + + + +class K3bMkisofsHandler::Private +{ +public: + const K3bExternalBin* mkisofsBin; + double firstProgressValue; + bool readError; +}; + + +K3bMkisofsHandler::K3bMkisofsHandler() +{ + d = new Private; + d->mkisofsBin = 0; +} + + +K3bMkisofsHandler::~K3bMkisofsHandler() +{ + delete d; +} + + +bool K3bMkisofsHandler::mkisofsReadError() const +{ + return d->readError; +} + + +const K3bExternalBin* K3bMkisofsHandler::initMkisofs() +{ + d->mkisofsBin = k3bcore->externalBinManager()->binObject( "mkisofs" ); + + if( d->mkisofsBin ) { + if( !d->mkisofsBin->copyright.isEmpty() ) + handleMkisofsInfoMessage( i18n("Using %1 %2 - Copyright (C) %3") + .arg("mkisofs").arg(d->mkisofsBin->version).arg(d->mkisofsBin->copyright), + K3bJob::INFO ); + + d->firstProgressValue = -1; + d->readError = false; + } + else { + kdDebug() << "(K3bMkisofsHandler) could not find mkisofs executable" << endl; + handleMkisofsInfoMessage( i18n("Mkisofs executable not found."), K3bJob::ERROR ); + } + + return d->mkisofsBin; +} + + +void K3bMkisofsHandler::parseMkisofsOutput( const QString& line ) +{ + if( !line.isEmpty() ) { + if( line.startsWith( d->mkisofsBin->path ) ) { + // error or warning + QString errorLine = line.mid( d->mkisofsBin->path.length() + 2 ); + if( errorLine.startsWith( "Input/output error. Cannot read from" ) ) { + handleMkisofsInfoMessage( i18n("Read error from file '%1'").arg( errorLine.mid( 38, errorLine.length()-40 ) ), + K3bJob::ERROR ); + d->readError = true; + } + else if( errorLine.startsWith( "Value too large for defined data type" ) ) { + handleMkisofsInfoMessage( i18n("Used version of mkisofs does not have large file support."), K3bJob::ERROR ); + handleMkisofsInfoMessage( i18n("Files bigger than 2 GB cannot be handled."), K3bJob::ERROR ); + d->readError = true; + } + } + else if( line.contains( "done, estimate" ) ) { + int p = parseMkisofsProgress( line ); + if( p != -1 ) + handleMkisofsProgress( p ); + } + else if( line.contains( "extents written" ) ) { + handleMkisofsProgress( 100 ); + } + else if( line.startsWith( "Incorrectly encoded string" ) ) { + handleMkisofsInfoMessage( i18n("Encountered an incorrectly encoded filename '%1'") + .arg(line.section( QRegExp("[\\(\\)]"), 1, 1 )), K3bJob::ERROR ); + handleMkisofsInfoMessage( i18n("This may be caused by a system update which changed the local character set."), K3bJob::ERROR ); + handleMkisofsInfoMessage( i18n("You may use convmv (http://j3e.de/linux/convmv/) to fix the filename encoding."), K3bJob::ERROR ); + d->readError = true; + } + else if( line.endsWith( "has not an allowable size." ) ) { + handleMkisofsInfoMessage( i18n("The boot image has an invalid size."), K3bJob::ERROR ); + d->readError = true; + } + else if( line.endsWith( "has multiple partitions." ) ) { + handleMkisofsInfoMessage( i18n("The boot image contains multiple partitions.."), K3bJob::ERROR ); + handleMkisofsInfoMessage( i18n("A hard-disk boot image has to contain a single partition."), K3bJob::ERROR ); + d->readError = true; + } + else { + kdDebug() << "(mkisofs) " << line << endl; + } + } +} + + +int K3bMkisofsHandler::parseMkisofsProgress( const QString& line ) +{ + // + // in multisession mode mkisofs' progress does not start at 0 but at (X+Y)/X + // where X is the data already on the cd and Y the data to create + // This is not very dramatic but kind or ugly. + // We just save the first emitted progress value and to some math ;) + // + + QString perStr = line; + perStr.truncate( perStr.find('%') ); + bool ok; + double p = perStr.toDouble( &ok ); + if( !ok ) { + kdDebug() << "(K3bMkisofsHandler) Parsing did not work for " << perStr << endl; + return -1; + } + else { + if( d->firstProgressValue < 0 ) + d->firstProgressValue = p; + + return( (int)::ceil( (p - d->firstProgressValue)*100.0/(100.0 - d->firstProgressValue) ) ); + } +} diff --git a/libk3b/projects/datacd/k3bmkisofshandler.h b/libk3b/projects/datacd/k3bmkisofshandler.h new file mode 100644 index 0000000..32576bc --- /dev/null +++ b/libk3b/projects/datacd/k3bmkisofshandler.h @@ -0,0 +1,74 @@ +/* + * + * $Id: k3bmkisofshandler.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2005 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_MKISOfS_HANDLER_H_ +#define _K3B_MKISOfS_HANDLER_H_ + +#include + +class K3bExternalBin; + + +/** + * Derive from this to handle mkisofs. + */ +class K3bMkisofsHandler +{ + public: + K3bMkisofsHandler(); + virtual ~K3bMkisofsHandler(); + + /** + * \return true if there was a read error. + */ + bool mkisofsReadError() const; + + protected: + /** + * Initialize the MkisofsHandler. + * This method emits copyright information and an error message in case mkisofs is not installed + * through handleMkisofsInfoMessage. + * + * \return A mkisofs bin object to be used or 0 if mkisofs is not installed. + */ + const K3bExternalBin* initMkisofs(); + + void parseMkisofsOutput( const QString& line ); + + /** + * Used internally by handleMkisofsOutput. + * May be used in case handleMkisofsOutput is not sufficient. + */ + int parseMkisofsProgress( const QString& line ); + + /** + * Called by handleMkisofsOutput + */ + virtual void handleMkisofsProgress( int ) = 0; + + /** + * Called by handleMkisofsOutput + * + * Uses K3bJob::MessageType + */ + virtual void handleMkisofsInfoMessage( const QString&, int ) = 0; + + private: + class Private; + Private* d; +}; + + +#endif diff --git a/libk3b/projects/datacd/k3bmsinfofetcher.cpp b/libk3b/projects/datacd/k3bmsinfofetcher.cpp new file mode 100644 index 0000000..c30d0ff --- /dev/null +++ b/libk3b/projects/datacd/k3bmsinfofetcher.cpp @@ -0,0 +1,243 @@ +/* + * + * $Id: k3bmsinfofetcher.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bmsinfofetcher.h" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + + +K3bMsInfoFetcher::K3bMsInfoFetcher( K3bJobHandler* jh, QObject* parent, const char* name ) + : K3bJob( jh, parent, name ), + m_process(0), + m_device(0), + m_dvd(false) +{ +} + + +K3bMsInfoFetcher::~K3bMsInfoFetcher() +{ + delete m_process; +} + + +void K3bMsInfoFetcher::start() +{ + jobStarted(); + + emit infoMessage( i18n("Searching previous session"), K3bJob::INFO ); + + if( !k3bcore->externalBinManager()->foundBin( "cdrecord" ) ) { + kdDebug() << "(K3bMsInfoFetcher) could not find cdrecord executable" << endl; + emit infoMessage( i18n("Could not find %1 executable.").arg("cdrecord"), K3bJob::ERROR ); + jobFinished(false); + return; + } + + if( m_device == 0 ) { + kdDebug() << "(K3bMsInfoFetcher) internal error: No device set!" << endl; + jobFinished(false); + return; + } + + // + // first we try to determine if it is a dvd. If so we need to + // read the info on our own + // + + connect( K3bDevice::sendCommand( K3bDevice::DeviceHandler::NG_DISKINFO, m_device ), + SIGNAL(finished(K3bDevice::DeviceHandler*)), + this, + SLOT(slotMediaDetectionFinished(K3bDevice::DeviceHandler*)) ); +} + + +void K3bMsInfoFetcher::getMsInfo() +{ + delete m_process; + m_process = new KProcess(); + + const K3bExternalBin* bin = 0; + if( m_dvd ) { + // already handled + } + else { + bin = k3bcore->externalBinManager()->binObject( "cdrecord" ); + + if( !bin ) { + emit infoMessage( i18n("Could not find %1 executable.").arg( m_dvd ? "dvdrecord" : "cdrecord" ), ERROR ); + jobFinished(false); + return; + } + + *m_process << bin->path; + + // add the device (e.g. /dev/sg1) + *m_process << QString("dev=%1").arg( K3b::externalBinDeviceParameter(m_device, bin) ); + + *m_process << "-msinfo"; + + // additional user parameters from config + const QStringList& params = bin->userParameters(); + for( QStringList::const_iterator it = params.begin(); it != params.end(); ++it ) + *m_process << *it; + + kdDebug() << "***** " << bin->name() << " parameters:\n"; + const QValueList& args = m_process->args(); + QString s; + for( QValueList::const_iterator it = args.begin(); it != args.end(); ++it ) { + s += *it + " "; + } + kdDebug() << s << flush << endl; + emit debuggingOutput( "msinfo command:", s ); + + + // connect( m_process, SIGNAL(receivedStderr(KProcess*, char*, int)), + // this, SLOT(slotCollectOutput(KProcess*, char*, int)) ); + connect( m_process, SIGNAL(receivedStdout(KProcess*, char*, int)), + this, SLOT(slotCollectOutput(KProcess*, char*, int)) ); + connect( m_process, SIGNAL(processExited(KProcess*)), + this, SLOT(slotProcessExited()) ); + + m_msInfo = QString::null; + m_collectedOutput = QString::null; + m_canceled = false; + + if( !m_process->start( KProcess::NotifyOnExit, KProcess::AllOutput ) ) { + emit infoMessage( i18n("Could not start %1.").arg(bin->name()), K3bJob::ERROR ); + jobFinished(false); + } + } +} + + +void K3bMsInfoFetcher::slotMediaDetectionFinished( K3bDevice::DeviceHandler* h ) +{ + if( h->success() ) { + m_dvd = h->diskInfo().isDvdMedia(); + } + else { + // for now we just default to cd and go on with the detecting + m_dvd = false; + } + + if( m_dvd ) { + if( h->diskInfo().mediaType() & (K3bDevice::MEDIA_DVD_PLUS_RW|K3bDevice::MEDIA_DVD_RW_OVWR) ) { + // get info from iso filesystem + K3bIso9660 iso( m_device, h->toc().last().firstSector().lba() ); + if( iso.open() ) { + unsigned long long nextSession = iso.primaryDescriptor().volumeSpaceSize; + // pad to closest 32K boundary + nextSession += 15; + nextSession /= 16; + nextSession *= 16; + m_msInfo.sprintf( "16,%llu", nextSession ); + + jobFinished( true ); + } + else { + emit infoMessage( i18n("Could not open Iso9660 filesystem in %1.") + .arg( m_device->vendor() + " " + m_device->description() ), ERROR ); + jobFinished( false ); + } + } + else { + unsigned int lastSessionStart, nextWritableAdress; + if( m_device->getNextWritableAdress( lastSessionStart, nextWritableAdress ) ) { + m_msInfo.sprintf( "%u,%u", lastSessionStart+16, nextWritableAdress ); + jobFinished( true ); + } + else { + emit infoMessage( i18n("Could not determine next writable address."), ERROR ); + jobFinished( false ); + } + } + } + else // call cdrecord + getMsInfo(); +} + + +void K3bMsInfoFetcher::slotProcessExited() +{ + if( m_canceled ) + return; + + kdDebug() << "(K3bMsInfoFetcher) msinfo fetched" << endl; + + // now parse the output + QString firstLine = m_collectedOutput.left( m_collectedOutput.find("\n") ); + QStringList list = QStringList::split( ",", firstLine ); + if( list.count() == 2 ) { + bool ok1, ok2; + m_lastSessionStart = list.first().toInt( &ok1 ); + m_nextSessionStart = list[1].toInt( &ok2 ); + if( ok1 && ok2 ) + m_msInfo = firstLine.stripWhiteSpace(); + else + m_msInfo = QString::null; + } + else { + m_msInfo = QString::null; + } + + kdDebug() << "(K3bMsInfoFetcher) msinfo parsed: " << m_msInfo << endl; + + if( m_msInfo.isEmpty() ) { + emit infoMessage( i18n("Could not retrieve multisession information from disk."), K3bJob::ERROR ); + emit infoMessage( i18n("The disk is either empty or not appendable."), K3bJob::ERROR ); + jobFinished(false); + } + else { + jobFinished(true); + } +} + + +void K3bMsInfoFetcher::slotCollectOutput( KProcess*, char* output, int len ) +{ + emit debuggingOutput( "msinfo", QString::fromLocal8Bit( output, len ) ); + + m_collectedOutput += QString::fromLocal8Bit( output, len ); +} + + +void K3bMsInfoFetcher::cancel() +{ + // FIXME: this does not work if the devicehandler is running + + if( m_process ) + if( m_process->isRunning() ) { + m_canceled = true; + m_process->kill(); + emit canceled(); + jobFinished(false); + } +} + + +#include "k3bmsinfofetcher.moc" diff --git a/libk3b/projects/datacd/k3bmsinfofetcher.h b/libk3b/projects/datacd/k3bmsinfofetcher.h new file mode 100644 index 0000000..593664f --- /dev/null +++ b/libk3b/projects/datacd/k3bmsinfofetcher.h @@ -0,0 +1,64 @@ +/* + * + * $Id: k3bmsinfofetcher.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef K3B_MSINFO_FETCHER_H +#define K3B_MSINFO_FETCHER_H + +#include + +namespace K3bDevice { + class Device; + class DeviceHandler; +} +class KProcess; + +class K3bMsInfoFetcher : public K3bJob +{ + Q_OBJECT + + public: + K3bMsInfoFetcher( K3bJobHandler*, QObject* parent = 0, const char* name = 0 ); + ~K3bMsInfoFetcher(); + + const QString& msInfo() const { return m_msInfo; } + int lastSessionStart() const { return m_lastSessionStart; } + int nextSessionStart() const { return m_nextSessionStart; } + + public slots: + void start(); + void cancel(); + + void setDevice( K3bDevice::Device* dev ) { m_device = dev; } + + private slots: + void slotProcessExited(); + void slotCollectOutput( KProcess*, char* output, int len ); + void slotMediaDetectionFinished( K3bDevice::DeviceHandler* ); + void getMsInfo(); + + private: + QString m_msInfo; + int m_lastSessionStart; + int m_nextSessionStart; + QString m_collectedOutput; + + KProcess* m_process; + K3bDevice::Device* m_device; + + bool m_canceled; + bool m_dvd; +}; + +#endif diff --git a/libk3b/projects/datacd/k3bsessionimportitem.cpp b/libk3b/projects/datacd/k3bsessionimportitem.cpp new file mode 100644 index 0000000..35f7936 --- /dev/null +++ b/libk3b/projects/datacd/k3bsessionimportitem.cpp @@ -0,0 +1,59 @@ +/* + * + * $Id: k3bsessionimportitem.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bsessionimportitem.h" +#include "k3bfileitem.h" +#include "k3bdiritem.h" + +#include + + +K3bSessionImportItem::K3bSessionImportItem( const K3bIso9660File* isoF, K3bDataDoc* doc, K3bDirItem* dir ) + : K3bDataItem( doc, dir ), + m_replaceItem(0), + m_size( isoF->size() ) + +{ + setK3bName( isoF->name() ); + + // add automagically like a qlistviewitem + if( parent() ) + parent()->addDataItem( this ); +} + + +K3bSessionImportItem::K3bSessionImportItem( const K3bSessionImportItem& item ) + : K3bDataItem( item ), + m_replaceItem( item.m_replaceItem ), + m_size( item.m_size ) +{ +} + + +K3bSessionImportItem::~K3bSessionImportItem() +{ + if( m_replaceItem ) + m_replaceItem->setReplacedItemFromOldSession(0); + + // remove this from parentdir + if( parent() ) + parent()->takeDataItem( this ); +} + + +K3bDataItem* K3bSessionImportItem::copy() const +{ + return new K3bSessionImportItem( *this ); +} diff --git a/libk3b/projects/datacd/k3bsessionimportitem.h b/libk3b/projects/datacd/k3bsessionimportitem.h new file mode 100644 index 0000000..33f8124 --- /dev/null +++ b/libk3b/projects/datacd/k3bsessionimportitem.h @@ -0,0 +1,63 @@ +/* + * + * $Id: k3bsessionimportitem.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_SESSION_IMPORT_ITEM_H_ +#define _K3B_SESSION_IMPORT_ITEM_H_ + + +#include "k3bdataitem.h" + + +class K3bDataDoc; +class K3bFileItem; +class K3bDirItem; +class K3bIso9660File; + + +class K3bSessionImportItem : public K3bDataItem +{ + public: + K3bSessionImportItem( const K3bIso9660File*, K3bDataDoc* doc, K3bDirItem* ); + K3bSessionImportItem( const K3bSessionImportItem& ); + ~K3bSessionImportItem(); + + K3bDataItem* copy() const; + + K3bFileItem* replaceItem() const { return m_replaceItem; } + void setReplaceItem( K3bFileItem* item ) { m_replaceItem = item; } + + bool isFile() const { return false; } + bool isFromOldSession() const { return true; } + + bool isRemoveable() const { return false; } + bool isMoveable() const { return false; } + bool isRenameable() const { return false; } + bool isHideable() const { return false; } + bool writeToCd() const { return false; } + + protected: + // the size of an item from an imported session does not depend + // on the value of followSymlinks + /** + * Normally one does not use this method but K3bDataItem::size() + */ + KIO::filesize_t itemSize( bool ) const { return m_size; } + + private: + K3bFileItem* m_replaceItem; + KIO::filesize_t m_size; +}; + +#endif diff --git a/libk3b/projects/datacd/k3bspecialdataitem.h b/libk3b/projects/datacd/k3bspecialdataitem.h new file mode 100644 index 0000000..05005ed --- /dev/null +++ b/libk3b/projects/datacd/k3bspecialdataitem.h @@ -0,0 +1,76 @@ +/* + * + * $Id: k3bspecialdataitem.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef K3BSPECIALDATAITEM_H +#define K3BSPECIALDATAITEM_H + +#include "k3bdataitem.h" +#include "k3bdiritem.h" + +#include + +/** + * This can be used to create fake items like the boot catalog + * It's mainly a K3bDataItem where everything has to be set manually + */ +class K3bSpecialDataItem : public K3bDataItem +{ + public: + K3bSpecialDataItem( K3bDataDoc* doc, KIO::filesize_t size, K3bDirItem* parent = 0, const QString& k3bName = QString::null ) + : K3bDataItem( doc, parent ), + m_size( size ) + { + setK3bName( k3bName ); + + // add automagically like a qlistviewitem + if( parent ) + parent->addDataItem( this ); + } + + K3bSpecialDataItem( const K3bSpecialDataItem& item ) + : K3bDataItem( item ), + m_mimeType( item.m_mimeType ), + m_size( item.m_size ) { + } + + ~K3bSpecialDataItem() { + // remove this from parentdir + if( parent() ) + parent()->takeDataItem( this ); + } + + K3bDataItem* copy() const { + return new K3bSpecialDataItem( *this ); + } + + void setMimeType( const QString& s ) { m_mimeType = s; } + const QString& mimeType() const { return m_mimeType; } + + bool isSpecialFile() const { return true; } + + protected: + /** + * Normally one does not use this method but K3bDataItem::size() + */ + KIO::filesize_t itemSize( bool ) const { return m_size; } + + private: + QString m_mimeType; + KIO::filesize_t m_size; +}; + +#endif + diff --git a/libk3b/projects/datadvd/Makefile.am b/libk3b/projects/datadvd/Makefile.am new file mode 100644 index 0000000..99ae10c --- /dev/null +++ b/libk3b/projects/datadvd/Makefile.am @@ -0,0 +1,21 @@ +# we need the ../datacd for the uic generated header files +AM_CPPFLAGS= -I$(srcdir)/../../core \ + -I$(srcdir)/../../../libk3bdevice \ + -I$(srcdir)/../../../src \ + -I$(srcdir)/../../tools \ + -I$(srcdir)/../../jobs \ + -I$(srcdir)/../datacd \ + -I$(srcdir)/.. \ + -I../datacd \ + $(all_includes) + +METASOURCES = AUTO + +noinst_LTLIBRARIES = libdvd.la + +libdvd_la_SOURCES = k3bdvddoc.cpp \ + k3bdvdjob.cpp \ + k3bdvdbooktypejob.cpp + +include_HEADERS = k3bdvddoc.h \ + k3bdvdjob.h diff --git a/libk3b/projects/datadvd/k3bdvdbooktypejob.cpp b/libk3b/projects/datadvd/k3bdvdbooktypejob.cpp new file mode 100644 index 0000000..f703452 --- /dev/null +++ b/libk3b/projects/datadvd/k3bdvdbooktypejob.cpp @@ -0,0 +1,350 @@ +/* + * + * $Id: k3bdvdbooktypejob.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bdvdbooktypejob.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include +#include + + +class K3bDvdBooktypeJob::Private +{ +public: + Private() + : device(0), + process(0), + dvdBooktypeBin(0), + running(false), + forceNoEject(false) { + } + + K3bDevice::Device* device; + K3bProcess* process; + const K3bExternalBin* dvdBooktypeBin; + + bool success; + bool canceled; + bool running; + + bool forceNoEject; + + int foundMediaType; +}; + + +K3bDvdBooktypeJob::K3bDvdBooktypeJob( K3bJobHandler* jh, QObject* parent, const char* name ) + : K3bJob( jh, parent, name ), + m_action(0) +{ + d = new Private; +} + + +K3bDvdBooktypeJob::~K3bDvdBooktypeJob() +{ + delete d->process; + delete d; +} + + +void K3bDvdBooktypeJob::setForceNoEject( bool b ) +{ + d->forceNoEject = b; +} + + +QString K3bDvdBooktypeJob::jobDescription() const +{ + return i18n("Changing DVD Booktype"); // Changing DVD±R(W) Booktype +} + + +QString K3bDvdBooktypeJob::jobDetails() const +{ + return QString::null; +} + + +void K3bDvdBooktypeJob::start() +{ + d->canceled = false; + d->running = true; + + jobStarted(); + + if( !d->device ) { + emit infoMessage( i18n("No device set"), ERROR ); + jobFinished(false); + d->running = false; + return; + } + + // + // In case we want to change the writers default we do not need to wait for a media + // + if( m_action == SET_MEDIA_DVD_ROM || + m_action == SET_MEDIA_DVD_R_W ) { + emit newSubTask( i18n("Waiting for media") ); + if( waitForMedia( d->device, + K3bDevice::STATE_COMPLETE|K3bDevice::STATE_INCOMPLETE|K3bDevice::STATE_EMPTY, + K3bDevice::MEDIA_DVD_PLUS_RW|K3bDevice::MEDIA_DVD_PLUS_R, + i18n("Please insert an empty DVD+R or a DVD+RW medium into drive

%1 %2 (%3).") + .arg(d->device->vendor()).arg(d->device->description()).arg(d->device->devicename()) ) == -1 ) { + emit canceled(); + jobFinished(false); + d->running = false; + return; + } + + emit infoMessage( i18n("Checking media..."), INFO ); + emit newTask( i18n("Checking media") ); + + connect( K3bDevice::sendCommand( K3bDevice::DeviceHandler::NG_DISKINFO, d->device ), + SIGNAL(finished(K3bDevice::DeviceHandler*)), + this, + SLOT(slotDeviceHandlerFinished(K3bDevice::DeviceHandler*)) ); + } + else { + // change writer defaults + startBooktypeChange(); + } +} + + +void K3bDvdBooktypeJob::start( K3bDevice::DeviceHandler* dh ) +{ + d->canceled = false; + d->running = true; + + jobStarted(); + + slotDeviceHandlerFinished( dh ); +} + + +void K3bDvdBooktypeJob::cancel() +{ + if( d->running ) { + d->canceled = true; + if( d->process ) + d->process->kill(); + } + else { + kdDebug() << "(K3bDvdBooktypeJob) not running." << endl; + } +} + + +void K3bDvdBooktypeJob::setDevice( K3bDevice::Device* dev ) +{ + d->device = dev; +} + + +void K3bDvdBooktypeJob::slotStderrLine( const QString& line ) +{ + emit debuggingOutput( "dvd+rw-booktype", line ); + // FIXME +} + + +void K3bDvdBooktypeJob::slotProcessFinished( KProcess* p ) +{ + if( d->canceled ) { + emit canceled(); + d->success = false; + } + else if( p->normalExit() ) { + if( p->exitStatus() == 0 ) { + emit infoMessage( i18n("Booktype successfully changed"), K3bJob::SUCCESS ); + d->success = true; + } + else { + emit infoMessage( i18n("%1 returned an unknown error (code %2).").arg(d->dvdBooktypeBin->name()).arg(p->exitStatus()), + K3bJob::ERROR ); + emit infoMessage( i18n("Please send me an email with the last output."), K3bJob::ERROR ); + + d->success = false; + } + } + else { + emit infoMessage( i18n("%1 did not exit cleanly.").arg(d->dvdBooktypeBin->name()), + ERROR ); + d->success = false; + } + + // + // No need to eject the media if we changed the writer's default + // + if( m_action == SET_MEDIA_DVD_ROM || + m_action == SET_MEDIA_DVD_R_W ) { + + if( d->forceNoEject || + !k3bcore->globalSettings()->ejectMedia() ) { + d->running = false; + jobFinished(d->success); + } + else { + emit infoMessage( i18n("Ejecting DVD..."), INFO ); + connect( K3bDevice::eject( d->device ), + SIGNAL(finished(K3bDevice::DeviceHandler*)), + this, + SLOT(slotEjectingFinished(K3bDevice::DeviceHandler*)) ); + } + } + else { + d->running = false; + jobFinished(d->success); + } +} + + +void K3bDvdBooktypeJob::slotEjectingFinished( K3bDevice::DeviceHandler* dh ) +{ + if( !dh->success() ) + emit infoMessage( i18n("Unable to eject media."), ERROR ); + + d->running = false; + jobFinished(d->success); +} + + +void K3bDvdBooktypeJob::slotDeviceHandlerFinished( K3bDevice::DeviceHandler* dh ) +{ + if( d->canceled ) { + emit canceled(); + d->running = false; + jobFinished(false); + } + + if( dh->success() ) { + + d->foundMediaType = dh->diskInfo().mediaType(); + if( d->foundMediaType == K3bDevice::MEDIA_DVD_PLUS_R ) { + // the media needs to be empty + if( dh->diskInfo().empty() ) + startBooktypeChange(); + else { + emit infoMessage( i18n("Cannot change booktype on non-empty DVD+R media."), ERROR ); + jobFinished(false); + } + } + else if( d->foundMediaType == K3bDevice::MEDIA_DVD_PLUS_RW ) { + startBooktypeChange(); + } + else { + emit infoMessage( i18n("No DVD+R(W) media found."), ERROR ); + jobFinished(false); + } + } + else { + emit infoMessage( i18n("Unable to determine media state."), ERROR ); + d->running = false; + jobFinished(false); + } +} + + +void K3bDvdBooktypeJob::startBooktypeChange() +{ + delete d->process; + d->process = new K3bProcess(); + d->process->setRunPrivileged(true); + d->process->setSuppressEmptyLines(true); + connect( d->process, SIGNAL(stderrLine(const QString&)), this, SLOT(slotStderrLine(const QString&)) ); + connect( d->process, SIGNAL(processExited(KProcess*)), this, SLOT(slotProcessFinished(KProcess*)) ); + + d->dvdBooktypeBin = k3bcore->externalBinManager()->binObject( "dvd+rw-booktype" ); + if( !d->dvdBooktypeBin ) { + emit infoMessage( i18n("Could not find %1 executable.").arg("dvd+rw-booktype"), ERROR ); + d->running = false; + jobFinished(false); + return; + } + + *d->process << d->dvdBooktypeBin; + + switch( m_action ) { + case SET_MEDIA_DVD_ROM: + *d->process << "-dvd-rom-spec" + << "-media"; + break; + case SET_MEDIA_DVD_R_W: + if( d->foundMediaType == K3bDevice::MEDIA_DVD_PLUS_RW ) + *d->process << "-dvd+rw-spec"; + else + *d->process << "-dvd+r-spec"; + *d->process << "-media"; + break; + case SET_UNIT_DVD_ROM_ON_NEW_DVD_R: + *d->process << "-dvd-rom-spec" + << "-unit+r"; + break; + case SET_UNIT_DVD_ROM_ON_NEW_DVD_RW: + *d->process << "-dvd-rom-spec" + << "-unit+rw"; + break; + case SET_UNIT_DVD_R_ON_NEW_DVD_R: + *d->process << "-dvd+r-spec" + << "-unit+r"; + break; + case SET_UNIT_DVD_RW_ON_NEW_DVD_RW: + *d->process << "-dvd+rw-spec" + << "-unit+rw"; + break; + } + + *d->process << d->device->blockDeviceName(); + + kdDebug() << "***** dvd+rw-booktype parameters:\n"; + const QValueList& args = d->process->args(); + QString s; + for( QValueList::const_iterator it = args.begin(); it != args.end(); ++it ) { + s += *it + " "; + } + kdDebug() << s << endl << flush; + emit debuggingOutput( "dvd+rw-booktype command:", s ); + + + if( !d->process->start( KProcess::NotifyOnExit, KProcess::All ) ) { + // something went wrong when starting the program + // it "should" be the executable + emit infoMessage( i18n("Could not start %1.").arg(d->dvdBooktypeBin->name()), K3bJob::ERROR ); + d->running = false; + jobFinished(false); + } + else { + emit newTask( i18n("Changing Booktype") ); + } +} + +#include "k3bdvdbooktypejob.moc" diff --git a/libk3b/projects/datadvd/k3bdvdbooktypejob.h b/libk3b/projects/datadvd/k3bdvdbooktypejob.h new file mode 100644 index 0000000..b9e7e4b --- /dev/null +++ b/libk3b/projects/datadvd/k3bdvdbooktypejob.h @@ -0,0 +1,99 @@ +/* + * + * $Id: k3bdvdbooktypejob.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_DVD_BOOKTYPE_JOB_H_ +#define _K3B_DVD_BOOKTYPE_JOB_H_ + + +#include + + +class KProcess; +namespace K3bDevice { + class Device; + class DeviceHandler; +} + + +/** + * This job can change the compatibility bit of DVD+R(W) media + * with supported dvd writers. + */ +class K3bDvdBooktypeJob : public K3bJob +{ + Q_OBJECT + + public: + K3bDvdBooktypeJob( K3bJobHandler*, QObject* parent = 0, const char* name = 0 ); + ~K3bDvdBooktypeJob(); + + QString jobDescription() const; + QString jobDetails() const; + + /** + * @list SET_MEDIA_DVD_ROM Change media identification on current media to DVD-ROM. + * @list SET_MEDIA_DVD_R_W Change media identification on current media to DVD+R or DVD+RW. + * @list SET_UNIT_DVD_ROM_ON_NEW_DVD_R Set the drive to write DVD-ROM specification on future written DVD+R discs. + * @list SET_UNIT_DVD_ROM_ON_NEW_DVD_RW Set the drive to write DVD-ROM specification on future written DVD+RW discs. + * @list SET_UNIT_DVD_R_ON_NEW_DVD_R Set the drive to write DVD+R specification on future written DVD+R discs. + * @list SET_UNIT_DVD_RW_ON_NEW_DVD_RW Set the drive to write DVD+RW specification on future written DVD+RW discs. + */ + enum Action { + SET_MEDIA_DVD_ROM, + SET_MEDIA_DVD_R_W, + SET_UNIT_DVD_ROM_ON_NEW_DVD_R, + SET_UNIT_DVD_ROM_ON_NEW_DVD_RW, + SET_UNIT_DVD_R_ON_NEW_DVD_R, + SET_UNIT_DVD_RW_ON_NEW_DVD_RW + }; + + public slots: + void start(); + + /** + * The devicehandler needs to have a valid NgDiskInfo + * Use this to prevent the job from searching a media. + */ + void start( K3bDevice::DeviceHandler* ); + + void cancel(); + + void setDevice( K3bDevice::Device* ); + + void setAction( int a ) { m_action = a; } + + /** + * If set true the job ignores the global K3b setting + * and does not eject the CD-RW after finishing + */ + void setForceNoEject( bool ); + + private slots: + void slotStderrLine( const QString& ); + void slotProcessFinished( KProcess* ); + void slotDeviceHandlerFinished( K3bDevice::DeviceHandler* ); + void slotEjectingFinished( K3bDevice::DeviceHandler* ); + + private: + void startBooktypeChange(); + + int m_action; + + class Private; + Private* d; +}; + + +#endif diff --git a/libk3b/projects/datadvd/k3bdvddoc.cpp b/libk3b/projects/datadvd/k3bdvddoc.cpp new file mode 100644 index 0000000..4ab8b9f --- /dev/null +++ b/libk3b/projects/datadvd/k3bdvddoc.cpp @@ -0,0 +1,39 @@ +/* + * + * $Id: k3bdvddoc.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include "k3bdvddoc.h" +#include "k3bdvdjob.h" + +#include + +#include + + +K3bDvdDoc::K3bDvdDoc( QObject* parent ) + : K3bDataDoc( parent ) +{ +} + +K3bDvdDoc::~K3bDvdDoc() +{ +} + +K3bBurnJob* K3bDvdDoc::newBurnJob( K3bJobHandler* hdl, QObject* parent ) +{ + return new K3bDvdJob( this, hdl, parent ); +} + +//#include "k3bdvddoc.moc" diff --git a/libk3b/projects/datadvd/k3bdvddoc.h b/libk3b/projects/datadvd/k3bdvddoc.h new file mode 100644 index 0000000..03b5c3d --- /dev/null +++ b/libk3b/projects/datadvd/k3bdvddoc.h @@ -0,0 +1,37 @@ +/* + * + * $Id: k3bdvddoc.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_DVDDOC_H_ +#define _K3B_DVDDOC_H_ + +#include +#include "k3b_export.h" +class KConfig; + +class LIBK3B_EXPORT K3bDvdDoc : public K3bDataDoc +{ + public: + K3bDvdDoc( QObject* parent = 0 ); + virtual ~K3bDvdDoc(); + + virtual int type() const { return DVD; } + + virtual K3bBurnJob* newBurnJob( K3bJobHandler* hdl, QObject* parent = 0 ); + + protected: + virtual QString typeString() const { return "dvd"; } +}; + +#endif diff --git a/libk3b/projects/datadvd/k3bdvdjob.cpp b/libk3b/projects/datadvd/k3bdvdjob.cpp new file mode 100644 index 0000000..3cd1521 --- /dev/null +++ b/libk3b/projects/datadvd/k3bdvdjob.cpp @@ -0,0 +1,344 @@ +/* + * + * $Id: k3bdvdjob.cpp 690187 2007-07-20 09:18:03Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include "k3bdvdjob.h" +#include "k3bdvddoc.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + + +class K3bDvdJob::Private +{ +public: +}; + + +K3bDvdJob::K3bDvdJob( K3bDataDoc* doc, K3bJobHandler* hdl, QObject* parent ) + : K3bDataJob( doc, hdl, parent ), + m_doc( doc ) +{ + d = new Private(); +} + + +K3bDvdJob::~K3bDvdJob() +{ + delete d; +} + + +void K3bDvdJob::prepareData() +{ +} + + +bool K3bDvdJob::prepareWriterJob() +{ + K3bGrowisofsWriter* writer = new K3bGrowisofsWriter( m_doc->burner(), this, this ); + + // these do only make sense with DVD-R(W) + writer->setSimulate( m_doc->dummy() ); + writer->setBurnSpeed( m_doc->speed() ); + + // Andy said incremental sequential is the default mode and it seems uses have more problems with DAO anyway + // BUT: I also had a report that incremental sequential produced unreadable media! + if( m_doc->writingMode() == K3b::DAO ) +// || ( m_doc->writingMode() == K3b::WRITING_MODE_AUTO && +// usedMultiSessionMode() == K3bDataDoc::NONE ) ) + writer->setWritingMode( K3b::DAO ); + + writer->setMultiSession( usedMultiSessionMode() == K3bDataDoc::CONTINUE || + usedMultiSessionMode() == K3bDataDoc::FINISH ); + + writer->setCloseDvd( usedMultiSessionMode() == K3bDataDoc::NONE || + usedMultiSessionMode() == K3bDataDoc::FINISH ); + + writer->setImageToWrite( QString::null ); // read from stdin + writer->setTrackSize( m_isoImager->size() ); + + if( usedMultiSessionMode() != K3bDataDoc::NONE ) { + // + // growisofs wants a valid -C parameter for multisession, so we get it from the + // K3bMsInfoFetcher (see K3bDataJob::slotMsInfoFetched) + // + writer->setMultiSessionInfo( m_msInfoFetcher->msInfo() ); + } + + setWriterJob( writer ); + + return true; +} + + +void K3bDvdJob::determineMultiSessionMode() +{ + int m = requestMedia( K3bDevice::STATE_INCOMPLETE|K3bDevice::STATE_EMPTY ); + + if( m < 0 ) { + cancel(); + } + else { + connect( K3bDevice::sendCommand( K3bDevice::DeviceHandler::NG_DISKINFO, m_doc->burner() ), + SIGNAL(finished(K3bDevice::DeviceHandler*)), + this, + SLOT(slotDetermineMultiSessionMode(K3bDevice::DeviceHandler*)) ); + } +} + + +K3bDataDoc::MultiSessionMode K3bDvdJob::getMultiSessionMode( const K3bDevice::DiskInfo& info ) +{ + K3bDataDoc::MultiSessionMode mode = K3bDataDoc::NONE; + + if( info.mediaType() & (K3bDevice::MEDIA_DVD_PLUS_RW|K3bDevice::MEDIA_DVD_RW_OVWR) ) { + // + // we need to handle DVD+RW and DVD-RW overwrite media differently since remainingSize() is not valid + // in both cases + // Since one never closes a DVD+RW we only differ between CONTINUE and START + // + + // try to check the filesystem size + K3bIso9660 iso( m_doc->burner() ); + if( iso.open() && info.capacity() - iso.primaryDescriptor().volumeSpaceSize >= m_doc->burningLength() ) { + mode = K3bDataDoc::CONTINUE; + } + else { + mode = K3bDataDoc::START; + } + } + else if( info.appendable() ) { + // + // 3 cases: + // 1. the project does not fit -> no multisession (resulting in asking for another media above) + // 2. the project does fit and fills up the CD (No new sessions after the 4GB boundary) -> finish multisession + // 3. the project does fit and does not fill up the CD -> continue multisession + // + if( m_doc->size() > info.remainingSize().mode1Bytes() && !m_doc->sessionImported() ) + mode = K3bDataDoc::NONE; + else if( info.size() + m_doc->burningLength() + 11400 /* used size + project size + session gap */ > 2097152 /* 4 GB */ ) + mode = K3bDataDoc::FINISH; + else + mode = K3bDataDoc::CONTINUE; + } + else { + // + // We only close the DVD if the project fills it beyond the 4GB boundary + // + if( info.size() + m_doc->burningLength() + 11400 /* used size + project size + session gap */ > 2097152 /* 4 GB */ || + m_doc->writingMode() == K3b::DAO ) + mode = K3bDataDoc::NONE; + else + mode = K3bDataDoc::START; + } + + return mode; +} + + +int K3bDvdJob::requestMedia( int state ) +{ + int mt = 0; + if( m_doc->writingMode() == K3b::WRITING_MODE_RES_OVWR ) // we treat DVD+R(W) as restricted overwrite media + mt = K3bDevice::MEDIA_DVD_RW_OVWR|K3bDevice::MEDIA_DVD_PLUS_RW|K3bDevice::MEDIA_DVD_PLUS_R; + else + mt = K3bDevice::MEDIA_WRITABLE_DVD; + + // double layer media + // in case overburn is enabled we allow some made up max size + // before we force a DL medium + if( m_doc->size() > 4700372992LL ) { + if( !k3bcore->globalSettings()->overburn() || + m_doc->size() > 4900000000LL ) { + mt = K3bDevice::MEDIA_WRITABLE_DVD_DL; + } + } + + return waitForMedia( m_doc->burner(), + state, + mt ); +} + + +bool K3bDvdJob::waitForMedium() +{ + emit infoMessage( i18n("Waiting for media") + "...", INFO ); + + int foundMedium = requestMedia( usedMultiSessionMode() == K3bDataDoc::CONTINUE || + usedMultiSessionMode() == K3bDataDoc::FINISH ? + K3bDevice::STATE_INCOMPLETE : + K3bDevice::STATE_EMPTY ); + + if( foundMedium < 0 || hasBeenCanceled() ) { + return false; + } + + if( foundMedium == 0 ) { + emit infoMessage( i18n("Forced by user. Growisofs will be called without further tests."), INFO ); + } + + else { + // ------------------------------- + // DVD Plus + // ------------------------------- + if( foundMedium & K3bDevice::MEDIA_DVD_PLUS_ALL ) { + if( m_doc->dummy() ) { + if( !questionYesNo( i18n("K3b does not support simulation with DVD+R(W) media. " + "Do you really want to continue? The media will be written " + "for real."), + i18n("No Simulation with DVD+R(W)") ) ) { + return false; + } + + m_doc->setDummy( false ); + emit newTask( i18n("Writing") ); + } + + if( m_doc->writingMode() != K3b::WRITING_MODE_AUTO && m_doc->writingMode() != K3b::WRITING_MODE_RES_OVWR ) + emit infoMessage( i18n("Writing mode ignored when writing DVD+R(W) media."), INFO ); + + if( foundMedium & K3bDevice::MEDIA_DVD_PLUS_RW ) { + if( usedMultiSessionMode() == K3bDataDoc::NONE || + usedMultiSessionMode() == K3bDataDoc::START ) + emit infoMessage( i18n("Writing DVD+RW."), INFO ); + else + emit infoMessage( i18n("Growing ISO9660 filesystem on DVD+RW."), INFO ); + } + else if( foundMedium & K3bDevice::MEDIA_DVD_PLUS_R_DL ) + emit infoMessage( i18n("Writing Double Layer DVD+R."), INFO ); + else + emit infoMessage( i18n("Writing DVD+R."), INFO ); + } + + // ------------------------------- + // DVD Minus + // ------------------------------- + else { + if( m_doc->dummy() && !m_doc->burner()->dvdMinusTestwrite() ) { + if( !questionYesNo( i18n("Your writer (%1 %2) does not support simulation with DVD-R(W) media. " + "Do you really want to continue? The media will be written " + "for real.") + .arg(m_doc->burner()->vendor()) + .arg(m_doc->burner()->description()), + i18n("No Simulation with DVD-R(W)") ) ) { + return false; + } + + m_doc->setDummy( false ); + } + + // RESTRICTED OVERWRITE + // -------------------- + if( foundMedium & K3bDevice::MEDIA_DVD_RW_OVWR ) { + if( usedMultiSessionMode() == K3bDataDoc::NONE || + usedMultiSessionMode() == K3bDataDoc::START ) + emit infoMessage( i18n("Writing DVD-RW in restricted overwrite mode."), INFO ); + else + emit infoMessage( i18n("Growing ISO9660 filesystem on DVD-RW in restricted overwrite mode."), INFO ); + } + + // NORMAL + // ------ + else { + + // FIXME: DVD-R DL jump and stuff + + if( m_doc->writingMode() == K3b::DAO ) + // || ( m_doc->writingMode() == K3b::WRITING_MODE_AUTO && +// usedMultiSessionMode() == K3bDataDoc::NONE ) ) + emit infoMessage( i18n("Writing %1 in DAO mode.").arg( K3bDevice::mediaTypeString(foundMedium, true) ), INFO ); + + else { + // check if the writer supports writing sequential and thus multisession (on -1 the burner cannot handle + // features and we simply ignore it and hope for the best) + if( m_doc->burner()->featureCurrent( K3bDevice::FEATURE_INCREMENTAL_STREAMING_WRITABLE ) == 0 ) { + if( !questionYesNo( i18n("Your writer (%1 %2) does not support Incremental Streaming with %3 " + "media. Multisession will not be possible. Continue anyway?") + .arg(m_doc->burner()->vendor()) + .arg(m_doc->burner()->description()) + .arg( K3bDevice::mediaTypeString(foundMedium, true) ), + i18n("No Incremental Streaming") ) ) { + return false; + } + else { + emit infoMessage( i18n("Writing %1 in DAO mode.").arg( K3bDevice::mediaTypeString(foundMedium, true) ), INFO ); + } + } + else { + if( !(foundMedium & (K3bDevice::MEDIA_DVD_RW|K3bDevice::MEDIA_DVD_RW_OVWR|K3bDevice::MEDIA_DVD_RW_SEQ)) && + m_doc->writingMode() == K3b::WRITING_MODE_RES_OVWR ) + emit infoMessage( i18n("Restricted Overwrite is not possible with DVD-R media."), INFO ); + + emit infoMessage( i18n("Writing %1 in incremental mode.").arg( K3bDevice::mediaTypeString(foundMedium, true) ), INFO ); + } + } + } + } + } + + return true; +} + + +QString K3bDvdJob::jobDescription() const +{ + if( m_doc->onlyCreateImages() ) { + return i18n("Creating Data Image File"); + } + else if( m_doc->multiSessionMode() == K3bDataDoc::NONE || + m_doc->multiSessionMode() == K3bDataDoc::AUTO ) { + return i18n("Writing Data DVD") + + ( m_doc->isoOptions().volumeID().isEmpty() + ? QString::null + : QString( " (%1)" ).arg(m_doc->isoOptions().volumeID()) ); + } + else { + return i18n("Writing Multisession DVD") + + ( m_doc->isoOptions().volumeID().isEmpty() + ? QString::null + : QString( " (%1)" ).arg(m_doc->isoOptions().volumeID()) ); + } +} + + +QString K3bDvdJob::jobDetails() const +{ + if( m_doc->copies() > 1 && + !m_doc->dummy() && + !(m_doc->multiSessionMode() == K3bDataDoc::CONTINUE || + m_doc->multiSessionMode() == K3bDataDoc::FINISH) ) + return i18n("ISO9660 Filesystem (Size: %1) - %n copy", + "ISO9660 Filesystem (Size: %1) - %n copies", + m_doc->copies()) + .arg(KIO::convertSize( m_doc->size() )); + else + return i18n("ISO9660 Filesystem (Size: %1)") + .arg(KIO::convertSize( m_doc->size() )); +} + +#include "k3bdvdjob.moc" diff --git a/libk3b/projects/datadvd/k3bdvdjob.h b/libk3b/projects/datadvd/k3bdvdjob.h new file mode 100644 index 0000000..381bc1d --- /dev/null +++ b/libk3b/projects/datadvd/k3bdvdjob.h @@ -0,0 +1,57 @@ +/* + * + * $Id: k3bdvdjob.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef _K3B_DVD_JOB_H_ +#define _K3B_DVD_JOB_H_ + +#include + +#include + +class K3bDataDoc; +class K3bGrowisofsWriter; + + +class K3bDvdJob : public K3bDataJob +{ + Q_OBJECT + + public: + /** + * To be more flexible we allow writing of any data doc + */ + K3bDvdJob( K3bDataDoc*, K3bJobHandler*, QObject* parent = 0 ); + virtual ~K3bDvdJob(); + + virtual QString jobDescription() const; + virtual QString jobDetails() const; + + protected: + void prepareData(); + virtual bool prepareWriterJob(); + void determineMultiSessionMode(); + K3bDataDoc::MultiSessionMode getMultiSessionMode( const K3bDevice::DiskInfo& ); + bool waitForMedium(); + int requestMedia( int state ); + + private: + K3bDataDoc* m_doc; + + class Private; + Private* d; +}; + +#endif diff --git a/libk3b/projects/datadvd/k3bdvdview.cpp b/libk3b/projects/datadvd/k3bdvdview.cpp new file mode 100644 index 0000000..512ec4b --- /dev/null +++ b/libk3b/projects/datadvd/k3bdvdview.cpp @@ -0,0 +1,48 @@ +/* + * + * $Id: k3bdvdview.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bdvdview.h" +#include "k3bdvddoc.h" +#include "k3bdvdburndialog.h" +#include +#include + +#include + + +K3bDvdView::K3bDvdView( K3bDvdDoc* doc, QWidget *parent, const char *name ) + : K3bDataView( doc, parent, name ) +{ + m_doc = doc; + + fillStatusDisplay()->showDvdSizes(true); + + m_dataFileView->setNoItemText( i18n("Use drag'n'drop to add files and directories to the project.\n" + "To remove or rename files use the context menu.\n" + "After that press the burn button to write the DVD.") ); +} + + +K3bDvdView::~K3bDvdView() +{ +} + + +K3bProjectBurnDialog* K3bDvdView::newBurnDialog( QWidget* parent, const char* name ) +{ + return new K3bDvdBurnDialog( m_doc, parent, name, true ); +} + +#include "k3bdvdview.moc" diff --git a/libk3b/projects/datadvd/k3bdvdview.h b/libk3b/projects/datadvd/k3bdvdview.h new file mode 100644 index 0000000..d9f30f3 --- /dev/null +++ b/libk3b/projects/datadvd/k3bdvdview.h @@ -0,0 +1,40 @@ +/* + * + * $Id: k3bdvdview.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef _K3B_DVDVIEW_H_ +#define _K3B_DVDVIEW_H_ + +#include + +class K3bDvdDoc; + + +class K3bDvdView : public K3bDataView +{ + Q_OBJECT + + public: + K3bDvdView( K3bDvdDoc* doc, QWidget *parent = 0, const char *name = 0 ); + ~K3bDvdView(); + + protected: + virtual K3bProjectBurnDialog* newBurnDialog( QWidget* parent = 0, const char* name = 0 ); + + private: + K3bDvdDoc* m_doc; +}; + +#endif diff --git a/libk3b/projects/k3babstractwriter.cpp b/libk3b/projects/k3babstractwriter.cpp new file mode 100644 index 0000000..df22bc3 --- /dev/null +++ b/libk3b/projects/k3babstractwriter.cpp @@ -0,0 +1,96 @@ +/* + * + * $Id: k3babstractwriter.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include "k3babstractwriter.h" + +#include +#include +#include +#include + +#include +#include + + + +K3bAbstractWriter::K3bAbstractWriter( K3bDevice::Device* dev, K3bJobHandler* jh, QObject* parent, const char* name ) + : K3bJob( jh, parent, name ), + m_burnDevice(dev), + m_burnSpeed(1), + m_simulate(false), + m_sourceUnreadable(false) +{ +} + + +K3bAbstractWriter::~K3bAbstractWriter() +{ +} + + +K3bDevice::Device* K3bAbstractWriter::burnDevice() +{ + if( m_burnDevice ) + return m_burnDevice; + else + return k3bcore->deviceManager()->burningDevices().getFirst(); +} + + +void K3bAbstractWriter::cancel() +{ + if( burnDevice() ) { + // we need to unlock the writer because cdrecord locked it while writing + emit infoMessage( i18n("Unlocking drive..."), INFO ); + connect( K3bDevice::unblock( burnDevice() ), SIGNAL(finished(bool)), + this, SLOT(slotUnblockWhileCancellationFinished(bool)) ); + } + else { + emit canceled(); + jobFinished(false); + } +} + + +void K3bAbstractWriter::slotUnblockWhileCancellationFinished( bool success ) +{ + if( !success ) + emit infoMessage( i18n("Could not unlock CD drive."), K3bJob::ERROR ); // FIXME: simply "drive", not "CD drive" + + if( k3bcore->globalSettings()->ejectMedia() ) { + emit newSubTask( i18n("Ejecting CD") ); // FIXME: "media" instead of "CD" + connect( K3bDevice::eject( burnDevice() ), SIGNAL(finished(bool)), + this, SLOT(slotEjectWhileCancellationFinished(bool)) ); + } + else { + emit canceled(); + jobFinished( false ); + } +} + + +void K3bAbstractWriter::slotEjectWhileCancellationFinished( bool success ) +{ + if( !success ) { + emit infoMessage( i18n("Unable to eject media."), K3bJob::ERROR ); + } + + emit canceled(); + jobFinished( false ); +} + + +#include "k3babstractwriter.moc" diff --git a/libk3b/projects/k3babstractwriter.h b/libk3b/projects/k3babstractwriter.h new file mode 100644 index 0000000..3f91ee3 --- /dev/null +++ b/libk3b/projects/k3babstractwriter.h @@ -0,0 +1,92 @@ +/* + * + * $Id: k3babstractwriter.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef K3B_ABSTRACT_WRITER_H +#define K3B_ABSTRACT_WRITER_H + + +#include "k3bjob.h" + +#include + +class K3bDevice::Device; +class K3bJobHandler; + + +class K3bAbstractWriter : public K3bJob +{ + Q_OBJECT + + public: + virtual ~K3bAbstractWriter(); + + K3bDevice::Device* burnDevice(); + int burnSpeed() const { return m_burnSpeed; } + bool simulate() const { return m_simulate; } + + /** + * This can be used to setup direct streaming between two processes + * for example the cdrecordwriter returnes the stdin fd which can be + * connected to the stdout fd of mkisofs in the isoimager + */ + virtual int fd() const { return -1; } + virtual bool closeFd() { return false; } + + public slots: + /** + * If the burnDevice is set this will try to unlock the drive and + * eject the disk if K3b is configured to do so. + * Will also emit canceled and finished signals. + * may be called by subclasses. + */ + void cancel(); + + void setBurnDevice( K3bDevice::Device* dev ) { m_burnDevice = dev; } + void setBurnSpeed( int s ) { m_burnSpeed = s; } + void setSimulate( bool b ) { m_simulate = b; } + + /** + * Used to inform the writer that the source (especially useful when reading from + * another cd/dvd media) could not be read. + * + * Basically it should be used to make sure no "write an email" message is thrown. + */ + void setSourceUnreadable( bool b = true ) { m_sourceUnreadable = b; } + + signals: + void buffer( int ); + void deviceBuffer( int ); + void writeSpeed( int, int ); + + protected: + K3bAbstractWriter( K3bDevice::Device* dev, K3bJobHandler* hdl, + QObject* parent = 0, const char* name = 0 ); + + bool wasSourceUnreadable() const { return m_sourceUnreadable; } + + protected slots: + void slotUnblockWhileCancellationFinished( bool success ); + void slotEjectWhileCancellationFinished( bool success ); + + private: + K3bDevice::Device* m_burnDevice; + int m_burnSpeed; + bool m_simulate; + bool m_sourceUnreadable; +}; + + +#endif diff --git a/libk3b/projects/k3bcdrdaowriter.cpp b/libk3b/projects/k3bcdrdaowriter.cpp new file mode 100644 index 0000000..c49cb4b --- /dev/null +++ b/libk3b/projects/k3bcdrdaowriter.cpp @@ -0,0 +1,1101 @@ +/* + * + * $Id: k3bcdrdaowriter.cpp 654649 2007-04-16 17:55:50Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * Klaus-Dieter Krannich + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include "k3bcdrdaowriter.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + + + +#define PGSMSG_MIN PGSMSG_RCD_ANALYZING +#define PGSMSG_RCD_ANALYZING 1 +#define PGSMSG_RCD_EXTRACTING 2 +#define PGSMSG_WCD_LEADIN 3 +#define PGSMSG_WCD_DATA 4 +#define PGSMSG_WCD_LEADOUT 5 +#define PGSMSG_BLK 6 +#define PGSMSG_MAX PGSMSG_BLK + +struct ProgressMsg { + int status; // see PGSMSG_* constants + int totalTracks; // total number of tracks + int track; // actually written track + int trackProgress; // progress for current track 0..1000 + int totalProgress; // total writing progress 0..1000 + int bufferFillRate; // buffer fill rate 0..100 +}; + +#define PSGMSG_MINSIZE 24 + +struct ProgressMsg2 { + int status; // see PGSMSG_* constants + int totalTracks; // total number of tracks + int track; // actually written track + int trackProgress; // progress for current track 0..1000 + int totalProgress; // total writing progress 0..1000 + int bufferFillRate; // buffer fill rate 0..100 + int writerFillRate; // device write buffer fill rate 0..100 +}; + + +inline bool operator<( const ProgressMsg2& m1, const ProgressMsg2& m2 ) +{ + return m1.track < m2.track + || ( m1.track == m2.track + && m1.trackProgress < m2.trackProgress ) + || m1.totalProgress < m2.totalProgress; +} + + +inline bool operator==( const ProgressMsg2& m1, const ProgressMsg2& m2 ) +{ + return m1.status == m2.status + && m1.track == m2.track + && m1.totalTracks == m2.totalTracks + && m1.trackProgress == m2.trackProgress + && m1.totalProgress == m2.totalProgress + && m1.bufferFillRate == m2.bufferFillRate; +} + +inline bool operator!=( const ProgressMsg2& m1, const ProgressMsg2& m2 ) +{ + return !( m1 == m2 ); +} + + + +class K3bCdrdaoWriter::Private +{ +public: + Private() { + } + + K3bThroughputEstimator* speedEst; + + int usedSpeed; + + ProgressMsg2 oldMsg; + ProgressMsg2 newMsg; + + unsigned int progressMsgSize; +}; + + +K3bCdrdaoWriter::K3bCdrdaoWriter( K3bDevice::Device* dev, K3bJobHandler* hdl, + QObject* parent, const char* name ) + : K3bAbstractWriter( dev, hdl, parent, name ), + m_command(WRITE), + m_blankMode(MINIMAL), + m_sourceDevice(0), + m_readRaw(false), + m_multi(false), + m_force(false), + m_onTheFly(false), + m_fastToc(false), + m_readSubchan(None), + m_taoSource(false), + m_taoSourceAdjust(-1), + m_paranoiaMode(-1), + m_session(-1), + m_process(0), + m_comSock(0), + m_currentTrack(0), + m_forceNoEject(false) +{ + d = new Private(); + d->speedEst = new K3bThroughputEstimator( this ); + connect( d->speedEst, SIGNAL(throughput(int)), + this, SLOT(slotThroughput(int)) ); + + m_eject = k3bcore->globalSettings()->ejectMedia(); + + ::memset( &d->oldMsg, 0, sizeof(ProgressMsg2) ); + ::memset( &d->newMsg, 0, sizeof(ProgressMsg2) ); + + if( socketpair(AF_UNIX,SOCK_STREAM,0,m_cdrdaoComm) ) + { + kdDebug() << "(K3bCdrdaoWriter) could not open socketpair for cdrdao remote messages" << endl; + } + else + { + delete m_comSock; + m_comSock = new QSocket(); + m_comSock->setSocket(m_cdrdaoComm[1]); + m_comSock->socketDevice()->setReceiveBufferSize(49152); + // magic number from Qt documentation + m_comSock->socketDevice()->setBlocking(false); + connect( m_comSock, SIGNAL(readyRead()), + this, SLOT(parseCdrdaoMessage())); + } +} + +K3bCdrdaoWriter::~K3bCdrdaoWriter() +{ + delete d->speedEst; + delete d; + + // close the socket + if( m_comSock ) { + m_comSock->close(); + ::close( m_cdrdaoComm[0] ); + } + delete m_process; + delete m_comSock; +} + + +int K3bCdrdaoWriter::fd() const +{ + if( m_process ) + return m_process->stdinFd(); + else + return -1; +} + + +bool K3bCdrdaoWriter::active() const +{ + return (m_process ? m_process->isRunning() : false); +} + + +void K3bCdrdaoWriter::prepareArgumentList() +{ + + // binary + *m_process << m_cdrdaoBinObject; + + // command + switch ( m_command ) + { + case COPY: + *m_process << "copy"; + setWriteArguments(); + setReadArguments(); + setCopyArguments(); + break; + case WRITE: + *m_process << "write"; + setWriteArguments(); + break; + case READ: + *m_process << "read-cd"; + // source device and source driver + if ( m_sourceDevice ) + *m_process << "--device" + << K3b::externalBinDeviceParameter(m_sourceDevice, m_cdrdaoBinObject); + if ( m_sourceDevice->cdrdaoDriver() != "auto" ) + *m_process << "--driver" << m_sourceDevice->cdrdaoDriver(); + else if( defaultToGenericMMC( m_sourceDevice, false ) ) { + kdDebug() << "(K3bCdrdaoWriter) defaulting to generic-mmc driver for " << m_sourceDevice->blockDeviceName() << endl; + *m_process << "--driver" << "generic-mmc"; + } + setReadArguments(); + break; + case BLANK: + *m_process << "blank"; + setBlankArguments(); + break; + } + + setCommonArguments(); +} + +void K3bCdrdaoWriter::setWriteArguments() +{ + // device and driver + *m_process << "--device" + << K3b::externalBinDeviceParameter(burnDevice(), m_cdrdaoBinObject); + + if( burnDevice()->cdrdaoDriver() != "auto" ) + { + *m_process << "--driver"; + if( burnDevice()->cdTextCapable() == 1 ) + *m_process << QString("%1:0x00000010").arg( burnDevice()->cdrdaoDriver() ); + else + *m_process << burnDevice()->cdrdaoDriver(); + } + else if( defaultToGenericMMC( burnDevice(), true ) ) { + kdDebug() << "(K3bCdrdaoWriter) defaulting to generic-mmc driver for " << burnDevice()->blockDeviceName() << endl; + *m_process << "--driver" << "generic-mmc:0x00000010"; + } + + // burn speed + if( d->usedSpeed != 0 ) + *m_process << "--speed" << QString("%1").arg(d->usedSpeed); + + //simulate + if( simulate() ) + *m_process << "--simulate"; + + // multi + if( m_multi ) + *m_process << "--multi"; + + // force + if( m_force ) + *m_process << "--force"; + + // burnproof + if ( !k3bcore->globalSettings()->burnfree() ) { + if( m_cdrdaoBinObject->hasFeature( "disable-burnproof" ) ) + *m_process << "--buffer-under-run-protection" << "0"; + else + emit infoMessage( i18n("Cdrdao %1 does not support disabling burnfree.").arg(m_cdrdaoBinObject->version), WARNING ); + } + + if( k3bcore->globalSettings()->force() ) { + *m_process << "--force"; + emit infoMessage( i18n("'Force unsafe operations' enabled."), WARNING ); + } + + bool manualBufferSize = + k3bcore->globalSettings()->useManualBufferSize(); + if( manualBufferSize ) { + // + // one buffer in cdrdao holds 1 second of audio data = 75 frames = 75 * 2352 bytes + // + int bufSizeInMb = k3bcore->globalSettings()->bufferSize(); + *m_process << "--buffers" << QString::number( bufSizeInMb*1024*1024/(75*2352) ); + } + + bool overburn = + k3bcore->globalSettings()->overburn(); + if( overburn ) { + if( m_cdrdaoBinObject->hasFeature("overburn") ) + *m_process << "--overburn"; + else + emit infoMessage( i18n("Cdrdao %1 does not support overburning.").arg(m_cdrdaoBinObject->version), WARNING ); + } + +} + +void K3bCdrdaoWriter::setReadArguments() +{ + // readRaw + if ( m_readRaw ) + *m_process << "--read-raw"; + + // subchan + if ( m_readSubchan != None ) + { + *m_process << "--read-subchan"; + switch ( m_readSubchan ) + { + case RW: + *m_process << "rw"; + break; + case RW_RAW: + *m_process << "rw_raw"; + break; + case None: + break; + } + } + + // TAO Source + if ( m_taoSource ) + *m_process << "--tao-source"; + + // TAO Source Adjust + if ( m_taoSourceAdjust != -1 ) + *m_process << "--tao-source-adjust" + << QString("%1").arg(m_taoSourceAdjust); + + // paranoia Mode + if ( m_paranoiaMode != -1 ) + *m_process << "--paranoia-mode" + << QString("%1").arg(m_paranoiaMode); + + // session + if ( m_session != -1 ) + *m_process << "--session" + << QString("%1").arg(m_session); + + // fast TOC + if ( m_fastToc ) + *m_process << "--fast-toc"; + +} + +void K3bCdrdaoWriter::setCopyArguments() +{ + // source device and source driver + *m_process << "--source-device" << K3b::externalBinDeviceParameter(m_sourceDevice, m_cdrdaoBinObject); + if ( m_sourceDevice->cdrdaoDriver() != "auto" ) + *m_process << "--source-driver" << m_sourceDevice->cdrdaoDriver(); + else if( defaultToGenericMMC( m_sourceDevice, false ) ) { + kdDebug() << "(K3bCdrdaoWriter) defaulting to generic-mmc driver for " << m_sourceDevice->blockDeviceName() << endl; + *m_process << "--source-driver" << "generic-mmc"; + } + + // on-the-fly + if ( m_onTheFly ) + *m_process << "--on-the-fly"; +} + +void K3bCdrdaoWriter::setBlankArguments() +{ + // device and driver + *m_process << "--device" + << K3b::externalBinDeviceParameter(burnDevice(), m_cdrdaoBinObject); + + if( burnDevice()->cdrdaoDriver() != "auto" ) + { + *m_process << "--driver"; + if( burnDevice()->cdTextCapable() == 1 ) + *m_process << QString("%1:0x00000010").arg( burnDevice()->cdrdaoDriver() ); + else + *m_process << burnDevice()->cdrdaoDriver(); + } + else if( defaultToGenericMMC( burnDevice(), true ) ) { + kdDebug() << "(K3bCdrdaoWriter) defaulting to generic-mmc driver for " << burnDevice()->blockDeviceName() << endl; + *m_process << "--driver" << "generic-mmc"; + } + + // burn speed + if( d->usedSpeed != 0 ) + *m_process << "--speed" << QString("%1").arg(d->usedSpeed); + + // blank-mode + *m_process << "--blank-mode"; + switch (m_blankMode) + { + case FULL: + *m_process << "full"; + break; + case MINIMAL: + *m_process << "minimal"; + break; + } +} + +void K3bCdrdaoWriter::setCommonArguments() +{ + + // additional user parameters from config + const QStringList& params = m_cdrdaoBinObject->userParameters(); + for( QStringList::const_iterator it = params.begin(); it != params.end(); ++it ) + *m_process << *it; + + + // display debug info + *m_process << "-n" << "-v" << "2"; + + // we have the power to do what ever we want. ;) + *m_process << "--force"; + + // eject + if( m_eject && !m_forceNoEject ) + *m_process << "--eject"; + + // remote + *m_process << "--remote" << QString("%1").arg(m_cdrdaoComm[0]); + + // data File + if ( ! m_dataFile.isEmpty() ) + *m_process << "--datafile" << m_dataFile; + + // BIN/CUE + if ( ! m_cueFileLnk.isEmpty() ) + *m_process << m_cueFileLnk; + // TOC File + else if ( ! m_tocFile.isEmpty() ) + *m_process << m_tocFile; +} + +K3bCdrdaoWriter* K3bCdrdaoWriter::addArgument( const QString& arg ) +{ + *m_process << arg; + return this; +} + + +void K3bCdrdaoWriter::start() +{ + jobStarted(); + + d->speedEst->reset(); + + delete m_process; // kdelibs want this! + m_process = new K3bProcess(); + m_process->setRunPrivileged(true); + m_process->setSplitStdout(false); + m_process->setRawStdin(true); + connect( m_process, SIGNAL(stderrLine(const QString&)), + this, SLOT(slotStdLine(const QString&)) ); + connect( m_process, SIGNAL(processExited(KProcess*)), + this, SLOT(slotProcessExited(KProcess*)) ); + + m_canceled = false; + m_knownError = false; + + m_cdrdaoBinObject = k3bcore->externalBinManager()->binObject("cdrdao"); + + if( !m_cdrdaoBinObject ) { + emit infoMessage( i18n("Could not find %1 executable.").arg("cdrdao"), ERROR ); + jobFinished(false); + return; + } + + emit debuggingOutput( "Used versions", "cdrdao: " + m_cdrdaoBinObject->version ); + + if( !m_cdrdaoBinObject->copyright.isEmpty() ) + emit infoMessage( i18n("Using %1 %2 - Copyright (C) %3").arg(m_cdrdaoBinObject->name()).arg(m_cdrdaoBinObject->version).arg(m_cdrdaoBinObject->copyright), INFO ); + + + // the message size changed in cdrdao 1.1.8) + if( m_cdrdaoBinObject->version >= K3bVersion( 1, 1, 8 ) ) + d->progressMsgSize = sizeof(ProgressMsg2); + else + d->progressMsgSize = sizeof(ProgressMsg); + + // since the --speed parameter is used several times in this code we + // determine the speed in auto once at the beginning + d->usedSpeed = burnSpeed(); + if( d->usedSpeed == 0 ) { + // try to determine the writeSpeed + // if it fails determineMaximalWriteSpeed() will return 0 and + // the choice is left to cdrdao + d->usedSpeed = burnDevice()->determineMaximalWriteSpeed(); + } + d->usedSpeed /= 175; + + switch ( m_command ) + { + case WRITE: + case COPY: + if (!m_tocFile.isEmpty()) + { + + // if tocfile is a cuesheet than create symlinks to *.cue and the binary listed inside the cuesheet. + // now works without the .bin extension too. + if ( !cueSheet() ) { + m_backupTocFile = m_tocFile + ".k3bbak"; + + // workaround, cdrdao deletes the tocfile when --remote parameter is set + if ( !KIO::NetAccess::copy(KURL(m_tocFile),KURL(m_backupTocFile), (QWidget*) 0) ) + { + kdDebug() << "(K3bCdrdaoWriter) could not backup " << m_tocFile << " to " << m_backupTocFile << endl; + emit infoMessage( i18n("Could not backup tocfile."), ERROR ); + jobFinished(false); + return; + } + } + } + break; + case BLANK: + case READ: + break; + } + prepareArgumentList(); + // set working dir to dir part of toc file (to allow rel names in toc-file) + m_process->setWorkingDirectory(QUrl(m_tocFile).dirPath()); + + kdDebug() << "***** cdrdao parameters:\n"; + const QValueList& args = m_process->args(); + QString s; + for( QValueList::const_iterator it = args.begin(); it != args.end(); ++it ) + { + s += *it + " "; + } + kdDebug() << s << flush << endl; + emit debuggingOutput("cdrdao command:", s); + + m_currentTrack = 0; + reinitParser(); + + switch ( m_command ) + { + case READ: + emit newSubTask( i18n("Preparing read process...") ); + break; + case WRITE: + emit newSubTask( i18n("Preparing write process...") ); + break; + case COPY: + emit newSubTask( i18n("Preparing copy process...") ); + break; + case BLANK: + emit newSubTask( i18n("Preparing blanking process...") ); + break; + } + + // FIXME: check the return value + if( K3b::isMounted( burnDevice() ) ) { + emit infoMessage( i18n("Unmounting medium"), INFO ); + K3b::unmount( burnDevice() ); + } + + // block the device (including certain checks) + k3bcore->blockDevice( burnDevice() ); + + // lock the device for good in this process since it will + // be opened in the growisofs process + burnDevice()->close(); + burnDevice()->usageLock(); + + if( !m_process->start( KProcess::NotifyOnExit, KProcess::AllOutput ) ) + { + // something went wrong when starting the program + // it "should" be the executable + kdDebug() << "(K3bCdrdaoWriter) could not start cdrdao" << endl; + emit infoMessage( i18n("Could not start %1.").arg("cdrdao"), K3bJob::ERROR ); + jobFinished(false); + } + else + { + switch ( m_command ) + { + case WRITE: + if( simulate() ) + { + emit infoMessage(i18n("Starting DAO simulation at %1x speed...").arg(d->usedSpeed), + K3bJob::INFO ); + emit newTask( i18n("Simulating") ); + } + else + { + emit infoMessage( i18n("Starting DAO writing at %1x speed...").arg(d->usedSpeed), K3bJob::INFO ); + emit newTask( i18n("Writing") ); + } + break; + case READ: + emit infoMessage(i18n("Starting reading..."), K3bJob::INFO ); + emit newTask( i18n("Reading") ); + break; + case COPY: + if( simulate() ) + { + emit infoMessage(i18n("Starting simulation copy at %1x speed...").arg(d->usedSpeed), K3bJob::INFO ); + emit newTask( i18n("Simulating") ); + } + else + { + emit infoMessage( i18n("Starting copy at %1x speed...").arg(d->usedSpeed), K3bJob::INFO ); + emit newTask( i18n("Copying") ); + } + break; + case BLANK: + emit infoMessage(i18n("Starting blanking..."), K3bJob::INFO ); + emit newTask( i18n("Blanking") ); + } + } +} + + +void K3bCdrdaoWriter::cancel() +{ + m_canceled = true; + + if( m_process ) { + if( m_process->isRunning() ) { + m_process->disconnect(); + m_process->kill(); + + // we need to unlock the device because cdrdao locked it while writing + // + // FIXME: try to determine wheater we are writing or reading and choose + // the device to unblock based on that result. + // + if( m_command == READ ) { + // FIXME: this is a hack + setBurnDevice( m_sourceDevice ); + } + + // this will unblock and eject the drive and emit the finished/canceled signals + K3bAbstractWriter::cancel(); + } + } +} + + +bool K3bCdrdaoWriter::cueSheet() +{ + + // TODO: do this in the K3bCueFileParser + + if ( m_tocFile.lower().endsWith( ".cue" ) ) { + QFile f( m_tocFile ); + if ( f.open( IO_ReadOnly ) ) { + QTextStream ts( &f ); + if ( !ts.eof() ) { + QString line = ts.readLine(); + f.close(); + int pos = line.find( "FILE \"" ); + if( pos < 0 ) + return false; + + pos += 6; + int endPos = line.find( "\" BINARY", pos+1 ); + if( endPos < 0 ) + return false; + + line = line.mid( pos, endPos-pos ); + QFileInfo fi( QFileInfo( m_tocFile ).dirPath() + "/" + QFileInfo( line ).fileName() ); + QString binpath = fi.filePath(); + kdDebug() << QString("K3bCdrdaoWriter::cueSheet() BinFilePath from CueFile: %1").arg( line ) << endl; + kdDebug() << QString("K3bCdrdaoWriter::cueSheet() absolute BinFilePath: %1").arg( binpath ) << endl; + + if ( !fi.exists() ) + return false; + + KTempFile tempF; + QString tempFile = tempF.name(); + tempF.unlink(); + + if ( symlink(QFile::encodeName( binpath ), QFile::encodeName( tempFile + ".bin") ) == -1 ) + return false; + if ( symlink(QFile::encodeName( m_tocFile ), QFile::encodeName( tempFile + ".cue") ) == -1 ) + return false; + + kdDebug() << QString("K3bCdrdaoWriter::cueSheet() symlink BinFileName: %1.bin").arg( tempFile ) << endl; + kdDebug() << QString("K3bCdrdaoWriter::cueSheet() symlink CueFileName: %1.cue").arg( tempFile ) << endl; + m_binFileLnk = tempFile + ".bin"; + m_cueFileLnk = tempFile + ".cue"; + return true; + } + } + } + + return false; +} + +void K3bCdrdaoWriter::slotStdLine( const QString& line ) +{ + parseCdrdaoLine(line); +} + + +void K3bCdrdaoWriter::slotProcessExited( KProcess* p ) +{ + // release the device within this process + burnDevice()->usageUnlock(); + + // unblock the device + k3bcore->unblockDevice( burnDevice() ); + + switch ( m_command ) + { + case WRITE: + case COPY: + if ( !m_binFileLnk.isEmpty() ) { + KIO::NetAccess::del(KURL::fromPathOrURL(m_cueFileLnk), (QWidget*) 0); + KIO::NetAccess::del(KURL::fromPathOrURL(m_binFileLnk), (QWidget*) 0); + } + else if( (!QFile::exists( m_tocFile ) || K3b::filesize( KURL::fromPathOrURL(m_tocFile) ) == 0 ) && !m_onTheFly ) + { + // cdrdao removed the tocfile :( + // we need to recover it + if ( !KIO::NetAccess::copy(KURL::fromPathOrURL(m_backupTocFile), KURL::fromPathOrURL(m_tocFile), (QWidget*) 0) ) + { + kdDebug() << "(K3bCdrdaoWriter) restoring tocfile " << m_tocFile << " failed." << endl; + emit infoMessage( i18n("Due to a bug in cdrdao the toc/cue file %1 has been deleted. " + "K3b was unable to restore it from the backup %2.").arg(m_tocFile).arg(m_backupTocFile), ERROR ); + } + else if ( !KIO::NetAccess::del(KURL::fromPathOrURL(m_backupTocFile), (QWidget*) 0) ) + { + kdDebug() << "(K3bCdrdaoWriter) delete tocfile backkup " << m_backupTocFile << " failed." << endl; + } + } + break; + case BLANK: + case READ: + break; + } + + if( m_canceled ) + return; + + if( p->normalExit() ) + { + switch( p->exitStatus() ) + { + case 0: + if( simulate() ) + emit infoMessage( i18n("Simulation successfully completed"), K3bJob::SUCCESS ); + else + switch ( m_command ) + { + case READ: + emit infoMessage( i18n("Reading successfully completed"), K3bJob::SUCCESS ); + break; + case WRITE: + emit infoMessage( i18n("Writing successfully completed"), K3bJob::SUCCESS ); + break; + case COPY: + emit infoMessage( i18n("Copying successfully completed"), K3bJob::SUCCESS ); + break; + case BLANK: + emit infoMessage( i18n("Blanking successfully completed"), K3bJob::SUCCESS ); + break; + } + + if( m_command == WRITE || m_command == COPY ) { + int s = d->speedEst->average(); + emit infoMessage( i18n("Average overall write speed: %1 KB/s (%2x)").arg(s).arg(KGlobal::locale()->formatNumber((double)s/150.0), 2), INFO ); + } + + jobFinished( true ); + break; + + default: + if( !m_knownError && !wasSourceUnreadable() ) { + emit infoMessage( i18n("%1 returned an unknown error (code %2).").arg(m_cdrdaoBinObject->name()).arg(p->exitStatus()), + K3bJob::ERROR ); + emit infoMessage( i18n("Please include the debugging output in your problem report."), K3bJob::ERROR ); + } + + jobFinished( false ); + break; + } + } + else + { + emit infoMessage( i18n("%1 did not exit cleanly.").arg("cdrdao"), K3bJob::ERROR ); + jobFinished( false ); + } +} + + +void K3bCdrdaoWriter::unknownCdrdaoLine( const QString& line ) +{ + if( line.contains( "at speed" ) ) + { + // parse the speed and inform the user if cdrdao switched it down + int pos = line.find( "at speed" ); + int po2 = line.find( QRegExp("\\D"), pos + 9 ); + int speed = line.mid( pos+9, po2-pos-9 ).toInt(); + if( speed < d->usedSpeed ) + { + emit infoMessage( i18n("Medium or burner do not support writing at %1x speed").arg(d->usedSpeed), K3bJob::WARNING ); + emit infoMessage( i18n("Switching down burn speed to %1x").arg(speed), K3bJob::WARNING ); + } + } +} + + +void K3bCdrdaoWriter::reinitParser() +{ + ::memset( &d->oldMsg, 0, sizeof(ProgressMsg2) ); + ::memset( &d->newMsg, 0, sizeof(ProgressMsg2) ); + + m_currentTrack=0; +} + +void K3bCdrdaoWriter::parseCdrdaoLine( const QString& str ) +{ + emit debuggingOutput( "cdrdao", str ); + // kdDebug() << "(cdrdaoparse)" << str << endl; + // find some messages from cdrdao + // ----------------------------------------------------------------------------------------- + if( (str).startsWith( "Warning" ) || (str).startsWith( "WARNING" ) || (str).startsWith( "ERROR" ) ) + { + parseCdrdaoError( str ); + } + else if( (str).startsWith( "Wrote" ) && !str.contains("blocks") ) + { + parseCdrdaoWrote( str ); + } + else if( (str).startsWith( "Executing power" ) ) + { + emit newSubTask( i18n("Executing Power calibration") ); + } + else if( (str).startsWith( "Power calibration successful" ) ) + { + emit infoMessage( i18n("Power calibration successful"), K3bJob::INFO ); + emit newSubTask( i18n("Preparing burn process...") ); + } + else if( (str).startsWith( "Flushing cache" ) ) + { + emit newSubTask( i18n("Flushing cache") ); + } + else if( (str).startsWith( "Writing CD-TEXT lead" ) ) + { + emit newSubTask( i18n("Writing CD-Text lead-in...") ); + } + else if( (str).startsWith( "Turning BURN-Proof on" ) ) + { + emit infoMessage( i18n("Turning BURN-Proof on"), K3bJob::INFO ); + } + else if( str.startsWith( "Copying" ) ) + { + emit infoMessage( str, K3bJob::INFO ); + } + else if( str.startsWith( "Found ISRC" ) ) + { + emit infoMessage( i18n("Found ISRC code"), K3bJob::INFO ); + } + else if( str.startsWith( "Found pre-gap" ) ) + { + emit infoMessage( i18n("Found pregap: %1").arg( str.mid(str.find(":")+1) ), K3bJob::INFO ); + } + else + unknownCdrdaoLine(str); +} + +void K3bCdrdaoWriter::parseCdrdaoError( const QString& line ) +{ + int pos = -1; + + if( line.contains( "No driver found" ) || + line.contains( "use option --driver" ) ) + { + emit infoMessage( i18n("No cdrdao driver found."), K3bJob::ERROR ); + emit infoMessage( i18n("Please select one manually in the device settings."), K3bJob::ERROR ); + emit infoMessage( i18n("For most current drives this would be 'generic-mmc'."), K3bJob::ERROR ); + m_knownError = true; + } + else if( line.contains( "Cannot setup device" ) ) + { + // no nothing... + } + else if( line.contains( "not ready") ) + { + emit infoMessage( i18n("Device not ready, waiting."),K3bJob::WARNING ); + } + else if( line.contains("Drive does not accept any cue sheet") ) + { + emit infoMessage( i18n("Cue sheet not accepted."), K3bJob::ERROR ); + m_knownError = true; + } + else if( (pos = line.find( "Illegal option" )) > 0 ) { + // ERROR: Illegal option: -wurst + emit infoMessage( i18n("No valid %1 option: %2").arg(m_cdrdaoBinObject->name()).arg(line.mid(pos+16)), + ERROR ); + m_knownError = true; + } + else if( line.contains( "exceeds capacity" ) ) { + emit infoMessage( i18n("Data does not fit on disk."), ERROR ); + if( m_cdrdaoBinObject->hasFeature("overburn") ) + emit infoMessage( i18n("Enable overburning in the advanced K3b settings to burn anyway."), INFO ); + m_knownError = true; + } + // else if( !line.contains( "remote progress message" ) ) +// emit infoMessage( line, K3bJob::ERROR ); +} + +void K3bCdrdaoWriter::parseCdrdaoWrote( const QString& line ) +{ + int pos, po2; + pos = line.find( "Wrote" ); + po2 = line.find( " ", pos + 6 ); + int processed = line.mid( pos+6, po2-pos-6 ).toInt(); + + pos = line.find( "of" ); + po2 = line.find( " ", pos + 3 ); + m_size = line.mid( pos+3, po2-pos-3 ).toInt(); + + d->speedEst->dataWritten( processed*1024 ); + + emit processedSize( processed, m_size ); +} + + +void K3bCdrdaoWriter::parseCdrdaoMessage() +{ + static const char msgSync[] = { 0xff, 0x00, 0xff, 0x00 }; + unsigned int avail = m_comSock->bytesAvailable(); + unsigned int msgs = avail / ( sizeof(msgSync)+d->progressMsgSize ); + unsigned int count = 0; + + if ( msgs < 1 ) + return; + else if ( msgs > 1) { + // move the read-index forward to the beginnig of the most recent message + count = ( msgs-1 ) * ( sizeof(msgSync)+d->progressMsgSize ); + m_comSock->at(count); + kdDebug() << "(K3bCdrdaoParser) " << msgs-1 << " message(s) skipped" << endl; + } + + while( count < avail ) { + + // search for msg sync + int state = 0; + char buf; + while( state < 4 ) { + buf = m_comSock->getch(); + ++count; + if( count == avail ) { + // kdDebug() << "(K3bCdrdaoParser) remote message sync not found (" << count << ")" << endl; + return; + } + + if( buf == msgSync[state] ) + ++state; + else + state = 0; + } + + if( (avail - count) < d->progressMsgSize ) { + kdDebug() << "(K3bCdrdaoParser) could not read complete remote message." << endl; + return; + } + + // read one message (the message size changed in cdrdao 1.1.8) + ::memset( &d->newMsg, 0, d->progressMsgSize ); + int size = m_comSock->readBlock( (char*)&d->newMsg, d->progressMsgSize); + if( size == -1 ) { + kdDebug() << "(K3bCdrdaoParser) read error" << endl; + return; + } + count += size; + + // sometimes the progress takes one step back (on my system when using paranoia-level 3) + // so we just use messages that are greater than the previous or first messages + if( d->oldMsg < d->newMsg + || ( d->newMsg.track == 1 && + d->newMsg.trackProgress <= 10 )) { + + if( d->newMsg.track != m_currentTrack ) { + switch( d->newMsg.status ) { + case PGSMSG_RCD_EXTRACTING: + emit nextTrack( d->newMsg.track, d->newMsg.totalTracks ); + break; + case PGSMSG_WCD_LEADIN: + emit newSubTask( i18n("Writing leadin ") ); + break; + case PGSMSG_WCD_DATA: + emit nextTrack( d->newMsg.track, d->newMsg.totalTracks ); + break; + case PGSMSG_WCD_LEADOUT: + emit newSubTask( i18n("Writing leadout ") ); + break; + } + + m_currentTrack = d->newMsg.track; + } + + if( d->newMsg.status == PGSMSG_WCD_LEADIN || d->newMsg.status == PGSMSG_WCD_LEADOUT ) { + // cdrdao >= 1.1.8 emits progress data when writing the lead-in and lead-out :) + emit subPercent( d->newMsg.totalProgress/10 ); + } + else { + emit subPercent( d->newMsg.trackProgress/10 ); + emit percent( d->newMsg.totalProgress/10 ); + } + + emit buffer(d->newMsg.bufferFillRate); + + if( d->progressMsgSize == (unsigned int)sizeof(ProgressMsg2) ) + emit deviceBuffer( d->newMsg.writerFillRate ); + + ::memcpy( &d->oldMsg, &d->newMsg, d->progressMsgSize ); + } + } +} + + +void K3bCdrdaoWriter::slotThroughput( int t ) +{ + // FIXME: determine sector size + emit writeSpeed( t, 150 ); +} + + +QString K3bCdrdaoWriter::findDriverFile( const K3bExternalBin* bin ) +{ + if( !bin ) + return QString::null; + + // cdrdao normally in (prefix)/bin and driver table in (prefix)/share/cdrdao + QString path = bin->path; + path.truncate( path.findRev("/") ); + path.truncate( path.findRev("/") ); + path += "/share/cdrdao/drivers"; + if( QFile::exists(path) ) + return path; + else { + kdDebug() << "(K3bCdrdaoWriter) could not find cdrdao driver table." << endl; + return QString::null; + } +} + + +// returns true if the driver file could be opened and no driver could be found +// TODO: cache the drivers +bool K3bCdrdaoWriter::defaultToGenericMMC( K3bDevice::Device* dev, bool writer ) +{ + QString driverTable = findDriverFile( m_cdrdaoBinObject ); + if( !driverTable.isEmpty() ) { + QFile f( driverTable ); + if( f.open( IO_ReadOnly ) ) { + // read all drivers + QStringList drivers; + QTextStream fStr( &f ); + while( !fStr.atEnd() ) { + QString line = fStr.readLine(); + if( line.isEmpty() ) + continue; + if( line[0] == '#' ) + continue; + if( line[0] == 'R' && writer ) + continue; + if( line[0] == 'W' && !writer ) + continue; + drivers.append(line); + } + + // search for the driver + for( QStringList::const_iterator it = drivers.begin(); it != drivers.end(); ++it ) { + if( (*it).section( '|', 1, 1 ) == dev->vendor() && + (*it).section( '|', 2, 2 ) == dev->description() ) + return false; + } + + // no driver found + return true; + } + else { + kdDebug() << "(K3bCdrdaoWriter) could not open driver table " << driverTable << endl; + return false; + } + } + else + return false; +} + + +#include "k3bcdrdaowriter.moc" diff --git a/libk3b/projects/k3bcdrdaowriter.h b/libk3b/projects/k3bcdrdaowriter.h new file mode 100644 index 0000000..94a0c9f --- /dev/null +++ b/libk3b/projects/k3bcdrdaowriter.h @@ -0,0 +1,157 @@ +/* + * + * $Id: k3bcdrdaowriter.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * Klaus-Dieter Krannich + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef K3B_CDRDAO_WRITER_H +#define K3B_CDRDAO_WRITER_H + + +#include "k3babstractwriter.h" + +class K3bExternalBin; +class K3bProcess; +class KProcess; +class K3bDevice::Device; +class QSocket; + + + +class K3bCdrdaoWriter : public K3bAbstractWriter +{ + Q_OBJECT + + public: + + enum Command { WRITE, COPY, READ, BLANK }; + enum BlankMode { FULL, MINIMAL }; + enum SubMode { None, RW, RW_RAW }; + + K3bCdrdaoWriter( K3bDevice::Device* dev, K3bJobHandler*, + QObject* parent = 0, const char* name = 0 ); + ~K3bCdrdaoWriter(); + + /** + * to be used in chain: addArgument(x)->addArgument(y) + */ + K3bCdrdaoWriter* addArgument( const QString& ); + K3bDevice::Device* sourceDevice() { return m_sourceDevice; }; + + int fd() const; + + bool active() const; + + private: + void reinitParser(); + void parseCdrdaoLine( const QString& line ); + void parseCdrdaoWrote( const QString& line ); + void parseCdrdaoError( const QString& line ); + + public slots: + void start(); + void cancel(); + + // options + // --------------------- + void setCommand( int c ) { m_command = c; } + void setBlankMode( int b ) { m_blankMode = b; } + void setMulti( bool b ) { m_multi = b; } + void setForce( bool b ) { m_force = b; } + void setOnTheFly( bool b ) { m_onTheFly = b; } + void setDataFile( const QString& s ) { m_dataFile = s; } + void setTocFile( const QString& s ) { m_tocFile = s; } + + void setSourceDevice( K3bDevice::Device* dev ) { m_sourceDevice = dev; } + void setFastToc( bool b ) { m_fastToc = b; } + void setReadRaw( bool b ) { m_readRaw = b; } + void setReadSubchan(SubMode m) { m_readSubchan=m; }; + void setParanoiaMode( int i ) { m_paranoiaMode = i; } + void setTaoSource(bool b) { m_taoSource=b; }; + void setTaoSourceAdjust(int a) { m_taoSourceAdjust=a; }; + void setSession(int s) { m_session=s; }; + void setEject(bool e) { m_eject=e; }; +// --------------------- + + /** + * If set true the job ignores the global K3b setting + * and does not eject the CD-RW after finishing + */ + void setForceNoEject( bool b ) { m_forceNoEject = b; } + + private slots: + void slotStdLine( const QString& line ); + void slotProcessExited(KProcess*); + void parseCdrdaoMessage(); + void slotThroughput( int t ); + + private: + void unknownCdrdaoLine( const QString& ); + void prepareArgumentList(); + void setWriteArguments(); + void setReadArguments(); + void setCopyArguments(); + void setBlankArguments(); + void setCommonArguments(); + + bool cueSheet(); + + QString findDriverFile( const K3bExternalBin* bin ); + bool defaultToGenericMMC( K3bDevice::Device* dev, bool writer ); + + // options + // --------------------- + int m_command; + int m_blankMode; + K3bDevice::Device* m_sourceDevice; + QString m_dataFile; + QString m_tocFile; + QString m_cueFileLnk; + QString m_binFileLnk; + QString m_backupTocFile; + bool m_readRaw; + bool m_multi; + bool m_force; + bool m_onTheFly; + bool m_fastToc; + SubMode m_readSubchan; + bool m_taoSource; + int m_taoSourceAdjust; + int m_paranoiaMode; + int m_session; + bool m_eject; + // --------------------- + + const K3bExternalBin* m_cdrdaoBinObject; + K3bProcess* m_process; + + int m_cdrdaoComm[2]; + QSocket *m_comSock; + + bool m_canceled; + + bool m_knownError; + +// parser + + int m_size; + int m_currentTrack; + + bool m_forceNoEject; + + class Private; + Private* d; +}; + +#endif diff --git a/libk3b/projects/k3bcdrecordwriter.cpp b/libk3b/projects/k3bcdrecordwriter.cpp new file mode 100644 index 0000000..e87c767 --- /dev/null +++ b/libk3b/projects/k3bcdrecordwriter.cpp @@ -0,0 +1,810 @@ +/* + * + * $Id: k3bcdrecordwriter.cpp 690529 2007-07-21 10:51:47Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include + + +#include "k3bcdrecordwriter.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + + + +class K3bCdrecordWriter::Private +{ +public: + Private() + : cdTextFile(0) { + } + + K3bThroughputEstimator* speedEst; + bool canceled; + bool usingBurnfree; + int usedSpeed; + + struct Track { + int size; + bool audio; + }; + + QValueList tracks; + + KTempFile* cdTextFile; +}; + + +K3bCdrecordWriter::K3bCdrecordWriter( K3bDevice::Device* dev, K3bJobHandler* hdl, + QObject* parent, const char* name ) + : K3bAbstractWriter( dev, hdl, parent, name ), + m_clone(false), + m_cue(false), + m_forceNoEject(false) +{ + d = new Private(); + d->speedEst = new K3bThroughputEstimator( this ); + connect( d->speedEst, SIGNAL(throughput(int)), + this, SLOT(slotThroughput(int)) ); + + m_process = 0; + m_writingMode = K3b::TAO; +} + + +K3bCdrecordWriter::~K3bCdrecordWriter() +{ + delete d->cdTextFile; + delete d; + delete m_process; +} + + +bool K3bCdrecordWriter::active() const +{ + return ( m_process && m_process->isRunning() ); +} + + +int K3bCdrecordWriter::fd() const +{ + if( m_process ) + return m_process->stdinFd(); + else + return -1; +} + + +void K3bCdrecordWriter::setDao( bool b ) +{ + m_writingMode = ( b ? K3b::DAO : K3b::TAO ); +} + +void K3bCdrecordWriter::setCueFile( const QString& s) +{ + m_cue = true; + m_cueFile = s; + + // cuefile only works in DAO mode + setWritingMode( K3b::DAO ); +} + +void K3bCdrecordWriter::setClone( bool b ) +{ + m_clone = b; +} + + +void K3bCdrecordWriter::setWritingMode( int mode ) +{ + if( mode == K3b::DAO || + mode == K3b::TAO || + mode == K3b::RAW ) + m_writingMode = mode; + else + kdError() << "(K3bCdrecordWriter) wrong writing mode: " << mode << endl; +} + + +void K3bCdrecordWriter::prepareProcess() +{ + if( m_process ) delete m_process; // kdelibs want this! + m_process = new K3bProcess(); + m_process->setRunPrivileged(true); + // m_process->setPriority( KProcess::PrioHighest ); + m_process->setSplitStdout(true); + m_process->setSuppressEmptyLines(true); + m_process->setRawStdin(true); // we only use stdin when writing on-the-fly + connect( m_process, SIGNAL(stdoutLine(const QString&)), this, SLOT(slotStdLine(const QString&)) ); + connect( m_process, SIGNAL(stderrLine(const QString&)), this, SLOT(slotStdLine(const QString&)) ); + connect( m_process, SIGNAL(processExited(KProcess*)), this, SLOT(slotProcessExited(KProcess*)) ); + + m_cdrecordBinObject = k3bcore->externalBinManager()->binObject("cdrecord"); + + if( !m_cdrecordBinObject ) + return; + + *m_process << m_cdrecordBinObject; + + // display progress + *m_process << "-v"; + + if( m_cdrecordBinObject->hasFeature( "gracetime") ) + *m_process << "gracetime=2"; // 2 is the lowest allowed value (Joerg, why do you do this to us?) + + // Again we assume the device to be set! + *m_process << QString("dev=%1").arg(K3b::externalBinDeviceParameter(burnDevice(), m_cdrecordBinObject)); + + d->usedSpeed = burnSpeed(); + if( d->usedSpeed == 0 ) { + // try to determine the writeSpeed + // if it fails determineMaximalWriteSpeed() will return 0 and + // the choice is left to cdrecord + d->usedSpeed = burnDevice()->determineMaximalWriteSpeed(); + } + d->usedSpeed /= 175; + if( d->usedSpeed != 0 ) + *m_process << QString("speed=%1").arg(d->usedSpeed); + + if( m_writingMode == K3b::DAO || m_cue ) { + if( burnDevice()->dao() ) + *m_process << "-dao"; + else { + if( m_cdrecordBinObject->hasFeature( "tao" ) ) + *m_process << "-tao"; + emit infoMessage( i18n("Writer does not support disk at once (DAO) recording"), WARNING ); + } + } + else if( m_writingMode == K3b::RAW ) { + if( burnDevice()->supportsWritingMode( K3bDevice::RAW_R96R ) ) + *m_process << "-raw96r"; + else if( burnDevice()->supportsWritingMode( K3bDevice::RAW_R16 ) ) + *m_process << "-raw16"; + else if( burnDevice()->supportsWritingMode( K3bDevice::RAW_R96P ) ) + *m_process << "-raw96p"; + else { + emit infoMessage( i18n("Writer does not support raw writing."), WARNING ); + if( m_cdrecordBinObject->hasFeature( "tao" ) ) + *m_process << "-tao"; + } + } + else if( m_cdrecordBinObject->hasFeature( "tao" ) ) + *m_process << "-tao"; + + if( simulate() ) + *m_process << "-dummy"; + + d->usingBurnfree = false; + if( k3bcore->globalSettings()->burnfree() ) { + if( burnDevice()->burnproof() ) { + + d->usingBurnfree = true; + + // with cdrecord 1.11a02 burnproof was renamed to burnfree + if( m_cdrecordBinObject->hasFeature( "burnproof" ) ) + *m_process << "driveropts=burnproof"; + else + *m_process << "driveropts=burnfree"; + } + else + emit infoMessage( i18n("Writer does not support buffer underrun free recording (Burnfree)"), WARNING ); + } + + if( k3bcore->globalSettings()->force() ) { + *m_process << "-force"; + emit infoMessage( i18n("'Force unsafe operations' enabled."), WARNING ); + } + + if( m_cue ) { + m_process->setWorkingDirectory(QUrl(m_cueFile).dirPath()); + *m_process << QString("cuefile=%1").arg( m_cueFile ); + } + + if( m_clone ) + *m_process << "-clone"; + + if( m_rawCdText.size() > 0 ) { + delete d->cdTextFile; + d->cdTextFile = new K3bTempFile( QString::null, ".dat" ); + d->cdTextFile->setAutoDelete(true); + d->cdTextFile->file()->writeBlock( m_rawCdText ); + d->cdTextFile->close(); + + *m_process << "textfile=" + d->cdTextFile->name(); + } + + if( k3bcore->globalSettings()->ejectMedia() && + !m_forceNoEject ) + *m_process << "-eject"; + + bool manualBufferSize = k3bcore->globalSettings()->useManualBufferSize(); + if( manualBufferSize ) { + *m_process << QString("fs=%1m").arg( k3bcore->globalSettings()->bufferSize() ); + } + + bool overburn = k3bcore->globalSettings()->overburn(); + if( overburn ) + if( m_cdrecordBinObject->hasFeature("overburn") ) + *m_process << "-overburn"; + else + emit infoMessage( i18n("Cdrecord %1 does not support overburning.").arg(m_cdrecordBinObject->version), WARNING ); + + // additional user parameters from config + const QStringList& params = m_cdrecordBinObject->userParameters(); + for( QStringList::const_iterator it = params.begin(); it != params.end(); ++it ) + *m_process << *it; + + // add the user parameters + for( QStringList::const_iterator it = m_arguments.begin(); it != m_arguments.end(); ++it ) + *m_process << *it; +} + + +K3bCdrecordWriter* K3bCdrecordWriter::addArgument( const QString& arg ) +{ + m_arguments.append( arg ); + return this; +} + + +void K3bCdrecordWriter::clearArguments() +{ + m_arguments.clear(); +} + + +void K3bCdrecordWriter::start() +{ + jobStarted(); + + d->canceled = false; + d->speedEst->reset(); + + prepareProcess(); + + if( !m_cdrecordBinObject ) { + emit infoMessage( i18n("Could not find %1 executable.").arg("cdrecord"), ERROR ); + jobFinished(false); + return; + } + + emit debuggingOutput( "Used versions", "cdrecord: " + m_cdrecordBinObject->version ); + + if( !m_cdrecordBinObject->copyright.isEmpty() ) + emit infoMessage( i18n("Using %1 %2 - Copyright (C) %3") + .arg(m_cdrecordBinObject->hasFeature( "wodim" ) ? "Wodim" : "Cdrecord" ) + .arg(m_cdrecordBinObject->version) + .arg(m_cdrecordBinObject->copyright), INFO ); + + + kdDebug() << "***** " << m_cdrecordBinObject->name() << " parameters:\n"; + const QValueList& args = m_process->args(); + QString s; + for( QValueList::const_iterator it = args.begin(); it != args.end(); ++it ) { + s += *it + " "; + } + kdDebug() << s << flush << endl; + emit debuggingOutput( m_cdrecordBinObject->name() + " command:", s); + + m_currentTrack = 0; + m_cdrecordError = UNKNOWN; + m_totalTracksParsed = false; + m_alreadyWritten = 0; + d->tracks.clear(); + m_totalSize = 0; + + emit newSubTask( i18n("Preparing write process...") ); + + // FIXME: check the return value + if( K3b::isMounted( burnDevice() ) ) { + emit infoMessage( i18n("Unmounting medium"), INFO ); + K3b::unmount( burnDevice() ); + } + + // block the device (including certain checks) + k3bcore->blockDevice( burnDevice() ); + + // lock the device for good in this process since it will + // be opened in the growisofs process + burnDevice()->close(); + burnDevice()->usageLock(); + + if( !m_process->start( KProcess::NotifyOnExit, KProcess::All ) ) { + // something went wrong when starting the program + // it "should" be the executable + kdDebug() << "(K3bCdrecordWriter) could not start " << m_cdrecordBinObject->name() << endl; + emit infoMessage( i18n("Could not start %1.").arg(m_cdrecordBinObject->name()), K3bJob::ERROR ); + jobFinished(false); + } + else { + if( simulate() ) { + emit newTask( i18n("Simulating") ); + emit infoMessage( i18n("Starting %1 simulation at %2x speed...") + .arg(K3b::writingModeString(m_writingMode)) + .arg(d->usedSpeed), + K3bJob::INFO ); + } + else { + emit newTask( i18n("Writing") ); + emit infoMessage( i18n("Starting %1 writing at %2x speed...") + .arg(K3b::writingModeString(m_writingMode)) + .arg(d->usedSpeed), + K3bJob::INFO ); + } + } +} + + +void K3bCdrecordWriter::cancel() +{ + if( active() ) { + d->canceled = true; + if( m_process && m_process->isRunning() ) + m_process->kill(); + } +} + + +void K3bCdrecordWriter::slotStdLine( const QString& line ) +{ + static QRegExp s_burnfreeCounterRx( "^BURN\\-Free\\swas\\s(\\d+)\\stimes\\sused" ); + static QRegExp s_burnfreeCounterRxPredict( "^Total\\sof\\s(\\d+)\\s\\spossible\\sbuffer\\sunderruns\\spredicted" ); + + // tracknumber: cap(1) + // done: cap(2) + // complete: cap(3) + // fifo: cap(4) (it seems as if some patched cdrecord versions do not emit the fifo info but only the buf... :( + // buffer: cap(5) + static QRegExp s_progressRx( "Track\\s(\\d\\d)\\:\\s*(\\d*)\\sof\\s*(\\d*)\\sMB\\swritten\\s(?:\\(fifo\\s*(\\d*)\\%\\)\\s*)?(?:\\[buf\\s*(\\d*)\\%\\])?.*" ); + + emit debuggingOutput( m_cdrecordBinObject->name(), line ); + + // + // Progress and toc parsing + // + + if( line.startsWith( "Track " ) ) { + if( !m_totalTracksParsed ) { + // this is not the progress display but the list of tracks that will get written + // we always extract the tracknumber to get the highest at last + bool ok; + int tt = line.mid( 6, 2 ).toInt(&ok); + + if( ok ) { + struct Private::Track track; + track.audio = ( line.mid( 10, 5 ) == "audio" ); + + m_totalTracks = tt; + + int sizeStart = line.find( QRegExp("\\d"), 10 ); + int sizeEnd = line.find( "MB", sizeStart ); + track.size = line.mid( sizeStart, sizeEnd-sizeStart ).toInt(&ok); + + if( ok ) { + d->tracks.append(track); + m_totalSize += track.size; + } + else + kdDebug() << "(K3bCdrecordWriter) track number parse error: " + << line.mid( sizeStart, sizeEnd-sizeStart ) << endl; + } + else + kdDebug() << "(K3bCdrecordWriter) track number parse error: " + << line.mid( 6, 2 ) << endl; + } + + else if( s_progressRx.exactMatch( line ) ) { + // int num = s_progressRx.cap(1).toInt(); + int made = s_progressRx.cap(2).toInt(); + int size = s_progressRx.cap(3).toInt(); + int fifo = s_progressRx.cap(4).toInt(); + + emit buffer( fifo ); + m_lastFifoValue = fifo; + + if( s_progressRx.numCaptures() > 4 ) + emit deviceBuffer( s_progressRx.cap(5).toInt() ); + + // + // cdrecord's output sucks a bit. + // we get track sizes that differ from the sizes in the progress + // info since these are dependant on the writing mode. + // so we just use the track sizes and do a bit of math... + // + + if( d->tracks.count() > m_currentTrack-1 && size > 0 ) { + double convV = (double)d->tracks[m_currentTrack-1].size/(double)size; + made = (int)((double)made * convV); + size = d->tracks[m_currentTrack-1].size; + } + else { + kdError() << "(K3bCdrecordWriter) Did not parse all tracks sizes!" << endl; + } + + if( size > 0 ) { + emit processedSubSize( made, size ); + emit subPercent( 100*made/size ); + } + + if( m_totalSize > 0 ) { + emit processedSize( m_alreadyWritten+made, m_totalSize ); + emit percent( 100*(m_alreadyWritten+made)/m_totalSize ); + } + + d->speedEst->dataWritten( (m_alreadyWritten+made)*1024 ); + } + } + + // + // Cdrecord starts all error and warning messages with it's path + // With Debian's script it starts with cdrecord (or /usr/bin/cdrecord or whatever! I hate this script!) + // + + else if( line.startsWith( "cdrecord" ) || + line.startsWith( m_cdrecordBinObject->path ) || + line.startsWith( m_cdrecordBinObject->path.left(m_cdrecordBinObject->path.length()-5) ) ) { + // get rid of the path and the following colon and space + QString errStr = line.mid( line.find(':') + 2 ); + + if( errStr.startsWith( "Drive does not support SAO" ) ) { + emit infoMessage( i18n("DAO (Disk At Once) recording not supported with this writer"), K3bJob::ERROR ); + emit infoMessage( i18n("Please choose TAO (Track At Once) and try again"), K3bJob::ERROR ); + } + else if( errStr.startsWith( "Drive does not support RAW" ) ) { + emit infoMessage( i18n("RAW recording not supported with this writer"), K3bJob::ERROR ); + } + else if( errStr.startsWith("Input/output error.") ) { + emit infoMessage( i18n("Input/output error. Not necessarily serious."), WARNING ); + } + else if( errStr.startsWith("shmget failed") ) { + m_cdrecordError = SHMGET_FAILED; + } + else if( errStr.startsWith("OPC failed") ) { + m_cdrecordError = OPC_FAILED; + } + else if( errStr.startsWith( "Drive needs to reload the media" ) ) { + emit infoMessage( i18n("Reloading of medium required"), K3bJob::INFO ); + } + else if( errStr.startsWith( "The current problem looks like a buffer underrun" ) ) { + if( m_cdrecordError == UNKNOWN ) // it is almost never a buffer underrun these days. + m_cdrecordError = BUFFER_UNDERRUN; + } + else if( errStr.startsWith("WARNING: Data may not fit") ) { + bool overburn = k3bcore->globalSettings()->overburn(); + if( overburn && m_cdrecordBinObject->hasFeature("overburn") ) + emit infoMessage( i18n("Trying to write more than the official disk capacity"), K3bJob::WARNING ); + m_cdrecordError = OVERSIZE; + } + else if( errStr.startsWith("Bad Option") ) { + m_cdrecordError = BAD_OPTION; + // parse option + int pos = line.find( "Bad Option" ) + 13; + int len = line.length() - pos - 1; + emit infoMessage( i18n("No valid %1 option: %2").arg(m_cdrecordBinObject->name()).arg(line.mid(pos, len)), + ERROR ); + } + else if( errStr.startsWith("Cannot set speed/dummy") ) { + m_cdrecordError = CANNOT_SET_SPEED; + } + else if( errStr.startsWith("Cannot open new session") ) { + m_cdrecordError = CANNOT_OPEN_NEW_SESSION; + } + else if( errStr.startsWith("Cannot send CUE sheet") ) { + m_cdrecordError = CANNOT_SEND_CUE_SHEET; + } + else if( errStr.startsWith( "Trying to use ultra high speed" ) || + errStr.startsWith( "Trying to use high speed" ) || + errStr.startsWith( "Probably trying to use ultra high speed" ) || + errStr.startsWith( "You did use a high speed medium on an improper writer" ) || + errStr.startsWith( "You did use a ultra high speed medium on an improper writer" ) ) { + m_cdrecordError = HIGH_SPEED_MEDIUM; + } + else if( errStr.startsWith( "You may have used an ultra low speed medium" ) ) { + m_cdrecordError = LOW_SPEED_MEDIUM; + } + else if( errStr.startsWith( "Permission denied. Cannot open" ) || + errStr.startsWith( "Operation not permitted." ) ) { + m_cdrecordError = PERMISSION_DENIED; + } + else if( errStr.startsWith( "Can only copy session # 1") ) { + emit infoMessage( i18n("Only session 1 will be cloned."), WARNING ); + } + else if( errStr == "Cannot fixate disk." ) { + emit infoMessage( i18n("Unable to fixate the disk."), ERROR ); + if( m_cdrecordError == UNKNOWN ) + m_cdrecordError = CANNOT_FIXATE_DISK; + } + else if( errStr == "A write error occurred." ) { + m_cdrecordError = WRITE_ERROR; + } + else if( errStr.startsWith( "Try again with cdrecord blank=all." ) ) { + m_cdrecordError = BLANK_FAILED; + } + } + + // + // All other messages + // + + else if( line.contains( "at speed" ) ) { + // parse the speed and inform the user if cdrdao switched it down + int pos = line.find( "at speed" ); + int pos2 = line.find( "in", pos+9 ); + int speed = static_cast( line.mid( pos+9, pos2-pos-10 ).toDouble() ); // cdrecord-dvd >= 2.01a25 uses 8.0 and stuff + if( speed != d->usedSpeed ) { + emit infoMessage( i18n("Medium or burner do not support writing at %1x speed").arg(d->usedSpeed), K3bJob::WARNING ); + if( speed > d->usedSpeed ) + emit infoMessage( i18n("Switching burn speed up to %1x").arg(speed), K3bJob::WARNING ); + else + emit infoMessage( i18n("Switching burn speed down to %1x").arg(speed), K3bJob::WARNING ); + } + } + else if( line.startsWith( "Starting new" ) ) { + m_totalTracksParsed = true; + if( m_currentTrack > 0 ) {// nothing has been written at the start of track 1 + if( d->tracks.count() > m_currentTrack-1 ) + m_alreadyWritten += d->tracks[m_currentTrack-1].size; + else + kdError() << "(K3bCdrecordWriter) Did not parse all tracks sizes!" << endl; + } + else + emit infoMessage( i18n("Starting disc write"), INFO ); + + m_currentTrack++; + + if( m_currentTrack > d->tracks.count() ) { + kdDebug() << "(K3bCdrecordWriter) need to add dummy track struct." << endl; + struct Private::Track t; + t.size = 1; + t.audio = false; + d->tracks.append(t); + } + + kdDebug() << "(K3bCdrecordWriter) writing track " << m_currentTrack << " of " << m_totalTracks << " tracks." << endl; + emit nextTrack( m_currentTrack, m_totalTracks ); + } + else if( line.startsWith( "Fixating" ) ) { + emit newSubTask( i18n("Closing Session") ); + } + else if( line.startsWith( "Writing lead-in" ) ) { + m_totalTracksParsed = true; + emit newSubTask( i18n("Writing Leadin") ); + } + else if( line.startsWith( "Writing Leadout") ) { + emit newSubTask( i18n("Writing Leadout") ); + } + else if( line.startsWith( "Writing pregap" ) ) { + emit newSubTask( i18n("Writing pregap") ); + } + else if( line.startsWith( "Performing OPC" ) ) { + emit infoMessage( i18n("Performing Optimum Power Calibration"), K3bJob::INFO ); + } + else if( line.startsWith( "Sending" ) ) { + emit infoMessage( i18n("Sending CUE sheet"), K3bJob::INFO ); + } + else if( line.startsWith( "Turning BURN-Free on" ) || line.startsWith( "BURN-Free is ON") ) { + emit infoMessage( i18n("Enabled Burnfree"), K3bJob::INFO ); + } + else if( line.startsWith( "Turning BURN-Free off" ) ) { + emit infoMessage( i18n("Disabled Burnfree"), K3bJob::WARNING ); + } + else if( line.startsWith( "Re-load disk and hit" ) ) { + // this happens on some notebooks where cdrecord is not able to close the + // tray itself, so we need to ask the user to do so + blockingInformation( i18n("Please reload the medium and press 'ok'"), + i18n("Unable to close the tray") ); + + // now send a to cdrecord + // hopefully this will do it since I have no possibility to test it! + ::write( fd(), "\n", 1 ); + } + else if( s_burnfreeCounterRx.search( line ) ) { + bool ok; + int num = s_burnfreeCounterRx.cap(1).toInt(&ok); + if( ok ) + emit infoMessage( i18n("Burnfree was used 1 time.", "Burnfree was used %n times.", num), INFO ); + } + else if( s_burnfreeCounterRxPredict.search( line ) ) { + bool ok; + int num = s_burnfreeCounterRxPredict.cap(1).toInt(&ok); + if( ok ) + emit infoMessage( i18n("Buffer was low 1 time.", "Buffer was low %n times.", num), INFO ); + } + else if( line.contains("Medium Error") ) { + m_cdrecordError = MEDIUM_ERROR; + } + else if( line.startsWith( "Error trying to open" ) && line.contains( "(Device or resource busy)" ) ) { + m_cdrecordError = DEVICE_BUSY; + } + else { + // debugging + kdDebug() << "(" << m_cdrecordBinObject->name() << ") " << line << endl; + } +} + + +void K3bCdrecordWriter::slotProcessExited( KProcess* p ) +{ + // remove temporary cdtext file + delete d->cdTextFile; + d->cdTextFile = 0; + + // release the device within this process + burnDevice()->usageUnlock(); + + // unblock the device + k3bcore->unblockDevice( burnDevice() ); + + if( d->canceled ) { + // this will unblock and eject the drive and emit the finished/canceled signals + K3bAbstractWriter::cancel(); + return; + } + + + if( p->normalExit() ) { + switch( p->exitStatus() ) { + case 0: + { + if( simulate() ) + emit infoMessage( i18n("Simulation successfully completed"), K3bJob::SUCCESS ); + else + emit infoMessage( i18n("Writing successfully completed"), K3bJob::SUCCESS ); + + int s = d->speedEst->average(); + emit infoMessage( i18n("Average overall write speed: %1 KB/s (%2x)").arg(s).arg(KGlobal::locale()->formatNumber((double)s/150.0), 2), INFO ); + + jobFinished( true ); + } + break; + + default: + kdDebug() << "(K3bCdrecordWriter) error: " << p->exitStatus() << endl; + + if( m_cdrecordError == UNKNOWN && m_lastFifoValue <= 3 ) + m_cdrecordError = BUFFER_UNDERRUN; + + switch( m_cdrecordError ) { + case OVERSIZE: + if( k3bcore->globalSettings()->overburn() && + m_cdrecordBinObject->hasFeature("overburn") ) + emit infoMessage( i18n("Data did not fit on disk."), ERROR ); + else { + emit infoMessage( i18n("Data does not fit on disk."), ERROR ); + if( m_cdrecordBinObject->hasFeature("overburn") ) + emit infoMessage( i18n("Enable overburning in the advanced K3b settings to burn anyway."), INFO ); + } + break; + case BAD_OPTION: + // error message has already been emited earlier since we needed the actual line + break; + case SHMGET_FAILED: + emit infoMessage( i18n("%1 could not reserve shared memory segment of requested size.").arg(m_cdrecordBinObject->name()), ERROR ); + emit infoMessage( i18n("Probably you chose a too large buffer size."), ERROR ); + break; + case OPC_FAILED: + emit infoMessage( i18n("OPC failed. Probably the writer does not like the medium."), ERROR ); + break; + case CANNOT_SET_SPEED: + emit infoMessage( i18n("Unable to set write speed to %1.").arg(d->usedSpeed), ERROR ); + emit infoMessage( i18n("Probably this is lower than your writer's lowest writing speed."), ERROR ); + break; + case CANNOT_SEND_CUE_SHEET: + emit infoMessage( i18n("Unable to send CUE sheet."), ERROR ); + if( m_writingMode == K3b::DAO ) + emit infoMessage( i18n("Sometimes using TAO writing mode solves this issue."), ERROR ); + break; + case CANNOT_OPEN_NEW_SESSION: + emit infoMessage( i18n("Unable to open new session."), ERROR ); + emit infoMessage( i18n("Probably a problem with the medium."), ERROR ); + break; + case CANNOT_FIXATE_DISK: + emit infoMessage( i18n("The disk might still be readable."), ERROR ); + if( m_writingMode == K3b::TAO && burnDevice()->dao() ) + emit infoMessage( i18n("Try DAO writing mode."), ERROR ); + break; + case PERMISSION_DENIED: + emit infoMessage( i18n("%1 has no permission to open the device.").arg("Cdrecord"), ERROR ); +#ifdef HAVE_K3BSETUP + emit infoMessage( i18n("You may use K3bsetup2 to solve this problem."), ERROR ); +#endif + break; + case BUFFER_UNDERRUN: + emit infoMessage( i18n("Probably a buffer underrun occurred."), ERROR ); + if( !d->usingBurnfree && burnDevice()->burnproof() ) + emit infoMessage( i18n("Please enable Burnfree or choose a lower burning speed."), ERROR ); + else + emit infoMessage( i18n("Please choose a lower burning speed."), ERROR ); + break; + case HIGH_SPEED_MEDIUM: + emit infoMessage( i18n("Found a high-speed medium not suitable for the writer being used."), ERROR ); + emit infoMessage( i18n("Use the 'force unsafe operations' option to ignore this."), ERROR ); + break; + case LOW_SPEED_MEDIUM: + emit infoMessage( i18n("Found a low-speed medium not suitable for the writer being used."), ERROR ); + emit infoMessage( i18n("Use the 'force unsafe operations' option to ignore this."), ERROR ); + break; + case MEDIUM_ERROR: + emit infoMessage( i18n("Most likely the burning failed due to low-quality media."), ERROR ); + break; + case DEVICE_BUSY: + emit infoMessage( i18n("Another application is blocking the device (most likely automounting)."), ERROR ); + break; + case WRITE_ERROR: + emit infoMessage( i18n("A write error occurred."), ERROR ); + if( m_writingMode == K3b::DAO ) + emit infoMessage( i18n("Sometimes using TAO writing mode solves this issue."), ERROR ); + break; + case BLANK_FAILED: + emit infoMessage( i18n("Some drives do not support all erase types."), ERROR ); + emit infoMessage( i18n("Try again using 'Complete' erasing."), ERROR ); + break; + case UNKNOWN: + if( p->exitStatus() == 12 && K3b::kernelVersion() >= K3bVersion( 2, 6, 8 ) && m_cdrecordBinObject->hasFeature( "suidroot" ) ) { + emit infoMessage( i18n("Since kernel version 2.6.8 cdrecord cannot use SCSI transport when running suid root anymore."), ERROR ); + emit infoMessage( i18n("You may use K3bSetup to solve this problem or remove the suid bit manually."), ERROR ); + } + else if( !wasSourceUnreadable() ) { + emit infoMessage( i18n("%1 returned an unknown error (code %2).") + .arg(m_cdrecordBinObject->name()).arg(p->exitStatus()), + K3bJob::ERROR ); + + if( p->exitStatus() >= 254 && m_writingMode == K3b::DAO ) { + emit infoMessage( i18n("Sometimes using TAO writing mode solves this issue."), ERROR ); + } + else { + emit infoMessage( i18n("If you are running an unpatched cdrecord version..."), ERROR ); + emit infoMessage( i18n("...and this error also occurs with high quality media..."), ERROR ); + emit infoMessage( i18n("...and the K3b FAQ does not help you..."), ERROR ); + emit infoMessage( i18n("...please include the debugging output in your problem report."), ERROR ); + } + } + break; + } + jobFinished( false ); + } + } + else { + emit infoMessage( i18n("%1 did not exit cleanly.").arg(m_cdrecordBinObject->name()), + ERROR ); + jobFinished( false ); + } +} + + +void K3bCdrecordWriter::slotThroughput( int t ) +{ + emit writeSpeed( t, d->tracks[m_currentTrack-1].audio ? 175 : 150 ); +} + +#include "k3bcdrecordwriter.moc" diff --git a/libk3b/projects/k3bcdrecordwriter.h b/libk3b/projects/k3bcdrecordwriter.h new file mode 100644 index 0000000..9333588 --- /dev/null +++ b/libk3b/projects/k3bcdrecordwriter.h @@ -0,0 +1,123 @@ +/* + * + * $Id: k3bcdrecordwriter.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef K3B_CDRECORD_WRITER_H +#define K3B_CDRECORD_WRITER_H + + +#include "k3babstractwriter.h" + +#include + +class K3bExternalBin; +class K3bProcess; +class KProcess; +class K3bDevice::Device; + + +class K3bCdrecordWriter : public K3bAbstractWriter +{ + Q_OBJECT + + public: + K3bCdrecordWriter( K3bDevice::Device*, K3bJobHandler* hdl, + QObject* parent = 0, const char* name = 0 ); + ~K3bCdrecordWriter(); + + bool active() const; + + /** + * to be used in chain: addArgument(x)->addArgument(y) + */ + K3bCdrecordWriter* addArgument( const QString& ); + void clearArguments(); + + int fd() const; + + public slots: + void start(); + void cancel(); + + void setDao( bool b ); + void setWritingMode( int ); + void setCueFile( const QString& s); + void setClone( bool b ); + + void setRawCdText( const QByteArray& a ) { m_rawCdText = a; } + + /** + * If set true the job ignores the global K3b setting + * and does not eject the CD-RW after finishing + */ + void setForceNoEject( bool b ) { m_forceNoEject = b; } + + protected slots: + void slotStdLine( const QString& line ); + void slotProcessExited(KProcess*); + void slotThroughput( int t ); + + protected: + virtual void prepareProcess(); + + const K3bExternalBin* m_cdrecordBinObject; + K3bProcess* m_process; + + int m_writingMode; + bool m_totalTracksParsed; + bool m_clone; + bool m_cue; + + QString m_cueFile; + + enum CdrecordError { UNKNOWN, + OVERSIZE, + BAD_OPTION, + SHMGET_FAILED, + OPC_FAILED, + CANNOT_SET_SPEED, + CANNOT_SEND_CUE_SHEET, + CANNOT_OPEN_NEW_SESSION, + CANNOT_FIXATE_DISK, + WRITE_ERROR, + PERMISSION_DENIED, + BUFFER_UNDERRUN, + HIGH_SPEED_MEDIUM, + LOW_SPEED_MEDIUM, + MEDIUM_ERROR, + DEVICE_BUSY, + BLANK_FAILED }; + + QStringList m_arguments; + + private: + unsigned int m_currentTrack; + int m_totalTracks; + int m_totalSize; + int m_alreadyWritten; + + int m_lastFifoValue; + + int m_cdrecordError; + + bool m_forceNoEject; + + QByteArray m_rawCdText; + + class Private; + Private* d; +}; + +#endif diff --git a/libk3b/projects/k3bcuefileparser.cpp b/libk3b/projects/k3bcuefileparser.cpp new file mode 100644 index 0000000..49ca4fc --- /dev/null +++ b/libk3b/projects/k3bcuefileparser.cpp @@ -0,0 +1,461 @@ +/* + * + * $Id: k3bcuefileparser.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bcuefileparser.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + + +// avoid usage of QTextStream since K3b often +// tries to open big files (iso images) in a +// cue file parser to test it. +static QString readLine( QFile* f ) +{ + QString s; + Q_LONG r = f->readLine( s, 1024 ); + if( r >= 0 ) { + // remove the trailing newline + return s.stripWhiteSpace(); + } + else { + // end of file or error + return QString::null; + } +} + + +// TODO: add method: usableByCdrecordDirectly() +// TODO: add Toc with sector sizes + +class K3bCueFileParser::Private +{ +public: + bool inFile; + bool inTrack; + int trackType; + int trackMode; + bool rawData; + bool haveIndex1; + K3b::Msf currentDataPos; + K3b::Msf index0; + + K3bDevice::Toc toc; + int currentParsedTrack; + + K3bDevice::CdText cdText; +}; + + + +K3bCueFileParser::K3bCueFileParser( const QString& filename ) + : K3bImageFileReader() +{ + d = new Private; + openFile( filename ); +} + + +K3bCueFileParser::~K3bCueFileParser() +{ + delete d; +} + + +void K3bCueFileParser::readFile() +{ + setValid(true); + + d->inFile = d->inTrack = d->haveIndex1 = false; + d->trackMode = K3bDevice::Track::UNKNOWN; + d->toc.clear(); + d->cdText.clear(); + d->currentParsedTrack = 0; + + QFile f( filename() ); + if( f.open( IO_ReadOnly ) ) { + QString line = readLine( &f ); + while( !line.isNull() ) { + + if( !parseLine(line) ) { + setValid(false); + break; + } + + line = readLine( &f ); + } + + if( isValid() ) { + // save last parsed track for which we do not have the proper length :( + if( d->currentParsedTrack > 0 ) { + d->toc.append( K3bDevice::Track( d->currentDataPos, + d->currentDataPos, + d->trackType, + d->trackMode ) ); + } + + // debug the toc + kdDebug() << "(K3bCueFileParser) successfully parsed cue file." << endl + << "------------------------------------------------" << endl; + for( unsigned int i = 0; i < d->toc.count(); ++i ) { + K3bDevice::Track& track = d->toc[i]; + kdDebug() << "Track " << (i+1) + << " (" << ( track.type() == K3bDevice::Track::AUDIO ? "audio" : "data" ) << ") " + << track.firstSector().toString() << " - " << track.lastSector().toString() << endl; + } + + kdDebug() << "------------------------------------------------" << endl; + } + } + else { + kdDebug() << "(K3bCueFileParser) could not open file " << filename() << endl; + setValid(false); + } +} + + +bool K3bCueFileParser::parseLine( QString& line ) +{ + // use cap(1) for the filename + static QRegExp fileRx( "FILE\\s\"?([^\"]*)\"?\\s[^\"\\s]*" ); + + // use cap(1) for the flags + static QRegExp flagsRx( "FLAGS(\\s(DCP|4CH|PRE|SCMS)){1,4}" ); + + // use cap(1) for the tracknumber and cap(2) for the datatype + static QRegExp trackRx( "TRACK\\s(\\d{1,2})\\s(AUDIO|CDG|MODE1/2048|MODE1/2352|MODE2/2336|MODE2/2352|CDI/2336|CDI/2352)" ); + + // use cap(1) for the index number, cap(3) for the minutes, cap(4) for the seconds, cap(5) for the frames, + // and cap(2) for the MSF value string + static QRegExp indexRx( "INDEX\\s(\\d{1,2})\\s((\\d+):([0-5]\\d):((?:[0-6]\\d)|(?:7[0-4])))" ); + + // use cap(1) for the MCN + static QRegExp catalogRx( "CATALOG\\s(\\w{13,13})" ); + + // use cap(1) for the ISRC + static QRegExp isrcRx( "ISRC\\s(\\w{5,5}\\d{7,7})" ); + + static QString cdTextRxStr = "\"?([^\"]{0,80})\"?"; + + // use cap(1) for the string + static QRegExp titleRx( "TITLE\\s" + cdTextRxStr ); + static QRegExp performerRx( "PERFORMER\\s" + cdTextRxStr ); + static QRegExp songwriterRx( "SONGWRITER\\s" + cdTextRxStr ); + + + // simplify all white spaces except those in filenames and CD-TEXT + simplifyWhiteSpace( line ); + + // skip comments and empty lines + if( line.startsWith("REM") || line.startsWith("#") || line.isEmpty() ) + return true; + + + // + // FILE + // + if( fileRx.exactMatch( line ) ) { + + setValid( findImageFileName( fileRx.cap(1) ) ); + + if( d->inFile ) { + kdDebug() << "(K3bCueFileParser) only one FILE statement allowed." << endl; + return false; + } + d->inFile = true; + d->inTrack = false; + d->haveIndex1 = false; + return true; + } + + + // + // TRACK + // + else if( trackRx.exactMatch( line ) ) { + if( !d->inFile ) { + kdDebug() << "(K3bCueFileParser) TRACK statement before FILE." << endl; + return false; + } + + // check if we had index1 for the last track + if( d->inTrack && !d->haveIndex1 ) { + kdDebug() << "(K3bCueFileParser) TRACK without INDEX 1." << endl; + return false; + } + + // save last track + // TODO: use d->rawData in some way + if( d->currentParsedTrack > 0 ) { + d->toc.append( K3bDevice::Track( d->currentDataPos, + d->currentDataPos, + d->trackType, + d->trackMode ) ); + } + + d->currentParsedTrack++; + + d->cdText.resize( d->currentParsedTrack ); + + // parse the tracktype + if( trackRx.cap(2) == "AUDIO" ) { + d->trackType = K3bDevice::Track::AUDIO; + d->trackMode = K3bDevice::Track::UNKNOWN; + } + else { + d->trackType = K3bDevice::Track::DATA; + if( trackRx.cap(2).startsWith("MODE1") ) { + d->trackMode = K3bDevice::Track::MODE1; + d->rawData = (trackRx.cap(2) == "MODE1/2352"); + } + else if( trackRx.cap(2).startsWith("MODE2") ) { + d->trackMode = K3bDevice::Track::MODE2; + d->rawData = (trackRx.cap(2) == "MODE2/2352"); + } + else { + kdDebug() << "(K3bCueFileParser) unsupported track type: " << trackRx.cap(2) << endl; + return false; + } + } + + d->haveIndex1 = false; + d->inTrack = true; + d->index0 = 0; + + return true; + } + + + // + // FLAGS + // + else if( flagsRx.exactMatch( line ) ) { + if( !d->inTrack ) { + kdDebug() << "(K3bCueFileParser) FLAGS statement without TRACK." << endl; + return false; + } + + // TODO: save the flags + return true; + } + + + // + // INDEX + // + else if( indexRx.exactMatch( line ) ) { + if( !d->inTrack ) { + kdDebug() << "(K3bCueFileParser) INDEX statement without TRACK." << endl; + return false; + } + + unsigned int indexNumber = indexRx.cap(1).toInt(); + + K3b::Msf indexStart = K3b::Msf::fromString( indexRx.cap(2) ); + + if( indexNumber == 0 ) { + d->index0 = indexStart; + + if( d->currentParsedTrack < 2 && indexStart > 0 ) { + kdDebug() << "(K3bCueFileParser) first track is not allowed to have a pregap > 0." << endl; + return false; + } + } + else if( indexNumber == 1 ) { + d->haveIndex1 = true; + d->currentDataPos = indexStart; + if( d->currentParsedTrack > 1 ) { + d->toc[d->currentParsedTrack-2].setLastSector( indexStart-1 ); + if( d->index0 > 0 && d->index0 < indexStart ) { + d->toc[d->currentParsedTrack-2].setIndex0( d->index0 - d->toc[d->currentParsedTrack-2].firstSector() ); + } + } + } + else { + // TODO: add index > 0 + } + + return true; + } + + + // + // CATALOG + // + if( catalogRx.exactMatch( line ) ) { + // TODO: set the toc's mcn + return true; + } + + + // + // ISRC + // + if( isrcRx.exactMatch( line ) ) { + if( d->inTrack ) { + // TODO: set the track's ISRC + return true; + } + else { + kdDebug() << "(K3bCueFileParser) ISRC without TRACK." << endl; + return false; + } + } + + + // + // CD-TEXT + // TODO: create K3bDevice::TrackCdText entries + // + else if( titleRx.exactMatch( line ) ) { + if( d->inTrack ) + d->cdText[d->currentParsedTrack-1].setTitle( titleRx.cap(1) ); + else + d->cdText.setTitle( titleRx.cap(1) ); + return true; + } + + else if( performerRx.exactMatch( line ) ) { + if( d->inTrack ) + d->cdText[d->currentParsedTrack-1].setPerformer( performerRx.cap(1) ); + else + d->cdText.setPerformer( performerRx.cap(1) ); + return true; + } + + else if( songwriterRx.exactMatch( line ) ) { + if( d->inTrack ) + d->cdText[d->currentParsedTrack-1].setSongwriter( songwriterRx.cap(1) ); + else + d->cdText.setSongwriter( songwriterRx.cap(1) ); + return true; + } + + else { + kdDebug() << "(K3bCueFileParser) unknown Cue line: '" << line << "'" << endl; + return false; + } +} + + +void K3bCueFileParser::simplifyWhiteSpace( QString& s ) +{ + s = s.stripWhiteSpace(); + + unsigned int i = 0; + bool insideQuote = false; + while( i < s.length() ) { + if( !insideQuote ) { + if( s[i].isSpace() && s[i+1].isSpace() ) + s.remove( i, 1 ); + } + + if( s[i] == '"' ) + insideQuote = !insideQuote; + + ++i; + } +} + + +const K3bDevice::Toc& K3bCueFileParser::toc() const +{ + return d->toc; +} + + +const K3bDevice::CdText& K3bCueFileParser::cdText() const +{ + return d->cdText; +} + + +bool K3bCueFileParser::findImageFileName( const QString& dataFile ) +{ + // + // CDRDAO does not use this image filename but replaces the extension from the cue file + // with "bin" to get the image filename, we should take this into account + // + + m_imageFilenameInCue = true; + + // first try filename as a hole (absolut) + if( QFile::exists( dataFile ) ) { + setImageFilename( QFileInfo(dataFile).absFilePath() ); + return true; + } + + // try the filename in the cue's directory + if( QFileInfo( K3b::parentDir(filename()) + dataFile.section( '/', -1 ) ).isFile() ) { + setImageFilename( K3b::parentDir(filename()) + dataFile.section( '/', -1 ) ); + kdDebug() << "(K3bCueFileParser) found image file: " << imageFilename() << endl; + return true; + } + + // try the filename ignoring case + if( QFileInfo( K3b::parentDir(filename()) + dataFile.section( '/', -1 ).lower() ).isFile() ) { + setImageFilename( K3b::parentDir(filename()) + dataFile.section( '/', -1 ).lower() ); + kdDebug() << "(K3bCueFileParser) found image file: " << imageFilename() << endl; + return true; + } + + m_imageFilenameInCue = false; + + // try removing the ending from the cue file (image.bin.cue and image.bin) + if( QFileInfo( filename().left( filename().length()-4 ) ).isFile() ) { + setImageFilename( filename().left( filename().length()-4 ) ); + kdDebug() << "(K3bCueFileParser) found image file: " << imageFilename() << endl; + return true; + } + + // + // we did not find the image specified in the cue. + // Search for another one having the same filename as the cue but a different extension + // + + QDir parentDir( K3b::parentDir(filename()) ); + QString filenamePrefix = filename().section( '/', -1 ); + filenamePrefix.truncate( filenamePrefix.length() - 3 ); // remove cue extension + kdDebug() << "(K3bCueFileParser) checking folder " << parentDir.path() << " for files: " << filenamePrefix << "*" << endl; + + // + // we cannot use the nameFilter in QDir because of the spaces that may occur in filenames + // + QStringList possibleImageFiles = parentDir.entryList( QDir::Files ); + int cnt = 0; + for( QStringList::const_iterator it = possibleImageFiles.constBegin(); it != possibleImageFiles.constEnd(); ++it ) { + if( (*it).lower() == dataFile.section( '/', -1 ).lower() || + (*it).startsWith( filenamePrefix ) && !(*it).endsWith( "cue" ) ) { + ++cnt; + setImageFilename( K3b::parentDir(filename()) + *it ); + } + } + + // + // we only do this if there is one unique file which fits the requirements. + // Otherwise we cannot be certain to have the right file. + // + return ( cnt == 1 && QFileInfo( imageFilename() ).isFile() ); +} diff --git a/libk3b/projects/k3bcuefileparser.h b/libk3b/projects/k3bcuefileparser.h new file mode 100644 index 0000000..41a5ee6 --- /dev/null +++ b/libk3b/projects/k3bcuefileparser.h @@ -0,0 +1,57 @@ +/* + * + * $Id: k3bcuefileparser.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_CUEFILE_PARSER_H_ +#define _K3B_CUEFILE_PARSER_H_ + +#include "k3bimagefilereader.h" + +#include +#include +#include "k3b_export.h" +/** + * Parses a cue file. + * Datatracks have either mode1 or mode2 where the latter contains xa form1/2. + * The last track may not have a proper length! + */ +class LIBK3B_EXPORT K3bCueFileParser : public K3bImageFileReader +{ + public: + K3bCueFileParser( const QString& filename = QString::null ); + ~K3bCueFileParser(); + + /** + * CDRDAO does not use this image filename but replaces the extension from the cue file + * with "bin" to get the image filename. + * So in this case cdrecord won't be able to burn the cue file. That is why we need this hack. + */ + bool imageFilenameInCue() const { return m_imageFilenameInCue; } + + const K3bDevice::Toc& toc() const; + const K3bDevice::CdText& cdText() const; + + private: + void readFile(); + bool parseLine( QString& line ); + void simplifyWhiteSpace( QString& s ); + bool findImageFileName( const QString& fileEntry ); + + bool m_imageFilenameInCue; + + class Private; + Private* d; +}; + +#endif diff --git a/libk3b/projects/k3bdoc.cpp b/libk3b/projects/k3bdoc.cpp new file mode 100644 index 0000000..ac5346d --- /dev/null +++ b/libk3b/projects/k3bdoc.cpp @@ -0,0 +1,221 @@ +/* + * + * $Id: k3bdoc.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +// include files for Qt +#include +#include +#include + +// include files for KDE +#include +#include + +// application specific includes +#include "k3bdoc.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +K3bDoc::K3bDoc( QObject* parent ) + : QObject( parent ), + m_modified(false), + m_view(0) +{ + connect( this, SIGNAL(changed()), this, SLOT(slotChanged()) ); +} + + +K3bDoc::~K3bDoc() +{ +} + + +void K3bDoc::slotChanged() +{ + setModified( true ); + emit changed( this ); +} + + +void K3bDoc::setModified( bool m ) +{ + if( m != m_modified ) { + m_modified = m; + if( m ) + emit changed(); + } +} + + +void K3bDoc::setDummy( bool b ) +{ + m_dummy = b; +} + +void K3bDoc::setSpeed( int speed ) +{ + m_speed = speed; +} + +void K3bDoc::setBurner( K3bDevice::Device* dev ) +{ + m_burner = dev; +} + + +void K3bDoc::addUrl( const KURL& url ) +{ + KURL::List urls(url); + addUrls( urls ); +} + + +void K3bDoc::setURL( const KURL& url ) +{ + doc_url = url; + + emit changed(); +} + +const KURL& K3bDoc::URL() const +{ + return doc_url; +} + + +QString K3bDoc::name() const +{ + return URL().path().section( '/', -1 ); +} + + +bool K3bDoc::newDocument() +{ + setModified( false ); + + m_copies = 1; + m_burner = 0; + m_onTheFly = true; + m_speed = 0; // Auto + m_onlyCreateImages = false; + m_removeImages = true; + m_dummy = false; + m_writingApp = K3b::DEFAULT; + m_writingMode = K3b::WRITING_MODE_AUTO; + m_saved = false; + + return true; +} + + +bool K3bDoc::saveGeneralDocumentData( QDomElement* part ) +{ + QDomDocument doc = part->ownerDocument(); + QDomElement mainElem = doc.createElement( "general" ); + + QDomElement propElem = doc.createElement( "writing_mode" ); + switch( writingMode() ) { + case K3b::DAO: + propElem.appendChild( doc.createTextNode( "dao" ) ); + break; + case K3b::TAO: + propElem.appendChild( doc.createTextNode( "tao" ) ); + break; + case K3b::RAW: + propElem.appendChild( doc.createTextNode( "raw" ) ); + break; + default: + propElem.appendChild( doc.createTextNode( "auto" ) ); + break; + } + mainElem.appendChild( propElem ); + + propElem = doc.createElement( "dummy" ); + propElem.setAttribute( "activated", dummy() ? "yes" : "no" ); + mainElem.appendChild( propElem ); + + propElem = doc.createElement( "on_the_fly" ); + propElem.setAttribute( "activated", onTheFly() ? "yes" : "no" ); + mainElem.appendChild( propElem ); + + propElem = doc.createElement( "only_create_images" ); + propElem.setAttribute( "activated", onlyCreateImages() ? "yes" : "no" ); + mainElem.appendChild( propElem ); + + propElem = doc.createElement( "remove_images" ); + propElem.setAttribute( "activated", removeImages() ? "yes" : "no" ); + mainElem.appendChild( propElem ); + + part->appendChild( mainElem ); + + return true; +} + + +bool K3bDoc::readGeneralDocumentData( const QDomElement& elem ) +{ + if( elem.nodeName() != "general" ) + return false; + + QDomNodeList nodes = elem.childNodes(); + for( uint i = 0; i < nodes.count(); i++ ) { + + QDomElement e = nodes.item(i).toElement(); + if( e.isNull() ) + return false; + + if( e.nodeName() == "writing_mode") { + QString mode = e.text(); + if( mode == "dao" ) + setWritingMode( K3b::DAO ); + else if( mode == "tao" ) + setWritingMode( K3b::TAO ); + else if( mode == "raw" ) + setWritingMode( K3b::RAW ); + else + setWritingMode( K3b::WRITING_MODE_AUTO ); + } + + if( e.nodeName() == "dummy") + setDummy( e.attributeNode( "activated" ).value() == "yes" ); + + if( e.nodeName() == "on_the_fly") + setOnTheFly( e.attributeNode( "activated" ).value() == "yes" ); + + if( e.nodeName() == "only_create_images") + setOnlyCreateImages( e.attributeNode( "activated" ).value() == "yes" ); + + if( e.nodeName() == "remove_images") + setRemoveImages( e.attributeNode( "activated" ).value() == "yes" ); + } + + + return true; +} + + +#include "k3bdoc.moc" diff --git a/libk3b/projects/k3bdoc.h b/libk3b/projects/k3bdoc.h new file mode 100644 index 0000000..f241487 --- /dev/null +++ b/libk3b/projects/k3bdoc.h @@ -0,0 +1,229 @@ +/* + * + * $Id: k3bdoc.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef K3BDOC_H +#define K3BDOC_H + +#ifdef HAVE_CONFIG_H +#include +#endif + +// include files for QT +#include +#include +#include + + +// include files for KDE +#include +#include +#include "k3b_export.h" + +// forward declaration of the K3b classes +class QTimer; +class KTempFile; +class K3bBurnJob; +class QDomDocument; +class QDomElement; +class KConfig; +class KActionCollection; +class K3bJobHandler; + + +namespace K3bDevice { + class Device; +} +namespace K3b { + class Msf; +} + +/** + * K3bDoc is the base document class. + * It handles some general settings. + */ +class LIBK3B_EXPORT K3bDoc : public QObject +{ + Q_OBJECT + + public: + K3bDoc( QObject* = 0 ); + virtual ~K3bDoc(); + + enum DocType { + AUDIO = 1, + DATA, + MIXED, + VCD, + MOVIX, + MOVIX_DVD, + DVD, + VIDEODVD + }; + + virtual int type() const { return m_docType; } + + /** + * \return A name for the project which might for example be used as a suggestion for a file name + * when saving. The default implementation extracts a name from the URL. + */ + virtual QString name() const; + + /** + * \return A string representation of the document type. + */ + virtual QString typeString() const = 0; + + /** + * returns the view widget set with setView() or null if none has been set. + */ + QWidget* view() const { return m_view; } + + /** + * Just for convenience to make an easy mapping from doc to GUI possible. + */ + void setView( QWidget* v ) { m_view = v; } + + /** + * sets the modified flag for the document after a modifying action on the view connected to the document. + */ + virtual void setModified( bool m = true ); + + /** + * returns if the document is modified or not. Use this to determine + * if your document needs saving by the user on closing. + */ + virtual bool isModified() const { return m_modified; } + + /** + * Subclasses should call this when reimplementing. + * Sets some defaults. + */ + virtual bool newDocument(); + + /** + * Load a project from an xml stream. + * + * This is used to load/save k3b projects. + */ + virtual bool loadDocumentData( QDomElement* root ) = 0; + + /** + * Save a project to an xml stream. + * + * This is used to load/save k3b projects. + */ + virtual bool saveDocumentData( QDomElement* docElem ) = 0; + + /** returns the KURL of the document */ + const KURL& URL() const; + /** sets the URL of the document */ + virtual void setURL( const KURL& url ); + + int writingMode() const { return m_writingMode; } + bool dummy() const { return m_dummy; } + bool onTheFly() const { return m_onTheFly; } + bool removeImages() const { return m_removeImages; } + bool onlyCreateImages() const { return m_onlyCreateImages; } + int copies() const { return m_copies; } + int speed() const { return m_speed; } + K3bDevice::Device* burner() const { return m_burner; } + virtual KIO::filesize_t size() const = 0; + virtual K3b::Msf length() const = 0; + + // FIXME: rename this to something like imagePath + const QString& tempDir() const { return m_tempDir; } + + virtual int numOfTracks() const { return 1; } + + /** + * Create a new BurnJob to burn this project. It is not mandatory to use this + * method. You may also just create the BurnJob you need manually. It is just + * easier this way since you don't need to distinguish between the different + * project types. + */ + virtual K3bBurnJob* newBurnJob( K3bJobHandler*, QObject* parent = 0 ) = 0; + + int writingApp() const { return m_writingApp; } + void setWritingApp( int a ) { m_writingApp = a; } + + /** + * @return true if the document has successfully been saved to a file + */ + bool isSaved() const { return m_saved; } + + /** + * Used for session management. Use with care. + */ + void setSaved( bool s ) { m_saved = s; } + + signals: + void changed(); + void changed( K3bDoc* ); + + public slots: + void setDummy( bool d ); + void setWritingMode( int m ) { m_writingMode = m; } + void setOnTheFly( bool b ) { m_onTheFly = b; } + void setSpeed( int speed ); + void setBurner( K3bDevice::Device* dev ); + void setTempDir( const QString& dir ) { m_tempDir = dir; } + void setRemoveImages( bool b ) { m_removeImages = b; } + void setOnlyCreateImages( bool b ) { m_onlyCreateImages = b; } + void setCopies( int c ) { m_copies = c; } + + /** + * the default implementation just calls addUrls with + * list containing the url + */ + virtual void addUrl( const KURL& url ); + virtual void addUrls( const KURL::List& urls ) = 0; + + protected: + int m_docType; + + bool saveGeneralDocumentData( QDomElement* ); + + bool readGeneralDocumentData( const QDomElement& ); + + private slots: + void slotChanged(); + + private: + /** the modified flag of the current document */ + bool m_modified; + KURL doc_url; + + QWidget* m_view; + + QString m_tempDir; + K3bDevice::Device* m_burner; + bool m_dummy; + bool m_onTheFly; + bool m_removeImages; + bool m_onlyCreateImages; + int m_speed; + + /** see k3bglobals.h */ + int m_writingApp; + + int m_writingMode; + + int m_copies; + + bool m_saved; +}; + +#endif // K3BDOC_H diff --git a/libk3b/projects/k3bdvdrecordwriter.cpp b/libk3b/projects/k3bdvdrecordwriter.cpp new file mode 100644 index 0000000..0910d4a --- /dev/null +++ b/libk3b/projects/k3bdvdrecordwriter.cpp @@ -0,0 +1,119 @@ +/* + * + * $Id: k3bdvdrecordwriter.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bdvdrecordwriter.h" + +#include +#include +#include +#include +#include +#include +#include + +#include + + +K3bDvdrecordWriter::K3bDvdrecordWriter( K3bDevice::Device* dev, QObject* parent, const char* name ) + : K3bCdrecordWriter( dev, parent, name ) +{ +} + + +K3bDvdrecordWriter::~K3bDvdrecordWriter() +{ +} + +void K3bDvdrecordWriter::prepareProcess() +{ + if( m_process ) delete m_process; // kdelibs want this! + m_process = new K3bProcess(); + m_process->setRunPrivileged(true); + m_process->setSplitStdout(true); + connect( m_process, SIGNAL(stdoutLine(const QString&)), this, SLOT(slotStdLine(const QString&)) ); + connect( m_process, SIGNAL(stderrLine(const QString&)), this, SLOT(slotStdLine(const QString&)) ); + connect( m_process, SIGNAL(processExited(KProcess*)), this, SLOT(slotProcessExited(KProcess*)) ); + connect( m_process, SIGNAL(wroteStdin(KProcess*)), this, SIGNAL(dataWritten()) ); + +// if( k3bcore->externalBinManager()->binObject("cdrecord")->hasFeature( "dvd-patch" ) ) +// m_cdrecordBinObject = k3bcore->externalBinManager()->binObject("cdrecord"); +// else + m_cdrecordBinObject = k3bcore->externalBinManager()->binObject("dvdrecord"); + + if( !m_cdrecordBinObject ) + return; + + *m_process << m_cdrecordBinObject->path; + + // display progress + *m_process << "-v"; + + if( m_cdrecordBinObject->hasFeature( "delay") ) + *m_process << "-delay" << "0"; + else if( m_cdrecordBinObject->hasFeature( "gracetime") ) + *m_process << "gracetime=2"; // 2 is the lowest allowed value (Joerg, why do you do this to us?) + + // Again we assume the device to be set! + *m_process << QString("dev=%1").arg(K3b::externalBinDeviceParameter(burnDevice(), m_cdrecordBinObject)); + *m_process << QString("speed=%1").arg(burnSpeed()); + + // DVDs are only written in DAO mode (and Packet, but we do not support that since it does not + // make much sense here) + *m_process << "-dao"; + setWritingMode( K3b::DAO ); // just to make sure the CdrecordWriter emits the correct messages + + if( simulate() ) + *m_process << "-dummy"; + + if( burnproof() ) { + if( burnDevice()->burnproof() ) { + // with cdrecord 1.11a02 burnproof was renamed to burnfree + // what about dvdrecord?? + if( m_cdrecordBinObject->version < K3bVersion( "1.11a02" ) ) + *m_process << "driveropts=burnproof"; + else + *m_process << "driveropts=burnfree"; + } + else + emit infoMessage( i18n("Writer does not support buffer underrun free recording (BURNPROOF)"), INFO ); + } + + if( k3bcore->globalSettings()->ejectMedia() ) + *m_process << "-eject"; + + bool manualBufferSize = k3bcore->globalSettings()->manualBufferSize(); + if( manualBufferSize ) { + *m_process << QString("fs=%1m").arg( k3bcore->globalSettings()->writingBuffer() ); + } + + bool overburn = k3bcore->globalSettings()->overburn(); + if( overburn ) + if( m_cdrecordBinObject->hasFeature("overburn") ) + *m_process << "-overburn"; + else + emit infoMessage( i18n("Cdrecord %1 does not support overburning.").arg(m_cdrecordBinObject->version), INFO ); + + // additional user parameters from config + const QStringList& params = m_cdrecordBinObject->userParameters(); + for( QStringList::const_iterator it = params.begin(); it != params.end(); ++it ) + *m_process << *it; + + // add the user parameters + for( QStringList::const_iterator it = m_arguments.begin(); it != m_arguments.end(); ++it ) + *m_process << *it; +} + +#include "k3bdvdrecordwriter.moc" + diff --git a/libk3b/projects/k3bdvdrecordwriter.h b/libk3b/projects/k3bdvdrecordwriter.h new file mode 100644 index 0000000..f9dcf4a --- /dev/null +++ b/libk3b/projects/k3bdvdrecordwriter.h @@ -0,0 +1,40 @@ +/* + * + * $Id: k3bdvdrecordwriter.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_DVDRECORD_WRITER_H_ +#define _K3B_DVDRECORD_WRITER_H_ + +#include "k3bcdrecordwriter.h" + + +class K3bDevice::Device; + +/** + * Basically this is just a wrapper around K3bCdrecordWriter + * which uses another K3bExternalBin and ignores the writingMode setting. + */ +class K3bDvdrecordWriter : public K3bCdrecordWriter +{ + Q_OBJECT + + public: + K3bDvdrecordWriter( K3bDevice::Device*, QObject* parent = 0, const char* name = 0 ); + ~K3bDvdrecordWriter(); + + protected: + void prepareProcess(); +}; + +#endif diff --git a/libk3b/projects/k3bgrowisofshandler.cpp b/libk3b/projects/k3bgrowisofshandler.cpp new file mode 100644 index 0000000..0b582ce --- /dev/null +++ b/libk3b/projects/k3bgrowisofshandler.cpp @@ -0,0 +1,318 @@ +/* + * + * $Id: k3bgrowisofshandler.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bgrowisofshandler.h" + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include +#include + + +class K3bGrowisofsHandler::Private +{ +public: + int lastBuffer; + int lastDeviceBuffer; +}; + + +K3bGrowisofsHandler::K3bGrowisofsHandler( QObject* parent, const char* name ) + : QObject( parent, name ) +{ + d = new Private; + reset(); +} + + +K3bGrowisofsHandler::~K3bGrowisofsHandler() +{ + delete d; +} + + +void K3bGrowisofsHandler::reset( K3bDevice::Device* dev, bool dao ) +{ + m_device = dev; + m_error = ERROR_UNKNOWN; + m_dao = dao; + d->lastBuffer = 0; + d->lastDeviceBuffer = 0; +} + + +void K3bGrowisofsHandler::handleStart() +{ +// QTimer::singleShot( 2000, this, SLOT(slotCheckBufferStatus()) ); +} + + +void K3bGrowisofsHandler::handleLine( const QString& line ) +{ + int pos = 0; + + if( line.startsWith( ":-[" ) ) { + // Error + + if( line.contains( "ASC=30h" ) ) + m_error = ERROR_MEDIA; + + // :-[ PERFORM OPC failed with SK=3h/ASC=73h/ASCQ=03h + else if( line.startsWith( ":-[ PERFORM OPC failed" ) ) + emit infoMessage( i18n("OPC failed. Please try writing speed 1x."), K3bJob::ERROR ); + + // :-[ attempt -blank=full or re-run with -dvd-compat -dvd-compat to engage DAO ] + else if( !m_dao && + ( line.contains( "engage DAO" ) || line.contains( "media is not formatted or unsupported" ) ) ) + emit infoMessage( i18n("Please try again with writing mode DAO."), K3bJob::ERROR ); + + else if( line.startsWith( ":-[ Failed to change write speed" ) ) { + m_error = ERROR_SPEED_SET_FAILED; + } + } + else if( line.startsWith( ":-(" ) ) { + if( line.contains( "No space left on device" ) ) + m_error = ERROR_OVERSIZE; + + else if( line.contains( "blocks are free" ) && line.contains( "to be written" ) ) { + m_error = ERROR_OVERSIZE; + if( k3bcore->globalSettings()->overburn() ) + emit infoMessage( i18n("Trying to write more than the official disk capacity"), K3bJob::WARNING ); + } + + else if( line.startsWith( ":-( unable to anonymously mmap" ) ) { + m_error = ERROR_MEMLOCK; + } + + else if( line.startsWith( ":-( write failed" ) ) { + m_error = ERROR_WRITE_FAILED; + } + + else + emit infoMessage( line, K3bJob::ERROR ); + } + else if( line.startsWith( "PERFORM OPC" ) ) { + m_error = ERROR_OPC; + } + else if( line.contains( "flushing cache" ) ) { + // here is where we already should stop queriying the buffer fill + // since the device is only used there so far... + m_device = 0; + + emit flushingCache(); + emit newSubTask( i18n("Flushing Cache") ); + emit infoMessage( i18n("Flushing the cache may take some time."), K3bJob::INFO ); + } + + // FIXME: I think this starts with dev->blockDeviceName() so we could improve parsing with: + // if( line.startsWith( dev->blockDeviceName() ) ) { + // line = line.mid( dev->blockDeviceName().length() ); + // if( line.startsWith( "closing..... + + else if( line.contains( "closing track" ) ) { + emit newSubTask( i18n("Closing Track") ); + } + else if( line.contains( "closing disc" ) ) { + emit newSubTask( i18n("Closing Disk") ); + } + else if( line.contains( "closing session" ) ) { + emit newSubTask( i18n("Closing Session") ); + } + else if( line.contains( "updating RMA" ) ) { + emit newSubTask( i18n("Updating RMA") ); + emit infoMessage( i18n("Updating RMA") + "...", K3bJob::INFO ); + } + else if( line.contains( "closing session" ) ) { + emit newSubTask( i18n("Closing Session") ); + emit infoMessage( i18n("Closing Session") + "...", K3bJob::INFO ); + } + else if( line.contains( "writing lead-out" ) ) { + emit newSubTask( i18n("Writing Lead-out") ); + emit infoMessage( i18n("Writing the lead-out may take some time."), K3bJob::INFO ); + } + else if( line.contains( "Quick Grow" ) ) { + emit infoMessage( i18n("Removing reference to lead-out."), K3bJob::INFO ); + } + else if( line.contains( "copying volume descriptor" ) ) { + emit infoMessage( i18n("Modifying ISO9660 volume descriptor"), K3bJob::INFO ); + } + else if( line.contains( "FEATURE 21h is not on" ) ) { + if( !m_dao ) { + // FIXME: it's not only the writer. It may be the media: something like does not support it with this media + // da war was mit: wenn einmal formattiert, dann geht nur noch dao oder wenn einmal als overwrite + // formattiert, dann nur noch dao oder sowas + emit infoMessage( i18n("Writing mode Incremental Streaming not available"), K3bJob::WARNING ); + emit infoMessage( i18n("Engaging DAO"), K3bJob::WARNING ); + } + } + else if( ( pos = line.find( "Current Write Speed" ) ) > 0 ) { + // parse write speed + // /dev/sr0: "Current Write Speed" is 2.4x1385KBps + + pos += 24; + int endPos = line.find( 'x', pos+1 ); + bool ok = true; + double speed = line.mid( pos, endPos-pos ).toDouble(&ok); + if( ok ) + emit infoMessage( i18n("Writing speed: %1 KB/s (%2x)") + .arg((int)(speed*1385.0)) + .arg(KGlobal::locale()->formatNumber(speed)), K3bJob::INFO ); + else + kdDebug() << "(K3bGrowisofsHandler) parsing error: '" << line.mid( pos, endPos-pos ) << "'" << endl; + } + else if( (pos = line.find( "RBU" )) > 0 ) { + + // FIXME: use QRegExp + + // parse ring buffer fill for growisofs >= 6.0 + pos += 4; + int endPos = line.find( '%', pos+1 ); + bool ok = true; + double val = line.mid( pos, endPos-pos ).toDouble( &ok ); + if( ok ) { + int newBuffer = (int)(val+0.5); + if( newBuffer != d->lastBuffer ) { + d->lastBuffer = newBuffer; + emit buffer( newBuffer ); + } + + // device buffer for growisofs >= 7.0 + pos = line.find( "UBU", pos ); + endPos = line.find( '%', pos+5 ); + if( pos > 0 ) { + pos += 4; + val = line.mid( pos, endPos-pos ).toDouble( &ok ); + if( ok ) { + int newBuffer = (int)(val+0.5); + if( newBuffer != d->lastDeviceBuffer ) { + d->lastDeviceBuffer = newBuffer; + emit deviceBuffer( newBuffer ); + } + } + } + } + else + kdDebug() << "(K3bGrowisofsHandler) failed to parse ring buffer fill from '" << line.mid( pos, endPos-pos ) << "'" << endl; + } + + else { + kdDebug() << "(growisofs) " << line << endl; + } +} + + +void K3bGrowisofsHandler::handleExit( int exitCode ) +{ + switch( m_error ) { + case ERROR_MEDIA: + emit infoMessage( i18n("K3b detected a problem with the media."), K3bJob::ERROR ); + emit infoMessage( i18n("Please try another media brand, preferably one explicitly recommended by your writer's vendor."), K3bJob::ERROR ); + emit infoMessage( i18n("Report the problem if it persists anyway."), K3bJob::ERROR ); + break; + + case ERROR_OVERSIZE: + if( k3bcore->globalSettings()->overburn() ) + emit infoMessage( i18n("Data did not fit on disk."), K3bJob::ERROR ); + else + emit infoMessage( i18n("Data does not fit on disk."), K3bJob::ERROR ); + break; + + case ERROR_SPEED_SET_FAILED: + emit infoMessage( i18n("Unable to set writing speed."), K3bJob::ERROR ); + emit infoMessage( i18n("Please try again with the 'ignore speed' setting."), K3bJob::ERROR ); + break; + + case ERROR_OPC: + emit infoMessage( i18n("Optimum Power Calibration failed."), K3bJob::ERROR ); + emit infoMessage( i18n("Try adding '-use-the-force-luke=noopc' to the " + "growisofs user parameters in the K3b settings."), K3bJob::ERROR ); + break; + + case ERROR_MEMLOCK: + emit infoMessage( i18n("Unable to allocate software buffer."), K3bJob::ERROR ); + emit infoMessage( i18n("This error is caused by the low memorylocked resource limit."), K3bJob::ERROR ); + emit infoMessage( i18n("It can be solved by issuing the command 'ulimit -l unlimited'..."), K3bJob::ERROR ); + emit infoMessage( i18n("...or by lowering the used software buffer size in the advanced K3b settings."), K3bJob::ERROR ); + break; + + case ERROR_WRITE_FAILED: + emit infoMessage( i18n("Write error"), K3bJob::ERROR ); + break; + + default: + + // + // The growisofs error codes: + // + // 128 + errno: fatal error upon program startup + // errno : fatal error during recording + // + + if( exitCode > 128 ) { + // for now we just emit a message with the error + // in the future when I know more about what kinds of errors may occur + // we will enhance this + emit infoMessage( i18n("Fatal error at startup: %1").arg(strerror(exitCode-128)), + K3bJob::ERROR ); + } + else if( exitCode == 1 ) { + // Doku says: warning at exit + // Example: mkisofs error + // unable to reload + // So basically this is just for mkisofs failure since we do not let growisofs reload the media + emit infoMessage( i18n("Warning at exit: (1)"), K3bJob::ERROR ); + emit infoMessage( i18n("Most likely mkisofs failed in some way."), K3bJob::ERROR ); + } + else { + emit infoMessage( i18n("Fatal error during recording: %1").arg(strerror(exitCode)), + K3bJob::ERROR ); + } + } + + reset(); +} + + +void K3bGrowisofsHandler::slotCheckBufferStatus() +{ + connect( K3bDevice::sendCommand( K3bDevice::DeviceHandler::BUFFER_CAPACITY, m_device ), + SIGNAL(finished(K3bDevice::DeviceHandler*)), + this, + SLOT(slotCheckBufferStatusDone(K3bDevice::DeviceHandler*)) ); +} + + +void K3bGrowisofsHandler::slotCheckBufferStatusDone( K3bDevice::DeviceHandler* dh ) +{ + if( dh->success() && dh->bufferCapacity() > 0 ) { + emit deviceBuffer( 100 * (dh->bufferCapacity() - dh->availableBufferCapacity() ) / dh->bufferCapacity() ); + QTimer::singleShot( 500, this, SLOT(slotCheckBufferStatus()) ); + } + else { + kdDebug() << "(K3bGrowisofsHandler) stopping buffer check." << endl; + } +} + +#include "k3bgrowisofshandler.moc" diff --git a/libk3b/projects/k3bgrowisofshandler.h b/libk3b/projects/k3bgrowisofshandler.h new file mode 100644 index 0000000..42fcd2a --- /dev/null +++ b/libk3b/projects/k3bgrowisofshandler.h @@ -0,0 +1,87 @@ +/* + * + * $Id: k3bgrowisofshandler.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_GROWISOFS_HANDLER_H_ +#define _K3B_GROWISOFS_HANDLER_H_ + +#include + +namespace K3bDevice { + class Device; + class DeviceHandler; +} + + +/** + * This class handles the output parsing for growisofs + * We put it in an extra class since we have two classes + * using growisofs: the writer and the imager. + */ +class K3bGrowisofsHandler : public QObject +{ + Q_OBJECT + + public: + K3bGrowisofsHandler( QObject* parent = 0, const char* name = 0 ); + ~K3bGrowisofsHandler(); + + enum ErrorType { + ERROR_UNKNOWN, + ERROR_MEDIA, + ERROR_OVERSIZE, + ERROR_SPEED_SET_FAILED, + ERROR_OPC, + ERROR_MEMLOCK, + ERROR_WRITE_FAILED + }; + + int error() const { return m_error; } + + public slots: + /** + * This will basically reset the error type + * @param dao was growisofs called with DAO? + */ + void reset( K3bDevice::Device* = 0, bool dao = false ); + + void handleStart(); + void handleLine( const QString& ); + void handleExit( int exitCode ); + + signals: + void infoMessage( const QString&, int ); + void newSubTask( const QString& ); + void buffer( int ); + void deviceBuffer( int ); + + /** + * We need this to know when the writing finished to update the progress + */ + void flushingCache(); + + private slots: + void slotCheckBufferStatus(); + void slotCheckBufferStatusDone( K3bDevice::DeviceHandler* ); + + private: + class Private; + Private* d; + + int m_error; + bool m_dao; + K3bDevice::Device* m_device; +}; + +#endif diff --git a/libk3b/projects/k3bgrowisofswriter.cpp b/libk3b/projects/k3bgrowisofswriter.cpp new file mode 100644 index 0000000..3144547 --- /dev/null +++ b/libk3b/projects/k3bgrowisofswriter.cpp @@ -0,0 +1,630 @@ +/* + * + * $Id: k3bgrowisofswriter.cpp 731898 2007-11-02 08:22:18Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bgrowisofswriter.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "k3bgrowisofshandler.h" +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include + + +class K3bGrowisofsWriter::Private +{ +public: + Private() + : writingMode( 0 ), + closeDvd(false), + multiSession(false), + process( 0 ), + growisofsBin( 0 ), + trackSize(-1), + layerBreak(0), + usingRingBuffer(false), + ringBuffer(0), + forceNoEject( false ) { + } + + int writingMode; + bool closeDvd; + bool multiSession; + K3bProcess* process; + const K3bExternalBin* growisofsBin; + QString image; + + bool success; + bool canceled; + bool finished; + + QTime lastSpeedCalculationTime; + int lastSpeedCalculationBytes; + int lastProgress; + unsigned int lastProgressed; + double lastWritingSpeed; + + bool writingStarted; + + K3bThroughputEstimator* speedEst; + K3bGrowisofsHandler* gh; + + // used in DAO with growisofs >= 5.15 + long trackSize; + + long layerBreak; + + unsigned long long overallSizeFromOutput; + long long firstSizeFromOutput; + + QFile inputFile; + + bool usingRingBuffer; + K3bPipeBuffer* ringBuffer; + + QString multiSessionInfo; + + bool forceNoEject; +}; + + +K3bGrowisofsWriter::K3bGrowisofsWriter( K3bDevice::Device* dev, K3bJobHandler* hdl, + QObject* parent, const char* name ) + : K3bAbstractWriter( dev, hdl, parent, name ) +{ + d = new Private; + d->speedEst = new K3bThroughputEstimator( this ); + connect( d->speedEst, SIGNAL(throughput(int)), + this, SLOT(slotThroughput(int)) ); + + d->gh = new K3bGrowisofsHandler( this ); + connect( d->gh, SIGNAL(infoMessage(const QString&, int)), + this,SIGNAL(infoMessage(const QString&, int)) ); + connect( d->gh, SIGNAL(newSubTask(const QString&)), + this, SIGNAL(newSubTask(const QString&)) ); + connect( d->gh, SIGNAL(buffer(int)), + this, SIGNAL(buffer(int)) ); + connect( d->gh, SIGNAL(deviceBuffer(int)), + this, SIGNAL(deviceBuffer(int)) ); + connect( d->gh, SIGNAL(flushingCache()), + this, SLOT(slotFlushingCache()) ); +} + + +K3bGrowisofsWriter::~K3bGrowisofsWriter() +{ + delete d->process; + delete d; +} + + +bool K3bGrowisofsWriter::active() const +{ + return (d->process ? d->process->isRunning() : false); +} + + +int K3bGrowisofsWriter::fd() const +{ + if( d->process ) { + if( d->usingRingBuffer ) + return d->ringBuffer->inFd(); + else + return d->process->stdinFd(); + } + else + return -1; +} + + +bool K3bGrowisofsWriter::closeFd() +{ + return ( !::close( fd() ) ); +} + + +bool K3bGrowisofsWriter::prepareProcess() +{ + d->growisofsBin = k3bcore->externalBinManager()->binObject( "growisofs" ); + if( !d->growisofsBin ) { + emit infoMessage( i18n("Could not find %1 executable.").arg("growisofs"), ERROR ); + return false; + } + + if( d->growisofsBin->version < K3bVersion( 5, 10 ) ) { + emit infoMessage( i18n("Growisofs version %1 is too old. " + "K3b needs at least version 5.10.").arg(d->growisofsBin->version), + ERROR ); + return false; + } + + emit debuggingOutput( "Used versions", "growisofs: " + d->growisofsBin->version ); + + if( !d->growisofsBin->copyright.isEmpty() ) + emit infoMessage( i18n("Using %1 %2 - Copyright (C) %3").arg("growisofs") + .arg(d->growisofsBin->version).arg(d->growisofsBin->copyright), INFO ); + + + // + // The growisofs bin is ready. Now we add the parameters + // + delete d->process; + d->process = new K3bProcess(); + d->process->setRunPrivileged(true); + // d->process->setPriority( KProcess::PrioHighest ); + d->process->setSplitStdout(true); + d->process->setRawStdin(true); + connect( d->process, SIGNAL(stderrLine(const QString&)), this, SLOT(slotReceivedStderr(const QString&)) ); + connect( d->process, SIGNAL(stdoutLine(const QString&)), this, SLOT(slotReceivedStderr(const QString&)) ); + connect( d->process, SIGNAL(processExited(KProcess*)), this, SLOT(slotProcessExited(KProcess*)) ); + + + // + // growisofs < 5.20 wants the tracksize to be a multiple of 16 (1 ECC block: 16*2048 bytes) + // we simply pad ourselves. + // + // But since the writer itself properly pads or writes a longer lead-out we don't really need + // to write zeros. We just tell growisofs to reserve a multiple of 16 blocks. + // This is only releveant in DAO mode anyway. + // + // FIXME: seems as we also need this for double layer writing. Better make it the default and + // actually write the pad bytes. The only possibility I see right now is to add a padding option + // to the pipebuffer. + int trackSizePadding = 0; + if( d->trackSize > 0 && d->growisofsBin->version < K3bVersion( 5, 20 ) ) { + if( d->trackSize % 16 ) { + trackSizePadding = (16 - d->trackSize%16); + kdDebug() << "(K3bGrowisofsWriter) need to pad " << trackSizePadding << " blocks." << endl; + } + } + + + *d->process << d->growisofsBin; + + // set this var to true to enable the ringbuffer + d->usingRingBuffer = ( d->growisofsBin->version < K3bVersion( 6, 0 ) ); + + QString s = burnDevice()->blockDeviceName() + "="; + if( d->usingRingBuffer || d->image.isEmpty() ) { + // we always read from stdin since the ringbuffer does the actual reading from the source + s += "/dev/fd/0"; + } + else + s += d->image; + + if( d->multiSession && !d->multiSessionInfo.isEmpty() ) + *d->process << "-C" << d->multiSessionInfo; + + if( d->multiSession ) + *d->process << "-M"; + else + *d->process << "-Z"; + *d->process << s; + + + if( !d->image.isEmpty() && d->usingRingBuffer ) { + d->inputFile.setName( d->image ); + d->trackSize = (K3b::filesize( d->image ) + 1024) / 2048; + if( !d->inputFile.open( IO_ReadOnly ) ) { + emit infoMessage( i18n("Could not open file %1.").arg(d->image), ERROR ); + return false; + } + } + + // now we use the force (luke ;) do not reload the dvd, K3b does that. + *d->process << "-use-the-force-luke=notray"; + + // we check for existing filesystems ourselves, so we always force the overwrite... + *d->process << "-use-the-force-luke=tty"; + + bool dvdCompat = d->closeDvd; + + // DL writing with forced layer break + if( d->layerBreak > 0 ) { + *d->process << "-use-the-force-luke=break:" + QString::number(d->layerBreak); + dvdCompat = true; + } + + // the tracksize parameter takes priority over the dao:tracksize parameter since growisofs 5.18 + else if( d->growisofsBin->version > K3bVersion( 5, 17 ) && d->trackSize > 0 ) + *d->process << "-use-the-force-luke=tracksize:" + QString::number(d->trackSize + trackSizePadding); + + if( simulate() ) + *d->process << "-use-the-force-luke=dummy"; + + if( d->writingMode == K3b::DAO ) { + dvdCompat = true; + if( d->growisofsBin->version >= K3bVersion( 5, 15 ) && d->trackSize > 0 ) + *d->process << "-use-the-force-luke=dao:" + QString::number(d->trackSize + trackSizePadding); + else + *d->process << "-use-the-force-luke=dao"; + d->gh->reset( burnDevice(), true ); + } + else + d->gh->reset( burnDevice(), false ); + + // + // Never use the -dvd-compat parameter with DVD+RW media + // because the only thing it does is creating problems. + // Normally this should be done in growisofs + // + int mediaType = burnDevice()->mediaType(); + if( dvdCompat && + mediaType != K3bDevice::MEDIA_DVD_PLUS_RW && + mediaType != K3bDevice::MEDIA_DVD_RW_OVWR ) + *d->process << "-dvd-compat"; + + // + // Some DVD writers do not allow changing the writing speed so we allow + // the user to ignore the speed setting + // + int speed = burnSpeed(); + if( speed >= 0 ) { + if( speed == 0 ) { + // try to determine the writeSpeed + // if it fails determineOptimalWriteSpeed() will return 0 and + // the choice is left to growisofs which means that the choice is + // really left to the drive since growisofs does not change the speed + // if no option is given + speed = burnDevice()->determineMaximalWriteSpeed(); + } + + // speed may be a float number. example: DVD+R(W): 2.4x + if( speed != 0 ) + *d->process << QString("-speed=%1").arg( speed%1385 > 0 + ? QString::number( (float)speed/1385.0, 'f', 1 ) + : QString::number( speed/1385 ) ); + } + + if( k3bcore->globalSettings()->overburn() ) + *d->process << "-overburn"; + + if( !d->usingRingBuffer && d->growisofsBin->version >= K3bVersion( 6, 0 ) ) { + bool manualBufferSize = k3bcore->globalSettings()->useManualBufferSize(); + int bufSize = ( manualBufferSize ? k3bcore->globalSettings()->bufferSize() : 32 ); + *d->process << QString("-use-the-force-luke=bufsize:%1m").arg(bufSize); + } + + // additional user parameters from config + const QStringList& params = d->growisofsBin->userParameters(); + for( QStringList::const_iterator it = params.begin(); it != params.end(); ++it ) + *d->process << *it; + + emit debuggingOutput( "Burned media", K3bDevice::mediaTypeString(mediaType) ); + + return true; +} + + +void K3bGrowisofsWriter::start() +{ + jobStarted(); + + d->lastWritingSpeed = 0; + d->lastProgressed = 0; + d->lastProgress = 0; + d->firstSizeFromOutput = -1; + d->lastSpeedCalculationTime = QTime::currentTime(); + d->lastSpeedCalculationBytes = 0; + d->writingStarted = false; + d->canceled = false; + d->speedEst->reset(); + d->finished = false; + + if( !prepareProcess() ) { + jobFinished( false ); + } + else { + + kdDebug() << "***** " << d->growisofsBin->name() << " parameters:\n"; + const QValueList& args = d->process->args(); + QString s; + for( QValueList::const_iterator it = args.begin(); it != args.end(); ++it ) { + s += *it + " "; + } + kdDebug() << s << flush << endl; + emit debuggingOutput( d->growisofsBin->name() + " command:", s); + + + emit newSubTask( i18n("Preparing write process...") ); + + // FIXME: check the return value + if( K3b::isMounted( burnDevice() ) ) { + emit infoMessage( i18n("Unmounting medium"), INFO ); + K3b::unmount( burnDevice() ); + } + + // block the device (including certain checks) + k3bcore->blockDevice( burnDevice() ); + + // lock the device for good in this process since it will + // be opened in the growisofs process + burnDevice()->close(); + burnDevice()->usageLock(); + + if( !d->process->start( KProcess::NotifyOnExit, KProcess::All ) ) { + // something went wrong when starting the program + // it "should" be the executable + kdDebug() << "(K3bGrowisofsWriter) could not start " << d->growisofsBin->path << endl; + emit infoMessage( i18n("Could not start %1.").arg(d->growisofsBin->name()), K3bJob::ERROR ); + jobFinished(false); + } + else { + if( simulate() ) { + emit newTask( i18n("Simulating") ); + emit infoMessage( i18n("Starting simulation..."), + K3bJob::INFO ); + } + else { + emit newTask( i18n("Writing") ); + emit infoMessage( i18n("Starting disc write..."), K3bJob::INFO ); + } + + d->gh->handleStart(); + + // create the ring buffer + if( d->usingRingBuffer ) { + if( !d->ringBuffer ) { + d->ringBuffer = new K3bPipeBuffer( this, this ); + connect( d->ringBuffer, SIGNAL(percent(int)), this, SIGNAL(buffer(int)) ); + connect( d->ringBuffer, SIGNAL(finished(bool)), this, SLOT(slotRingBufferFinished(bool)) ); + } + + d->ringBuffer->writeToFd( d->process->stdinFd() ); + bool manualBufferSize = k3bcore->globalSettings()->useManualBufferSize(); + int bufSize = ( manualBufferSize ? k3bcore->globalSettings()->bufferSize() : 20 ); + d->ringBuffer->setBufferSize( bufSize ); + + if( !d->image.isEmpty() ) + d->ringBuffer->readFromFd( d->inputFile.handle() ); + + d->ringBuffer->start(); + } + } + } +} + + +void K3bGrowisofsWriter::cancel() +{ + if( active() ) { + d->canceled = true; + closeFd(); + if( d->usingRingBuffer && d->ringBuffer ) + d->ringBuffer->cancel(); + d->process->kill(); + } +} + + +void K3bGrowisofsWriter::setWritingMode( int m ) +{ + d->writingMode = m; +} + + +void K3bGrowisofsWriter::setTrackSize( long size ) +{ + d->trackSize = size; +} + + +void K3bGrowisofsWriter::setLayerBreak( long lb ) +{ + d->layerBreak = lb; +} + + +void K3bGrowisofsWriter::setCloseDvd( bool b ) +{ + d->closeDvd = b; +} + + +void K3bGrowisofsWriter::setMultiSession( bool b ) +{ + d->multiSession = b; +} + + +void K3bGrowisofsWriter::setImageToWrite( const QString& filename ) +{ + d->image = filename; +} + + +void K3bGrowisofsWriter::slotReceivedStderr( const QString& line ) +{ + emit debuggingOutput( d->growisofsBin->name(), line ); + + if( line.contains( "remaining" ) ) { + + if( !d->writingStarted ) { + d->writingStarted = true; + emit newSubTask( i18n("Writing data") ); + } + + // parse progress + int pos = line.find( "/" ); + unsigned long long done = line.left( pos ).toULongLong(); + bool ok = true; + d->overallSizeFromOutput = line.mid( pos+1, line.find( "(", pos ) - pos - 1 ).toULongLong( &ok ); + if( d->firstSizeFromOutput == -1 ) + d->firstSizeFromOutput = done; + done -= d->firstSizeFromOutput; + d->overallSizeFromOutput -= d->firstSizeFromOutput; + if( ok ) { + int p = (int)(100 * done / d->overallSizeFromOutput); + if( p > d->lastProgress ) { + emit percent( p ); + emit subPercent( p ); + d->lastProgress = p; + } + if( (unsigned int)(done/1024/1024) > d->lastProgressed ) { + d->lastProgressed = (unsigned int)(done/1024/1024); + emit processedSize( d->lastProgressed, (int)(d->overallSizeFromOutput/1024/1024) ); + emit processedSubSize( d->lastProgressed, (int)(d->overallSizeFromOutput/1024/1024) ); + } + + // try parsing write speed (since growisofs 5.11) + pos = line.find( '@' ); + if( pos != -1 ) { + pos += 1; + double speed = line.mid( pos, line.find( 'x', pos ) - pos ).toDouble(&ok); + if( ok ) { + if( d->lastWritingSpeed != speed ) + emit writeSpeed( (int)(speed*1385.0), 1385 ); + d->lastWritingSpeed = speed; + } + else + kdDebug() << "(K3bGrowisofsWriter) speed parsing failed: '" + << line.mid( pos, line.find( 'x', pos ) - pos ) << "'" << endl; + } + else { + d->speedEst->dataWritten( done/1024 ); + } + } + else + kdDebug() << "(K3bGrowisofsWriter) progress parsing failed: '" + << line.mid( pos+1, line.find( "(", pos ) - pos - 1 ).stripWhiteSpace() << "'" << endl; + } + + // else + // to be able to parse the ring buffer fill in growisofs 6.0 we need to do this all the time + // FIXME: get rid of the K3bGrowisofsHandler once it is sure that we do not need the K3bGrowisofsImager anymore + d->gh->handleLine( line ); +} + + +void K3bGrowisofsWriter::slotProcessExited( KProcess* p ) +{ + d->inputFile.close(); + + // release the device within this process + burnDevice()->usageUnlock(); + + // unblock the device + k3bcore->unblockDevice( burnDevice() ); + + if( d->canceled ) { + if( !d->finished ) { + d->finished = true; + // this will unblock and eject the drive and emit the finished/canceled signals + K3bAbstractWriter::cancel(); + } + return; + } + + d->finished = true; + + // it seems that growisofs sometimes exits with a valid exit code while a write error occured + if( p->exitStatus() == 0 && d->gh->error() != K3bGrowisofsHandler::ERROR_WRITE_FAILED ) { + + int s = d->speedEst->average(); + if( s > 0 ) + emit infoMessage( i18n("Average overall write speed: %1 KB/s (%2x)") + .arg(s).arg(KGlobal::locale()->formatNumber((double)s/1385.0), 2), INFO ); + + if( simulate() ) + emit infoMessage( i18n("Simulation successfully completed"), K3bJob::SUCCESS ); + else + emit infoMessage( i18n("Writing successfully completed"), K3bJob::SUCCESS ); + + d->success = true; + } + else { + if( !wasSourceUnreadable() ) + d->gh->handleExit( p->exitStatus() ); + d->success = false; + } + + if( !k3bcore->globalSettings()->ejectMedia() || d->forceNoEject ) + jobFinished(d->success); + else { + emit newSubTask( i18n("Ejecting DVD") ); + connect( K3bDevice::eject( burnDevice() ), + SIGNAL(finished(K3bDevice::DeviceHandler*)), + this, + SLOT(slotEjectingFinished(K3bDevice::DeviceHandler*)) ); + } +} + + +void K3bGrowisofsWriter::slotRingBufferFinished( bool ) +{ + if( !d->finished ) { + d->finished = true; + // this will unblock and eject the drive and emit the finished/canceled signals + K3bAbstractWriter::cancel(); + } +} + + +void K3bGrowisofsWriter::slotEjectingFinished( K3bDevice::DeviceHandler* dh ) +{ + if( !dh->success() ) + emit infoMessage( i18n("Unable to eject media."), ERROR ); + + jobFinished(d->success); +} + + +void K3bGrowisofsWriter::slotThroughput( int t ) +{ + emit writeSpeed( t, 1385 ); +} + + +void K3bGrowisofsWriter::slotFlushingCache() +{ + if( !d->canceled ) { + // + // growisofs's progress output stops before 100%, so we do it manually + // + emit percent( 100 ); + emit processedSize( d->overallSizeFromOutput/1024/1024, + d->overallSizeFromOutput/1024/1024 ); + } +} + + +void K3bGrowisofsWriter::setMultiSessionInfo( const QString& info ) +{ + d->multiSessionInfo = info; +} + + +void K3bGrowisofsWriter::setForceNoEject( bool b ) +{ + d->forceNoEject = b; +} + +#include "k3bgrowisofswriter.moc" diff --git a/libk3b/projects/k3bgrowisofswriter.h b/libk3b/projects/k3bgrowisofswriter.h new file mode 100644 index 0000000..ed69923 --- /dev/null +++ b/libk3b/projects/k3bgrowisofswriter.h @@ -0,0 +1,106 @@ +/* + * + * $Id: k3bgrowisofswriter.h 679276 2007-06-23 13:25:21Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_GROWISOFS_WRITER_H_ +#define _K3B_GROWISOFS_WRITER_H_ + +#include "k3babstractwriter.h" + + +namespace K3bDevice { + class Device; + class DeviceHandler; +} +class KProcess; + + + +class K3bGrowisofsWriter : public K3bAbstractWriter +{ + Q_OBJECT + + public: + K3bGrowisofsWriter( K3bDevice::Device*, K3bJobHandler*, + QObject* parent = 0, const char* name = 0 ); + ~K3bGrowisofsWriter(); + + bool active() const; + + int fd() const; + bool closeFd(); + + public slots: + void start(); + void cancel(); + + void setWritingMode( int ); + + /** + * If true the growisofs parameter -M is used in favor of -Z. + */ + void setMultiSession( bool b ); + + /** + * Only used in DAO mode and only supported with growisofs >= 5.15 + * @param size size in blocks + */ + void setTrackSize( long size ); + + /** + * Use this in combination with setTrackSize when writing double layer media. + * @param lb The number of data sectors in the first layer. It needs to be less or equal + * to tracksize/2. The writer will pad the second layer with zeros if + * break < tracksize/2. + * If set to 0 this setting will be ignored. + */ + void setLayerBreak( long lb ); + + /** + * Close the DVD to enable max DVD compatibility (uses the growisofs --dvd-compat parameter) + * This will also be used in DAO mode and when the layerBreak has been set. + */ + void setCloseDvd( bool ); + + /** + * set this to QString::null or an empty string to let the writer + * read it's data from fd() + */ + void setImageToWrite( const QString& ); + + /** + * While reading the image from stdin growisofs needs + * a valid -C parameter for multisession. + */ + void setMultiSessionInfo( const QString& ); + + void setForceNoEject( bool ); + + protected: + bool prepareProcess(); + + protected slots: + void slotReceivedStderr( const QString& ); + void slotProcessExited( KProcess* ); + void slotEjectingFinished( K3bDevice::DeviceHandler* dh ); + void slotThroughput( int t ); + void slotFlushingCache(); + void slotRingBufferFinished( bool ); + + private: + class Private; + Private* d; +}; + +#endif diff --git a/libk3b/projects/k3bimagefilereader.cpp b/libk3b/projects/k3bimagefilereader.cpp new file mode 100644 index 0000000..70ece16 --- /dev/null +++ b/libk3b/projects/k3bimagefilereader.cpp @@ -0,0 +1,88 @@ +/* + * + * $Id: k3bimagefilereader.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bimagefilereader.h" + +#include +#include + +#include + + + +class K3bImageFileReader::Private +{ +public: + Private() + : isValid(false) { + } + + QString filename; + QString imageFilename; + bool isValid; +}; + + +K3bImageFileReader::K3bImageFileReader() +{ + d = new Private(); +} + + +K3bImageFileReader::~K3bImageFileReader() +{ + delete d; +} + + +void K3bImageFileReader::openFile( const QString& filename ) +{ + d->filename = filename; + d->imageFilename = QString::null; + setValid(false); + + if( !filename.isEmpty() ) + readFile(); +} + + +void K3bImageFileReader::setValid( bool b ) +{ + d->isValid = b; +} + + +void K3bImageFileReader::setImageFilename( const QString& filename ) +{ + d->imageFilename = filename; +} + + +bool K3bImageFileReader::isValid() const +{ + return d->isValid; +} + + +const QString& K3bImageFileReader::filename() const +{ + return d->filename; +} + + +const QString& K3bImageFileReader::imageFilename() const +{ + return d->imageFilename; +} diff --git a/libk3b/projects/k3bimagefilereader.h b/libk3b/projects/k3bimagefilereader.h new file mode 100644 index 0000000..2bf727e --- /dev/null +++ b/libk3b/projects/k3bimagefilereader.h @@ -0,0 +1,55 @@ +/* + * + * $Id: k3bimagefilereader.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_IMAGE_FILE_READER_H_ +#define _K3B_IMAGE_FILE_READER_H_ + +#include +#include "k3b_export.h" + +class LIBK3B_EXPORT K3bImageFileReader +{ + public: + K3bImageFileReader(); + virtual ~K3bImageFileReader(); + + /** + * Open a file. In most cases the TOC file + */ + void openFile( const QString& filename ); + + virtual bool isValid() const; + + /** + * Return the current set filename; + */ + const QString& filename() const; + + /** + * returns the name of the corresponding image file. + */ + virtual const QString& imageFilename() const; + + protected: + virtual void readFile() = 0; + void setValid( bool ); + void setImageFilename( const QString& ); + + private: + class Private; + Private* d; +}; + +#endif diff --git a/libk3b/projects/k3binffilewriter.cpp b/libk3b/projects/k3binffilewriter.cpp new file mode 100644 index 0000000..9395b2a --- /dev/null +++ b/libk3b/projects/k3binffilewriter.cpp @@ -0,0 +1,186 @@ +/* + * + * $Id: k3binffilewriter.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3binffilewriter.h" + +#include +#include +#include +#include +#include + +#include +#include +#include + + + +K3bInfFileWriter::K3bInfFileWriter() + : m_index0(-1), + m_trackNumber(1), + m_trackStart(0), + m_trackLength(0), + m_preEmphasis(false), + m_copyPermitted(true), + m_bigEndian(false) +{ +} + + +bool K3bInfFileWriter::save( const QString& filename ) +{ + QFile f( filename ); + + if( !f.open( IO_WriteOnly ) ) { + kdDebug() << "(K3bInfFileWriter) could not open file " << f.name() << endl; + return false; + } + + QTextStream s( &f ); + + return save( s ); +} + + +bool K3bInfFileWriter::save( QTextStream& s ) +{ + // now write the inf data + // ---------------------- + // header + s << "# Cdrecord-Inf-File written by K3b " << k3bcore->version() + << ", " << QDateTime::currentDateTime().toString() << endl + << "#" << endl; + + s << "ISRC=\t\t" << m_isrc << endl; + s << "MCN=\t\t" << m_mcn << endl; + + // CD-Text + s << "Albumperformer=\t" << "'" << m_albumPerformer << "'" << endl; + s << "Albumtitle=\t" << "'" << m_albumTitle << "'" << endl; + + s << "Performer=\t" << "'" << m_trackPerformer << "'" << endl; + s << "Songwriter=\t" << "'" << m_trackSongwriter << "'" << endl; + s << "Composer=\t" << "'" << m_trackComposer << "'" << endl; + s << "Arranger=\t" << "'" << m_trackArranger << "'" << endl; + s << "Message=\t" << "'" << m_trackMessage << "'" << endl; + + s << "Tracktitle=\t" << "'" << m_trackTitle << "'" << endl; + + s << "Tracknumber=\t" << m_trackNumber << endl; + + // track start + s << "Trackstart=\t" << m_trackStart.lba() << endl; + + // track length + s << "# Tracklength: " << m_trackLength.toString() << endl; + s << "Tracklength=\t" << m_trackLength.totalFrames() << ", 0" << endl; + + // pre-emphasis + s << "Pre-emphasis=\t"; + if( m_preEmphasis ) + s << "yes"; + else + s << "no"; + s << endl; + + // channels (always 2) + s << "Channels=\t2" << endl; + + // copy-permitted + // TODO: not sure about this! + // there are three options: yes, no, once + // but using "once" gives the same result as with cdrdao + // and that's important. + s << "Copy_permitted=\t"; + if( m_copyPermitted ) + s << "yes"; + else + s << "once"; + s << endl; + + // endianess - wav is little -> onthefly: big, with images: little + s << "Endianess=\t"; + if( m_bigEndian ) + s << "big"; + else + s << "little"; + s << endl; + + // write indices + // the current tracks' data contains the pregap of the next track + // if the pregap has length 0 we need no index 0 + if( m_indices.isEmpty() ) + s << "Index=\t\t0" << endl; + else { + for( unsigned int i = 0; i < m_indices.count(); ++i ) + s << "Index=\t\t" << m_indices[i] << endl; + } + + s << "Index0=\t\t" << m_index0 << endl; + + return ( s.device()->status() == IO_Ok ); +} + + +void K3bInfFileWriter::setTrack( const K3bDevice::Track& track ) +{ + m_indices.clear(); + + // the first index always has to be a zero (cdrecord manpage) + m_indices.append( 0 ); + + const QValueVector& indexList = track.indices(); + for( unsigned int i = 0; i < indexList.count(); ++i ) + m_indices.append( indexList[i].lba() ); + + if( track.index0() > 0 ) + m_index0 = track.index0().lba(); + else + m_index0 = -1; + + setPreEmphasis( track.preEmphasis() ); + setCopyPermitted( track.copyPermitted() ); + + setTrackStart( track.firstSector() ); + setTrackLength( track.length() ); + + setIsrc( track.isrc() ); + + setBigEndian( true ); +} + + +void K3bInfFileWriter::addIndex( long i ) +{ + m_indices.append( i ); +} + + +void K3bInfFileWriter::setTrackCdText( const K3bDevice::TrackCdText& cdtext ) +{ + setTrackTitle( cdtext.title() ); + setTrackPerformer( cdtext.performer() ); + setTrackSongwriter( cdtext.songwriter() ); + setTrackComposer( cdtext.composer() ); + setTrackArranger( cdtext.arranger() ); + setTrackMessage( cdtext.message() ); +} + + +void K3bInfFileWriter::setCdText( const K3bDevice::CdText& cdtext ) +{ + setAlbumTitle( cdtext.title() ); + setAlbumPerformer( cdtext.performer() ); +} diff --git a/libk3b/projects/k3binffilewriter.h b/libk3b/projects/k3binffilewriter.h new file mode 100644 index 0000000..74e23e4 --- /dev/null +++ b/libk3b/projects/k3binffilewriter.h @@ -0,0 +1,119 @@ +/* + * + * $Id: k3binffilewriter.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_INF_FILE_WRITER_H_ +#define _K3B_INF_FILE_WRITER_H_ + +#include +#include + +#include + + +namespace K3bDevice { + class Track; + class TrackCdText; + class CdText; +} + + +class K3bInfFileWriter +{ + public: + K3bInfFileWriter(); + + bool save( QTextStream& ); + bool save( const QString& filename ); + + /** + * Use this to set: + * @li trackStart + * @li trackLength + * @li index0 + * @li all indices + * @li preemphasis + * @li copyPermitted + * @li ISRC + * + * Endianess is set to big. + * + * Tracknumber needs to be set manually. + */ + void setTrack( const K3bDevice::Track& ); + + void clearIndices() { m_indices.clear(); } + + /** + * This is relative to the track start + */ + void setIndex0( int i ) { m_index0 = i; } + void addIndex( long i ); + + void setTrackNumber( int i ) { m_trackNumber = i; } + + void setTrackStart( const K3b::Msf& i ) { m_trackStart = i; } + void setTrackLength( const K3b::Msf& i ) { m_trackLength = i; } + + void setPreEmphasis( bool b ) { m_preEmphasis = b; } + void setCopyPermitted( bool b ) { m_copyPermitted = b; } + + /** + * Cdrecord seems to ignore this anyway and always expect big endian + * data on stdin and wavs are little endian anyway. + */ + void setBigEndian( bool b ) { m_bigEndian = b; } + + void setTrackCdText( const K3bDevice::TrackCdText& ); + void setTrackTitle( const QString& s ) { m_trackTitle = s; } + void setTrackPerformer( const QString& s ) { m_trackPerformer = s; } + void setTrackSongwriter( const QString& s ) { m_trackSongwriter = s; } + void setTrackComposer( const QString& s ) { m_trackComposer = s; } + void setTrackArranger( const QString& s ) { m_trackArranger = s; } + void setTrackMessage( const QString& s ) { m_trackMessage = s; } + + void setCdText( const K3bDevice::CdText& ); + void setAlbumTitle( const QString& s ) { m_albumTitle = s; } + void setAlbumPerformer( const QString& s ) { m_albumPerformer = s; } + + void setIsrc( const QCString& s ) { m_isrc = s; } + void setMcn( const QCString& s ) { m_mcn = s; } + + private: + long m_index0; + + QValueVector m_indices; + + int m_trackNumber; + K3b::Msf m_trackStart; + K3b::Msf m_trackLength; + bool m_preEmphasis; + bool m_copyPermitted; + bool m_bigEndian; + + QString m_trackTitle; + QString m_trackPerformer; + QString m_trackSongwriter; + QString m_trackComposer; + QString m_trackArranger; + QString m_trackMessage; + + QString m_albumTitle; + QString m_albumPerformer; + + QCString m_isrc; + QCString m_mcn; +}; + +#endif diff --git a/libk3b/projects/k3bpipebuffer.cpp b/libk3b/projects/k3bpipebuffer.cpp new file mode 100644 index 0000000..3b61116 --- /dev/null +++ b/libk3b/projects/k3bpipebuffer.cpp @@ -0,0 +1,281 @@ +/* + * + * $Id: k3bpipebuffer.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bpipebuffer.h" + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + + +// +// This one is based on the little pipebuf2 program by Peter Osterlund +// + + +class K3bPipeBuffer::WorkThread : public K3bThread +{ +public: + WorkThread() + : K3bThread(), + buffer(0), + bufSize(4*1024*1024), + canceled(false) { + outFd = inFd = -1; + inFdPair[0] = inFdPair[1] = -1; + } + + ~WorkThread() { + delete [] buffer; + } + + bool initFds() { + if( inFd == -1 ) { + if( ::socketpair(AF_UNIX, SOCK_STREAM, 0, inFdPair) ) { + // if( ::pipe( inFdPair ) ) { + kdDebug() << "(K3bPipeBuffer::WorkThread) unable to create socketpair" << endl; + inFdPair[0] = inFdPair[1] = -1; + return false; + } + else { + ::fcntl(inFdPair[0], F_SETFL, O_NONBLOCK); + ::fcntl(outFd, F_SETFL, O_NONBLOCK); + } + } + else { + ::fcntl(inFd, F_SETFL, O_NONBLOCK); + } + + delete [] buffer; + buffer = new char[bufSize]; + + return (buffer != 0); + } + + void run() { + emitStarted(); + + int usedInFd = -1; + if( inFd > 0 ) + usedInFd = inFd; + else + usedInFd = inFdPair[0]; + + kdDebug() << "(K3bPipeBuffer::WorkThread) reading from " << usedInFd + << " and writing to " << outFd << endl; + kdDebug() << "(K3bPipeBuffer::WorkThread) using buffer size of " << bufSize << endl; + + // start the buffering + unsigned int bufPos = 0; + unsigned int dataLen = 0; + bool eof = false; + bool error = false; + canceled = false; + int oldPercent = 0; + + static const unsigned int MAX_BUFFER_READ = 2048*3; + + while( !canceled && !error && (!eof || dataLen > 0) ) { + // + // create two fd sets + // + fd_set readFds, writeFds; + FD_ZERO(&readFds); + FD_ZERO(&writeFds); + + // + // fill the fd sets + // + if( !eof && dataLen < bufSize ) + FD_SET(usedInFd, &readFds); + if( dataLen > 0 ) + FD_SET(outFd, &writeFds); + + // + // wait for data + // + int ret = select( QMAX(usedInFd, outFd) + 1, &readFds, &writeFds, NULL, NULL); + + // + // Do the buffering + // + if( !canceled && ret > 0 ) { + + int percent = -1; + + // + // Read from the buffer and write to the output + // + if( FD_ISSET(outFd, &writeFds) ) { + unsigned int maxLen = QMIN(bufSize - bufPos, dataLen); + + ret = ::write( outFd, &buffer[bufPos], maxLen ); + + if( ret < 0 ) { + if( (errno != EINTR) && (errno != EAGAIN) ) { + kdDebug() << "(K3bPipeBuffer::WorkThread) error while writing to " << outFd << endl; + error = true; + } + } + else { + // + // we always emit before the reading from the buffer since + // it makes way more sense to show the buffer before the reading. + // + percent = (int)((double)dataLen*100.0/(double)bufSize); + + bufPos = (bufPos + ret) % bufSize; + dataLen -= ret; + } + } + + // + // Read into the buffer + // + else if( FD_ISSET(usedInFd, &readFds) ) { + unsigned int readPos = (bufPos + dataLen) % bufSize; + unsigned int maxLen = QMIN(bufSize - readPos, bufSize - dataLen); + // + // never read more than xxx bytes + // This is some tuning to prevent the reading from blocking the whole thread + // + if( maxLen > MAX_BUFFER_READ ) // some dummy value below 1 MB + maxLen = MAX_BUFFER_READ; + ret = ::read( usedInFd, &buffer[readPos], maxLen ); + if( ret < 0 ) { + if( (errno != EINTR) && (errno != EAGAIN) ) { + kdDebug() << "(K3bPipeBuffer::WorkThread) error while reading from " << usedInFd << endl; + error = true; + } + } + else if( ret == 0 ) { + kdDebug() << "(K3bPipeBuffer::WorkThread) end of input." << endl; + eof = true; + } + else { + dataLen += ret; + + percent = (int)((double)dataLen*100.0/(double)bufSize); + } + } + + // A little hack to keep the buffer display from flickering + if( percent == 99 ) + percent = 100; + + if( percent != -1 && percent != oldPercent ) { + emitPercent( percent ); + oldPercent = percent; + } + } + else if( !canceled ) { + error = true; + kdDebug() << "(K3bPipeBuffer::WorkThread) select: " << ::strerror(errno) << endl; + } + } + + if( inFd == -1 ) { + ::close( inFdPair[0] ); + ::close( inFdPair[1] ); + inFdPair[0] = inFdPair[1] = -1; + } + + // + // close the fd we are writing to (this is need to make growisofs happy + // TODO: perhaps make this configurable + // + ::close( outFd ); + + if( canceled ) + emitCanceled(); + emitFinished( !error && !canceled ); + } + + char* buffer; + size_t bufSize; + int outFd; + int inFd; + int inFdPair[2]; + bool canceled; +}; + + +K3bPipeBuffer::K3bPipeBuffer( K3bJobHandler* jh, QObject* parent, const char* name ) + : K3bThreadJob( jh, parent, name ) +{ + m_thread = new WorkThread(); + setThread( m_thread ); +} + + +K3bPipeBuffer::~K3bPipeBuffer() +{ + delete m_thread; +} + + +void K3bPipeBuffer::start() +{ + // + // Create the socketpair in the gui thread to be sure it's available after + // this method returns. + // + if( !m_thread->initFds() ) + jobFinished(false); + else + K3bThreadJob::start(); +} + + +void K3bPipeBuffer::cancel() +{ + m_thread->canceled = true; +} + + +void K3bPipeBuffer::setBufferSize( int mb ) +{ + m_thread->bufSize = mb * 1024 * 1024; +} + + +void K3bPipeBuffer::readFromFd( int fd ) +{ + m_thread->inFd = fd; +} + + +void K3bPipeBuffer::writeToFd( int fd ) +{ + m_thread->outFd = fd; +} + + +int K3bPipeBuffer::inFd() const +{ + if( m_thread->inFd == -1 ) + return m_thread->inFdPair[1]; + else + return m_thread->inFd; +} diff --git a/libk3b/projects/k3bpipebuffer.h b/libk3b/projects/k3bpipebuffer.h new file mode 100644 index 0000000..6aae368 --- /dev/null +++ b/libk3b/projects/k3bpipebuffer.h @@ -0,0 +1,59 @@ +/* + * + * $Id: k3bpipebuffer.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_PIPE_BUFFER_H_ +#define _K3B_PIPE_BUFFER_H_ + + +#include + +/** + * the pipebuffer uses the signal percent to show it's status. + */ +class K3bPipeBuffer : public K3bThreadJob +{ + public: + K3bPipeBuffer( K3bJobHandler*, QObject* parent = 0, const char* name = 0 ); + ~K3bPipeBuffer(); + + /** + * Set the buffer size in MB. The default value is 4 MB. + */ + void setBufferSize( int ); + + /** + * If this is set to -1 (which is the default) the pipebuffer + * will create a fd pair which can be obtained by inFd() after + * the buffer has been started. + */ + void readFromFd( int fd ); + void writeToFd( int fd ); + + /** + * This is only valid after the piepbuffer has been started and no fd + * has been set with readFromFd. + */ + int inFd() const; + + public slots: + void start(); + void cancel(); + + private: + class WorkThread; + WorkThread* m_thread; +}; + +#endif diff --git a/libk3b/projects/k3btocfilewriter.cpp b/libk3b/projects/k3btocfilewriter.cpp new file mode 100644 index 0000000..77662d6 --- /dev/null +++ b/libk3b/projects/k3btocfilewriter.cpp @@ -0,0 +1,356 @@ +/* + * + * $Id: k3btocfilewriter.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2004 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3btocfilewriter.h" + +#include +#include +#include +#include + +#include +#include +#include + + +K3bTocFileWriter::K3bTocFileWriter() + : m_hideFirstTrack(false), + m_sessionToWrite(1) +{ +} + + +bool K3bTocFileWriter::save( const QString& filename ) +{ + QFile f( filename ); + + if( !f.open( IO_WriteOnly ) ) { + kdDebug() << "(K3bCueFileWriter) could not open file " << f.name() << endl; + return false; + } + + QTextStream s( &f ); + + return save( s ); +} + + +bool K3bTocFileWriter::save( QTextStream& t ) +{ + writeHeader(t); + + if( !m_cdText.isEmpty() ) + writeGlobalCdText(t); + + // + // see if we have multiple sessions + // + int sessions = 1; + for( K3bDevice::Toc::iterator it = m_toc.begin(); it != m_toc.end(); ++it ) { + if( (*it).session() > 1 ) + sessions = (*it).session(); + } + + if( m_sessionToWrite > sessions ) + m_sessionToWrite = 1; + + // + // We can only hide the first track if both the first and the second track are + // audio tracks. + // We also can only hide the first track in the first session. + // + bool hideFirstTrack = m_hideFirstTrack; + if( m_toc.count() < 2 || + m_toc[0].type() != K3bDevice::Track::AUDIO || + m_toc[1].type() != K3bDevice::Track::AUDIO || + (sessions > 1 && m_sessionToWrite != 1 ) ) + hideFirstTrack = false; + + + // the dataStart will be the offset in case we do not write the first session + K3b::Msf dataStart; + + unsigned int trackIndex = 0; + if( hideFirstTrack ) { + const K3bDevice::Track& hiddenTrack = m_toc[0]; + const K3bDevice::Track& track = m_toc[1]; + + t << "// Track number 1 (hidden) and track number 2 (as track 1)" << endl; + t << "TRACK AUDIO" << endl; + + if( track.copyPermitted() ) + t << "COPY" << endl; + else + t << "NO COPY" << endl; + + if( track.preEmphasis() ) + t << "PRE_EMPHASIS" << endl; + else + t << "NO PRE_EMPHASIS" << endl; + + if( !m_cdText.isEmpty() ) + writeTrackCdText( m_cdText[0], t ); + + // the "hidden" file will be used as pregap for the "first" track + t << "AUDIOFILE "; + writeDataSource( 0, t ); + if( readFromStdin() ) + t << hiddenTrack.firstSector().toString(); + else + t << " 0"; + t << " " << hiddenTrack.length().toString() << endl; + t << "START" << endl; // use the whole hidden file as pregap + + // now comes the "real" first track + t << "AUDIOFILE "; + writeDataSource( 1, t ); + if( readFromStdin() ) + t << track.firstSector().toString() << " "; + else + t << "0 "; + // no index 0 for the last track. Or should we allow this??? + if( m_toc.count() == 2 ) + t << track.length().toString(); + else + t << track.realAudioLength().toString(); + t << endl << endl; + + trackIndex+=2; + } + else { + // + // Seek to the first track to write. + // In case we hid the first track above it was the first track anyway. + // + while( m_toc[trackIndex].session() < m_sessionToWrite && + m_toc[trackIndex].session() > 0 ) + ++trackIndex; + + dataStart = m_toc[trackIndex].firstSector(); + } + + kdDebug() << "(K3bTocFileWriter) using offset of: " << dataStart.toString() << endl; + + while( trackIndex < m_toc.count() ) { + if( m_toc[trackIndex].session() == 0 || m_toc[trackIndex].session() == m_sessionToWrite ) + writeTrack( trackIndex, dataStart, t ); + trackIndex++; + } + + return ( t.device()->status() == IO_Ok ); +} + + +void K3bTocFileWriter::writeHeader( QTextStream& t ) +{ + // little comment + t << "// TOC-file to use with cdrdao created by K3b " << k3bcore->version() + << ", " << QDateTime::currentDateTime().toString() << endl << endl; + + t << "// " << m_toc.count() << " tracks" << endl; + if( m_toc.back().session() > 0 ) { + t << "// " << m_toc.back().session() << " sessions" << endl + << "// this is session number " << m_sessionToWrite << endl; + } + t << endl; + + // check the cd type + if( m_toc.contentType() == K3bDevice::AUDIO ) { + t << "CD_DA"; + } + else { + bool hasMode2Tracks = false; + for( K3bDevice::Toc::iterator it = m_toc.begin(); it != m_toc.end(); ++it ) { + const K3bDevice::Track& track = *it; + if( track.type() == K3bDevice::Track::DATA && + (track.mode() == K3bDevice::Track::MODE2 || + track.mode() == K3bDevice::Track::XA_FORM1 || + track.mode() == K3bDevice::Track::XA_FORM2 ) ) { + hasMode2Tracks = true; + break; + } + } + + if( hasMode2Tracks ) + t << "CD_ROM_XA"; + else + t << "CD_ROM"; + } + + t << endl << endl; +} + + +void K3bTocFileWriter::writeTrack( unsigned int index, const K3b::Msf& offset, QTextStream& t ) +{ + const K3bDevice::Track& track = m_toc[index]; + + t << "// Track number " << (index+1) << endl; + + if( track.type() == K3bDevice::Track::AUDIO ) { + t << "TRACK AUDIO" << endl; + + if( track.copyPermitted() ) + t << "COPY" << endl; + else + t << "NO COPY" << endl; + + if( track.preEmphasis() ) + t << "PRE_EMPHASIS" << endl; + else + t << "NO PRE_EMPHASIS" << endl; + + if( !m_cdText.isEmpty() ) + writeTrackCdText( m_cdText[index], t ); + + // + // cdrdao sees the pregap as part of the current track and not as part of + // the previous like it really is. + // + + if( index == 0 ) { + if( (track.firstSector()-offset) > 0 ) { + // + // the first track is the only track K3b does not generate null-pregap data for + // since cdrecord does not allow this. So We just do it here the same way and tell + // cdrdao to create the first pregap for us + // + + t << "PREGAP " + << (track.firstSector()-offset).toString() << endl; + } + } + else { + const K3bDevice::Track& lastTrack = m_toc[index-1]; + + // + // the pregap data + // + if( lastTrack.index0() > 0 ) { + t << "AUDIOFILE "; + writeDataSource( index-1, t ); + if( readFromStdin() ) + t << (lastTrack.firstSector() + lastTrack.index0() - offset).toString(); + else + t << (lastTrack.index0() - offset).toString(); + t << " " + << (lastTrack.length() - lastTrack.index0()).toString() + << endl + << "START" << endl; + } + } + + // + // The track data + // + t << "AUDIOFILE "; + writeDataSource( index, t ); + if( readFromStdin() ) + t << (track.firstSector() - offset).toString() << " "; + else + t << "0 "; + // no index 0 for the last track. Or should we allow this??? + if( index == m_toc.count()-1 ) + t << track.length().toString(); + else + t << track.realAudioLength().toString(); + t << endl; + } + else { + if( track.mode() == K3bDevice::Track::XA_FORM1 ) + t << "TRACK MODE2_FORM1" << endl; + else if( track.mode() == K3bDevice::Track::XA_FORM2 ) + t << "TRACK MODE2_FORM2" << endl; + else + t << "TRACK MODE1" << endl; + + if( !m_cdText.isEmpty() && !m_toc.contentType() != K3bDevice::DATA ) { + // + // insert fake cdtext + // cdrdao does not work without it and it seems not to do any harm. + // + t << "CD_TEXT {" << endl + << " LANGUAGE 0 {" << endl + << " TITLE " << "\"\"" << endl + << " PERFORMER " << "\"\"" << endl + << " ISRC " << "\"\"" << endl + << " ARRANGER " << "\"\"" << endl + << " SONGWRITER " << "\"\"" << endl + << " COMPOSER " << "\"\"" << endl + << " MESSAGE " << "\"\"" << endl + << " }" << endl + << "}" << endl; + } + + if( readFromStdin() ) + t << "DATAFILE \"-\" " << track.length().toString() << endl; + else + t << "DATAFILE \"" << m_filenames[index] << "\"" << endl; + t << endl; + } + + t << endl; +} + + +void K3bTocFileWriter::writeGlobalCdText( QTextStream& t ) +{ + t << "CD_TEXT {" << endl; + t << " LANGUAGE_MAP { 0: EN }" << endl; + t << " LANGUAGE 0 {" << endl; + t << " TITLE " << "\"" << m_cdText.title() << "\"" << endl; + t << " PERFORMER " << "\"" << m_cdText.performer() << "\"" << endl; + t << " DISC_ID " << "\"" << m_cdText.discId() << "\"" << endl; + t << " UPC_EAN " << "\"" << m_cdText.upcEan() << "\"" << endl; + t << endl; + t << " ARRANGER " << "\"" << m_cdText.arranger() << "\"" << endl; + t << " SONGWRITER " << "\"" << m_cdText.songwriter() << "\"" << endl; + t << " COMPOSER " << "\"" << m_cdText.composer() << "\"" << endl; + t << " MESSAGE " << "\"" << m_cdText.message() << "\"" << endl; + t << " }" << endl; + t << "}" << endl; + t << endl; +} + + +void K3bTocFileWriter::writeTrackCdText( const K3bDevice::TrackCdText& track, QTextStream& t ) +{ + t << "CD_TEXT {" << endl; + t << " LANGUAGE 0 {" << endl; + t << " TITLE " << "\"" << track.title() << "\"" << endl; + t << " PERFORMER " << "\"" << track.performer() << "\"" << endl; + t << " ISRC " << "\"" << track.isrc() << "\"" << endl; + t << " ARRANGER " << "\"" << track.arranger() << "\"" << endl; + t << " SONGWRITER " << "\"" << track.songwriter() << "\"" << endl; + t << " COMPOSER " << "\"" << track.composer() << "\"" << endl; + t << " MESSAGE " << "\"" << track.message() << "\"" << endl; + t << " }" << endl; + t << "}" << endl; +} + + +void K3bTocFileWriter::writeDataSource( unsigned int trackIndex, QTextStream& t ) +{ + if( readFromStdin() ) + t << "\"-\" "; + else + t << "\"" << m_filenames[trackIndex] << "\" "; +} + + +bool K3bTocFileWriter::readFromStdin() const +{ + return ( m_toc.count() > m_filenames.count() ); +} diff --git a/libk3b/projects/k3btocfilewriter.h b/libk3b/projects/k3btocfilewriter.h new file mode 100644 index 0000000..1c1da47 --- /dev/null +++ b/libk3b/projects/k3btocfilewriter.h @@ -0,0 +1,62 @@ +/* + * + * $Id: k3btocfilewriter.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2004 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_TOC_FILE_WRITER_H_ +#define _K3B_TOC_FILE_WRITER_H_ + +#include +#include + +#include +#include + +namespace K3bDevice { + class TrackCdText; +} + +class K3bTocFileWriter +{ + public: + K3bTocFileWriter(); + + bool save( QTextStream& ); + bool save( const QString& filename ); + + void setData( const K3bDevice::Toc& toc ) { m_toc = toc; } + void setCdText( const K3bDevice::CdText& text ) { m_cdText = text; } + void setFilenames( const QStringList& names ) { m_filenames = names; } + void setHideFirstTrack( bool b ) { m_hideFirstTrack = b; } + + /** + * The default is 1. + */ + void setSession( int s ) { m_sessionToWrite = s; } + + private: + void writeHeader( QTextStream& t ); + void writeGlobalCdText( QTextStream& t ); + void writeTrackCdText( const K3bDevice::TrackCdText& track, QTextStream& t ); + void writeTrack( unsigned int index, const K3b::Msf& offset, QTextStream& t ); + void writeDataSource( unsigned int trackNumber, QTextStream& t ); + bool readFromStdin() const; + + K3bDevice::Toc m_toc; + K3bDevice::CdText m_cdText; + QStringList m_filenames; + bool m_hideFirstTrack; + int m_sessionToWrite; +}; + +#endif diff --git a/libk3b/projects/mixedcd/Makefile.am b/libk3b/projects/mixedcd/Makefile.am new file mode 100644 index 0000000..fb5f44c --- /dev/null +++ b/libk3b/projects/mixedcd/Makefile.am @@ -0,0 +1,23 @@ +# we need the ../datacd and ../audiocd for the uic generated header files +AM_CPPFLAGS= -I$(srcdir)/../../core \ + -I$(srcdir)/../../plugin \ + -I$(srcdir)/../../../libk3bdevice \ + -I$(srcdir)/../../../src \ + -I$(srcdir)/../../tools \ + -I$(srcdir)/.. \ + -I$(srcdir)/../datacd \ + -I$(srcdir)/../audiocd \ + -I$(srcdir)/../../plugin \ + -I../datacd \ + -I../audiocd \ + $(all_includes) + +METASOURCES = AUTO + +noinst_LTLIBRARIES = libmixed.la + +libmixed_la_SOURCES = k3bmixeddoc.cpp \ + k3bmixedjob.cpp + +include_HEADERS = k3bmixeddoc.h \ + k3bmixedjob.h diff --git a/libk3b/projects/mixedcd/k3bmixeddoc.cpp b/libk3b/projects/mixedcd/k3bmixeddoc.cpp new file mode 100644 index 0000000..a2c76b0 --- /dev/null +++ b/libk3b/projects/mixedcd/k3bmixeddoc.cpp @@ -0,0 +1,249 @@ +/* + * + * $Id: k3bmixeddoc.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bmixeddoc.h" +#include "k3bmixedjob.h" + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + + + +K3bMixedDoc::K3bMixedDoc( QObject* parent ) + : K3bDoc( parent ) +{ + m_dataDoc = new K3bDataDoc( this ); + m_audioDoc = new K3bAudioDoc( this ); + + connect( m_dataDoc, SIGNAL(changed()), + this, SIGNAL(changed()) ); + connect( m_audioDoc, SIGNAL(changed()), + this, SIGNAL(changed()) ); +} + + +K3bMixedDoc::~K3bMixedDoc() +{ +} + + +bool K3bMixedDoc::newDocument() +{ + m_dataDoc->newDocument(); + m_audioDoc->newDocument(); + + return K3bDoc::newDocument(); +} + + +QString K3bMixedDoc::name() const +{ + return m_dataDoc->name(); +} + + +void K3bMixedDoc::setURL( const KURL& url ) +{ + K3bDoc::setURL( url ); + m_audioDoc->setURL( url ); + m_dataDoc->setURL( url ); +} + + +void K3bMixedDoc::setModified( bool m ) +{ + m_audioDoc->setModified( m ); + m_dataDoc->setModified( m ); +} + + +bool K3bMixedDoc::isModified() const +{ + return ( m_audioDoc->isModified() || m_dataDoc->isModified() ); +} + + +KIO::filesize_t K3bMixedDoc::size() const +{ + return m_dataDoc->size() + m_audioDoc->size(); +} + +K3b::Msf K3bMixedDoc::length() const +{ + return m_dataDoc->length() + m_audioDoc->length(); +} + + +int K3bMixedDoc::numOfTracks() const +{ + return m_audioDoc->numOfTracks() + 1; +} + + +K3bBurnJob* K3bMixedDoc::newBurnJob( K3bJobHandler* hdl, QObject* parent ) +{ + return new K3bMixedJob( this, hdl, parent ); +} + + +void K3bMixedDoc::addUrls( const KURL::List& urls ) +{ + dataDoc()->addUrls( urls ); +} + + +bool K3bMixedDoc::loadDocumentData( QDomElement* rootElem ) +{ + QDomNodeList nodes = rootElem->childNodes(); + + if( nodes.length() < 4 ) + return false; + + if( nodes.item(0).nodeName() != "general" ) + return false; + if( !readGeneralDocumentData( nodes.item(0).toElement() ) ) + return false; + + if( nodes.item(1).nodeName() != "audio" ) + return false; + QDomElement audioElem = nodes.item(1).toElement(); + if( !m_audioDoc->loadDocumentData( &audioElem ) ) + return false; + + if( nodes.item(2).nodeName() != "data" ) + return false; + QDomElement dataElem = nodes.item(2).toElement(); + if( !m_dataDoc->loadDocumentData( &dataElem ) ) + return false; + + if( nodes.item(3).nodeName() != "mixed" ) + return false; + + QDomNodeList optionList = nodes.item(3).childNodes(); + for( uint i = 0; i < optionList.count(); i++ ) { + + QDomElement e = optionList.item(i).toElement(); + if( e.isNull() ) + return false; + + if( e.nodeName() == "remove_buffer_files" ) + setRemoveImages( e.toElement().text() == "yes" ); + else if( e.nodeName() == "image_path" ) + setTempDir( e.toElement().text() ); + else if( e.nodeName() == "mixed_type" ) { + QString mt = e.toElement().text(); + if( mt == "last_track" ) + setMixedType( DATA_LAST_TRACK ); + else if( mt == "second_session" ) + setMixedType( DATA_SECOND_SESSION ); + else + setMixedType( DATA_FIRST_TRACK ); + } + } + + return true; +} + + +bool K3bMixedDoc::saveDocumentData( QDomElement* docElem ) +{ + QDomDocument doc = docElem->ownerDocument(); + saveGeneralDocumentData( docElem ); + + QDomElement audioElem = doc.createElement( "audio" ); + m_audioDoc->saveDocumentData( &audioElem ); + docElem->appendChild( audioElem ); + + QDomElement dataElem = doc.createElement( "data" ); + m_dataDoc->saveDocumentData( &dataElem ); + docElem->appendChild( dataElem ); + + QDomElement mixedElem = doc.createElement( "mixed" ); + docElem->appendChild( mixedElem ); + + QDomElement bufferFilesElem = doc.createElement( "remove_buffer_files" ); + bufferFilesElem.appendChild( doc.createTextNode( removeImages() ? "yes" : "no" ) ); + mixedElem.appendChild( bufferFilesElem ); + + QDomElement imagePathElem = doc.createElement( "image_path" ); + imagePathElem.appendChild( doc.createTextNode( tempDir() ) ); + mixedElem.appendChild( imagePathElem ); + + QDomElement mixedTypeElem = doc.createElement( "mixed_type" ); + switch( mixedType() ) { + case DATA_FIRST_TRACK: + mixedTypeElem.appendChild( doc.createTextNode( "first_track" ) ); + break; + case DATA_LAST_TRACK: + mixedTypeElem.appendChild( doc.createTextNode( "last_track" ) ); + break; + case DATA_SECOND_SESSION: + mixedTypeElem.appendChild( doc.createTextNode( "second_session" ) ); + break; + } + mixedElem.appendChild( mixedTypeElem ); + + setModified( false ); + + return true; +} + + +K3bDevice::Toc K3bMixedDoc::toToc( int dataMode, const K3b::Msf& dataTrackLength ) const +{ + // !inaccurate datatrack size! + K3bDevice::Track dataTrack( 0, dataTrackLength > 0 ? dataTrackLength-1 : m_dataDoc->length()-1, + K3bDevice::Track::DATA, dataMode ); + K3bDevice::Toc toc = audioDoc()->toToc(); + if( mixedType() == DATA_FIRST_TRACK ) { + // fix the audio tracks' sectors + for( K3bDevice::Toc::iterator it = toc.begin(); it != toc.end(); ++it ) { + (*it).setLastSector( (*it).lastSector() + dataTrack.length() ); + (*it).setFirstSector( (*it).firstSector() + dataTrack.length() ); + } + toc.insert( toc.begin(), dataTrack ); + } + else { + // fix the datatrack's sectors + dataTrack.setLastSector( dataTrack.lastSector() + toc.back().lastSector()+1 ); + dataTrack.setFirstSector( toc.back().lastSector()+1 ); + toc.append( dataTrack ); + + if( mixedType() == DATA_SECOND_SESSION ) { + // fix the session numbers + for( K3bDevice::Toc::iterator it = toc.begin(); it != toc.end(); ++it ) { + if( (*it).type() == K3bDevice::Track::DATA ) + (*it).setSession( 2 ); + else + (*it).setSession( 1 ); + } + } + } + + return toc; +} + +#include "k3bmixeddoc.moc" + diff --git a/libk3b/projects/mixedcd/k3bmixeddoc.h b/libk3b/projects/mixedcd/k3bmixeddoc.h new file mode 100644 index 0000000..7d71b39 --- /dev/null +++ b/libk3b/projects/mixedcd/k3bmixeddoc.h @@ -0,0 +1,95 @@ +/* + * + * $Id: k3bmixeddoc.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef K3B_MIXED_DOC_H +#define K3B_MIXED_DOC_H + +#include +#include +#include + +#include +#include "k3b_export.h" +class QDomDocument; +class QDomElement; +class K3bBurnJob; +//class K3bView; +class QWidget; +class KConfig; + + +class LIBK3B_EXPORT K3bMixedDoc : public K3bDoc +{ + Q_OBJECT + + public: + K3bMixedDoc( QObject* parent = 0 ); + ~K3bMixedDoc(); + + QString name() const; + + bool newDocument(); + + void setModified( bool m = true ); + bool isModified() const; + + KIO::filesize_t size() const; + K3b::Msf length() const; + + int numOfTracks() const; + + K3bBurnJob* newBurnJob( K3bJobHandler*, QObject* parent = 0 ); + + K3bAudioDoc* audioDoc() const { return m_audioDoc; } + K3bDataDoc* dataDoc() const { return m_dataDoc; } + + enum MixedType { DATA_FIRST_TRACK, + DATA_LAST_TRACK, + DATA_SECOND_SESSION }; + + int mixedType() const { return m_mixedType; } + int type() const { return MIXED; } + + void setURL( const KURL& url ); + + /** + * Represent the structure of the doc as CD Table of Contents. + * Be aware that the length of the data track is just an estimate + * and needs to be corrected if not specified here. + * + * @param dataMode mode of the data track (MODE1 or XA_FORM1) + * @param dataTrackLength exact length of the dataTrack + */ + + K3bDevice::Toc toToc( int dataMode, const K3b::Msf& dataTrackLength = 0 ) const; + + public slots: + void setMixedType( MixedType t ) { m_mixedType = t; } + void addUrls( const KURL::List& urls ); + + protected: + bool loadDocumentData( QDomElement* ); + bool saveDocumentData( QDomElement* ); + QString typeString() const { return "mixed"; } + + private: + K3bDataDoc* m_dataDoc; + K3bAudioDoc* m_audioDoc; + + int m_mixedType; +}; + + +#endif diff --git a/libk3b/projects/mixedcd/k3bmixedjob.cpp b/libk3b/projects/mixedcd/k3bmixedjob.cpp new file mode 100644 index 0000000..a4be92c --- /dev/null +++ b/libk3b/projects/mixedcd/k3bmixedjob.cpp @@ -0,0 +1,1339 @@ +/* + * + * $Id: k3bmixedjob.cpp 690212 2007-07-20 11:02:13Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + + + +#include "k3bmixedjob.h" +#include "k3bmixeddoc.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + + +static QString createNonExistingFilesString( const QValueList& items, unsigned int max ) +{ + QString s; + unsigned int cnt = 0; + for( QValueList::const_iterator it = items.begin(); + it != items.end(); ++it ) { + + s += KStringHandler::csqueeze( (*it)->filename(), 60 ); + + ++cnt; + if( cnt >= max || it == items.end() ) + break; + + s += "
"; + } + + if( items.count() > max ) + s += "..."; + + return s; +} + + + +class K3bMixedJob::Private +{ +public: + Private() + : maxSpeedJob(0) { + } + + + int copies; + int copiesDone; + + K3bAudioMaxSpeedJob* maxSpeedJob; + bool maxSpeed; +}; + + +K3bMixedJob::K3bMixedJob( K3bMixedDoc* doc, K3bJobHandler* hdl, QObject* parent ) + : K3bBurnJob( hdl, parent ), + m_doc( doc ), + m_normalizeJob(0) +{ + d = new Private; + + m_isoImager = new K3bIsoImager( doc->dataDoc(), this, this ); + connect( m_isoImager, SIGNAL(infoMessage(const QString&, int)), this, SIGNAL(infoMessage(const QString&, int)) ); + connect( m_isoImager, SIGNAL(percent(int)), this, SLOT(slotIsoImagerPercent(int)) ); + connect( m_isoImager, SIGNAL(finished(bool)), this, SLOT(slotIsoImagerFinished(bool)) ); + connect( m_isoImager, SIGNAL(debuggingOutput(const QString&, const QString&)), + this, SIGNAL(debuggingOutput(const QString&, const QString&)) ); + + m_audioImager = new K3bAudioImager( doc->audioDoc(), this, this ); + connect( m_audioImager, SIGNAL(infoMessage(const QString&, int)), + this, SIGNAL(infoMessage(const QString&, int)) ); + connect( m_audioImager, SIGNAL(percent(int)), this, SLOT(slotAudioDecoderPercent(int)) ); + connect( m_audioImager, SIGNAL(subPercent(int)), this, SLOT(slotAudioDecoderSubPercent(int)) ); + connect( m_audioImager, SIGNAL(finished(bool)), this, SLOT(slotAudioDecoderFinished(bool)) ); + connect( m_audioImager, SIGNAL(nextTrack(int, int)), this, SLOT(slotAudioDecoderNextTrack(int, int)) ); + + m_msInfoFetcher = new K3bMsInfoFetcher( this, this ); + connect( m_msInfoFetcher, SIGNAL(finished(bool)), this, SLOT(slotMsInfoFetched(bool)) ); + connect( m_msInfoFetcher, SIGNAL(infoMessage(const QString&, int)), this, SIGNAL(infoMessage(const QString&, int)) ); + + m_writer = 0; + m_tocFile = 0; + m_tempData = new K3bAudioJobTempData( m_doc->audioDoc(), this ); +} + + +K3bMixedJob::~K3bMixedJob() +{ + delete m_tocFile; + delete d; +} + + +K3bDevice::Device* K3bMixedJob::writer() const +{ + if( m_doc->onlyCreateImages() ) + return 0; + else + return m_doc->burner(); +} + + +K3bDoc* K3bMixedJob::doc() const +{ + return m_doc; +} + + +void K3bMixedJob::start() +{ + jobStarted(); + + m_canceled = false; + m_errorOccuredAndAlreadyReported = false; + d->copiesDone = 0; + d->copies = m_doc->copies(); + m_currentAction = PREPARING_DATA; + d->maxSpeed = false; + + if( m_doc->dummy() ) + d->copies = 1; + + prepareProgressInformation(); + + // + // Check if all files exist + // + QValueList nonExistingFiles; + K3bAudioTrack* track = m_doc->audioDoc()->firstTrack(); + while( track ) { + K3bAudioDataSource* source = track->firstSource(); + while( source ) { + if( K3bAudioFile* file = dynamic_cast( source ) ) { + if( !QFile::exists( file->filename() ) ) + nonExistingFiles.append( file ); + } + source = source->next(); + } + track = track->next(); + } + if( !nonExistingFiles.isEmpty() ) { + if( questionYesNo( "

" + i18n("The following files could not be found. Do you want to remove them from the " + "project and continue without adding them to the image?") + + "

" + createNonExistingFilesString( nonExistingFiles, 10 ), + i18n("Warning"), + i18n("Remove missing files and continue"), + i18n("Cancel and go back") ) ) { + for( QValueList::const_iterator it = nonExistingFiles.begin(); + it != nonExistingFiles.end(); ++it ) { + delete *it; + } + } + else { + m_canceled = true; + emit canceled(); + jobFinished(false); + return; + } + } + + // + // Make sure the project is not empty + // + if( m_doc->audioDoc()->numOfTracks() == 0 ) { + emit infoMessage( i18n("Please add files to your project first."), ERROR ); + jobFinished(false); + return; + } + + + // set some flags that are needed + m_doc->audioDoc()->setOnTheFly( m_doc->onTheFly() ); // for the toc writer + m_doc->audioDoc()->setHideFirstTrack( false ); // unsupported + m_doc->dataDoc()->setBurner( m_doc->burner() ); // so the isoImager can read ms data + + emit newTask( i18n("Preparing data") ); + + determineWritingMode(); + + // + // First we make sure the data portion is valid + // + + // we do not have msinfo yet + m_currentAction = INITIALIZING_IMAGER; + m_isoImager->setMultiSessionInfo( QString::null ); + m_isoImager->init(); +} + + +void K3bMixedJob::startFirstCopy() +{ + // + // if not onthefly create the iso image and then the wavs + // and write then + // if onthefly calculate the iso size + // + if( m_doc->onTheFly() ) { + if( m_doc->speed() == 0 ) { + emit newSubTask( i18n("Determining maximum writing speed") ); + + // + // try to determine the max possible speed + // no need to check the data track's max speed. Most current systems are able + // to handle the maxium possible + // + if( !d->maxSpeedJob ) { + // the maxspeed job gets the device from the doc: + m_doc->audioDoc()->setBurner( m_doc->burner() ); + d->maxSpeedJob = new K3bAudioMaxSpeedJob( m_doc->audioDoc(), this, this ); + connect( d->maxSpeedJob, SIGNAL(percent(int)), + this, SIGNAL(subPercent(int)) ); + connect( d->maxSpeedJob, SIGNAL(finished(bool)), + this, SLOT(slotMaxSpeedJobFinished(bool)) ); + } + d->maxSpeedJob->start(); + } + else if( m_doc->mixedType() != K3bMixedDoc::DATA_SECOND_SESSION ) { + m_currentAction = PREPARING_DATA; + m_isoImager->calculateSize(); + } + else { + // we cannot calculate the size since we don't have the msinfo yet + // so first write the audio session + writeNextCopy(); + } + } + else { + emit burning(false); + + emit infoMessage( i18n("Creating audio image files in %1").arg(m_doc->tempDir()), INFO ); + + m_tempFilePrefix = K3b::findUniqueFilePrefix( ( !m_doc->audioDoc()->title().isEmpty() + ? m_doc->audioDoc()->title() + : m_doc->dataDoc()->isoOptions().volumeID() ), + m_doc->tempDir() ); + + m_tempData->prepareTempFileNames( m_doc->tempDir() ); + QStringList filenames; + for( K3bAudioTrack* track = m_doc->audioDoc()->firstTrack(); track; track = track->next() ) + filenames += m_tempData->bufferFileName( track ); + m_audioImager->setImageFilenames( filenames ); + + if( m_doc->mixedType() != K3bMixedDoc::DATA_SECOND_SESSION ) { + createIsoImage(); + } + else { + emit newTask( i18n("Creating audio image files") ); + m_currentAction = CREATING_AUDIO_IMAGE; + m_audioImager->start(); + } + } +} + + +void K3bMixedJob::slotMaxSpeedJobFinished( bool success ) +{ + d->maxSpeed = success; + if( !success ) + emit infoMessage( i18n("Unable to determine maximum speed for some reason. Ignoring."), WARNING ); + + if( m_doc->mixedType() != K3bMixedDoc::DATA_SECOND_SESSION ) { + m_currentAction = PREPARING_DATA; + m_isoImager->calculateSize(); + } + else { + // we cannot calculate the size since we don't have the msinfo yet + // so first write the audio session + writeNextCopy(); + } +} + + +void K3bMixedJob::writeNextCopy() +{ + if( m_doc->mixedType() == K3bMixedDoc::DATA_SECOND_SESSION ) { + m_currentAction = WRITING_AUDIO_IMAGE; + if( !prepareWriter() || !startWriting() ) { + cleanupAfterError(); + jobFinished(false); + } + else if( m_doc->onTheFly() ) + m_audioImager->start(); + } + else { + // the prepareWriter method needs the action to be set + if( m_doc->mixedType() == K3bMixedDoc::DATA_LAST_TRACK ) + m_currentAction = WRITING_AUDIO_IMAGE; + else + m_currentAction = WRITING_ISO_IMAGE; + + if( !prepareWriter() || !startWriting() ) { + cleanupAfterError(); + jobFinished(false); + } + else if( m_doc->onTheFly() ) { + if( m_doc->mixedType() == K3bMixedDoc::DATA_LAST_TRACK ) + m_audioImager->start(); + else + m_isoImager->start(); + } + } +} + + +void K3bMixedJob::cancel() +{ + m_canceled = true; + + if( d->maxSpeedJob ) + d->maxSpeedJob->cancel(); + + if( m_writer ) + m_writer->cancel(); + m_isoImager->cancel(); + m_audioImager->cancel(); + m_msInfoFetcher->cancel(); + emit infoMessage( i18n("Writing canceled."), K3bJob::ERROR ); + removeBufferFiles(); + emit canceled(); + jobFinished(false); +} + + +void K3bMixedJob::slotMsInfoFetched( bool success ) +{ + if( m_canceled || m_errorOccuredAndAlreadyReported ) + return; + + if( success ) { + if( m_usedDataWritingApp == K3b::CDRECORD ) + m_isoImager->setMultiSessionInfo( m_msInfoFetcher->msInfo() ); + else // cdrdao seems to write a 150 blocks pregap that is not used by cdrecord + m_isoImager->setMultiSessionInfo( QString("%1,%2") + .arg(m_msInfoFetcher->lastSessionStart()) + .arg(m_msInfoFetcher->nextSessionStart()+150) ); + + if( m_doc->onTheFly() ) { + m_currentAction = PREPARING_DATA; + m_isoImager->calculateSize(); + } + else { + createIsoImage(); + } + } + else { + // the MsInfoFetcher already emitted failure info + cleanupAfterError(); + jobFinished(false); + } +} + + +void K3bMixedJob::slotIsoImagerFinished( bool success ) +{ + if( m_canceled || m_errorOccuredAndAlreadyReported ) + return; + + // + // Initializing imager before the first copy + // + if( m_currentAction == INITIALIZING_IMAGER ) { + if( success ) { + m_currentAction = PREPARING_DATA; + + // check the size + m_projectSize = m_isoImager->size() + m_doc->audioDoc()->length(); + if( m_doc->mixedType() == K3bMixedDoc::DATA_SECOND_SESSION ) + m_projectSize += 11400; // the session gap + + startFirstCopy(); + } + else { + cleanupAfterError(); + jobFinished( false ); + } + } + + // + // Recalculated iso image size + // + else if( m_currentAction == PREPARING_DATA ) { + if( success ) { + // 1. data in first track: + // start isoimager and writer + // when isoimager finishes start audiodecoder + + // 2. data in last track + // start audiodecoder and writer + // when audiodecoder finishes start isoimager + + // 3. data in second session + // start audiodecoder and writer + // start isoimager and writer + + if( m_doc->mixedType() == K3bMixedDoc::DATA_SECOND_SESSION ) { + m_currentAction = WRITING_ISO_IMAGE; + if( !prepareWriter() || !startWriting() ) { + cleanupAfterError(); + jobFinished(false); + } + else + m_isoImager->start(); + } + else + writeNextCopy(); + } + else { + cleanupAfterError(); + jobFinished( false ); + } + } + + // + // Image creation finished + // + else { + if( !success ) { + emit infoMessage( i18n("Error while creating ISO image."), ERROR ); + cleanupAfterError(); + + jobFinished( false ); + return; + } + + if( m_doc->onTheFly() ) { + if( m_doc->mixedType() == K3bMixedDoc::DATA_FIRST_TRACK ) { + m_currentAction = WRITING_AUDIO_IMAGE; + m_audioImager->start(); + } + } + else { + emit infoMessage( i18n("ISO image successfully created."), SUCCESS ); + + if( m_doc->mixedType() == K3bMixedDoc::DATA_SECOND_SESSION ) { + m_currentAction = WRITING_ISO_IMAGE; + + if( !prepareWriter() || !startWriting() ) { + cleanupAfterError(); + jobFinished(false); + } + } + else { + emit newTask( i18n("Creating audio image files") ); + m_currentAction = CREATING_AUDIO_IMAGE; + m_audioImager->start(); + } + } + } +} + + +void K3bMixedJob::slotWriterFinished( bool success ) +{ + if( m_canceled || m_errorOccuredAndAlreadyReported ) + return; + + if( !success ) { + cleanupAfterError(); + jobFinished(false); + return; + } + + emit burning(false); + + if( m_doc->mixedType() == K3bMixedDoc::DATA_SECOND_SESSION && m_currentAction == WRITING_AUDIO_IMAGE ) { + // reload the media (as a subtask so the user does not see the "Flushing cache" or "Fixating" messages while + // doing so + emit newSubTask( i18n("Reloading the medium") ); + connect( K3bDevice::reload( m_doc->burner() ), SIGNAL(finished(bool)), + this, SLOT(slotMediaReloadedForSecondSession(bool)) ); + } + else { + d->copiesDone++; + if( d->copiesDone < d->copies ) { + K3bDevice::eject( m_doc->burner() ); + writeNextCopy(); + } + else { + if( !m_doc->onTheFly() && m_doc->removeImages() ) + removeBufferFiles(); + + if( k3bcore->globalSettings()->ejectMedia() ) + K3bDevice::eject( m_doc->burner() ); + + jobFinished(true); + } + } +} + + +void K3bMixedJob::slotMediaReloadedForSecondSession( bool success ) +{ + if( !success ) + blockingInformation( i18n("Please reload the medium and press 'ok'"), + i18n("Unable to close the tray") ); + + // start the next session + m_currentAction = WRITING_ISO_IMAGE; + if( d->copiesDone > 0 ) { + // we only create the image once. This should not be a problem??? + if( !prepareWriter() || !startWriting() ) { + cleanupAfterError(); + jobFinished(false); + } + else if( m_doc->onTheFly() ) { + m_isoImager->start(); + } + } + else if( m_doc->dummy() ) { + // do not try to get ms info in simulation mode since the cd is empty! + if( m_doc->onTheFly() ) { + m_currentAction = PREPARING_DATA; + m_isoImager->calculateSize(); + } + else + createIsoImage(); + } + else { + m_currentAction = FETCHING_MSINFO; + m_msInfoFetcher->setDevice( m_doc->burner() ); + m_msInfoFetcher->start(); + } +} + + +void K3bMixedJob::slotAudioDecoderFinished( bool success ) +{ + if( m_canceled || m_errorOccuredAndAlreadyReported ) + return; + + if( !success ) { + emit infoMessage( i18n("Error while decoding audio tracks."), ERROR ); + cleanupAfterError(); + jobFinished(false); + return; + } + + if( m_doc->onTheFly() ) { + if( m_doc->mixedType() == K3bMixedDoc::DATA_LAST_TRACK ) { + m_currentAction = WRITING_ISO_IMAGE; + m_isoImager->start(); + } + } + else { + emit infoMessage( i18n("Audio images successfully created."), SUCCESS ); + + if( m_doc->audioDoc()->normalize() ) { + normalizeFiles(); + } + else { + if( m_doc->mixedType() == K3bMixedDoc::DATA_FIRST_TRACK ) + m_currentAction = WRITING_ISO_IMAGE; + else + m_currentAction = WRITING_AUDIO_IMAGE; + + if( !prepareWriter() || !startWriting() ) { + cleanupAfterError(); + jobFinished(false); + } + } + } +} + + +void K3bMixedJob::slotAudioDecoderNextTrack( int t, int tt ) +{ + if( m_doc->onlyCreateImages() || !m_doc->onTheFly() ) { + K3bAudioTrack* track = m_doc->audioDoc()->getTrack(t); + emit newSubTask( i18n("Decoding audio track %1 of %2%3") + .arg(t) + .arg(tt) + .arg( track->title().isEmpty() || track->artist().isEmpty() + ? QString::null + : " (" + track->artist() + " - " + track->title() + ")" ) ); + } +} + + +bool K3bMixedJob::prepareWriter() +{ + if( m_writer ) delete m_writer; + + if( ( m_currentAction == WRITING_ISO_IMAGE && m_usedDataWritingApp == K3b::CDRECORD ) || + ( m_currentAction == WRITING_AUDIO_IMAGE && m_usedAudioWritingApp == K3b::CDRECORD ) ) { + + if( !writeInfFiles() ) { + kdDebug() << "(K3bMixedJob) could not write inf-files." << endl; + emit infoMessage( i18n("IO Error"), ERROR ); + + return false; + } + + K3bCdrecordWriter* writer = new K3bCdrecordWriter( m_doc->burner(), this, this ); + + // only write the audio tracks in DAO mode + if( m_currentAction == WRITING_ISO_IMAGE ) + writer->setWritingMode( m_usedDataWritingMode ); + else + writer->setWritingMode( m_usedAudioWritingMode ); + + writer->setSimulate( m_doc->dummy() ); + writer->setBurnSpeed( m_doc->speed() ); + + if( m_doc->mixedType() == K3bMixedDoc::DATA_SECOND_SESSION ) { + if( m_currentAction == WRITING_ISO_IMAGE ) { + if( m_doc->onTheFly() ) + writer->addArgument("-waiti"); + + addDataTrack( writer ); + } + else { + writer->addArgument("-multi"); + addAudioTracks( writer ); + } + } + else { + if( m_doc->mixedType() == K3bMixedDoc::DATA_FIRST_TRACK ) + addDataTrack( writer ); + addAudioTracks( writer ); + if( m_doc->mixedType() == K3bMixedDoc::DATA_LAST_TRACK ) + addDataTrack( writer ); + } + + m_writer = writer; + } + else { + if( !writeTocFile() ) { + kdDebug() << "(K3bDataJob) could not write tocfile." << endl; + emit infoMessage( i18n("IO Error"), ERROR ); + + return false; + } + + // create the writer + // create cdrdao job + K3bCdrdaoWriter* writer = new K3bCdrdaoWriter( m_doc->burner(), this, this ); + writer->setSimulate( m_doc->dummy() ); + writer->setBurnSpeed( m_doc->speed() ); + + // multisession only for the first session + writer->setMulti( m_doc->mixedType() == K3bMixedDoc::DATA_SECOND_SESSION + && m_currentAction == WRITING_AUDIO_IMAGE ); + + writer->setTocFile( m_tocFile->name() ); + + m_writer = writer; + } + + connect( m_writer, SIGNAL(infoMessage(const QString&, int)), this, SIGNAL(infoMessage(const QString&, int)) ); + connect( m_writer, SIGNAL(percent(int)), this, SLOT(slotWriterJobPercent(int)) ); + connect( m_writer, SIGNAL(processedSize(int, int)), this, SIGNAL(processedSize(int, int)) ); + connect( m_writer, SIGNAL(subPercent(int)), this, SIGNAL(subPercent(int)) ); + connect( m_writer, SIGNAL(processedSubSize(int, int)), this, SIGNAL(processedSubSize(int, int)) ); + connect( m_writer, SIGNAL(nextTrack(int, int)), this, SLOT(slotWriterNextTrack(int, int)) ); + connect( m_writer, SIGNAL(buffer(int)), this, SIGNAL(bufferStatus(int)) ); + connect( m_writer, SIGNAL(deviceBuffer(int)), this, SIGNAL(deviceBuffer(int)) ); + connect( m_writer, SIGNAL(writeSpeed(int, int)), this, SIGNAL(writeSpeed(int, int)) ); + connect( m_writer, SIGNAL(finished(bool)), this, SLOT(slotWriterFinished(bool)) ); + // connect( m_writer, SIGNAL(newTask(const QString&)), this, SIGNAL(newTask(const QString&)) ); + connect( m_writer, SIGNAL(newSubTask(const QString&)), this, SIGNAL(newSubTask(const QString&)) ); + connect( m_writer, SIGNAL(debuggingOutput(const QString&, const QString&)), + this, SIGNAL(debuggingOutput(const QString&, const QString&)) ); + + return true; +} + + +bool K3bMixedJob::writeInfFiles() +{ + K3bInfFileWriter infFileWriter; + K3bAudioTrack* track = m_doc->audioDoc()->firstTrack(); + while( track ) { + + infFileWriter.setTrack( track->toCdTrack() ); + infFileWriter.setTrackNumber( track->trackNumber() ); + if( !m_doc->onTheFly() ) + infFileWriter.setBigEndian( false ); + + if( !infFileWriter.save( m_tempData->infFileName(track) ) ) + return false; + + track = track->next(); + } + return true; +} + + +bool K3bMixedJob::writeTocFile() +{ + // FIXME: create the tocfile in the same directory like all the other files. + + if( m_tocFile ) delete m_tocFile; + m_tocFile = new KTempFile( QString::null, "toc" ); + m_tocFile->setAutoDelete(true); + + // write the toc-file + if( QTextStream* s = m_tocFile->textStream() ) { + + K3bTocFileWriter tocFileWriter; + + // + // TOC + // + tocFileWriter.setData( m_doc->toToc( m_usedDataMode == K3b::MODE2 + ? K3bDevice::Track::XA_FORM1 + : K3bDevice::Track::MODE1, + m_doc->onTheFly() + ? m_isoImager->size() + : m_doc->dataDoc()->length() ) ); + + // + // CD-Text + // + if( m_doc->audioDoc()->cdText() ) { + K3bDevice::CdText text = m_doc->audioDoc()->cdTextData(); + // if data in first track we need to add a dummy cdtext + if( m_doc->mixedType() == K3bMixedDoc::DATA_FIRST_TRACK ) + text.insert( text.begin(), K3bDevice::TrackCdText() ); + + tocFileWriter.setCdText( text ); + } + + // + // Session to write + // + tocFileWriter.setSession( m_doc->mixedType() == K3bMixedDoc::DATA_SECOND_SESSION && + m_currentAction == WRITING_ISO_IMAGE ? 2 : 1 ); + + // + // image filenames + // + if( !m_doc->onTheFly() ) { + QStringList files; + K3bAudioTrack* track = m_doc->audioDoc()->firstTrack(); + while( track ) { + files += m_tempData->bufferFileName( track ); + track = track->next(); + } + if( m_doc->mixedType() == K3bMixedDoc::DATA_FIRST_TRACK ) + files.prepend( m_isoImageFilePath ); + else + files.append( m_isoImageFilePath ); + + tocFileWriter.setFilenames( files ); + } + + bool success = tocFileWriter.save( *s ); + + m_tocFile->close(); + + // backup for debugging +// KIO::NetAccess::del("/tmp/trueg/tocfile_debug_backup.toc",0L); +// KIO::NetAccess::copy( m_tocFile->name(), "/tmp/trueg/tocfile_debug_backup.toc",0L ); + + return success; + } + else + return false; +} + + +void K3bMixedJob::addAudioTracks( K3bCdrecordWriter* writer ) +{ + writer->addArgument( "-useinfo" ); + + // add raw cdtext data + if( m_doc->audioDoc()->cdText() ) { + writer->setRawCdText( m_doc->audioDoc()->cdTextData().rawPackData() ); + } + + writer->addArgument( "-audio" ); + + // we always pad because although K3b makes sure all tracks' length are multiples of 2352 + // it seems that normalize sometimes corrupts these lengths + // FIXME: see K3bAudioJob for the whole less4secs and zeroPregap handling + writer->addArgument( "-pad" ); + + // Allow tracks shorter than 4 seconds + writer->addArgument( "-shorttrack" ); + + // add all the audio tracks + K3bAudioTrack* track = m_doc->audioDoc()->firstTrack(); + while( track ) { + if( m_doc->onTheFly() ) { + // this is only supported by cdrecord versions >= 2.01a13 + writer->addArgument( QFile::encodeName( m_tempData->infFileName( track ) ) ); + } + else { + writer->addArgument( QFile::encodeName( m_tempData->bufferFileName( track ) ) ); + } + track = track->next(); + } +} + +void K3bMixedJob::addDataTrack( K3bCdrecordWriter* writer ) +{ + // add data track + if( m_usedDataMode == K3b::MODE2 ) { + if( k3bcore->externalBinManager()->binObject("cdrecord") && + k3bcore->externalBinManager()->binObject("cdrecord")->hasFeature( "xamix" ) ) + writer->addArgument( "-xa" ); + else + writer->addArgument( "-xa1" ); + } + else + writer->addArgument( "-data" ); + + if( m_doc->onTheFly() ) + writer->addArgument( QString("-tsize=%1s").arg(m_isoImager->size()) )->addArgument("-"); + else + writer->addArgument( m_isoImageFilePath ); +} + + +void K3bMixedJob::slotWriterNextTrack( int t, int ) +{ + K3bAudioTrack* track = 0; + + if( m_doc->mixedType() == K3bMixedDoc::DATA_FIRST_TRACK ) { + if( t > 1 ) + track = m_doc->audioDoc()->getTrack(t-1); + } + else if( m_doc->mixedType() == K3bMixedDoc::DATA_LAST_TRACK ) { + if( t < m_doc->audioDoc()->numOfTracks()+1 ) + track = m_doc->audioDoc()->getTrack(t); + } + else if( m_currentAction == WRITING_AUDIO_IMAGE ) + track = m_doc->audioDoc()->getTrack(t); + else + t = m_doc->numOfTracks(); + + if( track ) + emit newSubTask( i18n("Writing track %1 of %2%3") + .arg(t) + .arg(m_doc->numOfTracks()) + .arg( track->title().isEmpty() || track->artist().isEmpty() + ? QString::null + : " (" + track->artist() + " - " + track->title() + ")" ) ); + else + emit newSubTask( i18n("Writing track %1 of %2 (%3)").arg(t).arg(m_doc->numOfTracks()).arg(i18n("ISO9660 data")) ); +} + + +void K3bMixedJob::slotWriterJobPercent( int p ) +{ + double totalTasks = d->copies; + double tasksDone = d->copiesDone; + if( m_doc->audioDoc()->normalize() ) { + totalTasks+=1.0; + tasksDone+=1.0; + } + if( !m_doc->onTheFly() ) { + totalTasks+=1.0; + } + + if( m_doc->mixedType() == K3bMixedDoc::DATA_SECOND_SESSION ) { + if( m_currentAction == WRITING_AUDIO_IMAGE ) { + // the audio imager has finished in all cases + // the iso imager only if this is not the first copy + if( d->copiesDone > 0 ) + tasksDone += 1.0; + else if( !m_doc->onTheFly() ) + tasksDone += m_audioDocPartOfProcess; + + p = (int)((double)p*m_audioDocPartOfProcess); + } + else { + // all images have been created + if( !m_doc->onTheFly() ) + tasksDone += 1.0; + + p = (int)(100.0*m_audioDocPartOfProcess + (double)p*(1.0-m_audioDocPartOfProcess)); + } + } + else if( !m_doc->onTheFly() ) + tasksDone += 1.0; + + emit percent( (int)((100.0*tasksDone + (double)p) / totalTasks) ); +} + + +void K3bMixedJob::slotAudioDecoderPercent( int p ) +{ + // the only thing finished here might be the isoimager which is part of this task + if( !m_doc->onTheFly() ) { + double totalTasks = d->copies+1; + if( m_doc->audioDoc()->normalize() ) + totalTasks+=1.0; + + if( m_doc->mixedType() == K3bMixedDoc::DATA_SECOND_SESSION ) + p = (int)((double)p*m_audioDocPartOfProcess); + else + p = (int)(100.0*(1.0-m_audioDocPartOfProcess) + (double)p*m_audioDocPartOfProcess); + + emit percent( (int)((double)p / totalTasks) ); + } +} + + +void K3bMixedJob::slotAudioDecoderSubPercent( int p ) +{ + if( !m_doc->onTheFly() ) { + emit subPercent( p ); + } +} + + +void K3bMixedJob::slotIsoImagerPercent( int p ) +{ + if( !m_doc->onTheFly() ) { + emit subPercent( p ); + if( m_doc->mixedType() == K3bMixedDoc::DATA_SECOND_SESSION ) { + + double totalTasks = d->copies+1.0; + double tasksDone = d->copiesDone; + if( m_doc->audioDoc()->normalize() ) { + totalTasks+=1.0; + // the normalizer finished + tasksDone+=1.0; + } + + // the writing of the audio part finished + tasksDone += m_audioDocPartOfProcess; + + // the audio decoder finished (which is part of this task in terms of progress) + p = (int)(100.0*m_audioDocPartOfProcess + (double)p*(1.0-m_audioDocPartOfProcess)); + + emit percent( (int)((100.0*tasksDone + (double)p) / totalTasks) ); + } + else { + double totalTasks = d->copies+1.0; + if( m_doc->audioDoc()->normalize() ) + totalTasks+=1.0; + + emit percent( (int)((double)(p*(1.0-m_audioDocPartOfProcess)) / totalTasks) ); + } + } +} + + +bool K3bMixedJob::startWriting() +{ + if( m_doc->mixedType() == K3bMixedDoc::DATA_SECOND_SESSION ) { + if( m_currentAction == WRITING_ISO_IMAGE) { + if( m_doc->dummy() ) + emit newTask( i18n("Simulating second session") ); + else if( d->copies > 1 ) + emit newTask( i18n("Writing second session of copy %1").arg(d->copiesDone+1) ); + else + emit newTask( i18n("Writing second session") ); + } + else { + if( m_doc->dummy() ) + emit newTask( i18n("Simulating first session") ); + else if( d->copies > 1 ) + emit newTask( i18n("Writing first session of copy %1").arg(d->copiesDone+1) ); + else + emit newTask( i18n("Writing first session") ); + } + } + else if( m_doc->dummy() ) + emit newTask( i18n("Simulating") ); + else + emit newTask( i18n("Writing Copy %1").arg(d->copiesDone+1) ); + + + // if we append the second session the cd is already in the drive + if( !(m_doc->mixedType() == K3bMixedDoc::DATA_SECOND_SESSION + && m_currentAction == WRITING_ISO_IMAGE) ) { + + emit newSubTask( i18n("Waiting for media") ); + if( waitForMedia( m_doc->burner() ) < 0 ) { + cancel(); + return false; + } + + // just to be sure we did not get canceled during the async discWaiting + if( m_canceled ) + return false; + + // check if the project will fit on the CD + if( m_doc->mixedType() == K3bMixedDoc::DATA_SECOND_SESSION ) { + // the media is in and has been checked so this should be fast (hopefully) + K3b::Msf mediaSize = m_doc->burner()->diskInfo().capacity(); + if( mediaSize < m_projectSize ) { + if( k3bcore->globalSettings()->overburn() ) { + emit infoMessage( i18n("Trying to write more than the official disk capacity"), K3bJob::WARNING ); + } + else { + emit infoMessage( i18n("Data does not fit on disk."), ERROR ); + return false; + } + } + } + } + + // in case we determined the max possible writing speed we have to reset the speed on the writer job + // here since an inserted media is necessary + // the Max speed job will compare the max speed value with the supported values of the writer + if( d->maxSpeed ) + m_writer->setBurnSpeed( d->maxSpeedJob->maxSpeed() ); + + emit burning(true); + m_writer->start(); + + if( m_doc->onTheFly() ) { + // now the writer is running and we can get it's stdin + // we only use this method when writing on-the-fly since + // we cannot easily change the audioDecode fd while it's working + // which we would need to do since we write into several + // image files. + m_audioImager->writeToFd( m_writer->fd() ); + m_isoImager->writeToFd( m_writer->fd() ); + } + + return true; +} + + +void K3bMixedJob::createIsoImage() +{ + m_currentAction = CREATING_ISO_IMAGE; + + // prepare iso image file + m_isoImageFilePath = m_tempFilePrefix + "_datatrack.iso"; + + if( !m_doc->onTheFly() ) + emit newTask( i18n("Creating ISO image file") ); + emit newSubTask( i18n("Creating ISO image in %1").arg(m_isoImageFilePath) ); + emit infoMessage( i18n("Creating ISO image in %1").arg(m_isoImageFilePath), INFO ); + + m_isoImager->writeToImageFile( m_isoImageFilePath ); + m_isoImager->start(); +} + + +void K3bMixedJob::cleanupAfterError() +{ + m_errorOccuredAndAlreadyReported = true; + // m_audioImager->cancel(); + m_isoImager->cancel(); + if( m_writer ) + m_writer->cancel(); + + if( m_tocFile ) delete m_tocFile; + m_tocFile = 0; + + // remove the temp files + removeBufferFiles(); +} + + +void K3bMixedJob::removeBufferFiles() +{ + if ( !m_doc->onTheFly() ) { + emit infoMessage( i18n("Removing buffer files."), INFO ); + } + + if( QFile::exists( m_isoImageFilePath ) ) + if( !QFile::remove( m_isoImageFilePath ) ) + emit infoMessage( i18n("Could not delete file %1.").arg(m_isoImageFilePath), ERROR ); + + // removes buffer images and temp toc or inf files + m_tempData->cleanup(); +} + + +void K3bMixedJob::determineWritingMode() +{ + // we don't need this when only creating image and it is possible + // that the burn device is null + if( m_doc->onlyCreateImages() ) + return; + + // at first we determine the data mode + // -------------------------------------------------------------- + if( m_doc->dataDoc()->dataMode() == K3b::DATA_MODE_AUTO ) { + if( m_doc->mixedType() == K3bMixedDoc::DATA_SECOND_SESSION ) + m_usedDataMode = K3b::MODE2; + else + m_usedDataMode = K3b::MODE1; + } + else + m_usedDataMode = m_doc->dataDoc()->dataMode(); + + + // we try to use cdrecord if possible + bool cdrecordOnTheFly = false; + bool cdrecordCdText = false; + bool cdrecordUsable = false; + + if( k3bcore->externalBinManager()->binObject("cdrecord") ) { + cdrecordOnTheFly = + k3bcore->externalBinManager()->binObject("cdrecord")->hasFeature( "audio-stdin" ); + cdrecordCdText = + k3bcore->externalBinManager()->binObject("cdrecord")->hasFeature( "cdtext" ); + cdrecordUsable = + !( !cdrecordOnTheFly && m_doc->onTheFly() ) && + !( m_doc->audioDoc()->cdText() && !cdrecordCdText ); + } + + // Writing Application + // -------------------------------------------------------------- + // cdrecord seems to have problems writing xa 1 disks in dao mode? At least on my system! + if( writingApp() == K3b::DEFAULT ) { + if( m_doc->mixedType() == K3bMixedDoc::DATA_SECOND_SESSION ) { + if( m_doc->writingMode() == K3b::DAO || + ( m_doc->writingMode() == K3b::WRITING_MODE_AUTO && !cdrecordUsable ) ) { + m_usedAudioWritingApp = K3b::CDRDAO; + m_usedDataWritingApp = K3b::CDRDAO; + } + else { + m_usedAudioWritingApp = K3b::CDRECORD; + m_usedDataWritingApp = K3b::CDRECORD; + } + } + else { + if( cdrecordUsable ) { + m_usedAudioWritingApp = K3b::CDRECORD; + m_usedDataWritingApp = K3b::CDRECORD; + } + else { + m_usedAudioWritingApp = K3b::CDRDAO; + m_usedDataWritingApp = K3b::CDRDAO; + } + } + } + else { + m_usedAudioWritingApp = writingApp(); + m_usedDataWritingApp = writingApp(); + } + + // TODO: use K3bExceptions::brokenDaoAudio + + // Writing Mode (TAO/DAO/RAW) + // -------------------------------------------------------------- + if( m_doc->writingMode() == K3b::WRITING_MODE_AUTO ) { + + if( m_doc->mixedType() == K3bMixedDoc::DATA_SECOND_SESSION ) { + if( m_usedDataWritingApp == K3b::CDRECORD ) + m_usedDataWritingMode = K3b::TAO; + else + m_usedDataWritingMode = K3b::DAO; + + // default to Session at once for the audio part + m_usedAudioWritingMode = K3b::DAO; + } + else if( writer()->dao() ) { + m_usedDataWritingMode = K3b::DAO; + m_usedAudioWritingMode = K3b::DAO; + } + else { + m_usedDataWritingMode = K3b::TAO; + m_usedAudioWritingMode = K3b::TAO; + } + } + else { + m_usedAudioWritingMode = m_doc->writingMode(); + m_usedDataWritingMode = m_doc->writingMode(); + } + + + if( m_usedDataWritingApp == K3b::CDRECORD ) { + if( !cdrecordOnTheFly && m_doc->onTheFly() ) { + m_doc->setOnTheFly( false ); + emit infoMessage( i18n("On-the-fly writing with cdrecord < 2.01a13 not supported."), ERROR ); + } + + if( m_doc->audioDoc()->cdText() ) { + if( !cdrecordCdText ) { + m_doc->audioDoc()->writeCdText( false ); + emit infoMessage( i18n("Cdrecord %1 does not support CD-Text writing.").arg(k3bcore->externalBinManager()->binObject("cdrecord")->version), ERROR ); + } + else if( m_usedAudioWritingMode == K3b::TAO ) { + emit infoMessage( i18n("It is not possible to write CD-Text in TAO mode. Try DAO or RAW."), WARNING ); + } + } + } +} + + +void K3bMixedJob::normalizeFiles() +{ + if( !m_normalizeJob ) { + m_normalizeJob = new K3bAudioNormalizeJob( this, this ); + + connect( m_normalizeJob, SIGNAL(infoMessage(const QString&, int)), + this, SIGNAL(infoMessage(const QString&, int)) ); + connect( m_normalizeJob, SIGNAL(percent(int)), this, SLOT(slotNormalizeProgress(int)) ); + connect( m_normalizeJob, SIGNAL(subPercent(int)), this, SLOT(slotNormalizeSubProgress(int)) ); + connect( m_normalizeJob, SIGNAL(finished(bool)), this, SLOT(slotNormalizeJobFinished(bool)) ); + connect( m_normalizeJob, SIGNAL(newTask(const QString&)), this, SIGNAL(newSubTask(const QString&)) ); + connect( m_normalizeJob, SIGNAL(debuggingOutput(const QString&, const QString&)), + this, SIGNAL(debuggingOutput(const QString&, const QString&)) ); + } + + // add all the files + QValueVector files; + K3bAudioTrack* track = m_doc->audioDoc()->firstTrack(); + while( track ) { + files.append( m_tempData->bufferFileName(track) ); + track = track->next(); + } + + m_normalizeJob->setFilesToNormalize( files ); + + emit newTask( i18n("Normalizing volume levels") ); + m_normalizeJob->start(); +} + +void K3bMixedJob::slotNormalizeJobFinished( bool success ) +{ + if( m_canceled || m_errorOccuredAndAlreadyReported ) + return; + + if( success ) { + if( m_doc->mixedType() == K3bMixedDoc::DATA_FIRST_TRACK ) + m_currentAction = WRITING_ISO_IMAGE; + else + m_currentAction = WRITING_AUDIO_IMAGE; + + if( !prepareWriter() || !startWriting() ) { + cleanupAfterError(); + jobFinished(false); + } + } + else { + cleanupAfterError(); + jobFinished(false); + } +} + +void K3bMixedJob::slotNormalizeProgress( int p ) +{ + double totalTasks = d->copies+2.0; + double tasksDone = 0; + + if( m_doc->mixedType() == K3bMixedDoc::DATA_SECOND_SESSION ) { + // the audio imager finished (m_audioDocPartOfProcess*1 task) + // plus the normalize progress + tasksDone = m_audioDocPartOfProcess; + } + else { + // the iso and audio imagers already finished (one task) + // plus the normalize progress + tasksDone = 1.0; + } + + emit percent( (int)((100.0*tasksDone + (double)p) / totalTasks) ); +} + + +void K3bMixedJob::slotNormalizeSubProgress( int p ) +{ + emit subPercent( p ); +} + + +void K3bMixedJob::prepareProgressInformation() +{ + // calculate percentage of audio and data + // this is also used in on-the-fly mode + double ds = (double)m_doc->dataDoc()->length().totalFrames(); + double as = (double)m_doc->audioDoc()->length().totalFrames(); + m_audioDocPartOfProcess = as/(ds+as); +} + + +QString K3bMixedJob::jobDescription() const +{ + if( m_doc->mixedType() == K3bMixedDoc::DATA_SECOND_SESSION ) + return i18n("Writing Enhanced Audio CD") + + ( m_doc->audioDoc()->title().isEmpty() + ? QString::null + : QString( " (%1)" ).arg(m_doc->audioDoc()->title()) ); + else + return i18n("Writing Mixed Mode CD") + + ( m_doc->audioDoc()->title().isEmpty() + ? QString::null + : QString( " (%1)" ).arg(m_doc->audioDoc()->title()) ); +} + + +QString K3bMixedJob::jobDetails() const +{ + return ( i18n("%1 tracks (%2 minutes audio data, %3 ISO9660 data)") + .arg(m_doc->numOfTracks()) + .arg(m_doc->audioDoc()->length().toString()) + .arg(KIO::convertSize(m_doc->dataDoc()->size())) + + ( m_doc->copies() > 1 && !m_doc->dummy() + ? i18n(" - %n copy", " - %n copies", m_doc->copies()) + : QString::null ) ); +} + +#include "k3bmixedjob.moc" diff --git a/libk3b/projects/mixedcd/k3bmixedjob.h b/libk3b/projects/mixedcd/k3bmixedjob.h new file mode 100644 index 0000000..50a1dc7 --- /dev/null +++ b/libk3b/projects/mixedcd/k3bmixedjob.h @@ -0,0 +1,144 @@ +/* + * + * $Id: k3bmixedjob.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef K3BMIXEDJOB_H +#define K3BMIXEDJOB_H + +#include + + +class K3bMixedDoc; +class K3bIsoImager; +class K3bAudioImager; +class QFile; +class QDataStream; +class K3bAbstractWriter; +class K3bWaveFileWriter; +class KTempFile; +class K3bCdrecordWriter; +class K3bMsInfoFetcher; +class K3bAudioNormalizeJob; +class K3bAudioJobTempData; +class K3bDevice::Device; + +/** + *@author Sebastian Trueg + */ +class K3bMixedJob : public K3bBurnJob +{ + Q_OBJECT + + public: + K3bMixedJob( K3bMixedDoc*, K3bJobHandler*, QObject* parent = 0 ); + ~K3bMixedJob(); + + K3bDoc* doc() const; + K3bDevice::Device* writer() const; + + QString jobDescription() const; + QString jobDetails() const; + + public slots: + void cancel(); + void start(); + + protected slots: + // iso imager slots + void slotIsoImagerFinished( bool success ); + void slotIsoImagerPercent(int); + + // ms info fetcher slots + void slotMsInfoFetched(bool); + + // audio decoder slots + void slotAudioDecoderFinished( bool ); + void slotAudioDecoderNextTrack( int, int ); + void slotAudioDecoderPercent(int); + void slotAudioDecoderSubPercent( int ); + + // writer slots + void slotWriterFinished( bool success ); + void slotWriterNextTrack(int, int); + void slotWriterJobPercent(int); + + // normalizing slots + void slotNormalizeJobFinished( bool ); + void slotNormalizeProgress( int ); + void slotNormalizeSubProgress( int ); + + // misc slots + void slotMediaReloadedForSecondSession( bool ); + void slotMaxSpeedJobFinished( bool ); + + private: + bool prepareWriter(); + bool writeTocFile(); + bool writeInfFiles(); + bool startWriting(); + void startFirstCopy(); + void addAudioTracks( K3bCdrecordWriter* writer ); + void addDataTrack( K3bCdrecordWriter* writer ); + void cleanupAfterError(); + void removeBufferFiles(); + void createIsoImage(); + void determineWritingMode(); + void normalizeFiles(); + void prepareProgressInformation(); + void writeNextCopy(); + void determinePreliminaryDataImageSize(); + + K3bMixedDoc* m_doc; + K3bIsoImager* m_isoImager; + K3bAudioImager* m_audioImager; + K3bAudioJobTempData* m_tempData; + K3bWaveFileWriter* m_waveFileWriter; + K3bAbstractWriter* m_writer; + K3bMsInfoFetcher* m_msInfoFetcher; + K3bAudioNormalizeJob* m_normalizeJob; + + QString m_isoImageFilePath; + + KTempFile* m_tocFile; + + enum Action { INITIALIZING_IMAGER, + PREPARING_DATA, + CREATING_ISO_IMAGE, + CREATING_AUDIO_IMAGE, + WRITING_ISO_IMAGE, + WRITING_AUDIO_IMAGE, + FETCHING_MSINFO }; + + int m_currentAction; + double m_audioDocPartOfProcess; + + bool m_canceled; + bool m_errorOccuredAndAlreadyReported; + + int m_usedDataMode; + int m_usedDataWritingApp; + int m_usedAudioWritingApp; + int m_usedDataWritingMode; + int m_usedAudioWritingMode; + + QString m_tempFilePrefix; + + K3b::Msf m_projectSize; + + class Private; + Private* d; +}; + +#endif diff --git a/libk3b/projects/movixcd/Makefile.am b/libk3b/projects/movixcd/Makefile.am new file mode 100644 index 0000000..d1b4f5d --- /dev/null +++ b/libk3b/projects/movixcd/Makefile.am @@ -0,0 +1,23 @@ +# we need the ../datacd for the uic generated header files +AM_CPPFLAGS= -I$(srcdir)/../../core \ + -I$(srcdir)/../../../libk3bdevice \ + -I$(srcdir)/../../../src \ + -I$(srcdir)/../../tools \ + -I$(srcdir)/../datacd \ + -I$(srcdir)/.. \ + -I../datacd \ + $(all_includes) + +METASOURCES = AUTO + +noinst_LTLIBRARIES = libmovix.la + +libmovix_la_SOURCES = k3bmovixprogram.cpp \ + k3bmovixdoc.cpp \ + k3bmovixjob.cpp \ + k3bmovixfileitem.cpp \ + k3bmovixdocpreparer.cpp + +include_HEADERS = k3bmovixdoc.h \ + k3bmovixjob.h \ + k3bmovixfileitem.h diff --git a/libk3b/projects/movixcd/k3bmovixdoc.cpp b/libk3b/projects/movixcd/k3bmovixdoc.cpp new file mode 100644 index 0000000..f7b2198 --- /dev/null +++ b/libk3b/projects/movixcd/k3bmovixdoc.cpp @@ -0,0 +1,445 @@ +/* + * + * $Id: k3bmovixdoc.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include "k3bmovixdoc.h" +#include "k3bmovixjob.h" +#include "k3bmovixfileitem.h" + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + + +K3bMovixDoc::K3bMovixDoc( QObject* parent ) + : K3bDataDoc( parent ) +{ + connect( this, SIGNAL(itemRemoved(K3bDataItem*)), + this, SLOT(slotDataItemRemoved(K3bDataItem*)) ); +} + + +K3bMovixDoc::~K3bMovixDoc() +{ +} + + +K3bBurnJob* K3bMovixDoc::newBurnJob( K3bJobHandler* hdl, QObject* parent ) +{ + return new K3bMovixJob( this, hdl, parent ); +} + + +bool K3bMovixDoc::newDocument() +{ + m_loopPlaylist = 1; + m_ejectDisk = false; + m_reboot = false; + m_shutdown = false; + m_randomPlay = false; + + return K3bDataDoc::newDocument(); +} + + +void K3bMovixDoc::addUrls( const KURL::List& urls ) +{ + for( KURL::List::ConstIterator it = urls.begin(); it != urls.end(); ++it ) { + addMovixFile( *it ); + } + + emit newMovixFileItems(); +} + + +void K3bMovixDoc::addMovixFile( const KURL& _url, int pos ) +{ + KURL url = K3b::convertToLocalUrl( _url ); + + QFileInfo f( url.path() ); + if( !f.isFile() || !url.isLocalFile() ) + return; + + QString newName = f.fileName(); + if( nameAlreadyInDir( newName, root() ) ) { + kapp->config()->setGroup("Data project settings"); + bool dropDoubles = kapp->config()->readBoolEntry( "Drop doubles", false ); + if( dropDoubles ) + return; + + bool ok = true; + do { + newName = KInputDialog::getText( i18n("Enter New Filename"), + i18n("A file with that name already exists. Please enter a new name:"), + newName, &ok, 0 ); + } while( ok && nameAlreadyInDir( newName, root() ) ); + + if( !ok ) + return; + } + + K3bMovixFileItem* newK3bItem = new K3bMovixFileItem( f.absFilePath(), this, root(), newName ); + if( pos < 0 || pos > (int)m_movixFiles.count() ) + pos = m_movixFiles.count(); + + m_movixFiles.insert( pos, newK3bItem ); + + emit newMovixFileItems(); + + setModified(true); +} + + +bool K3bMovixDoc::loadDocumentData( QDomElement* rootElem ) +{ + if( !root() ) + newDocument(); + + QDomNodeList nodes = rootElem->childNodes(); + + if( nodes.item(0).nodeName() != "general" ) { + kdDebug() << "(K3bMovixDoc) could not find 'general' section." << endl; + return false; + } + if( !readGeneralDocumentData( nodes.item(0).toElement() ) ) + return false; + + + // parse options + // ----------------------------------------------------------------- + if( nodes.item(1).nodeName() != "data_options" ) { + kdDebug() << "(K3bMovixDoc) could not find 'data_options' section." << endl; + return false; + } + if( !loadDocumentDataOptions( nodes.item(1).toElement() ) ) + return false; + // ----------------------------------------------------------------- + + + + // parse header + // ----------------------------------------------------------------- + if( nodes.item(2).nodeName() != "data_header" ) { + kdDebug() << "(K3bMovixDoc) could not find 'data_header' section." << endl; + return false; + } + if( !loadDocumentDataHeader( nodes.item(2).toElement() ) ) + return false; + // ----------------------------------------------------------------- + + + + // parse movix options + // ----------------------------------------------------------------- + if( nodes.item(3).nodeName() != "movix_options" ) { + kdDebug() << "(K3bMovixDoc) could not find 'movix_options' section." << endl; + return false; + } + + // load the options + QDomNodeList optionList = nodes.item(3).childNodes(); + for( uint i = 0; i < optionList.count(); i++ ) { + + QDomElement e = optionList.item(i).toElement(); + if( e.isNull() ) + return false; + + if( e.nodeName() == "shutdown") + setShutdown( e.attributeNode( "activated" ).value() == "yes" ); + else if( e.nodeName() == "reboot") + setReboot( e.attributeNode( "activated" ).value() == "yes" ); + else if( e.nodeName() == "eject_disk") + setEjectDisk( e.attributeNode( "activated" ).value() == "yes" ); + else if( e.nodeName() == "random_play") + setRandomPlay( e.attributeNode( "activated" ).value() == "yes" ); + else if( e.nodeName() == "no_dma") + setNoDma( e.attributeNode( "activated" ).value() == "yes" ); + else if( e.nodeName() == "subtitle_fontset") + setSubtitleFontset( e.text() ); + else if( e.nodeName() == "boot_message_language") + setBootMessageLanguage( e.text() ); + else if( e.nodeName() == "audio_background") + setAudioBackground( e.text() ); + else if( e.nodeName() == "keyboard_language") + setKeyboardLayout( e.text() ); + else if( e.nodeName() == "codecs") + setCodecs( QStringList::split( ',', e.text() ) ); + else if( e.nodeName() == "default_boot_label") + setDefaultBootLabel( e.text() ); + else if( e.nodeName() == "additional_mplayer_options") + setAdditionalMPlayerOptions( e.text() ); + else if( e.nodeName() == "unwanted_mplayer_options") + setUnwantedMPlayerOptions( e.text() ); + else if( e.nodeName() == "loop_playlist") + setLoopPlaylist( e.text().toInt() ); + else + kdDebug() << "(K3bMovixDoc) unknown movix option: " << e.nodeName() << endl; + } + // ----------------------------------------------------------------- + + // parse files + // ----------------------------------------------------------------- + if( nodes.item(4).nodeName() != "movix_files" ) { + kdDebug() << "(K3bMovixDoc) could not find 'movix_files' section." << endl; + return false; + } + + // load file items + QDomNodeList fileList = nodes.item(4).childNodes(); + for( uint i = 0; i < fileList.count(); i++ ) { + + QDomElement e = fileList.item(i).toElement(); + if( e.isNull() ) + return false; + + if( e.nodeName() == "file" ) { + if( !e.hasAttribute( "name" ) ) { + kdDebug() << "(K3bMovixDoc) found file tag without name attribute." << endl; + return false; + } + + QDomElement urlElem = e.firstChild().toElement(); + if( urlElem.isNull() ) { + kdDebug() << "(K3bMovixDoc) found file tag without url child." << endl; + return false; + } + + // create the item + K3bMovixFileItem* newK3bItem = new K3bMovixFileItem( urlElem.text(), + this, + root(), + e.attributeNode("name").value() ); + m_movixFiles.append( newK3bItem ); + + // subtitle file? + QDomElement subTitleElem = e.childNodes().item(1).toElement(); + if( !subTitleElem.isNull() && subTitleElem.nodeName() == "subtitle_file" ) { + urlElem = subTitleElem.firstChild().toElement(); + if( urlElem.isNull() ) { + kdDebug() << "(K3bMovixDoc) found subtitle_file tag without url child." << endl; + return false; + } + + QString name = K3bMovixFileItem::subTitleFileName( newK3bItem->k3bName() ); + K3bFileItem* subItem = new K3bFileItem( urlElem.text(), this, root(), name ); + newK3bItem->setSubTitleItem( subItem ); + } + } + else { + kdDebug() << "(K3bMovixDoc) found " << e.nodeName() << " node where 'file' was expected." << endl; + return false; + } + } + // ----------------------------------------------------------------- + + + emit newMovixFileItems(); + + return true; +} + + +bool K3bMovixDoc::saveDocumentData( QDomElement* docElem ) +{ + QDomDocument doc = docElem->ownerDocument(); + + saveGeneralDocumentData( docElem ); + + QDomElement optionsElem = doc.createElement( "data_options" ); + saveDocumentDataOptions( optionsElem ); + + QDomElement headerElem = doc.createElement( "data_header" ); + saveDocumentDataHeader( headerElem ); + + QDomElement movixOptElem = doc.createElement( "movix_options" ); + QDomElement movixFilesElem = doc.createElement( "movix_files" ); + + + // save the movix options + QDomElement propElem = doc.createElement( "shutdown" ); + propElem.setAttribute( "activated", shutdown() ? "yes" : "no" ); + movixOptElem.appendChild( propElem ); + + propElem = doc.createElement( "reboot" ); + propElem.setAttribute( "activated", reboot() ? "yes" : "no" ); + movixOptElem.appendChild( propElem ); + + propElem = doc.createElement( "eject_disk" ); + propElem.setAttribute( "activated", ejectDisk() ? "yes" : "no" ); + movixOptElem.appendChild( propElem ); + + propElem = doc.createElement( "random_play" ); + propElem.setAttribute( "activated", randomPlay() ? "yes" : "no" ); + movixOptElem.appendChild( propElem ); + + propElem = doc.createElement( "no_dma" ); + propElem.setAttribute( "activated", noDma() ? "yes" : "no" ); + movixOptElem.appendChild( propElem ); + + propElem = doc.createElement( "subtitle_fontset" ); + propElem.appendChild( doc.createTextNode( subtitleFontset() ) ); + movixOptElem.appendChild( propElem ); + + propElem = doc.createElement( "boot_message_language" ); + propElem.appendChild( doc.createTextNode( bootMessageLanguage() ) ); + movixOptElem.appendChild( propElem ); + + propElem = doc.createElement( "audio_background" ); + propElem.appendChild( doc.createTextNode( audioBackground() ) ); + movixOptElem.appendChild( propElem ); + + propElem = doc.createElement( "keyboard_language" ); + propElem.appendChild( doc.createTextNode( keyboardLayout() ) ); + movixOptElem.appendChild( propElem ); + + propElem = doc.createElement( "codecs" ); + propElem.appendChild( doc.createTextNode( codecs().join(",") ) ); + movixOptElem.appendChild( propElem ); + + propElem = doc.createElement( "default_boot_label" ); + propElem.appendChild( doc.createTextNode( defaultBootLabel() ) ); + movixOptElem.appendChild( propElem ); + + propElem = doc.createElement( "additional_mplayer_options" ); + propElem.appendChild( doc.createTextNode( additionalMPlayerOptions() ) ); + movixOptElem.appendChild( propElem ); + + propElem = doc.createElement( "unwanted_mplayer_options" ); + propElem.appendChild( doc.createTextNode( unwantedMPlayerOptions() ) ); + movixOptElem.appendChild( propElem ); + + propElem = doc.createElement( "loop_playlist" ); + propElem.appendChild( doc.createTextNode( QString::number(loopPlaylist()) ) ); + movixOptElem.appendChild( propElem ); + + + // save the movix items + for( QPtrListIterator it( m_movixFiles ); + *it; ++it ) { + K3bMovixFileItem* item = *it; + + QDomElement topElem = doc.createElement( "file" ); + topElem.setAttribute( "name", item->k3bName() ); + QDomElement urlElem = doc.createElement( "url" ); + urlElem.appendChild( doc.createTextNode( item->localPath() ) ); + topElem.appendChild( urlElem ); + if( item->subTitleItem() ) { + QDomElement subElem = doc.createElement( "subtitle_file" ); + urlElem = doc.createElement( "url" ); + urlElem.appendChild( doc.createTextNode( item->subTitleItem()->localPath() ) ); + subElem.appendChild( urlElem ); + topElem.appendChild( subElem ); + } + + movixFilesElem.appendChild( topElem ); + } + + docElem->appendChild( optionsElem ); + docElem->appendChild( headerElem ); + docElem->appendChild( movixOptElem ); + docElem->appendChild( movixFilesElem ); + + return true; +} + + +void K3bMovixDoc::slotDataItemRemoved( K3bDataItem* item ) +{ + // check if it's a movix item + if( K3bMovixFileItem* fi = dynamic_cast(item) ) + if( m_movixFiles.containsRef( fi ) ) { + emit movixItemRemoved( fi ); + m_movixFiles.removeRef( fi ); + setModified(true); + } +} + + +int K3bMovixDoc::indexOf( K3bMovixFileItem* item ) +{ + return m_movixFiles.findRef(item)+1; +} + + +void K3bMovixDoc::moveMovixItem( K3bMovixFileItem* item, K3bMovixFileItem* itemAfter ) +{ + if( item == itemAfter ) + return; + + // set the current item to track + m_movixFiles.findRef( item ); + // take the current item + item = m_movixFiles.take(); + + // if after == 0 findRef returnes -1 + int pos = m_movixFiles.findRef( itemAfter ); + m_movixFiles.insert( pos+1, item ); + + emit newMovixFileItems(); + + setModified(true); +} + + +void K3bMovixDoc::addSubTitleItem( K3bMovixFileItem* item, const KURL& url ) +{ + if( item->subTitleItem() ) + removeSubTitleItem( item ); + + QFileInfo f( url.path() ); + if( !f.isFile() || !url.isLocalFile() ) + return; + + // check if there already is a file named like we want to name the subTitle file + QString name = K3bMovixFileItem::subTitleFileName( item->k3bName() ); + + if( nameAlreadyInDir( name, root() ) ) { + KMessageBox::error( 0, i18n("Could not rename subtitle file. File with requested name %1 already exists.").arg(name) ); + return; + } + + K3bFileItem* subItem = new K3bFileItem( f.absFilePath(), this, root(), name ); + item->setSubTitleItem( subItem ); + + emit newMovixFileItems(); + + setModified(true); +} + + +void K3bMovixDoc::removeSubTitleItem( K3bMovixFileItem* item ) +{ + if( item->subTitleItem() ) { + emit subTitleItemRemoved( item ); + + delete item->subTitleItem(); + item->setSubTitleItem(0); + + setModified(true); + } +} + +#include "k3bmovixdoc.moc" diff --git a/libk3b/projects/movixcd/k3bmovixdoc.h b/libk3b/projects/movixcd/k3bmovixdoc.h new file mode 100644 index 0000000..53debfc --- /dev/null +++ b/libk3b/projects/movixcd/k3bmovixdoc.h @@ -0,0 +1,125 @@ +/* + * + * $Id: k3bmovixdoc.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef _K3B_MOVIX_DOC_H_ +#define _K3B_MOVIX_DOC_H_ + + +#include + +#include +#include "k3b_export.h" +//class K3bView; +class KURL; +class QDomElement; +class K3bFileItem; +class K3bMovixFileItem; +class K3bDataItem; +class KConfig; + + +class LIBK3B_EXPORT K3bMovixDoc : public K3bDataDoc +{ + Q_OBJECT + + public: + K3bMovixDoc( QObject* parent = 0 ); + virtual ~K3bMovixDoc(); + + virtual int type() const { return MOVIX; } + + virtual K3bBurnJob* newBurnJob( K3bJobHandler* hdl, QObject* parent ); + + bool newDocument(); + + const QPtrList& movixFileItems() const { return m_movixFiles; } + + int indexOf( K3bMovixFileItem* ); + + + bool shutdown() const { return m_shutdown; } + bool reboot() const { return m_reboot; } + bool ejectDisk() const { return m_ejectDisk; } + bool randomPlay() const { return m_randomPlay; } + const QString& subtitleFontset() const { return m_subtitleFontset; } + const QString& bootMessageLanguage() const { return m_bootMessageLanguage; } + const QString& audioBackground() const { return m_audioBackground; } + const QString& keyboardLayout() const { return m_keyboardLayout; } + const QStringList& codecs() const { return m_codecs; } + const QString& defaultBootLabel() const { return m_defaultBootLabel; } + const QString& additionalMPlayerOptions() const { return m_additionalMPlayerOptions; } + const QString& unwantedMPlayerOptions() const { return m_unwantedMPlayerOptions; } + int loopPlaylist() const { return m_loopPlaylist; } + bool noDma() const { return m_noDma; } + + void setShutdown( bool v ) { m_shutdown = v; } + void setReboot( bool v ) { m_reboot = v; } + void setEjectDisk( bool v ) { m_ejectDisk = v; } + void setRandomPlay( bool v ) { m_randomPlay = v; } + void setSubtitleFontset( const QString& v ) { m_subtitleFontset = v; } + void setBootMessageLanguage( const QString& v ) { m_bootMessageLanguage = v; } + void setAudioBackground( const QString& b ) { m_audioBackground = b; } + void setKeyboardLayout( const QString& l ) { m_keyboardLayout = l; } + void setCodecs( const QStringList& c ) { m_codecs = c; } + void setDefaultBootLabel( const QString& v ) { m_defaultBootLabel = v; } + void setAdditionalMPlayerOptions( const QString& v ) { m_additionalMPlayerOptions = v; } + void setUnwantedMPlayerOptions( const QString& v ) { m_unwantedMPlayerOptions = v; } + void setLoopPlaylist( int v ) { m_loopPlaylist = v; } + void setNoDma( bool b ) { m_noDma = b; } + + signals: + void newMovixFileItems(); + void movixItemRemoved( K3bMovixFileItem* ); + void subTitleItemRemoved( K3bMovixFileItem* ); + + public slots: + void addUrls( const KURL::List& urls ); + void addMovixFile( const KURL& url, int pos = -1 ); + void moveMovixItem( K3bMovixFileItem* item, K3bMovixFileItem* itemAfter ); + void addSubTitleItem( K3bMovixFileItem*, const KURL& ); + void removeSubTitleItem( K3bMovixFileItem* ); + + protected: + /** reimplemented from K3bDoc */ + bool loadDocumentData( QDomElement* root ); + /** reimplemented from K3bDoc */ + bool saveDocumentData( QDomElement* ); + + virtual QString typeString() const { return "movix"; } + + private slots: + void slotDataItemRemoved( K3bDataItem* ); + + private: + QPtrList m_movixFiles; + + bool m_shutdown; + bool m_reboot; + bool m_ejectDisk; + bool m_randomPlay; + QString m_subtitleFontset; + QString m_bootMessageLanguage; + QString m_audioBackground; + QString m_keyboardLayout; + QStringList m_codecs; + QString m_defaultBootLabel; + QString m_additionalMPlayerOptions; + QString m_unwantedMPlayerOptions; + int m_loopPlaylist; + bool m_noDma; +}; + +#endif diff --git a/libk3b/projects/movixcd/k3bmovixdocpreparer.cpp b/libk3b/projects/movixcd/k3bmovixdocpreparer.cpp new file mode 100644 index 0000000..57e18af --- /dev/null +++ b/libk3b/projects/movixcd/k3bmovixdocpreparer.cpp @@ -0,0 +1,490 @@ +/* + * + * $Id: k3bmovixdocpreparer.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bmovixdocpreparer.h" +#include "k3bmovixdoc.h" +#include "k3bmovixprogram.h" +#include "k3bmovixfileitem.h" + + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + + +class K3bMovixDocPreparer::Private +{ +public: + Private() + : doc(0), + playlistFile(0), + isolinuxConfigFile(0), + movixRcFile(0), + isolinuxDir(0), + movixDir(0), + mplayerDir(0), + playlistFileItem(0), + structuresCreated(false) { + } + + K3bMovixDoc* doc; + const K3bMovixBin* eMovixBin; + + KTempFile* playlistFile; + KTempFile* isolinuxConfigFile; + KTempFile* movixRcFile; + + K3bDirItem* isolinuxDir; + K3bDirItem* movixDir; + K3bDirItem* mplayerDir; + K3bFileItem* playlistFileItem; + + QPtrList newMovixItems; + + bool structuresCreated; +}; + + +K3bMovixDocPreparer::K3bMovixDocPreparer( K3bMovixDoc* doc, K3bJobHandler* jh, QObject* parent, const char* name ) + : K3bJob( jh, parent, name ) +{ + d = new Private(); + d->doc = doc; +} + + +K3bMovixDocPreparer::~K3bMovixDocPreparer() +{ + removeMovixStructures(); + delete d; +} + + +K3bMovixDoc* K3bMovixDocPreparer::doc() const +{ + return d->doc; +} + + +void K3bMovixDocPreparer::start() +{ + kdDebug() << k_funcinfo << endl; + jobStarted(); + + bool success = true; + if( d->structuresCreated ) + removeMovixStructures(); + else + success = createMovixStructures(); + + jobFinished(success); +} + + +void K3bMovixDocPreparer::cancel() +{ + // do nothing... +} + + +bool K3bMovixDocPreparer::createMovixStructures() +{ + kdDebug() << k_funcinfo << endl; + removeMovixStructures(); + + if( doc() ) { + doc()->setMultiSessionMode( K3bDataDoc::NONE ); + doc()->prepareFilenames(); + } + + d->eMovixBin = dynamic_cast( k3bcore->externalBinManager()->binObject("eMovix") ); + if( d->eMovixBin ) { + bool success = false; + if( d->eMovixBin->version >= K3bVersion( 0, 9, 0 ) ) + success = addMovixFilesNew(); + else + success = addMovixFiles(); + + d->structuresCreated = success; + return success; + } + else { + emit infoMessage( i18n("Could not find a valid eMovix installation."), ERROR ); + return false; + } +} + + +void K3bMovixDocPreparer::removeMovixStructures() +{ + kdDebug() << k_funcinfo << endl; + // remove movix files from doc + // the dataitems do the cleanup in the doc + delete d->movixDir; + delete d->isolinuxDir; + delete d->mplayerDir; + delete d->playlistFileItem; + + d->movixDir = 0; + d->isolinuxDir = 0; + d->mplayerDir = 0; + d->playlistFileItem = 0; + + d->newMovixItems.setAutoDelete( true ); + d->newMovixItems.clear(); + + // remove all the temp files + delete d->playlistFile; + delete d->isolinuxConfigFile; + delete d->movixRcFile; + + d->playlistFile = 0; + d->isolinuxConfigFile = 0; + d->movixRcFile = 0; + + d->structuresCreated = false; +} + + +bool K3bMovixDocPreparer::writePlaylistFile() +{ + delete d->playlistFile; + d->playlistFile = new KTempFile(); + d->playlistFile->setAutoDelete(true); + + if( QTextStream* s = d->playlistFile->textStream() ) { + + const QPtrList& movixFileItems = d->doc->movixFileItems(); + + for( QPtrListIterator it( movixFileItems ); + *it; ++it ) { + *s << "/cdrom/"; + *s << it.current()->writtenName(); + *s << endl; + } + + d->playlistFile->close(); + return true; + } + else { + emit infoMessage( i18n("Could not write to temporary file %1").arg(d->playlistFile->name()), ERROR ); + return false; + } +} + + +bool K3bMovixDocPreparer::writeIsolinuxConfigFile( const QString& originalPath ) +{ + delete d->isolinuxConfigFile; + d->isolinuxConfigFile = new KTempFile(); + d->isolinuxConfigFile->setAutoDelete(true); + + if( QTextStream* s = d->isolinuxConfigFile->textStream() ) { + + // now open the default isolinux.cfg and copy everything except the first line which contains + // the default boot label + QFile f( originalPath ); + if( f.open( IO_ReadOnly ) ) { + + QTextStream isolinuxConfigOrig( &f ); + + if( d->doc->defaultBootLabel() != i18n("default") ) { + isolinuxConfigOrig.readLine(); // skip first line + *s << "default " << d->doc->defaultBootLabel() << endl; + } + + QString line = isolinuxConfigOrig.readLine(); + while( !line.isNull() ) { + *s << line << endl; + line = isolinuxConfigOrig.readLine(); + } + + d->isolinuxConfigFile->close(); + return true; + } + else + return false; + } + else { + emit infoMessage( i18n("Could not write to temporary file %1").arg(d->isolinuxConfigFile->name()), ERROR ); + return false; + } +} + + +bool K3bMovixDocPreparer::writeMovixRcFile() +{ + delete d->movixRcFile; + d->movixRcFile = new KTempFile(); + d->movixRcFile->setAutoDelete(true); + + if( QTextStream* s = d->movixRcFile->textStream() ) { + + if( !d->doc->additionalMPlayerOptions().isEmpty() ) + *s << "extra-mplayer-options=" << d->doc->additionalMPlayerOptions() << endl; + if( !d->doc->unwantedMPlayerOptions().isEmpty() ) + *s << "unwanted-mplayer-options=" << d->doc->unwantedMPlayerOptions() << endl; + *s << "loop=" << d->doc->loopPlaylist() << endl; + if( d->doc->shutdown() ) + *s << "shut=y" << endl; + if( d->doc->reboot() ) + *s << "reboot=y" << endl; + if( d->doc->ejectDisk() ) + *s << "eject=y" << endl; + if( d->doc->randomPlay() ) + *s << "random=y" << endl; + if( d->doc->noDma() ) + *s << "dma=n" << endl; + + d->movixRcFile->close(); + return true; + } + else { + emit infoMessage( i18n("Could not write to temporary file %1").arg(d->movixRcFile->name()), ERROR ); + return false; + } +} + + +bool K3bMovixDocPreparer::addMovixFiles() +{ + // first of all we create the directories + d->isolinuxDir = new K3bDirItem( "isolinux", d->doc, d->doc->root() ); + d->movixDir = new K3bDirItem( "movix", d->doc, d->doc->root() ); + K3bDirItem* kernelDir = d->doc->addEmptyDir( "kernel", d->isolinuxDir ); + + // add the linux kernel + (void)new K3bFileItem( d->eMovixBin->path + "/isolinux/kernel/vmlinuz", d->doc, kernelDir ); + + // add the boot image + K3bBootItem* bootItem = d->doc->createBootItem( d->eMovixBin->path + "/isolinux/isolinux.bin", + d->isolinuxDir ); + bootItem->setImageType( K3bBootItem::NONE ); + bootItem->setLoadSize( 4 ); + bootItem->setBootInfoTable(true); + + // some sort weights as defined in isolinux + d->isolinuxDir->setSortWeight( 100 ); + kernelDir->setSortWeight( 50 ); + bootItem->setSortWeight( 200 ); + + // rename the boot catalog file + d->doc->bootCataloge()->setK3bName( "isolinux.boot" ); + + // the following sucks! Redesign it! + + // add all the isolinux files + QStringList isolinuxFiles = d->eMovixBin->isolinuxFiles(); + isolinuxFiles.remove( "isolinux.bin" ); + isolinuxFiles.remove( "isolinux.cfg" ); + isolinuxFiles.remove( "kernel/vmlinuz" ); + for( QStringList::const_iterator it = isolinuxFiles.begin(); + it != isolinuxFiles.end(); ++it ) { + QString path = d->eMovixBin->path + "/isolinux/" + *it; + (void)new K3bFileItem( path, d->doc, d->isolinuxDir ); + } + + const QStringList& movixFiles = d->eMovixBin->movixFiles(); + for( QStringList::const_iterator it = movixFiles.begin(); + it != movixFiles.end(); ++it ) { + QString path = d->eMovixBin->path + "/movix/" + *it; + (void)new K3bFileItem( path, d->doc, d->movixDir ); + } + + // add doku files + QString path = d->eMovixBin->languageDir( d->doc->bootMessageLanguage() ); + QDir dir(path); + QStringList helpFiles = dir.entryList(QDir::Files); + for( QStringList::const_iterator it = helpFiles.begin(); + it != helpFiles.end(); ++it ) { + // some emovix installations include backup-files, no one's perfect ;) + if( !(*it).endsWith( "~" ) ) + (void)new K3bFileItem( path + "/" + *it, d->doc, d->isolinuxDir ); + } + + + // add subtitle font dir + if( !d->doc->subtitleFontset().isEmpty() && + d->doc->subtitleFontset() != i18n("none") ) { + d->mplayerDir = new K3bDirItem( "mplayer", d->doc, d->doc->root() ); + + QString fontPath = d->eMovixBin->subtitleFontDir( d->doc->subtitleFontset() ); + QFileInfo fontType( fontPath ); + if( fontType.isDir() ) { + K3bDirItem* fontDir = new K3bDirItem( "font", d->doc, d->mplayerDir ); + QDir dir( fontPath ); + QStringList fontFiles = dir.entryList( QDir::Files ); + for( QStringList::const_iterator it = fontFiles.begin(); + it != fontFiles.end(); ++it ) { + (void)new K3bFileItem( fontPath + "/" + *it, d->doc, fontDir ); + } + } + else { + // just a ttf file + // needs to be named: subfont.ttf and needs to be placed in mplayer/ + // instead of mplayer/font + (void)new K3bFileItem( fontPath, + d->doc, + d->mplayerDir, + "subfont.ttf" ); + } + } + + + // add movix-config-file and boot-config file + if( writeMovixRcFile() && + writeIsolinuxConfigFile( d->eMovixBin->path + "/isolinux/isolinux.cfg" ) && + writePlaylistFile() ) { + + (void)new K3bFileItem( d->movixRcFile->name(), d->doc, d->movixDir, "movixrc" ); + (void)new K3bFileItem( d->isolinuxConfigFile->name(), d->doc, d->isolinuxDir, "isolinux.cfg" ); + d->playlistFileItem = new K3bFileItem( d->playlistFile->name(), d->doc, d->doc->root(), "movix.list" ); + + return true; + } + else + return false; +} + + +bool K3bMovixDocPreparer::addMovixFilesNew() +{ + // 1. get a list of files from the movixbin + // 2. create file items (replace isolinux.cfg with the one created above) + // 3. add movixrc and movix.list files + // 4. set weights for isolinux files + + // FIXME: use the settings from the doc + QStringList files = d->eMovixBin->files( d->doc->keyboardLayout(), + d->doc->subtitleFontset(), + d->doc->audioBackground(), + d->doc->bootMessageLanguage(), + "all" /*d->doc->codecs()*/ ); // for now we simply don't allow selection + + for( QStringList::iterator it = files.begin(); it != files.end(); ++it ) { + QString docPath = (*it).section( ' ', 0, 0 ); + QString filePath = (*it).section( ' ', 1, 1 ); + QString fileName = filePath.section( '/', -1 ); + + if( fileName == "isolinux.cfg" ) { + // replace the local file with our modified one + if( writeIsolinuxConfigFile( filePath ) ) + createItem( d->isolinuxConfigFile->name(), docPath )->setK3bName( "isolinux.cfg" ); + else + return false; + } + else if( fileName == "isolinux.bin" ) { + // create boot item (no need to remember this since it's in a dir which will be removed + // anyway) + K3bBootItem* bootItem = d->doc->createBootItem( filePath, createDir(docPath) ); + bootItem->setImageType( K3bBootItem::NONE ); + bootItem->setLoadSize( 4 ); + bootItem->setBootInfoTable(true); + + // set the proper sort weight + bootItem->setSortWeight( 200 ); + bootItem->parent()->setSortWeight( 100 ); + } + else if( fileName != "movixrc" ) { // we create our own movixrc + K3bFileItem* item = createItem( filePath, docPath ); + + // Truetype subtitle fonts needs to be named subfont.ttf + if( fileName == d->doc->subtitleFontset() + ".ttf" ) { + item->setK3bName( "subfont.ttf" ); + } + else if( fileName == "vmlinuz" ) + item->setSortWeight( 50 ); + } + } + + // Some distributions (such as Gentoo for example) do use the win32codecs package instead of the + // eMovix supplied codecs. These codecs are not picked up by the movix-conf script + K3bDirItem* codecDir = dynamic_cast( d->doc->root()->findByPath( "/eMoviX/codecs" ) ); + if( !codecDir || codecDir->isEmpty() ) { + QDir localCodecDir( d->eMovixBin->movixDataDir() + "/codecs" ); + if( localCodecDir.exists() ) { + QStringList codecFiles = localCodecDir.entryList( QDir::Files ); + for( QStringList::const_iterator it = codecFiles.begin(); it != codecFiles.end(); ++it ) + createItem( localCodecDir.path() + '/' + *it, "/eMoviX/codecs" ); + } + } + + if( writePlaylistFile() && writeMovixRcFile() ) { + // add the two items that are not listed by the script + createItem( d->movixRcFile->name(), "/eMoviX/movix" )->setK3bName( "movixrc" ); + createItem( d->playlistFile->name(), "/" )->setK3bName( "movix.list" ); + return true; + } + else + return false; +} + + +K3bFileItem* K3bMovixDocPreparer::createItem( const QString& localPath, const QString& docPath ) +{ + // make sure the path in the doc exists + K3bDirItem* dir = createDir( docPath ); + + // create the file in dir + K3bFileItem* item = new K3bFileItem( localPath, d->doc, dir ); + + // remember the item to remove it becasue the dir cannot be removed + if( dir == d->doc->root() ) + d->newMovixItems.append( item ); + + return item; +} + + +K3bDirItem* K3bMovixDocPreparer::createDir( const QString& docPath ) +{ + QStringList docPathSections = QStringList::split( '/', docPath ); + K3bDirItem* dir = d->doc->root(); + for( QStringList::iterator it = docPathSections.begin(); it != docPathSections.end(); ++it ) { + K3bDataItem* next = dir->find( *it ); + if( !next ) + dir = new K3bDirItem( *it, d->doc, dir ); + else if( next->isDir() ) + dir = static_cast( next ); + else { + kdError() << "(K3bMovixDocPreparer) found non-dir item where a dir was needed." << endl; + return 0; + } + } + + // remember the dir to remove it + if( dir != d->doc->root() ) { + K3bDirItem* delDir = dir; + while( delDir->parent() != d->doc->root() ) + delDir = delDir->parent(); + if( d->newMovixItems.findRef( delDir ) == -1 ) + d->newMovixItems.append( delDir ); + } + + return dir; +} + +#include "k3bmovixdocpreparer.moc" diff --git a/libk3b/projects/movixcd/k3bmovixdocpreparer.h b/libk3b/projects/movixcd/k3bmovixdocpreparer.h new file mode 100644 index 0000000..3844eae --- /dev/null +++ b/libk3b/projects/movixcd/k3bmovixdocpreparer.h @@ -0,0 +1,67 @@ +/* + * + * $Id: k3bmovixdocpreparer.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_MOVIX_DOC_PREPARER_H_ +#define _K3B_MOVIX_DOC_PREPARER_H_ + +#include + +class K3bMovixDoc; +class K3bFileItem; +class K3bDirItem; + + +/** + * This class creates the needed eMovix structures in an eMovix doc + * and removes them after creating the image. + */ +class K3bMovixDocPreparer : public K3bJob +{ + Q_OBJECT + + public: + explicit K3bMovixDocPreparer( K3bMovixDoc* doc, K3bJobHandler*, QObject* parent = 0, const char* name = 0 ); + ~K3bMovixDocPreparer(); + + K3bMovixDoc* doc() const; + + bool createMovixStructures(); + void removeMovixStructures(); + + public slots: + /** + * use createMovixStructures and removeMovixStructures instead. + */ + void start(); + + /** + * Useless since this job works syncronously + */ + void cancel(); + + private: + bool writePlaylistFile(); + bool writeIsolinuxConfigFile( const QString& ); + bool writeMovixRcFile(); + bool addMovixFiles(); + bool addMovixFilesNew(); + K3bFileItem* createItem( const QString& localPath, const QString& docPath ); + K3bDirItem* createDir( const QString& docPath ); + + class Private; + Private* d; +}; + +#endif diff --git a/libk3b/projects/movixcd/k3bmovixfileitem.cpp b/libk3b/projects/movixcd/k3bmovixfileitem.cpp new file mode 100644 index 0000000..12803a2 --- /dev/null +++ b/libk3b/projects/movixcd/k3bmovixfileitem.cpp @@ -0,0 +1,68 @@ +/* + * + * $Id: k3bmovixfileitem.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include "k3bmovixfileitem.h" +#include "k3bmovixdoc.h" + +#include + + +K3bMovixFileItem::K3bMovixFileItem( const QString& fileName, + K3bMovixDoc* doc, + K3bDirItem* dir, + const QString& k3bName ) + : K3bFileItem( fileName, doc, dir, k3bName ), + m_doc(doc), + m_subTitleItem(0) +{ +} + + +K3bMovixFileItem::~K3bMovixFileItem() +{ + if( m_subTitleItem ) + m_doc->removeSubTitleItem( this ); + + // remove this from parentdir + // it is important to do it here and not + // rely on the K3bFileItem destructor becasue + // otherwise the doc is not informed early enough + if( parent() ) + parent()->takeDataItem( this ); +} + + +void K3bMovixFileItem::setK3bName( const QString& newName ) +{ + K3bFileItem::setK3bName( newName ); + + // take care of the subTitle file + if( m_subTitleItem ) { + m_subTitleItem->setK3bName( subTitleFileName(k3bName()) ); + } +} + + +QString K3bMovixFileItem::subTitleFileName( const QString& name ) +{ + // remove ending from k3bName + QString subName = name; + int pos = subName.findRev("."); + if( pos > 0 ) + subName.truncate( pos ); + subName += ".sub"; + return subName; +} diff --git a/libk3b/projects/movixcd/k3bmovixfileitem.h b/libk3b/projects/movixcd/k3bmovixfileitem.h new file mode 100644 index 0000000..343f00b --- /dev/null +++ b/libk3b/projects/movixcd/k3bmovixfileitem.h @@ -0,0 +1,52 @@ +/* + * + * $Id: k3bmovixfileitem.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef _K3B_MOVIX_FILEITEM_H_ +#define _K3B_MOVIX_FILEITEM_H_ + +#include + +class K3bMovixDoc; + + +class K3bMovixFileItem : public K3bFileItem +{ + public: + K3bMovixFileItem( const QString& fileName, K3bMovixDoc* doc, K3bDirItem* dir, const QString& k3bName = 0 ); + ~K3bMovixFileItem(); + + K3bFileItem* subTitleItem() const { return m_subTitleItem; } + void setSubTitleItem( K3bFileItem* i ) { m_subTitleItem = i; } + + /** + * reimplemented from K3bDataItem + * also renames the subTitleItem + */ + void setK3bName( const QString& ); + + /** + * returnes the name that the subtitle file must have in + * order to work with mplayer + */ + static QString subTitleFileName( const QString& ); + + private: + K3bMovixDoc* m_doc; + + K3bFileItem* m_subTitleItem; +}; + +#endif diff --git a/libk3b/projects/movixcd/k3bmovixjob.cpp b/libk3b/projects/movixcd/k3bmovixjob.cpp new file mode 100644 index 0000000..2579453 --- /dev/null +++ b/libk3b/projects/movixcd/k3bmovixjob.cpp @@ -0,0 +1,132 @@ +/* + * + * $Id: k3bmovixjob.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include "k3bmovixjob.h" +#include "k3bmovixdoc.h" +#include "k3bmovixfileitem.h" +#include "k3bmovixdocpreparer.h" + +#include +#include +#include + +#include +#include + + +K3bMovixJob::K3bMovixJob( K3bMovixDoc* doc, K3bJobHandler* jh, QObject* parent ) + : K3bBurnJob( jh, parent ), + m_doc(doc) +{ + m_dataJob = new K3bDataJob( doc, this, this ); + m_movixDocPreparer = new K3bMovixDocPreparer( doc, this, this ); + + // pipe signals + connect( m_dataJob, SIGNAL(percent(int)), this, SIGNAL(percent(int)) ); + connect( m_dataJob, SIGNAL(subPercent(int)), this, SIGNAL(subPercent(int)) ); + connect( m_dataJob, SIGNAL(processedSubSize(int, int)), this, SIGNAL(processedSubSize(int, int)) ); + connect( m_dataJob, SIGNAL(processedSize(int, int)), this, SIGNAL(processedSize(int, int)) ); + connect( m_dataJob, SIGNAL(bufferStatus(int)), this, SIGNAL(bufferStatus(int)) ); + connect( m_dataJob, SIGNAL(deviceBuffer(int)), this, SIGNAL(deviceBuffer(int)) ); + connect( m_dataJob, SIGNAL(writeSpeed(int, int)), this, SIGNAL(writeSpeed(int, int)) ); + connect( m_dataJob, SIGNAL(newTask(const QString&)), this, SIGNAL(newTask(const QString&)) ); + connect( m_dataJob, SIGNAL(newSubTask(const QString&)), this, SIGNAL(newSubTask(const QString&)) ); + connect( m_dataJob, SIGNAL(debuggingOutput(const QString&, const QString&)), + this, SIGNAL(debuggingOutput(const QString&, const QString&)) ); + connect( m_dataJob, SIGNAL(infoMessage(const QString&, int)), + this, SIGNAL(infoMessage(const QString&, int)) ); + connect( m_dataJob, SIGNAL(burning(bool)), this, SIGNAL(burning(bool)) ); + + // we need to clean up here + connect( m_dataJob, SIGNAL(finished(bool)), this, SLOT(slotDataJobFinished(bool)) ); + + connect( m_movixDocPreparer, SIGNAL(infoMessage(const QString&, int)), + this, SIGNAL(infoMessage(const QString&, int)) ); +} + + +K3bMovixJob::~K3bMovixJob() +{ +} + + +K3bDevice::Device* K3bMovixJob::writer() const +{ + return m_dataJob->writer(); +} + + +K3bDoc* K3bMovixJob::doc() const +{ + return m_doc; +} + + +void K3bMovixJob::start() +{ + jobStarted(); + + m_canceled = false; + m_dataJob->setWritingApp( writingApp() ); + + if( m_movixDocPreparer->createMovixStructures() ) { + m_dataJob->start(); + } + else { + m_movixDocPreparer->removeMovixStructures(); + jobFinished(false); + } +} + + +void K3bMovixJob::cancel() +{ + m_canceled = true; + m_dataJob->cancel(); +} + + +void K3bMovixJob::slotDataJobFinished( bool success ) +{ + m_movixDocPreparer->removeMovixStructures(); + + if( m_canceled || m_dataJob->hasBeenCanceled() ) + emit canceled(); + + jobFinished( success ); +} + + +QString K3bMovixJob::jobDescription() const +{ + if( m_doc->isoOptions().volumeID().isEmpty() ) + return i18n("Writing eMovix CD"); + else + return i18n("Writing eMovix CD (%1)").arg(m_doc->isoOptions().volumeID()); +} + + +QString K3bMovixJob::jobDetails() const +{ + return ( i18n("1 file (%1) and about 8 MB eMovix data", + "%n files (%1) and about 8 MB eMovix data", + m_doc->movixFileItems().count()).arg(KIO::convertSize(m_doc->size())) + + ( m_doc->copies() > 1 + ? i18n(" - %n copy", " - %n copies", m_doc->copies()) + : QString::null ) ); +} + +#include "k3bmovixjob.moc" diff --git a/libk3b/projects/movixcd/k3bmovixjob.h b/libk3b/projects/movixcd/k3bmovixjob.h new file mode 100644 index 0000000..81dea8e --- /dev/null +++ b/libk3b/projects/movixcd/k3bmovixjob.h @@ -0,0 +1,60 @@ +/* + * + * $Id: k3bmovixjob.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef _K3B_MOVIX_JOB_H_ +#define _K3B_MOVIX_JOB_H_ + +#include + +class K3bMovixDoc; +class K3bDevice::Device; +class K3bDataJob; +class KTempFile; +class K3bMovixInstallation; +class K3bMovixDocPreparer; +class K3bDirItem; +class K3bFileItem; + +class K3bMovixJob : public K3bBurnJob +{ + Q_OBJECT + + public: + K3bMovixJob( K3bMovixDoc* doc, K3bJobHandler*, QObject* parent = 0 ); + ~K3bMovixJob(); + + K3bDoc* doc() const; + K3bDevice::Device* writer() const; + + QString jobDescription() const; + QString jobDetails() const; + + public slots: + void start(); + void cancel(); + + private slots: + void slotDataJobFinished( bool ); + + private: + K3bMovixDoc* m_doc; + K3bDataJob* m_dataJob; + K3bMovixDocPreparer* m_movixDocPreparer; + + bool m_canceled; +}; + +#endif diff --git a/libk3b/projects/movixcd/k3bmovixprogram.cpp b/libk3b/projects/movixcd/k3bmovixprogram.cpp new file mode 100644 index 0000000..8720e8d --- /dev/null +++ b/libk3b/projects/movixcd/k3bmovixprogram.cpp @@ -0,0 +1,339 @@ +/* + * + * $Id: k3bmovixprogram.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include "k3bmovixprogram.h" + +#include + +#include +#include + +#include +#include +#include + + +K3bMovixProgram::K3bMovixProgram() + : K3bExternalProgram( "eMovix" ) +{ +} + +bool K3bMovixProgram::scan( const QString& p ) +{ + if( p.isEmpty() ) + return false; + + QString path = p; + if( path[path.length()-1] != '/' ) + path.append("/"); + + // first test if we have a version info (eMovix >= 0.8.0pre3) + if( !QFile::exists( path + "movix-version" ) ) + return false; + + K3bMovixBin* bin = 0; + + // + // probe version and data dir + // + KProcess vp, dp; + vp << path + "movix-version"; + dp << path + "movix-conf"; + K3bProcessOutputCollector vout( &vp ), dout( &dp ); + if( vp.start( KProcess::Block, KProcess::AllOutput ) && dp.start( KProcess::Block, KProcess::AllOutput ) ) { + // movix-version just gives us the version number on stdout + if( !vout.output().isEmpty() && !dout.output().isEmpty() ) { + bin = new K3bMovixBin( this ); + bin->version = vout.output().stripWhiteSpace(); + bin->path = path; + bin->m_movixPath = dout.output().stripWhiteSpace(); + } + } + else { + kdDebug() << "(K3bMovixProgram) could not start " << path << "movix-version" << endl; + return false; + } + + if( bin->version >= K3bVersion( 0, 9, 0 ) ) + return scanNewEMovix( bin, path ); + else + return scanOldEMovix( bin, path ); +} + + +bool K3bMovixProgram::scanNewEMovix( K3bMovixBin* bin, const QString& path ) +{ + QStringList files = bin->files(); + for( QStringList::iterator it = files.begin(); + it != files.end(); ++it ) { + if( (*it).contains( "isolinux.cfg" ) ) { + bin->m_supportedBootLabels = determineSupportedBootLabels( QStringList::split( " ", *it )[1] ); + break; + } + } + + // here we simply check for the movix-conf program + if( QFile::exists( path + "movix-conf" ) ) { + bin->addFeature( "newfiles" ); + addBin(bin); + return true; + } + else { + delete bin; + return false; + } +} + + +bool K3bMovixProgram::scanOldEMovix( K3bMovixBin* bin, const QString& path ) +{ + // + // first check if all necessary directories are present + // + QDir dir( bin->movixDataDir() ); + QStringList subdirs = dir.entryList( QDir::Dirs ); + if( !subdirs.contains( "boot-messages" ) ) { + kdDebug() << "(K3bMovixProgram) could not find subdir 'boot-messages'" << endl; + delete bin; + return false; + } + if( !subdirs.contains( "isolinux" ) ) { + kdDebug() << "(K3bMovixProgram) could not find subdir 'isolinux'" << endl; + delete bin; + return false; + } + if( !subdirs.contains( "movix" ) ) { + kdDebug() << "(K3bMovixProgram) could not find subdir 'movix'" << endl; + delete bin; + return false; + } + if( !subdirs.contains( "mplayer-fonts" ) ) { + kdDebug() << "(K3bMovixProgram) could not find subdir 'mplayer-fonts'" << endl; + delete bin; + return false; + } + + + // + // check if we have a version of eMovix which contains the movix-files script + // + if( QFile::exists( path + "movix-files" ) ) { + bin->addFeature( "files" ); + + KProcess p; + K3bProcessOutputCollector out( &p ); + p << bin->path + "movix-files"; + if( p.start( KProcess::Block, KProcess::AllOutput ) ) { + bin->m_movixFiles = QStringList::split( "\n", out.output() ); + } + } + + // + // fallback: to be compatible with 0.8.0rc2 we just add all files in the movix directory + // + if( bin->m_movixFiles.isEmpty() ) { + QDir dir( bin->movixDataDir() + "/movix" ); + bin->m_movixFiles = dir.entryList(QDir::Files); + } + + // + // these files are fixed. That should not be a problem + // since Isolinux is quite stable as far as I know. + // + bin->m_isolinuxFiles.append( "initrd.gz" ); + bin->m_isolinuxFiles.append( "isolinux.bin" ); + bin->m_isolinuxFiles.append( "isolinux.cfg" ); + bin->m_isolinuxFiles.append( "kernel/vmlinuz" ); + bin->m_isolinuxFiles.append( "movix.lss" ); + bin->m_isolinuxFiles.append( "movix.msg" ); + + + // + // check every single necessary file :( + // + for( QStringList::const_iterator it = bin->m_isolinuxFiles.begin(); + it != bin->m_isolinuxFiles.end(); ++it ) { + if( !QFile::exists( bin->movixDataDir() + "/isolinux/" + *it ) ) { + kdDebug() << "(K3bMovixProgram) Could not find file " << *it << endl; + delete bin; + return false; + } + } + + // + // now check the boot-messages languages + // + dir.cd( "boot-messages" ); + bin->m_supportedLanguages = dir.entryList(QDir::Dirs); + bin->m_supportedLanguages.remove("."); + bin->m_supportedLanguages.remove(".."); + bin->m_supportedLanguages.remove("CVS"); // the eMovix makefile stuff seems not perfect ;) + bin->m_supportedLanguages.prepend( i18n("default") ); + dir.cdUp(); + + // + // now check the supported mplayer-fontsets + // FIXME: every font dir needs to contain the "font.desc" file! + // + dir.cd( "mplayer-fonts" ); + bin->m_supportedSubtitleFonts = dir.entryList( QDir::Dirs ); + bin->m_supportedSubtitleFonts.remove("."); + bin->m_supportedSubtitleFonts.remove(".."); + bin->m_supportedSubtitleFonts.remove("CVS"); // the eMovix makefile stuff seems not perfect ;) + // new ttf fonts in 0.8.0rc2 + bin->m_supportedSubtitleFonts += dir.entryList( "*.ttf", QDir::Files ); + bin->m_supportedSubtitleFonts.prepend( i18n("none") ); + dir.cdUp(); + + // + // now check the supported boot labels + // + dir.cd( "isolinux" ); + bin->m_supportedBootLabels = determineSupportedBootLabels( dir.filePath("isolinux.cfg") ); + + // + // This seems to be a valid eMovix installation. :) + // + + addBin(bin); + return true; +} + + +QStringList K3bMovixProgram::determineSupportedBootLabels( const QString& isoConfigFile ) const +{ + QStringList list( i18n("default") ); + + QFile f( isoConfigFile ); + if( !f.open( IO_ReadOnly ) ) { + kdDebug() << "(K3bMovixProgram) could not open file '" << f.name() << "'" << endl; + } + else { + QTextStream fs( &f ); + QString line = fs.readLine(); + while( !line.isNull() ) { + if( line.startsWith( "label" ) ) + list.append( line.mid( 5 ).stripWhiteSpace() ); + + line = fs.readLine(); + } + f.close(); + } + + return list; +} + + +QString K3bMovixBin::subtitleFontDir( const QString& font ) const +{ + if( font == i18n("none" ) ) + return ""; + else if( m_supportedSubtitleFonts.contains( font ) ) + return path + "/mplayer-fonts/" + font; + else + return ""; +} + + +QString K3bMovixBin::languageDir( const QString& lang ) const +{ + if( lang == i18n("default") ) + return languageDir( "en" ); + else if( m_supportedLanguages.contains( lang ) ) + return path + "/boot-messages/" + lang; + else + return ""; +} + + +QStringList K3bMovixBin::supportedSubtitleFonts() const +{ + if( version >= K3bVersion( 0, 9, 0 ) ) + return QStringList( i18n("default") ) += supported( "font" ); + else + return m_supportedSubtitleFonts; +} + + +QStringList K3bMovixBin::supportedLanguages() const +{ + if( version >= K3bVersion( 0, 9, 0 ) ) + return QStringList( i18n("default") ) += supported( "lang" ); + else + return m_supportedLanguages; +} + + +// only used for eMovix >= 0.9.0 +QStringList K3bMovixBin::supportedKbdLayouts() const +{ + return QStringList( i18n("default") ) += supported( "kbd" ); +} + + +// only used for eMovix >= 0.9.0 +QStringList K3bMovixBin::supportedBackgrounds() const +{ + return QStringList( i18n("default") ) += supported( "background" ); +} + + +// only used for eMovix >= 0.9.0 +QStringList K3bMovixBin::supportedCodecs() const +{ + return supported( "codecs" ); +} + + +QStringList K3bMovixBin::supported( const QString& type ) const +{ + KProcess p; + K3bProcessOutputCollector out( &p ); + p << path + "movix-conf" << "--supported=" + type; + if( p.start( KProcess::Block, KProcess::AllOutput ) ) + return QStringList::split( "\n", out.output() ); + else + return QStringList(); +} + + +QStringList K3bMovixBin::files( const QString& kbd, + const QString& font, + const QString& bg, + const QString& lang, + const QStringList& codecs ) const +{ + KProcess p; + K3bProcessOutputCollector out( &p ); + p << path + "movix-conf" << "--files"; + + + if( !kbd.isEmpty() && kbd != i18n("default") ) + p << "--kbd" << kbd; + if( !font.isEmpty() && font != i18n("default") ) + p << "--font" << font; + if( !bg.isEmpty() && bg != i18n("default") ) + p << "--background" << bg; + if( !lang.isEmpty() && lang != i18n("default") ) + p << "--lang" << lang; + if( !codecs.isEmpty() ) + p << "--codecs" << codecs.join( "," ); + + if( p.start( KProcess::Block, KProcess::AllOutput ) ) + return QStringList::split( "\n", out.output() ); + else + return QStringList(); +} diff --git a/libk3b/projects/movixcd/k3bmovixprogram.h b/libk3b/projects/movixcd/k3bmovixprogram.h new file mode 100644 index 0000000..a6a9ac0 --- /dev/null +++ b/libk3b/projects/movixcd/k3bmovixprogram.h @@ -0,0 +1,103 @@ +/* + * + * $Id: k3bmovixprogram.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_MOVIX_PROGRAM_H_ +#define _K3B_MOVIX_PROGRAM_H_ + +#include +#include "k3b_export.h" + +class LIBK3B_EXPORT K3bMovixBin : public K3bExternalBin +{ + public: + K3bMovixBin( K3bExternalProgram* p ) + : K3bExternalBin( p ) { + } + + const QString& movixDataDir() const { return m_movixPath; } + + const QStringList& supportedBootLabels() const { return m_supportedBootLabels; } + QStringList supportedSubtitleFonts() const; + QStringList supportedLanguages() const; + QStringList supportedKbdLayouts() const; + QStringList supportedBackgrounds() const; + QStringList supportedCodecs() const; + + /* + * Unused for eMovix versions 0.9.0 and above + */ + const QStringList& movixFiles() const { return m_movixFiles; } + + /* + * Unused for eMovix versions 0.9.0 and above + */ + const QStringList& isolinuxFiles() const { return m_isolinuxFiles; } + + /** + * returnes empty string if font was not found + * + * Unused for eMovix versions 0.9.0 and above + */ + QString subtitleFontDir( const QString& font ) const; + + /** + * returnes empty string if lang was not found + * + * Unused for eMovix versions 0.9.0 and above + */ + QString languageDir( const QString& lang ) const; + + /** + * Interface for the movix-conf --files interface for + * versions >= 0.9.0 + */ + QStringList files( const QString& kbd = QString::null, + const QString& font = QString::null, + const QString& bg = QString::null, + const QString& lang = QString::null, + const QStringList& codecs = QStringList() ) const; + + private: + QStringList supported( const QString& ) const; + + QString m_movixPath; + QStringList m_movixFiles; + QStringList m_isolinuxFiles; + QStringList m_supportedBootLabels; + QStringList m_supportedSubtitleFonts; + QStringList m_supportedLanguages; + + friend class K3bMovixProgram; +}; + + +class LIBK3B_EXPORT K3bMovixProgram : public K3bExternalProgram +{ + public: + K3bMovixProgram(); + + bool scan( const QString& ); + + bool supportsUserParameters() const { return false; } + + private: + bool scanNewEMovix( K3bMovixBin* bin, const QString& ); + bool scanOldEMovix( K3bMovixBin* bin, const QString& ); + QStringList determineSupportedBootLabels( const QString& ) const; +}; + + + +#endif diff --git a/libk3b/projects/movixdvd/Makefile.am b/libk3b/projects/movixdvd/Makefile.am new file mode 100644 index 0000000..7af7283 --- /dev/null +++ b/libk3b/projects/movixdvd/Makefile.am @@ -0,0 +1,21 @@ +# we need the ../datacd and ../movixcd for the uic generated header files +AM_CPPFLAGS= -I$(srcdir)/../../core \ + -I$(srcdir)/../../../libk3bdevice \ + -I$(srcdir)/../../../src \ + -I$(srcdir)/../../tools \ + -I$(srcdir)/../datadvd \ + -I$(srcdir)/../movixcd \ + -I$(srcdir)/../datacd \ + -I$(srcdir)/.. \ + -I../datacd \ + -I../movixcd \ + $(all_includes) + +METASOURCES = AUTO + +noinst_LTLIBRARIES = libmovixdvd.la + +libmovixdvd_la_SOURCES = k3bmovixdvddoc.cpp k3bmovixdvdjob.cpp + +include_HEADERS = k3bmovixdvddoc.h \ + k3bmovixdvdjob.h diff --git a/libk3b/projects/movixdvd/k3bmovixdvddoc.cpp b/libk3b/projects/movixdvd/k3bmovixdvddoc.cpp new file mode 100644 index 0000000..80b8ec2 --- /dev/null +++ b/libk3b/projects/movixdvd/k3bmovixdvddoc.cpp @@ -0,0 +1,36 @@ +/* + * + * $Id: k3bmovixdvddoc.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bmovixdvddoc.h" +#include "k3bmovixdvdjob.h" + +#include + + +K3bMovixDvdDoc::K3bMovixDvdDoc( QObject* parent ) + : K3bMovixDoc( parent ) +{ +} + +K3bMovixDvdDoc::~K3bMovixDvdDoc() +{ +} + +K3bBurnJob* K3bMovixDvdDoc::newBurnJob( K3bJobHandler* hdl, QObject* parent ) +{ + return new K3bMovixDvdJob( this, hdl, parent ); +} + +#include "k3bmovixdvddoc.moc" diff --git a/libk3b/projects/movixdvd/k3bmovixdvddoc.h b/libk3b/projects/movixdvd/k3bmovixdvddoc.h new file mode 100644 index 0000000..85943f0 --- /dev/null +++ b/libk3b/projects/movixdvd/k3bmovixdvddoc.h @@ -0,0 +1,40 @@ +/* + * + * $Id: k3bmovixdvddoc.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#ifndef _K3B_MOVIX_DVD_DOC_H_ +#define _K3B_MOVIX_DVD_DOC_H_ + +#include +#include "k3b_export.h" +class KConfig; + + +class LIBK3B_EXPORT K3bMovixDvdDoc : public K3bMovixDoc +{ + Q_OBJECT + + public: + K3bMovixDvdDoc( QObject* parent = 0 ); + ~K3bMovixDvdDoc(); + + int type() const { return MOVIX_DVD; } + + K3bBurnJob* newBurnJob( K3bJobHandler* hdl, QObject* parent ); + + protected: + QString typeString() const { return "movixdvd"; } +}; + +#endif diff --git a/libk3b/projects/movixdvd/k3bmovixdvdjob.cpp b/libk3b/projects/movixdvd/k3bmovixdvdjob.cpp new file mode 100644 index 0000000..b556997 --- /dev/null +++ b/libk3b/projects/movixdvd/k3bmovixdvdjob.cpp @@ -0,0 +1,131 @@ +/* + * + * $Id: k3bmovixdvdjob.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include "k3bmovixdvdjob.h" +#include "k3bmovixdvddoc.h" +#include "k3bmovixfileitem.h" +#include "k3bmovixdocpreparer.h" + +#include +#include +#include + +#include +#include + + +K3bMovixDvdJob::K3bMovixDvdJob( K3bMovixDvdDoc* doc, K3bJobHandler* jh, QObject* parent ) + : K3bBurnJob( jh, parent ), + m_doc(doc) +{ + m_dvdJob = new K3bDvdJob( doc, this, this ); + m_movixDocPreparer = new K3bMovixDocPreparer( doc, this, this ); + + // pipe signals + connect( m_dvdJob, SIGNAL(percent(int)), this, SIGNAL(percent(int)) ); + connect( m_dvdJob, SIGNAL(subPercent(int)), this, SIGNAL(subPercent(int)) ); + connect( m_dvdJob, SIGNAL(processedSubSize(int, int)), this, SIGNAL(processedSubSize(int, int)) ); + connect( m_dvdJob, SIGNAL(processedSize(int, int)), this, SIGNAL(processedSize(int, int)) ); + connect( m_dvdJob, SIGNAL(bufferStatus(int)), this, SIGNAL(bufferStatus(int)) ); + connect( m_dvdJob, SIGNAL(writeSpeed(int, int)), this, SIGNAL(writeSpeed(int, int)) ); + connect( m_dvdJob, SIGNAL(newTask(const QString&)), this, SIGNAL(newTask(const QString&)) ); + connect( m_dvdJob, SIGNAL(newSubTask(const QString&)), this, SIGNAL(newSubTask(const QString&)) ); + connect( m_dvdJob, SIGNAL(debuggingOutput(const QString&, const QString&)), + this, SIGNAL(debuggingOutput(const QString&, const QString&)) ); + connect( m_dvdJob, SIGNAL(infoMessage(const QString&, int)), + this, SIGNAL(infoMessage(const QString&, int)) ); + connect( m_dvdJob, SIGNAL(burning(bool)), this, SIGNAL(burning(bool)) ); + + // we need to clean up here + connect( m_dvdJob, SIGNAL(finished(bool)), this, SLOT(slotDvdJobFinished(bool)) ); + + connect( m_movixDocPreparer, SIGNAL(infoMessage(const QString&, int)), + this, SIGNAL(infoMessage(const QString&, int)) ); +} + + +K3bMovixDvdJob::~K3bMovixDvdJob() +{ +} + + +K3bDevice::Device* K3bMovixDvdJob::writer() const +{ + return m_dvdJob->writer(); +} + + +K3bDoc* K3bMovixDvdJob::doc() const +{ + return m_doc; +} + + +void K3bMovixDvdJob::start() +{ + jobStarted(); + + m_canceled = false; + m_dvdJob->setWritingApp( writingApp() ); + + if( m_movixDocPreparer->createMovixStructures() ) { + m_dvdJob->start(); + } + else { + m_movixDocPreparer->removeMovixStructures(); + jobFinished(false); + } +} + + +void K3bMovixDvdJob::cancel() +{ + m_canceled = true; + m_dvdJob->cancel(); +} + + +void K3bMovixDvdJob::slotDvdJobFinished( bool success ) +{ + m_movixDocPreparer->removeMovixStructures(); + + if( m_canceled || m_dvdJob->hasBeenCanceled() ) + emit canceled(); + + jobFinished( success ); +} + + +QString K3bMovixDvdJob::jobDescription() const +{ + if( m_doc->isoOptions().volumeID().isEmpty() ) + return i18n("Writing eMovix DVD"); + else + return i18n("Writing eMovix DVD (%1)").arg(m_doc->isoOptions().volumeID()); +} + + +QString K3bMovixDvdJob::jobDetails() const +{ + return ( i18n("1 file (%1) and about 8 MB eMovix data", + "%n files (%1) and about 8 MB eMovix data", + m_doc->movixFileItems().count()).arg(KIO::convertSize(m_doc->size())) + + ( m_doc->copies() > 1 + ? i18n(" - %n copy", " - %n copies", m_doc->copies()) + : QString::null ) ); +} + +#include "k3bmovixdvdjob.moc" diff --git a/libk3b/projects/movixdvd/k3bmovixdvdjob.h b/libk3b/projects/movixdvd/k3bmovixdvdjob.h new file mode 100644 index 0000000..2b9ce10 --- /dev/null +++ b/libk3b/projects/movixdvd/k3bmovixdvdjob.h @@ -0,0 +1,60 @@ +/* + * + * $Id: k3bmovixdvdjob.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#ifndef _K3B_MOVIX_DVD_JOB_H_ +#define _K3B_MOVIX_DVD_JOB_H_ + +#include + +class K3bMovixDvdDoc; +class K3bDevice::Device; +class K3bDvdJob; +class KTempFile; +class K3bMovixInstallation; +class K3bMovixDocPreparer; +class K3bDirItem; +class K3bFileItem; + +class K3bMovixDvdJob : public K3bBurnJob +{ + Q_OBJECT + + public: + K3bMovixDvdJob( K3bMovixDvdDoc* doc, K3bJobHandler*, QObject* parent = 0 ); + ~K3bMovixDvdJob(); + + K3bDoc* doc() const; + K3bDevice::Device* writer() const; + + QString jobDescription() const; + QString jobDetails() const; + + public slots: + void start(); + void cancel(); + + private slots: + void slotDvdJobFinished( bool ); + + private: + K3bMovixDvdDoc* m_doc; + K3bDvdJob* m_dvdJob; + K3bMovixDocPreparer* m_movixDocPreparer; + + bool m_canceled; +}; + +#endif diff --git a/libk3b/projects/videocd/Makefile.am b/libk3b/projects/videocd/Makefile.am new file mode 100644 index 0000000..1e18d02 --- /dev/null +++ b/libk3b/projects/videocd/Makefile.am @@ -0,0 +1,20 @@ +AM_CPPFLAGS= -I$(srcdir)/../../core \ + -I$(srcdir)/../../../src \ + -I$(srcdir)/../../../libk3bdevice \ + -I$(srcdir)/../../tools \ + -I$(srcdir)/.. \ + $(all_includes) + +METASOURCES = AUTO + +noinst_LTLIBRARIES = libvcd.la + +libvcd_la_SOURCES = k3bvcddoc.cpp k3bvcdtrack.cpp k3bvcdjob.cpp k3bvcdoptions.cpp k3bvcdxmlview.cpp + +libvcd_la_LIBADD = mpeginfo/libmpeginfo.la + +SUBDIRS = cdi extra mpeginfo + +include_HEADERS = k3bvcdjob.h \ + k3bvcddoc.h \ + k3bvcdoptions.h diff --git a/libk3b/projects/videocd/cdi/Makefile.am b/libk3b/projects/videocd/cdi/Makefile.am new file mode 100644 index 0000000..e487acc --- /dev/null +++ b/libk3b/projects/videocd/cdi/Makefile.am @@ -0,0 +1,5 @@ + +cdidir = $(kde_datadir)/k3b/cdi +cdi_DATA = cdi_imag.rtf cdi_text.fnt cdi_vcd.app cdi_vcd.cfg vcd_on_cdi_41.pdf icdia.htm + +EXTRA_DIST = $(cdi_DATA) diff --git a/libk3b/projects/videocd/cdi/cdi_imag.rtf b/libk3b/projects/videocd/cdi/cdi_imag.rtf new file mode 100644 index 0000000000000000000000000000000000000000..809145ff6137ca9225d9b82c02164484f138346c GIT binary patch literal 1314877 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

OE2rw|}w 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

1g|LC!EF}myY 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 z zSLA18qXkVDfnUoU%Q(zm$M=29U(kQc;g`qK`{TMA>6>bTl4j-1Nt(7@*n)nssONZ; z(1 zGI49^9^7Ijgblr{17M7G3@ttgoiJvg@Y42}iJ-qqWI4=4AZs99?uw|cp$U%A@XbC; zZ&@R56NQWC%h(bPmI+rkK=~jqc5(wbFde#+ExH412INrU1iIB=Y)lxs zop{bX4E!O&)2$@q5JR6n%d((_%4f%^t`scp{^o5teTT#)JsgWVsmBqj$!=+)f5cC7?{apnfB2dAO{0x&8?ROin2UEt z?djy5hUo|$r6O}Xo*2>OWz)k%v#hz=ek>%h`;k3Nw78R zsN%RsP@*1b1IY@cQ{8d3z{ik)uB)zQ`T1s%b#uMuoZBE+O&nzpWBx=sWADX+&rUadL1<6{`GPH%d?OgNk*anisHE$);9Ldr^vSuD1j!KuLB8UIz@ zx5diC(mYg_R$cJ-I?payjbv#Wv-N<7U}18+aq-s(SKPIJ)P5&U12y9{1^R>ow2UXWl5iOgT0A?Ccz89fkVfZekto! z-(cC(2mg7b;ScGD*mbjdfmOT;#R3tzSro=od~HEi&v7K=;UHrj%VN|vV%#HGp$C3$ zX6_baD63R$<_5m)+IduSOtEXQkXlB)Hs+AIHDHamjxt843^x{4(bV%cM&`ynoN~5P z(}HMZi`%Obh{KydnrZtsj=ykc*YT4&n$IGSm7?3h&1&nIm2l-)V%xrcTU{9+q_6UE zzv}S9+cEB4S4O3tu=wAcYW(LSnX;W2q)MUEbxyK zeX{Jdecl6;MM;EVyb5g2++c8q*|$TD{*R${)Hhu$K;bskXgle_MzG>4!OF@Sw1l$m+dRD8VQpUZH<(s9 zk(FX+H*W+!qA+Ng+H}*KFPrU(X+}eq^sQ(#+-41y;6JdfHdp4275(4#+Xilv#8d9w znBIt^T63_((Cx8(WqzJ|`Kr{6eEMUAl{u58B>jKP=+W_f)Ys#3!)~b%3#Va9_z3vd z-JKsv>*7zw5@G1_rmLXr&M4~w(-{dC$QY38d+ z=B@$@ua)7tzOQ+KKk>SLZez_2y_$?&Ins6=LCRZhXbTVHjrap>(M_JT1)|-@Am9h% zMb`0qGZ{M@yjjwn3q&#On9HQ^EsYwt6Vr1Gm$N^bc&%0ydu_*Ah)oIySRu^|{4pXv zcxKGjzV0r9RycDl#)#MyWq#>%Ha6`;K&i!?MKv8d6Pn)Khf+m4Jlk7KvtuhOQU(_H~Pqnmk_c<%LhIkp#BdllMVvx|$s zv&2^*BZXKA8fS(@EOdCk1o^(IHB7JWF1%=a#6Jv-QP4&CDexEhW_i)x^B5Uwh7ZMH z2L8!|KM)`Tuk@V8kxCXttVRC z;9UZ`i^Gcr=6J6~&6;R7gP!2;w2|80GAenIH`NCz&K`w-;$grZ`<-lo!f1OfANjnT zWdJlf;$MpVa687*s_<9whm%zhHBg0)_)GsED*TO9B-yF|)BbqZz`s$G$T+mpjxka_ z`(^yyWL4nrfqw)1#iqSkG`fjg@ybp5|21}r;mE^jbb-H__D#W`{-4g>o;S7X%mwt% zz{LTZ#ZA++CRz{OkNb_co-X+NYn#!dgTGm|(`3@9ik81yj&No9Yw7>{ndfyX3jf9` zFEIuB@yzRVnOf{{YkR)T1%!D?3_!4PeY4@LRi|y~NBjxM+oGnn0+Bz`|I14LM|Cd` zDzkYT_ouZ+F17M0L0vVOfsi`0pv4Gj$y|h1fa?{dctt-u%O6&KI0zajv)ujKZFMc5 z76JtYqqAC9k^jtIvSK>)f7W9w+=*R3ad80#cq3gWZlT}o!XEK}(peY|3V-B}w;6j~ z4*}7}J;lNR`H%YI3jXLRfZY=P-m{&h*EYnfu&sMxfTmi*!RGnWkf+Y&ngM?984 zRd*irY&Fj+`CsN9=t8l*T(znWBPd#=zOew=n(HvFSAtb!dlB=my$nkw(+@UM8!{CEKh? z&lUWErAwQLr}+W?kw@UI;U!@qv=iqa&i?Z7s2>q8W73jSw7P-|R$SLKwZ?}c(iN8)`P2z{jbZVUS4Cg(Qxl z;x7DlIP==bH8b2fP4A=&(H6v-FiJ8~MVKk5dnPM2O_ScD>= zi%PU3ujmn}lU-{`zaD?=00<*QqaDS%C+qeH_*ZmREe+yJa&&*ML(_~W!$^7jjGAxBTmb%bQPypl=p)Op+qUswI-VzUao4jonV-jaZIi=Xz*?6E zu)NJ^RBwhIW*Avki(41FkZ0AjXp2_dGFea|tHiRSGiHW#mS zb(t+zjRXFHj?%JSG@`KWv}JZrI9PLOq=u|NcXEP%tW#)o4s-9<>PCHuA+Y`@U zZ|O&VTi??IY4&ZiN}FD_U5)?oZr^aw#-TlV_)On8@NgZST!H8O#nM!(UEK=yjPbK~ z@a2oiHH}cS#tLh!<+drY5ty!thdw^Iraa5i5|N~vd~ZwfLnpZMnVILCC~XeXa!f=S zqV9?q56VM@I~<|BG*Df)o2n+4K0mKZUk<{LDY6?|1w^w>9th-|_!k1U~of_x^v! z|8o)0w7>U1PXD9#(~quyoBLR}9=rEA^N#;}pm_Z??)YDi-FuvQ$NxQ0y#5+@{IAFE zJ4&HWrbJqI$(6XouLTp4%Yv{^1EmnCq4^z@xu_ z#N+HEet6WQZ&5(*_Jp1IuEOPXMzr4J{EX8XDMTcWJzaKV&-`98_V4@;|H$7x>qmGi ziOVO3OCl*w*ZYwVKhPFL&m}dIrCq0XgfL#^QPWO3o<+dTs~JUATlj6_8X-Y=_%ae# zmAR5VpSdK^ziK0+gQ(}3LRO-QZTFBL^4!@85vMMQ5&=>FehlcB!XH06@suqhJ!(Ss zLSD?4cuN9ri1&bh!KsouBN;`<&|@c4OfUkuYEc0*M=bXh2xukQ_)%Qj$y;4q-&3_&Bca zO^m9fU%-^GN&7`O7*E`2hMHI93H7v3;s8`RaWa}U+l1>Ha8Gz<8_T_??>^kw8nO$OUR~6IGamiPtp0IV3Pn^XBLn$0bd3%@#G}sRlL}P zvP2S*;?;(b{7$K==3liUt{eM89s4%2?gv6)B*pVQzG;6NkRarJV{om6Puj1{6 zy^hQpA#j1ObGd1?CA3W1XOl1lIgg0s)}0`I4U1Cf{bZYIieN zLhBe@r<93Ag~@uBFh?QYbysgm7#n0lz11{hw1k;EQzUZgS9-#Fy7c0H6a0mlQKCk> zvt^?;UG^9n?jmUt{yCR6ftFNq+lYWA2AEJ-!`-YZjfK}8EY?B7`?RfPPB?e73Bij= zIJay4P+IGc_Wzgh&tR!M;7_jQx?S2VhhEL#`ITvAhlpsJ!P$)7pIyx08k@~{7`UpwkX#4TPKF;d$AZG2G+7%OM9<1wj0F&VX)NrmS{i3iO+so)#yjkPs0TGggYe>5coY7q zT^WwaMkCcztpj|&Vp%%$bT6|SNzZ#}`_cX{s!*f78lx;mR%S4=o0f6x{|L%3v@)4` zWh#cxFb_Sw`3hOo3M4ms{Js8v?BRAh2L33H@{vkn>M#@~lKVYnkp~yHqoW+1rvh8J zHovise+l%9-`)>@kJRfz{%9xs*%8{!SkfwyPGwADN1wGebUwEy)2>oD(nh z{}-m>r}8I-^YUv=#VmP*c7QBSbZ5r}e=lrZ_Wu?10nmB7wx}$UVU&eowA8$*)_^|R zHOOzt+TBBhzNkVj3!DN%M7$G{gg|D;X4VXu1&WCMNAmyJ|CK5Pb%BTa^bG!zz)XHZ zxe;0Sr>|m zSoD9L#lZ}g8*k%P>Le4BE9+5HAS{s$&SFh1#dNRAOm6bLF3bnu|6u+lRS=>88~u&k zbNU?XVQ*?$;Sf94k)!z}RsO=S)&AyDKRWGv_#u_od%XRCEYjlK=W?XAlqKtDJj1F& zo;&)r-D*dcw`ES0wJ5XV0W&8^y&bCp{$?&|r%s}H7f-7)k}t`NC#jLS7c!6yO^T^# zM$%-m;Q01A2%&ob!(_c4r@k?cT%~|e+>Vpclqv~0)NcKV!6a(@k7KU-@V%xIv`2D1pYAiu+-Fb4F9{j ztyWWC2&9jDl&=E+$Gzd#zVaRa&upJx`SbtiAACnU(r!K#ybh3d=zvw z6viT96@|D)_*Jo`;f`{a4&1F3B#*&%+;^wbrwHUgW3>uKJ6>4?-&SE=GA&x6bYrJ^+ zEr0xY{3!r1bLx1C$8gw-2{no{=;jtGdcjx|36Zs+E{Ldh2Z@J*_SpULInSi>Bb1Gi zoz2FO02vOYd2r+kM_sVh+*MMg>_%))@@@lrDvJt<-(YzzT$r9U^O~~oD$wVwxg9Gj z8s#EzG!s%m{Xk*ciKsf1v5rPT!$(}dzM9@!+U~=#_k*pjk6>_WQE^7upb^U<#&t(n z)RkYY>Ec&wLHn?eA!iiL^Z-7L4wUJ0Gn|VM+>SBKcXk@gHXv(=6T0tNIC^^a0^_z# zeODMm@I%YVGgzT;f3;ytV-2k@7FeHggq~y%$E+zV2Te;Wm}6pSWBXWbwE>HEi3T@W&s51)?q>c|Jq8gV=9C@YX!TM z8;O1Bj6W1~2|P5+1Y$$&`i3{g;WOW0KdiU%Ar?c;s~o57ml3@F*FXI$fAM!;>P8>k z7I@F+3$JD_A(c6dg-*OMTk+h>AGO5@4pBJcq>xY17HhwU(bY0Ne>H&_Xq~~txEVJq zQ4@DBl&oI5v?@4ysN%sOgTpEDq!>~$7BVq~h(`z>tz#_MgSLp5%+?v<7gX5uEexk| zm5WkYfR@HKN?Tly^6St1X#DBxyUd0msI?k3Y{3wEu!gm?9d8{|YU(@|_+2=&RAq%T z{*)B0sp7;+Q{xiG>Kc(QO)Pb#Yp=>FoE zqdeaYz^BnZ8h>L09q(we?6v*wnP}B+VHp;e*~L`+9R7WaSd(_iW50tx;-3n@%)sbFLhenx0{nGE zBh4FK;tS2Cbs>HfAsVk<;D4zK^&t0>n7Xt0hbb#sY*sb6zWp}Am7Z1gwk8E84JV=h zd%hv^=M6Ysd*}z_&wGXoWUVM9CsmX{hhqVO@8kdK>6Zdp1qe^^Pa)crdgy2TQHA0q zRN};d5i~$aI<4&OOr~Fv|KiEq?3(581yEm$`Q>?!@&Dt&KmKPf)uYQ}fAF(v3+nID zr&mec$`gnt#UWNb;6__eYL;kUR8JxTC5kW_r$<$2)yq(Y_-$zw)3~TYgrbYIpafjA zx3r|VS*<}mMhRX!czKBL(GV$`EQwJ|3BPhPMQrwYNqN${99^lW+D|4~* z09lNcS9#BhxhQk-4$er!`)0zy5BA9ir#~JG4}N@yFFLEuGQq}XM6|0NNobbze^Z6= zaDDg^BYefr;%~PpjJwNR6B5LDEEh4_t1Sy^B6(vqs}dJ5OFGkqPL${YV|iu?AxQCB zOB6KK8;EBwusq{0B(9WFB^d$QZwZpHG^iqn!e1@~r6qCnzjKL==fV7F`~f30X570J zZ_JZ~xOf((zZXKysF`6(CANTxv!sqkN@E(v2nCeMZJ(4a1~i z&)sem-~&F?MIpVNtVUc|c#Vyj(+dJ;gZo4>hlBB)8h>&XJj8|ZSdO;0l+ROzgp(kZ zB2K2$8Z8D=GiAWqoSOy&$z4E2pH!k?|Yrl4e9{g6XbH9DC@G_bNj;pe7%6 zGi04*1cc@IJ_SFazOR)cES&+V*`>j3*~Q|m505TglE4yk7?b*k%aKw^lI#@N zaoo4G?%pONwPhJ(F+1d=nKor(mcAcRh>y%+Drn5{E%fjb@Mu^uG>WY>kX4@Xu+-_t zGz3?@wk=-$K-77slVU&s|8Tmfc}bsiVKNq1p=20syk2WPruq&Jb9YUhq)Y-HR75Yp zP`;;SNJ)mhl?wjE@nbs^CvTqO(Auh8gp%N|Yhni?)AWeHAr>Rz0xVAorAdV|K;B>_ zB7~@`$|_O#fmQnj{`e8HU0xz#6$i#mX5t&*uNo>{L7m~^N@r#^6H4Wg7E0YEq)pPa zK#wAElG8gCpRm%Ga03X)IOrvTl7T}76>{wfhaka*nof9kNv7Ns1z*5_gK4fzc^DF2 zbd~H!9=M0gy_rs>C?eV5`2g>}Jtb#=5|?BJs-kcsQe{1_-EWctC*xD<-RQ2{eSTtk zb)S2~fgj%gAL38U^sd+5O{j%LbrPSvj5@$OBA{Y7k_wZis3_!5NaHlAZvs+2#h11| zwPTi1zY(^jM$#F6x-h0aob<^h{5jQDG!TP?$KSB)|&%z8$88-wJufQkpmt+^8Dr})w zfd}OQ{-x4zR2IYZvHN51|33a0;0R^;KK^4&Nr@51= zwWd2;ngnwa9aSs~7z+^-Z{Nl;&xS7K%n;h-QqmR=rh*WH8*`OU-_jO%=(g~3_?v07 zt4oDFmSujJFn>IhMZ_JU4__>x-`uy~dcy6-LV-U$f20@*>P*E8mPVxu{EMl$&_(^> zv_tOS#aP(MSYRr?oD0Yue9c&pc}3;|yM|MZP@!+*f1ZlNEmhw>d{o>Bf2HxFcyO{F|^ zrqEh0dwq{wOSde_a8U4vSYD4M_7VTg%$1}|orpSmOfaGfQPohzpL$!%`!+AyTl@L9 zj=v55!o6guO5zp@A}Nq+E~X-JFCC!v$B6{>jI2~S3zacUVxPMZ*C<|^ESYA1iBhn>_+QzZ(&Rm3pI}&tpk+T|8i&!r(Qilqs<8_s4?`m3g=3za zc@m%=`RXM~#+@6NF`~lAoe(rY<;zp6JkOFIAHxblpTv{rc%-G_U$wm%f9+dY>`!l( zM!JepfS5d?7tSFpzkJ`PCp@<&B;fP}$LRpmUwLP?(O_*Q5U%TlUf1@+QkqgZLdX=M zUxZ4r6)xuS`tI?{_)|b106G5n2r-) zG7W^Vayi;#b_XiRW$<1;8d6lg@p_lnrMA`F-TOV)Vx&BJ-o$g~=HmX+kcUTu6G#}IjvI-5lZ1Ra>eMVA$SB0CJBpxXRDoXFpZe{cf9b3n z0napwt-3=-@OjX|&BSPly7nYVsBz-NeF2m~+t6aNKP{^_IWav;{A* zqK-u!f||pv$bhj4`3@NH!D`x&0vnGv#;m)!*e_Wc3*&SgHB=h5WtzSZb=aaIX5|KAxb=I^jX)6wIEkCao|s@KrlE#kWuCpdMI5F{h5`=T3j~+ z8|GaDj#FrDj*lS?e~~)|{N&PVY0S_g(ev;NY&`VBu*DFH)>~cZaV|x|;}?JN`!(>B z;%hlm<4nRyFCYg@a=dCOZaTbk^_no>Y)*&7o zSOuj-a+_+WVRURtBhU^L4`J3>Hq}>oBcrn(rAfS;I-^Q2Fu{MX8EIxy8--FtQxZk0 z$x?=*FdQ8Prv#vK>O~zEUhE)h;^aKTnM;OyKMC{P*!AlUz2+odU&Q*kAFspzQd8rq zu}3*#EnLkS(htc0O!itoSUa^e)OI0dlQx?^MRVwn$9~4an$WpE+D5AYdgJp>W8+Cm zAHlnJoZ~oSu0`uimmNuYqT#@Qw91?jw;gO;-m;niXwT(i^yM^PI%D5O+p zuSC_wr7CnURqCvVHJeAsnNG`DJkUd#r$Z;)S}`kugKU*k&Byhsq|@7}8Wx{`e@Z#! zhYe83-XvUlj?^6{NqB+ATq+a|U8aVU;69ufQN7Ee9NBU9KJ3<+YTXOzW3Hf%CXL`Y zvWmmdp%#=pZ-p=tsJ^d_fA!D(<+FP9Ko$+8MWua$m0BSvRmkXyCUkgKY6HlMIN&4#0ht$e^!ZbZ>UaNH$5-+8;%G@zBsQ&Kk(G%tb`0 z>F{9hTKfr=Bv02!B1-JSwq8t!a&8iYBU(z+!%)~8!%eL-B_C|N=yt)^KtnTwse+>aFR=(IKc6yKW~Kpp=3GSNi^?p#R6XnO^Q}D zXPI7f30~8kv0OWM5LT&JXJR2=r-{z{8T$wW$X#ieIa9>x7a^56e^a-l|B;Njs2%Sj z0#FtLMVlvTIzOZE9Q>R>$AGi+I2Z9^3kQ0ac!mh|SBs)k2RTXKF&Z{Ao9K8nf)4!H zV$HDSQha*PWK=WsSkgnU!2hl2!>uYRC+`LwXTp+2wrI7X_O)8RAVKDhlboRMPcPT_ z>S+0|K>u`{2qf4fl)Mc+XBnM-fvgxxuG4wy1ATvC`Fi7m?4;-w#WGbb!!DqB7JZqR z&(e#_lDejIU7n+%l+TLl?Nk}XBE&L;BALc`m`UALI>>sFsTDWo&^ZZf*kH7-Py(Ye zpL)&1XD+@yEx`Il{7Jqe2bk$`J?e&WMV^f-pWj7bL_s?|gt@||@OXxmCwT-v19^Vb z{E{Wvk;f~D+32Col9LlgPCYV?dW>8Tt^Tx5P@VtZ|3CiHKX%lN&P_pgNZcZg?_|)I zv%SefE2=EW7z}OS4Y+Qh1*u_4&x0Ru+YjT3(ymIT7on3St@XSk1};%}86|WYj3#pB zZ*NG7lRPVqdUI2tn*^KPmVz$^B*MkYla8d^R6&k1eV9YJe9=NjSTCRIVN;+cqIn*g zFBPLsQFQ_29?x-7GU1 zFc_D%3MB&$&2~EUJ0Gq9|Jzr5Sm~0U!_0KT^ucLK7=7!f({a>`fbZ?}^}&ZYV!|aC z|70RMqOV2y3U)3TaJb>HPxqsV)lDs`8utt%DXJCIB8-Cv7d(E!h9#Q*JYaQzvHe!}w=Eqnca-uuj-3;wUc!2456`{k+a3Q0sG&b&inbnb99ur#0W0tu&N%K`r(lE!=Ux5fj{hU*1pm|0 zT~?ghc(rcSWqEEg2rw8OOudiJyYlNV9sfV~Xa3ILc%mN#ML~oUJ${IhS`SyUDw85a zhT^6oIH_@3zNcZF8203C>#)a7_DgSzBOX%03_G5#+0Y+>pNA9M$SGDW%pLn^7?szGa_g~GpS{Et7UDGCz_V@O92|s6V$JeS zc5rW`!Nw6U^9x&umB*fjr)Y+6913C6Vn@Uh8x}eDu^xCn3-i^4@CrQ%H5k}ZW3#R` zRrN|u!U8>v!T|*Y3B6O-5*u+epRF>e#iINOH4?InheTAD~7I% z`{FKvt^5&+*mhU0+fy9!QXQA*3PT%+J;iPzgO!nz{Zm|#kIuZfGH)L{)D2jh&FE}; zzC7UgnM--P65ZHr;CK9HESoYPc6Ig4DMv|s1r{mMKdEEjOwvBSWHHbdvxG#LSrSl( z0k*xE<4HKQ%kjpq{re;MW2VP;Zs<`9XGNly9;$Xf7f2Sce zccY~zk&8hvw-Temz%cxw+YPs4r;fKHS|tq&cY)(ZskRE5XM67Xim&_h4)|+Y7w^V7 zhUd|ZO@a$9`tl|IqW5`(a}hBI<>y($_zwP5YjEepJL64n!ZGe)+y!Fy#8EIK_De#k%P$z-A0hGF*LT6cg7eOc1|*s&!G30) zWaTYM70SqdppCr5pE^E1!U)JBHzJa>Sf`_B_-iG9lJMaDd_Xx#^c{X5kxr)X5(9T4 z%_Oe{okje{;&+Oy5TmtTQOtg zG6Hdnu|RO6)3ppEYCCy!Y+}xnD8*B3uWFeWBHOP zdtxQV$>m!!pXt`AiN}K2C?btXZeS)PMzNmgq314+Gla2TZJSZr^C7xduCR(uXt)jI zq4)uVb<)O}J4`$NT&iGzpuDBrH9L7mxUjPcAPisUttN!VloBA7h(#0&Da|9p0AEcd zUJ+Q|j+R=PDD^qdX=HW16O8jAb#;pr3~_KL)SX!39Id;v$RpNH)1$y5@+Fp;*vcu1 zAT@(@-47RbnzVh-5FvEvZEuE8o$x;Rk0s7FBv7;wGv|46*hI$fa-Zrg$`uuB>t!<& z5l)=i27UhIhPg65RhcI{*`$DUW3^?{T zVuhDMi_91Xf#srnMNQX@4Y^vnEYPw83=31VC12adDJhs(VY)Bn?f;7=(Eu4R`)pOPuIJ55TlN3Y`{RXPK1qGGgvI{q5?X9-#(P8>C%?(QLrXb&d?uCdoqQKRyf z^<IVJ`3P%(1osifOER!ac)Kjes{yIf&7NH&caDXfSyTYFbEb^$<*9zC0sPEK`H z3@@f%G9i~Ht9E0)3;bq`Ji@^qwyfDsFITeaYVB<_stOD0Y=U+s)p`zFvd+V#VJoTJ z*Yx$W;R=Sv0?C-+wv@j*mmQX3`W-%8Mp1j@J(CPJ;w|C zxYDdJH@AsNI97A9X-mcjBZq4sphOYk-9s6fxbu$B^QOP=g1??F4KFFCC53nDxtWZ0 zYhgl^&Zt1$!6~@1sPd-pKdoLsop?4$$x`@_S}oFL#Ce}#3v-#@3F%r&Ej&gFttYxX z@_*rWP8w*Gn+~CMbL6pvc3$*cLr_q|SatX`yB!9hRTBBQuMle~mnwN=FZ-Sqa8@mfd{cY!} znNZTdz?_#+QT<7oVK7hY&QPmd;vXUhf|l)KR}uMtUK7PsId^T^Ln7)NHKNG8iQHM( zVzxl3jKw%3xd77t)w2d%p?17NOeh%PZ4}NXwuh))EtFN1u~}6b)R6AWSr+k1c28v) zmC09{&aA9LZL_I_RkG|=Bgx2-Ey;NyzgcEpI3RRu&PuFquK)0F-u{N8e#9{G!y3=T zQ`6}v9ON|Ac%%{E?xR0rzS^*aInHb6-LLvI-T~j-V8n{-CXY>|PK774jf4^bW7QUh zjQ*55<({$jYYh|fdt}j|f4Jvx;^(FpR!Ybs+Cu4^$w3ySs4<4`?qoDEpYn5$w;zs+ z48T5jz?2qw3)L2I;!7YfZHdJg|37>09xLDX-gWK! z{c>(I^Er2-g0X^8T1iY}@eeOZ`2#JHiiyg%v56!mtwIbbCe}+*B7Ycfp@yneFlb|% zdI<@jK(VH3C7M>GDo7ioppBiGGxyu^^{joF%b9b|%$zwh=kxjOX@B3(nLT^2wf1{G z>v^8_+|~*GN_!{cF<;aBlQ!XR?p=XIvkmbNh-SYE`u?>&Hak(B7_L6Vac884ifngv z(J0yz62u9$ES}s5xP_bEg#T1&g(xgg02UsF|2gI@G8?cR3NLcawx}~9dMRrGn$b9v z((T{g7dy3PTX=VTc7LDYPu8!OGN14=pB$KbC^S}BB>t)Um@0(YW8qa2cSVC&pBjBAi*DfSk}sbQ*X|geVZVc^VHxRgZ@Prk`!{!tggpDxk7{P zK>27_wn*#K@Wv)-I7L}Ihl1L(&`6lUISHF|<25vn`UDmL9svJ*$HVNOp>@P41dc(w`v* zPT1xx3C@q`ImF?iIh^akWzy=B<)j*gr#SAc@By zC3okK%~T(c0vkE}hL6zyUOy(MY(~jR6nFudi8PI=(MDg2BRh?g2mV^+c1!V_+)rM0 z1Rs$ni38763}usF7$-l)`6*RtXzM9?yv47292J)1;*yNPv}O_v8I7E~nA~kLQTbwY z5H@N&;NL4`fgU_UBiiYBSa%1Bt)0QnBFBcWj(YX;V&zgW;jJa|hm+kE(em9E{y;73 zOL2uH*d=~@p`rKrGxmEugq=ygem<>vKZ^KsTN2xc(Y4vHVLuO9SEf5l?n7B(*ZzbU z(uMR4NzQ%SK=+Nms6jCQYm)ZfHn8`3IwHlkmP8zizL-KnU!u^=lV?zu2=u6+yF zN_DbgC|1E0fME&mQDZ_r8Cb&MLVH8}^^E^{8&-F2*M=vgFR z)UYg+-r#&FE46mAn5r_es!(0i$S92H`+0>ych7P_Hi?GSF1Y1>M!CmU5>BJf&7*s4 zb?2rAwuYT$=f|rD--y5fyGy2ty|JO{@tqJ5{C9e=dT1{Qfd5|F`OuB%X_%^ALzYM?xP z*}GCT=#G5U3$!505owlon_3Bp2O3_4P!8L@U9E4i)Fb9UynS2d$1Jt5_RFBNcU@?0 zKQCMiMh`a)JAQ=}pENL!V%CS_^8omlFc1g$5lN;NP z#+*T!PLn$e2lKK{B9R^o%OjC`B@{?|GLSc2I6nT z#o1g>WUt(-&r?HR9^A&i4m!<+Io|lOCpSjp*s`pcRJrI(8k9K8g`1k;$Q7(s-%|`f zzHP%DS|oa1`;SoRysG3v15f_c@gi6%Vxft4FA-Z=+YxiAr>Eg4!Te{tgdCl!3QiXf>mik@{7@ZM$=k=2jowitXe8sUp7XeXr-4O}IZH#8r9BbqnaIu)2*Oc%Fqg?4vzUXM>?2}&Ira=dj3 zp2;Q&VK8&=g!y1~%W}F?;#PvG3Bxh3qMj9*++8OsXxORUj33S9{5-5#D2-`4ueG&q zR8Oz{rK`X3*KML34IUn!KD^x(!ug2fm=VE1P}5m7G*p>E?D_7Q3c-2W8X%O5 zVkWEu%J?a+ONCrFmXy~SQ*nk<$CmWrD0pN_)yzbfR5)Yij8pQ$A8ZRZLln4CA=X#M zv-{UQz>f=z&|Db;B}$xRIy{q=aH15Fc|h%w$qNFuvuHTOw|euMoQMRxJedFq+i=~2 zxi7yUA$D+(NleL7TOt$ zy;k9y6wLHo^0s7YvASph;Q z7^Vxi#1D)_&1*SOc&Uu_UKj zqFbT~X+hPo5XI8&O`^sPp*%R)WDbbtq@qEp&?im~_>yy(QKn+V2JJiw&90F&qigZ2 zX1(aT6b5`miu-OStg}my;WC4O6k3H(%XDPok`Li~t?6Mf=e zAP6!)SS0wDGI`z&D7gjt@|NJQ?$X1+?(tWf`eQWlIHP%8kKzlwx)LQqq~V2ST;Vx+ zB>g~B%u8p}n_$CF;!FI+C+0AA(^I0{dM39RYE8tqutx*}A|WL|330?aImMIK$>Seo z45B^3G*jx{m6V|~{*YBx(!%@|-uBm^^=9&aAVQ~;vu}l==?aE~#YqK@jFmUV*Ri0` z<%8CfVXHCU`w0Hx2iB4?T4`2WbvSA3rx&>&%ZRxw^EIOa?1_QKL#bS0SH&C>lE{kS zVaimDLvj()t8xD(NPE@|RpqFFHXb%=(pb_$$V6}`Q&VwA_%gFG=_Hw`G2}zc{=ub2 zQR6-}VfXwQJT~9jqDf|(WCUbmBf!d3F}TQtu6r8A*t;o0znV&ub;>>PXoY}WFa&@2 zgNj|j;ZKWt6m5SlQ0CSz_I~fiA^hRXitrW?Hv3>b(;H^WfOc zQ&}SNeBOv2AP34p7Y#!u=b9{~;zATo%$icuiYq()3;1sq1SUZ^Y<=mUpb;&;wE7b8 zBkPuG#@PpJqlySAzGwelUs*kq9HZi6jDuS3S}J6j#zr&&sEbC_YdUFCyUD#tGwzy3 zk3^nc5jN@AEdmpl#Jewp;_hjtR2vD=JBG3s7Gm9KeSN+ktKS(&|8D+;t_Tc+qd@uWkwfTuA; z*)z-kZOMXyq2^blW`wfo6YK7~yB^J~)?J-oPHgI_)t;T7 zQ_(*yn~tuoovxKO=UhTNlZ|N&o6Q38Uvb8ZV?R87`E{Klw6Bplg;VLCy_iEKVmqX8 zS*|o?kKGCT$Ew42>e}f%D*kaVXEof$h-$14C*?Th0pkYJ;iwjqCl)?86pS_Rn%QWR zt9twKEQ&6y+2T7b+`i$T0|KQty!GYV;`pJc#P{-z`LFt9bcV8BGE=$C&Wkdvi?sN1 zQ~CrWHo{ZUu0F#OVQN>Q2CXj!8qm|J(;)ztcq?QAg|*cEQQKn1teRrt3yKtrnH4}X z{M;6zMiET<(R~q~JtO>#Z4McIs;!rY`O>cgfPJ4?zMZt*+n$ho@h)jw6X4| z!KAtF^1EMS7qrBNcJ1))wEd#W6ytP6IlI=I`f2(=fV%YBngwT^T4G=1)*guYMPHmg zn{>|ZmzL@jPj<~(WO+Ni!GQS0ogVyL9!iUoc@_tpjMXVni>z<)=L7x?{s-)>>S`5% z!MMGLoxp0V)%Q&i0RI=+@c;ame)7jw4M&@{UEQ}G0)ug@S_|7jw%5A{;}2@Hw~Df2gScnDYnz)n?#`6VQKqoZJyd|M_>_ zZ@)c0LQwd({-vM#)s=qqHhSo{B-*I@91DSdGY^lbky(i&(_MjZ_1^UzXbJ72HC`7R zs{Y;yf&Qf081Dq!o*wESDO_$(!~g7?=}#*Df6Phjbq;Hb_}xGL_y3_vKUzQIz0TW{ zDc84LUEKtMp7}IX@K0xUD zzxeCE?H4NjNYi@1I8W)@Z1$?V_K5&%p^BH-C!kxl)oWLKfh{51>+RrQ(f?i%-LA1- zwGZ14usz@XQStx7ga7FN*0t}U_}lk<$g@-SJPoS3UUNTncHd)cRhtz86#^9k6#^9k z6#~ac;N(B}DGHE$gMRdl-KFwn^*J5_75>M=UV5(f@JGkL+QlDn3ZVamx{OC0$XD96 z@+Y;lCjVD`j(~vRzp4R!?@#__YVu_I(GiC9)ppryzx|wwuNJ&Lym%Gcu?G;}&_os6 z^ak+u@TkQ0?V*{fi5(FT{GSNp9owoN+a7`5hPI$z`_~?CD*b4Ce7AXmnESmQL%2=9 z)x8-4y-vG|t~nwx2>$tTl1CiH*V}ck^YHb){0DgRUbj+3k2wwCziJlRcsT#gZ}`5y zSm{R_!}aQoz3vAHx_@<)U+xVG|7v4)v|Ker1+B>O6w~ zUb+9@@EiW-|EAK9cAL_wM)PjC?dvJ<-+5oKuQ7bh?MRLIY66Z&0Sf=qFd<2Jt`$=E@ZdIfF2`C4= z(0_xE;DE#YV!IOjD*FsyhN5TKMjsIljUt5`WH5b)lSV84*U;EvM3jM>u{iG+s zznXw2upI0H__y_wgLPMRw1PmtN+e!EDeH8rpZ<UU|9&aySIVMkx`Z9uLYddoPK|89%_4*dTyG3ezWl>a~e z%DMm9=|>UM(Pl36?Jyc_AFl!rlDW_;FaP5D4)wNS3jEt~qXFCE#b!468#a`f+di~G zyPx+hVFLVowzTpH{##<1rb(=3`tt^C&!Zn1rg>(zjV-ytptE%zli>e=+}ZOBeCEvs zsmZ6Uoo$DU;D54}RHcw`5?lB8pE+K89)5F_w#^GzP`VwOgY9Ef(gggsWm?a_Za9h^ z`~3OepZ@Y&f9&V~)*bYtFqk@a5Na+Ix)sGe9lc{2YZ{`xIm?#{pSgOQP6}<(jUA z&(c&<&y5_!D!)WqwaSr~* zHc)EXVEcHjG?~GRwv_qLk7_i!cI{vk)vjCJ#%bt3KHeK{%@~a)aeC3PSROWdo?G+B zN!sk!PSG~P;nW_Vp13u07{;2`bxl7^8)0zo&ivcvquoEh$6mr+diR>UMxz_oz8*I3 zQ-gKDl9=9KxR$YBX*P;X^TITZEiDs+?Q^=5G>$F9*q2Q%7=^BV8K$krd(Ev4$LCHE z!$K~jt`)#bu7hayc)~BBXmb6YjzfR?sNbiKlU&YvcOl$`S#qyJ+p&UC%qlSj+aMU5 zNs{FFUxp7fTyu4QY}=}b^DWo?^CTp{_-3bLo(uhNg$(#_!>;H^_`l%)@^Ci)RpIZ4 z3HZ%~%1zggEjRY#I)c;bje`ivj)m68oyNH#d;|PNsya>x?80K~$d8;Lb?x(T7}p&e z9<1@VxsVxS zEo2il3~w`TSGNqCP8=sqO>0{b_zJqL1?wDMw5=|*{ak3Qg$~{9Nt%^wLCr<%M`_Ec z*P`Jhxlc97eKcv@2)V=W(S_7P9~bn@T1enZ{5T4(;Z61#Yr%19ip!Mv`@*dfKT1-k zZckV>j=iU`FU(1X|AS}|+k99HTj@@;ovnrKRIV3>6bv=j@dGX6MP`C**4%nHoH+GU z&9Z`Ft5HMwHH~3-?sk+$$&dB=a9XdAM>lmx)AN@IK`)qH+FWxNYMdp^AJ;Q&SIor1^7!B{if21{XS%9Rxg+mBWm;Z%|521nT z{;1oyP$Lb6hJ}xSzZ+deef!Q2ouJvT-;amPh%HQ@Il4^ybNpF7P7pC$@|^sS-N8OT z{zK!K)i{p%S$FngC{rxE%$3V(OMmX+qv?3k8$Zc5)< zd6 zcU(ie3c~o&X@DY3TZt&a({&7Vn-YKa0O71%uUo^=ab*qF^^>x{zN(nuEJ?rcemu(ug=TC=0eHh4*Rk_@uJl?3zM8nN0DW%{`mBJdHd6! zv=H5YF6PQRH*0uJdoNw`jgDFi+uEqN=0)#~|4T3Vfq#1o{tHC%`Ws@F!$!T`?(g+h zKl?j|ZR;Y_g|>PXB?~J2x58}g&Aa2j<)%ER|E=b1?TEjuiz0uaf8E^9UIYCf7Jr;1 z*ewr%y&rYlC*H7M{K;?qnL?dTa?91Ly*-$N{9%WYjioXU zvE+*%G71vg79( zdSp`gLIwXcaxRQ0(ro;5c7k=#cAUtcJh00+Q@xsL(a$FAuFqVNv}RT@w}hc$Y1+__$wR3t>c0}DBjoIz}HMf`5ga8?Vi0X zb_4mydz<*NdhQ);z$UuEl?`wb=&~EeGABF&2d}c?$wtu2Y~#XhuEGa=F(b3Cp1Klw zV=JG|Fs#{FwV4y?OYN&^3H+7&OzeT5n9WbO%oFs_e;*u2{6n)*W-VOkM-B4X|9n9F z2Th@<8vd?Gxux7IkP?@cqd2VKCf*l}(uq47$DdAxV_%NDjoTpxOl+4-Sdu>=o)+O6 z;x2P8M@<*A#V1YqCRi2VAA8M#qTrfqUHOm9vDopX>*bczoJmV!Pc7+R)+olPmZxQF zhF)>5U5=-!pG|xq9}xdA34`&YfPk$S8?!qaYK?d_Zq$wYjQ^DQdol-1gy~$xFd{!_ z_UdPr1;fJ1hIc@DJEABUJ)S7?S45kI2}E2TPqj}cGTrgLZW|*p<+TSX6RC`#Q>Ov> z_k-((W271NFQEVZ-)a7yLOWs*&(6dr;Z;rLaeHIX=G2z?Wx6N{6#g&JKTn-#A_@Fl5+sORz~}&RsY~602yQ1xf5Z!GC$dh+jZS;$^P!2K*hF;LRY~ zu^+WPxKBOZ4|L^RGti$*M1NFsJB2$;!T?0Kk!Vht$Go9HEmluQc6R-Ew4e#8ky*gr zc?h*nx_%kVkTO>gh?g>b-}?7{^Ct@JsHN8%vM0;u;`Lqe2b>Enimeq(+@i-yBxo&` z7&oXh{}isPIMT95iwo-aI9hE_U5+AxBl5qVy42>s=6&StGO z;=g{R#nnt-EWUm2|9*b>i^a>@j>tanBxU}|^AGPI_`ndpX=oMxZ-Vd55BpiHP(}Z5 zM)KJPt{UHuQ2qu-!#CvNyzt55Mor?`7Iljk9>{*$!B@HG9D-Me_<7tw4w=L)qLdu~ z|9$50eID?>I?6!hP?Au80Q?CSilaD=XGtOzhQ9ibZWu)DLjF?F-~jliF%uBS$&@NL zRdt~jEQbk@84&yzc9t6u<}UnSMGM6&f=5YhsXpY(g1_-#!2Km{V4MBT4)_x+$_#)% z%tt<7^#t_)yMJ@Aq#psl(KgNuGnzx!h0n)lP}7wc!6!$v`cI z?QqzBEr7U8K=!}wI{RYp7K#UaZA(GSQ#<0HCc3NxK3^=R+q{_YfB7G#^zB4Jh5t4% zKYQ=N@vr#L(p(&t|5WmK1^gBH`^P4~<999TM@zRq|7CkwfGAE#m)nx(JwJjk^FgOOt7z+6F1vXBkHh&W zU&UYYA;^b2$<@^ta_J9e!`Rl1%XDgXGN1c=plFqX8ZBN$ z^25ld^C0bRn4UFA&$^Bu$-OxBuO7SMBXOnk{F+pL4r3C%>ZIdQU6GJoA~t#DEV49% zpZp|EBPmbuH}0QWQIcin%%7I-#+p4(p^?bX^|^p5H2P6;J|e2pxtBrDJ!8yC%OPC! ziczZ^py-5zoGfE-{S16S{3!qml7uW%ost4sQz}SFr68$c)^Y8Dc5g-LLRhurH#yYV zY6PL)pekZp%3Zoa6vRBHf^>!Y4N}Z%l17$D8X8lr88NZes}E0``eFu?kc0|US1C;L ztw;sTa-pQ&FeI?^?qDn$Jz)$H-h)1ROy;R}%1H~#9)bC17zC4eb7jVO?cp+oX zAK6sUQYm&tc3IMJh7@X5c^VS+EI(TYxgJsjNLIdpROTQ^?yA5~O!h=&h&3qBMR2-g zc@VAc`q4}Idz2$3Ye4d!B!87PN>`Vv&%Oh}sJfb5&9g?N8dqP1)~~01ZI}Gj@A%(- z)%Buo^d5RpITw-2+f#B_=Ay_?%+ex?%*PU2$*-vge(S-pFC?3Zyw<6#e()maL)k#` zxv;IP$6iCvm%_qaNU|)se>~mn%1q8V5!nmQEm;X!HlIYpBbzMH&m+@|xp0E8@7zk# zAj=ZM@K_Cl6WHP_V)!F2g&p80d1DG&Hw=%m$C{+GO#EwVhh_>+4nK+3C)^`S$?{T2 zFT)8*+=k}0p2GjA7-6Q$K>m`vU|f!7b7D{_us)rgQz+1weR25Pk#=E~sSxW~k#QOf zXOb@OrFk+RLXoeT1+ZjA1}!PgXc>RwB=8?+++HxUa&3{7QD+UIDrL$s&q-q7GAkm1 z!yVQd*3EESw}g#;S@iD+JAaaHS3;!Nj~}%9{^NxRVzST31AmYLtyu=sW}?6sC25#H zJyogPsHr0V7c-b7MO)>B&-EaI-5!%IL+VeK@l4S=#eOJ4{spj~Rro3YJXP6!s{FP} z@fF#}8=HOLN0uUquh~);)W2R5+uh(MSA;ThRZr7+WVv_b4@zxs)wsZaCTTq2TP9+X z!$19Wnx!673W2P(l&TXAN%$8PTETz+S;H?meAiH)DhGjr?oc(wg$+r;^samFD+M(p zP*GZ)F)5c8B_8U5D#xLnTSnbcIb_0pcrYt{sWeK&=uDOE5b|DlS`zb+9rr^@=ATeZ zk=(S-*$st8&txA4@3E(o`vyh!$8u1Kr+bX#0`*^HE_Eh2-!3nWS&~1+mggJ$r|Qt2 zr0-Rpno*JwZxaQWgS5_R+bL zc34`DOsV8oYUBszCIy~SNrI9HXpZxW2-X=xB`Hv+Z%wiW%e8O{14VFLEB`2;EdE&fg;c-dI{y|w(YVjX&oZvd z#>)bia(j7Snf$lVi1tjT;NmT-e}6vsua5k^zQ14ye1|S8{8vF0Birh=_xoPq|9;qR z(sG6WCMdn%J@1JB<ik{>uNbYEF6_26r2Vl(#gJFwIMBsvS(>QKNp^Cw6Ih*-W}rg)$S_ z8#;D;D?T|~d1V6}J7*N$wI{RiVepszOp{V%m{iI=6cn{k>Jq0HH`!y3Vzd40Xdrgq zJ2B3WhZuBl(40_SOMYppT^UrYC^B~g*x|`pUZNEG&+1gF4c;Tph{77jp=4s)8xNy< zDS65BS&2=xmo8mu_+ivDS=r14qlT1VWLECk1qQ*5C!SRqxPybh4rkKCbMF6-f^8M*=a03)y}~zzSvr3{3PTQUQ%C(Q;xBfDd1WG1r&8<@ znAw;#Da)h^bB#uEz0Q$xXAZ~M^aVz&+;dBI=2KJnOWO&KozihKLp{t_c4xN@Ny=0W-JSMd0It)(3jwgu78k%3sOACIv4`=Z+j5R~iVPOu&KZ|KUeZ{(7MwJ!=;dON-Pn=H$Wo zTs&X)vNQr?w}G5p`-bOhBeC+csyOP6V_i7*bI~Pvi|xLK$0m~n8_$I*x4AqQinA}4 z(2U|c+jwRw98LjjJZl&_@Kn46Kb42Y5GJmeyhr%w9up+51XA3i@-ZTdy>ehvZy%=*bPRIr3 zLCx02zR7>FZl{i?@;qt`ezNRj=l7(45e3V28>Kf6 z;X+8=i)nAE`Z8xQq6)0}d?5a_4*z+rOC{0DTBE#WUkXL1IEEAIeoMi0)DY!TENXl! z`k(v3mZ~MI_@B8#SbqP6Q>s7ebRIr51yDFTCTgV9~Y+`Vy8Fg1U<7rVfGdsDD z>hI6S3w;3k|L*_c`&Zm+prFD{DB(F-sFPb(z6>L19K{D0R;R)7w37}eqf?!Itic18&D@8$k3KQA7Czu0Tu42;yeH5?l8sE zk+Z5EcUIq06`2&ZG8#>~oc%0jf;ES~ExXa4w*18Jmfy0jEqYjVtIhpkWo6C9_SXz% z;pg(t4}^a?rYC#%T=*>TS7G78kDu1J#0vMcKI>8tv;!vDC_{eg037J;yT?mzrj3iHw8^)LGG!{v`vH7?f?QdQ$}9V&;r zcF0`fs>bE=yjC?Xm+?64x2neFVex+2+h$_X zKtMm=4R*z<#^v+yy!$Vb7%2b4p>WVaF^re~P2+7( z23c+`jhAX`a{R=p)->@nm%YbHc6#XYbLw0C(g|U4y7UG~Y^grC4K&d#2dzvava&>=a6>kyvAi1I*?5;B#LQ1b}bCrt<%J@ z%=}s~k;-tImez^Mr#f4fOS3q10#riVqC(lls8^FPX!Qw)KlHnQ=g$}Vk>#3lXmR-o zhn5@Ml$g?~5e1ywJs-*HTmw--GKq;_3?C1C*J(Zr|1cy6hK!sb zFx|vH*9fMcQPHC8H?NZ*!E>fY@3u>zu$q#{cbs-!{h+*k@ecxTT>E0-%Hdp;3;0Wx z1rg5e(-Ykw%Kuy^8AC!rZOYQzNi_`KCn_k|@Ix+@`*wEL#j1!>Jxz>ubQ$%tYI3~S zFi1J&i9fpi3uZDHn&;7M)~7nkdC?$0KEdB6YbLg`+#8L|H14s2p`K&K*+o1I<1sWc z6eLg*xQW}G-p%`ozd3(qn@(nEZ`XKdg@}h*Q3sv(Mpmrr-R)$7=f$9fsODK%PX)swQzMA5$NZ^!L-{kI-*IfKC|s%<&F{*tMM)4$ zX4+{Z7|Ya`t0M5*#R1>hNYskG@|(HX2>b^Z#$UEIq(q&iGDFBJa37?dFi9RMxWe&D z)W6JUgcKh|KMBWNv#5^|u99;2xd`HLMp_;fX((GF;g;av)$e>b^Rv_=+&?sXCAAAM za2#15>H~E-bubM4`7BBm6oPNVu~U{i1T*qj^CbmtQc~2d1&Cd{S%h`6atI(UmYTFK z_y@irfuSl)l9fwPYQ|0ZIS7N8QZC?JjtI`DYp2E}h%o&tY+6y;ZiWEic?O3`j2)p#D@{(c}MqVpt# z78rux0{=PBkp_!VA1PeXx2P96bgz;=>F61^$VM&MUalPtBgsC@-@FJ{Ui&6gwkqkA z78S@m&x}I}D85Kzi z!&YANNlPPLCDoU6B6nol1b;+Y&m!foNFHt^&RgrV()43xRKlN=;kZ#x&qy%I#wSdO zw^wsv>h~un?IF5I_w1yV8r+0}%Bb5#=|p*5K0qgoCR+-*2n1ecFC#r^lz3mJ%Pdut zh#Fl}Qf-P;fT{6EMLL)Y3$lQJh;Smr{z|ToaekSF-NmP3f z+-A!rYeJ5J#uo&y#Q_KA{YdJ8lKPFLX%*b z3Hc?Fu912mqt0eu-Oh-}F3-p3v!Jm-Pe^*0i-IWhlMdU7tit$F@K+0zyt@*AmcOtO zK!kSHzw$E6G{`sG@voOC2{9`*k);6Le0Qo;$YK{9LVXYEH8uRqg2}7jLmx~O1_;hr z=wEG4f*Qgz>zg)EfWITSMf81M^d zZgM$lCsNPtjD5feO&ogUbz@jT4wT|U1&k83PFV(j?Ami(k&=_5d*tZ^IW90HxNo^h z){x4x8Ki8TLR5xX!LrZr|#O<_Ma+4*V*2elhYsuq;Ju%z;S_@~r@ic7T3tQ9@Y zuNIORop(tN?Nsnsn%&+(Ij^U}9v7mCQ6YHAQ*)A`3e_{ev4c!pl1Kkg^NP z+=E|(5IVgZQ8K9h#v z<{IS`v+DjEuvUge#*Z!z& zv9{+^0U0ESVk*Lj;Dz<;Y}ZyysE3~mwl7XMx-53DqH^k|L1weFflX-$s|-aE6?DDG zit=mx6WE=MYp>zgvRRs`%ttcuP+{v%H@lZ4a&j3i%gpG_=F84Eatc$i?pPQ~ zIv1v!8*Heah?T<1+{!q!iXB>HtyR)?otmTKuYJNLRoHobF+rD+9+@R;&LIFlY)4c< z8Ow14s`8E4@x+E2gLS3z_qhi{#6{k|8nwtvWhP^y}4EzaVNbj)@=z1F?+==4J7*<-X zyL;;MNhKwb0=O>3K!YQ!3eu6o|~+{UH^NOxrhkK zO2dcF=?TY7sUSDrUc50URE_Ji7KCMF;a$9!n30ss#8#A2$2N*a4mJ%8qaq8=&S&F` zi~|&;1DkoOmVBeS&Bz-U-#aTo%cnal<+OaJMIpU%7YJ z&oS^q3l5gWMt1xAIQU}`Gej3EN_#_T zL@dY&hFI7OzqxuL*f>i>q65XPCeB7)UxcbCMnuy!>Jg$~rbK~mh$vXWK^(h_3guJy zVS}z6pD&o`Lh9Dfn%$dQ7K#LZ&BV=FG*I^5W zp4;imSAZ=Qjzn>M1HS}B38P72KZ)f8NsDOZ^Hl2dLgFR+nIjex3y{aMWX+0S%Pc&E za_LF@LcR^S3}dN(%yN|0{78-&5RY2Hl*&=Q;g6%>FY#`fhioa513FyBKZ=Hv^TJC8 z1{}^R-W?@InHkC}hWOTI6VtqdQWx>ZOwtO?dQRE$Rb3+p$Q>+_e!w?J4J3=Re~c z@ux11+sp&&kJ~6lV|Y&jLpEhQFsJ|A&!wJ>d1_@-$InhK(z!*p6Uikia4C49kGT(B z8X>ZZ3hE8c<<7;(KM?)K|F2MwR4@DZ&k^QAYR)@a%v@;q!n^aiP)@NVa&j&~fMPh~ zBnG^}`FpZa;uL1v$%5QDvzcuf!a0(u$RWyD(Gt`WJ)!~(7to@sQX5jy8IgcrYN{-= z(rKJMC1R&=qb{`b_CJpRe-v>x27*=enbPCJ@+jk%IRVs6u7n1HwVV zf!FyT^Coxv=Lq=ANLT3zJXE}tD1quj;GtE9+2+^8#=t2Lz(QnI8nCsMu&qV-k&^^P z5Iol^c!oSma1gsc7=OMS-pr)6mW9Q(#L;5 zzbzTg(ocu{a-^u~J-lMXk+sS|8Q5y0u!klO-^Aw&|KYKErN=)t{?mW-P0G>k2{drl zl9RkLO8FUPN-iInp+#8w2G4v2xA>-IndHa8mA8SDu*Gfhr^aQ1!*82jz5@L71WIzx zwnAnn{1fPZt6sha{No46|9mI>w}VH;?M|k*xABbh(25Jeyp6N=!}*0`KXa{cBUBar zZ**sQQz*Qzmh`C|MAfzA@^(e zeEW}G{KQ83k)bgOCjX~ne_tEC`7B(6ZrdQyeTz@CMUAKYlk(Z((J%B?VMeS5!5>Z} zM>cN$*&csQYdtan^8eXq^Ul81J4KsB36-ibSWLFXUmn^D8GOQ0<}CXpr(5;6RY#x6 z&F!Wtt*Fr77E9=V+eZWy!9FXO@|j@t?!z?Xyszz{1pi%!R&oAC%5THS~wfzFxuF%zgz9a4hHs`j{2R4HCN}CzVC-;8~NAfPgH;Hia@{9t^&4p1#b_}fqx|n z_JHHAP4qjJk9b$?_VFC}@1vQjjU5r_KM*8Q*+q9m@9mE%{9D>q&Y3^|%YXR~RraH| zW53!$pV+zfsd8w*kpqRL=UhLHMSp`_0Nm{U!k4_;9bwzWC&gjZ}~Cj6e?`S+y72 z8NN3^DEPm*k*a~65$JV_!x?vO;@Jnk>o1RgO{E__3(u1udY#HJ@dT6uUg+VYOe-7p z0TEyBO5wkJsrq(61bX75JYauSSIY>1f29m9Lvqk>;D1nC#IN-JkIPCwT0g}-@fWZE zsk(Xq1bPpxR<$oa0MO5LA^2DH{|q<>xZHcFd^87u`PnXd?W(B9v)~-yhu#Mezn$~H z<8Q0eN_Cv`OSYe(6#TOKIHejSRZoDD}A8Ls_;K1{*^QPi0I?P_{CNgS$V`6Sm)3C zkw5S)|3#r69dT%1UDv&b%Aaw}Nv~o%j)^|9fY_$vj^OL=z1Nvl_#cr3dYy{@9}#}7 z*V(N1Z~d)5_f4fAZHCpZcl9TgU1C@4_VHYQQpw_d;J9lW{pqX>^I{Lrr&SNhR9WM044ukvqS z2k9N}kQ(Lh*nHLWD+u&ERnFBb5WVZq;Qy}eSB<}nKy_Zr%lN$aubdaPvt4M@u_eEK zcw6a5ucI{>SG?$Tl-}=-!MF+@eLr+xZyEe6C&BA5z1tmw$?V-_!MhFq3uqYptG(C} z=W#GOj{N5Fbqv1mJ%a z_8c>Lbpa%o>4Rehv29!FIsi9$N$^h{XKi1G!aocQ%PGo(>#=X7uJP)~HtBi0dj@Za zSJ|ScG#o)5e974L1rN z?5pU(jlw(Aj>hIi99oVx3ge`1r{T=12a#!;2b&4--vY+nZ;gkVV+5w-_z^^DIL@{I z;M9V#g7)q}BN#!2Fu zer#yEd*?seZs0q0t5_tvzx;+z4i1#Yk&FV%3>`=F6VthhJMO|<2**flrxxqF9u3X( z;%3%C7L4tBJc?{9Fl_gVnM=dSshbeG;158lnZ}w^4@QP<3gfv7+U~92anD5p2>ybt z1^y;WBypT`c{Catrh%ANvcUC20Xl{Mk4t&^l zJ==6|{I+8Up;`;J1F<``Bu$NIs2i>ycbp5qZ8!WVc5L62nd=Y~N<`(r~mBsfP?>sPThYL))iY;f_za-J@OSdvU2`E*6TLovJ*c} zy)b1_cEbzDUb}~Tm+1iicWL)Yqe(D|95)Vytz`WFaZdm6p6r2kbQ!l@AF;_qpu1fE z@rPggpA`C$F$rU|sH$%jV*i87bC6x;PiP?31}@skyj8 zFA)(e8?+36k*C&K3BTrwBnSe-v4&9j%j9E%|>?uNj>fZa00zZnV4*zF@YLOqcE!Vuy7?J;AU0f%f zzQ_>W*ZDnBf&jL}Qh@kr%x9b8UK={SP7~L@PlC%%+eIo^?)hPKp+V;$Mj=g0gQ4j< zcd>tMbjOA;`Wft2De4yR=ftn;e%R#Zf)V+s?UC8AA!aMNjr%p(2*7*<{xqk4fg2ff zYYwc`X|TWJWAcE=UAw`2TS*K}=lg(|+v!!{Z}=nNze(6~``GE+nl|=lRwMSAo(s`t z-~Th{@V1BeWboe_A(GXw8+tIb?Fc>;`htEj0%PP`mcj1e)}Pw0dF6LfT_6ocH+QX` zqYMiW|HM6m_;1-5ux(A)h8Y6?Ffd(ZkN|!^oWSr6w}u2iIq5l;m?ZQh@H=)w^Xx)o z$7>7m%VZ7B4E@+{z@KdQEGLIzT<`SnfK%(Pr$tn2{RN-Jw2% zPW!;{zx~aA;M@OC6v}TXoc&Fym@ckTBVM_$)3Tqi2#ZMlPY`8Mdz-lg5c zH)@Qc)T*yFM{hcqV5ZmX!^q!!NWlNuErm_d{2cBZbPuEkeGXt8VT^-rYwKS1C}Pc+ zc9JGhWLk%FWXMR9P&aICt*q3;M6=8&HntiPnn7%eZZQ8K|FwHNcjnA5ul$vSDKGy< zu|1q@&;Ai~65M4ujbMmQSC3Z)_C8-xBBQitop=vc11Y@bgCd%^SR(lS8C_@1L$aqE z+wRh?m%VbBdUr2FtA}3KL7$FhYJ<0~=?$(8C)@KM@Sj@dwccgJ7}##@HA2~77#rN8 zPyImij63jm?I$*xf9SvZu3uhMkAy~;iv(N$7UaPO4}wxVwqisw7l}95jf?Bc|6*;o zF<}LXhmmC0&#rUfxE}jjOXi{;gkxU$7B(@8Ff8KX!uM$R2uZ;pic!*5`iX&qxNBa; zed8n@2a#2`%`ixNVIVFNafd{s5O<`h`qgdRwBW%ZYO=wb2M?MB-_f)0=14KP0 z>H;@$Ei+^4!AQ(IjAd-$Kg$Nfjyoh8qHg1KQ~2=Ba_qB6tfed)gZp%w2m+VE%Lm61 zmZLO7KN*EGNJC44ab#mp3h^+DcUmkRLVxZ4FiBk)^k z58^j~@R8^H!1@L=QRWqR-@7=9?;N8t53bkuShme~6euWjLXl;0!4%Jiz>aE#(S>WrjQ(8v?)BQ#0nH$4~`BHa(p=oCt}@y@UE}YM~Ky8ozCD~;Sc%4-l8x*BY@??^TA)7pAE5O!F?cq@Q*!lc<%Vw6@Mfi zNU`V@{(QrL?A-XHln5Q~&YS8Of^EYeTG(z<$e-aY;O})&pT+G3?kV^izFy!jyvDP7 z_Rwtvm!arr^dm2~27hrhLjOuOEa7io29Jq#_1AtsCh5#_gt8W}7Q6t;%|4h$A9dIm zYk|3l^u@Ix@i8(N&TV2u1GN^!dzkP}F)|@d-)Sy(P)TJiI93fCvL8OkT40l;nL@iw zJBGv55Xsy?xt%%NRN!(V#+z~QlG~iW2|8x9Tc#$1~aEJ1WEBId^RZCTf z$TcRyXN{tPeDa5p$XQ1P-OTYvhX#j06uF3-b6H&CZ;nu7GA=d&{|>qk@AU+KMZ?I` z0{;YGn3l=n#1B!@;e;{xHav7*OE%F$|4P-g)ZAtCZ(D4)8jiSRnBhzpN5i!5dHYTG+DL2}o!wvKXpD zUDw@)Pxy{LO&V&aQt}^gXqpyLJ+f2i=ekhC_2EiUoOtIc^TY1p!t`+@hPtV=9o%E^ zf3*`6T~u?OPf3$sE$@c4rOUl^E?WU~QHxna!*?C_9Q4HQ!jiop{mK9r zNANdH_GJy*Gn;4>*|QDbm%vE&h?y=V{9n3K_|wxgcHK{*P)Q-?x0r=};Exn|)Sy?{ z4mqL7UpQvVsNO&4 zOn%BvZV~?*e;n(D2?1C9gph|^7iA9}B`iDhl)bjD_gH^I|H$8eGIH}v8a8d^<1@m@HW}^8CzU5wm#&_Krs%Qr4;cffBlGXef92g~7r7O^sklK5 z%$c<)jV4y9tKc(UX)c|_>>rB9c!iKKf#Q4qEaT$!ii_pFd--FRwXm0tt40(875>L1 zgbM!(|KlQX+}n@9RL#Zuxj59-3jaePy}q9c|Mj>W>S~4mp^#qRPlf+_Tn=@$!hdt5 zJHOz4dQbhRnv2cn;yv!H@P7|fH*d4Te{-zf?HY@x$$Lc-q{L1i8N!;k| zvq(_)Kl}FY+n0Xy=DE=0NqlENgo%E!u1>^y`bo!$Vc$d)80!lT ztMCu}J8ER@O#c$CXn%SY6e1#{zI&7LpJZ%Zq#?=ML>cnzrpb>V8Gp?hNS+;;rJv$3 z7*ne7Okzn%vAQD4G788tO-Z$=Id(>E)PQcgpOUV7N}4O>umX$1e)=>B93#3VM7d+s z!_e&6cjT|0IR)RQJT#?)gxX0nr9u{rBqSYG)g#g=0((yOV2`rKAq7hv+oJ9zi3xF= zl9ywN!pX~uA8#gp&GMqD>!^&qAvHOPTqUniS7FAceHTq!H}nV>eIx-$My?YGo07Ad zGoP69o}}e_@g?<&ALCosC7*)8Xv1|ceaehT(0dm3OL~s9dJ_&vmmxJTx+M6QkXn8v zfIBpkgnY_73DhM?Rb~0B)Ql^yN75-wPF5Murm2*8yo_eLO7WAjjQr|R|F{ehmK;R} z>bNH)WvP@`a@*E_UXfLvj7QkgE$RX#7B+|s1L zFKnD_I**Pij!PD$WOYbp0MXS2^`}17=YlL1SQe+GvXK}@L0(k`mYJp%s{0a6?Z=Yf zrz&9!p_p}dL^>b!eo3b)V|mxp{kQ)=KmJebq8jaCCIWv2AkQ#bY%htOl>3#)&sEi-enk}W_sQg{51ciSGiqzFgP$^2x&!gZkheyP9(gYO# zLcNkolFgOZgp5f8D3kOO7G$3%Zw#t$cvGuKagatfccD@jyq3aWl4NS0OsA{`-LXu= zISZz`%FhM=8tGEhwq~MouJ#nmU9Ri_{|MYKf{qj+Sfqb#Lo<^#J^ zYiALEv#Fhsq^j7Ak_05tQl?JM(yJ7m zaQc=~B_m0bU&7z088eDl7YTkD|GB1iYr>-7m<`UFkunvm9q%Q_8zbDqLG7SkC!>jdNI>ZSZ~V z-aX*Y=+g)ua=V8AHz-i3@Td60TK;6Ijj#vRLKo6djn}L>5?|B9X=UTA=0# zRo}C;XOvu3G(^%uZK+cPwS=OVib_XgqDga#6vKM^XCL^Z=L`N)h{uZItSXr?OE?t# zNn?$rbPZ{djMoSUlBSpM%6OOai`mrtM4FP3HlE8D6{>XjcpP2fDN?N<2_VcDkC2s^Pzq21Db)F*yNQD-?JPx5Q>f>0p?9*6JhU`?8=0Rm- zDJJ5ap){E(xw{F1Ql=w=KX6RWqj4|z)gVu{CQHx>fd7swvh7v*oC2)Wn^M9yt9v8x z3-_7GF4$Cs%+xnZR-2Mt%u>u*5oAOq2Ko@urjGA;JN553Ye0{&c&*bDut3*DW~z@K z>bZ4Dz7}byq`$Hqpk9=96Xi8lm(xkfBW>EUEqj{%szfn0M3i|C)kV^1jnG)9vLqBv z(`7xad~}qFxpmbT$7;N!)KW&Wyfq2i)}HIH?}7c4!+Yx=mKQ!2l)6=08UFQmG1+f5 zknL~&NcdBxk24sye+M=S*hJY-@9^j`ANlvb^H2YSi|Wxwnu}xNa;&~9{Evlv*6%yx zFMd@_5m|}R#W&Tb;mJbXhQ*)Czl|`S**jN{ESvezf4npPsDvCJ#(7tH301J*sLz?+ zh@}1=C5F`&=^2DFzuUf8eBLiLU-1^B@qdiZ0r2nW#1>@Lf#jW~I42IN@O9tte(}%x zjoC2D*7)neKkQ)}NHOw89Fm9ERd!44scwQP+x$@Pg;%(!AWn`pbnNRu)qGV)!Q_5t zOMK3CCsW`Js!d86S*qMd94E^0tO@?$UU;4K>?>-}jly~s^q}-AIUR! zDslkqm_uLdIH_@D^Bd<}-cnJ>PH`PmrkPPj>;$n)9At)8$^Vys>A%Kx^3staJ1<*U z5mQ0o%6|QN7`F90Y|)hB!WOSs5ff?%ilsgF@k)m2+S90(**w<;ti{%tao;9sVie<8AFZwlj5Q9>Ri5d$kFV+2YHN>sQ z{@bH4RZJ01@gs-bSS{W|sJW|iu`|-^AI$K_A5Zb-Aq7V9pRwter6A??Ja1%S2wY7l3oudp72|6`hpYZJo-E6KZ;`o;zR3<9Hrh!?@1Z-#iP zlcj$BF@Y9RB0Kj{`+|SVJHaK{izqyf8$nLa$~;5s-)fIn-yi>|DHzpRH4bT3Hns-AKVlJ{fJ2VI(V)m*hQCaXBZb=y=F=cTvUvdg0G>!-- zLWh7IIF_8KuoM2W9?E{<^|XBFP2!CH85b*WV4ov5sLibCUm`QI$N-*v-_QHwU#LP@ z53$jea7LF+>O8nU;xr=g%hif7|u9ea9a3qf!@=C=;#0`SLxR zLaK|rNXi*guK2;dko^)GiRIm9-lw@NNUlwe@c@?B*1~ylUf<$e7>oU8yoj}s%YsvX z=nz5|iwyEa4@mH>%{MXcJQe$O5j-92GX5}K4Oy_b7C3aEz+YrB{z?2P62Hc0j=vl> zu+dsrkN-ly3u_^h1?LoqN7JCawu6`_gZEx9#e{1Wbw237yT~aFT9Ak#=p9NzmmnB z%qzOvD{uGI;qVvEqD34m5PFtg?#1Bv@LY*(v`(WL5nn{iF7L(Ua2VWY4M$|9=%U$P z;F2@bBaUyr$0rP_Qn^^+uL|n|!JPlF7vON2vfr3J3BuU-&%`rLNo4kFk=uxMTJBH- z7T-Rypg1FZJ1}>+`ylue<>|QE;*_+A#tYg{{}u-F2j#|S+=lp z!b7$d=n-8Z=S&25X{Ybp5(>>(xCQw?g`d-%TMOMja$X37V8bQFlIyXACZ-;?SFu_U zu2tuE*iUg%(+-Gk^~gKJzc?0rz^Nts({&$yL{nPtV_fjlD)H-Fi<7sgh)mt$t|p-u z&wZZhS2?OR&c6*MrT{Z(I@axC`krfR-`97A|9|>{?qAu1cJ!9l$)-X@PrRj>@>w}N z!IU!ZhmpHwzvUmh&PCb4VgC>VshsGxuU^H?d`A|~zS`TmozD#at>5pXKTzR++!?Cy zukaTHjF9-u`noW-W_m;=5y=B}69y1A=JDya0%jkE1cAs;x%P3d_ zSi>|&9TA;;a{CQmb4LR^i@UT?@dlDuEMY*>%v@H|c>CVNjM>fj6Y z2!fCU&hR8#`$>Iy)3kjA{5=k-&G65H=cLdFc&YkH!-Zqd0-p z+9B2J${vVc5&Y#a=nQ|)&GDC$!^p!&(r{|BTf_ABa2OBpYm@Wd_e4}?f zThQYCy!Tuz_Vx5{!9TUld!q-HPeDm#IjOa91uqJTtEi=99btx6wzEy}|73PL#y!sr zBYVCU&~gQTYK>6Q<({K@y?th7KYg=JuN)tLJhe9*xv8S(7VxjB#8PB|Kc&#k0H?sl zyhskgHHngg{XgMFu1^^q$szajm(1Fm!uRI;J_7!dzPcidNy97fe_j^jVO*63+OjP6 z+>HOM$YOP9y~W9x6jwX)=I_Y($6jl$3l)LvivNJWR0_!t+x5df^(7={pGqwr$DDgO z#h#PJ=t3i8289X~{#V|ERNhe)YBF62_m~``oeZc2kVj*@nUHsE;JElpStvqmwa!4I z7uh#mARt8-RrGH#JM6Yvwin>F)nZadb-c?K9(DEtg1@#(|GFocuPTd}hJKI0^=hmo4#|7uWy;p1Dz<{rGSK+?` z$br9B_#YVXmF_D1R{%Ni*9!jw1HRJTN5=p1&;MV){%g{YKJr|wkj)qQwZi|n(^}zQ z;eT8Nj@x@h{}uk*An-8w{Xg@i>POXD*oG4Je{Y5V{xRLA#R~sz(AxjK75@9jbek3{ z{I@}C|Mz|g`2T_L|GWPBm!Kbg33IW33O!tlpB4U;^jJnFUHQKJ>$`nR)4kP9{+#e9 z<HqL`_9rIeF8j((n z??Z4oPk`ZI9&=yi!4=}^n4^}~CYh7e$r->BWc>Eew)iix0P6Nw^Fv#98jK$6#=3%r z#MWAFRw_RYIqa2VbtRU47mlKwHaRCr;&MqGrst-4IU+%IT~kZrD&}(O;`%SC zN*Iv?nN~hJ$2d8S{iOeIiGLPdn5`rGbPY&QFQJW*27kEnkuDV9j zT~<(zgzSJL3pF`6co;OCz_P-j-jD=iNh!|Z(K*1W<7LN;(Z+Z7e*D+Gq#vaTXFZYb zy{79Gw6m{~AN3ttmoiXGA85j9>?izv+qvKv&z^l7&LYk(a&N3hKXmJ_EQdJiO8H3& z|0jKOr81LbYS6$_66SaxvIg!_J&a77I+&bno3Iwbo_Uc{lPPJ);m3;~!rZA-_gqx9 zv=dGvPSKL15LiZ&sHXVaViPNWOD}p5&77>r+Wc4Gr|{bR`y2k+5`GEhAE$CW)ESv~ zmjSsgWJN3%g*3vkU0WO*2=@s*kJIqx%+emZ&OWjyaV5xyo%%nq7ZkTl_gQGbH?;vTQoX(*6JJeFc0~ zN7HvsLK2ALP@t4Lv{1(>Qrz7M8j7?)(H1N2feReMc7g_n1#XCKhK83v%hudNgBZcxIx8a1x&_ zPD01YEpYtT#1j7nzo+&%0g&9l*g81aJc0#6bH~RxyiZRKk&2NQll8Br%Tc=^d1Vz7 z=v+SdWK}f|aH5D~8k$%%!8z&ebPgUNPaf6|9n7D0?0iqtHi7gb>n2TF!Y?-tcCfLw zaIk;q02_Go2Tfma{1MNlE$IvXJ>d6)afXp99+(3LORaGNpwzaYJGHX6haco7mPlzs zo)QG$9Gl*ubBBezW;V^f7ra@}J!kU}wpDHIetL!nuf=Do%F2O*jV!i#9kp zv>iKx4DUYW#%avoG;ejU9jY&S2YbBZXfL24n}?PitSsP3#R_j>6B}~vVee?~XhBEq z!l)jd0y<=C`Pf?cuC&BS9Tvz;jif9oX9i)IYkU^vNUxLJ#BdmAnVC1SePC^Euekic zD~FMn72bwc_CMfp!pRF9vRM2yI~-HAkH*8=5knR@m$7rSw|(qjhmi_8GBsE{Y-WkZ zL>(oD1@&o1JZRz3Aeh0=Ofx!JlBy;;RyZDbgwFtLiw-vTte>Yg9Zo>eBw+A|(*c^o z%fvU7LM)zJJY&WQ%)CQlsf&8*EjST}K?w+2o^1+I={?$iP;#t&9jU$r~qEDenW zTV+u)yq(ro?95^ofwxGnU$AXzZSC+FgD!TQCHjYEcK57Wp@qU()t0DJS|x~dO}v=$ zD9q>}T6p#`bFhO8Tyr}IN5K)RO7WU2T7`u*QS#1hYS!`%MpywRZ5ri`M{>*;=C~Xo)xOu61kWg`u00*YOsHz6$^dcBOs~0c3rM1>`7W9Z(3-wcLjh9L+ z5$ZDR;h(d@c&C{S4#6nqX8icSaqXiq5IBwFy_smJMr;TS3sWHG2lnDrZd{LKyNROW+bth z{vE-{{JuGRE)Gp0x*#~(7aNd;pJgknR+>>Bje~w5>sUM$iL*rUnXV@3U*tfovM>(O zu!P6dX7F&OH)>``C=rZ!)%Y0vp$3xr;q4o5jpjYFZF=9jGYqcL3)tJ*!xos08O`k; zz#kBG9Cz^x{n*0mmN-zcz_|g|G*QOcpxM?c2TcafbkNocq5WwoReyVQA+}BBX$Fio zEga41V^_DCfiEyR&&i>k`m9`axl9W`i~cdP$5fcA*%4UcrL{>5KvV3^hI$IDtm! z$XFyks4T76x0D?!wK$lR&>v#l(gJMmTeY^ac}iaoaKH@>H*IZ>t{Psppi7HKHaM9^ zkOD0kP1d2`LAR{ik7BHgj|}Y;CWj}9{sj*2X(YqhKD4o;6Nl9AtsOca=IBloie1o< zSzE#CoJQYjWHpWn;b+o58xiWhd{k^W!cqp)iWC@3(&6Kepddy6(yTg10~}3BXp#Y4 zI2tTy9~yDM$xW!voY`|W4^SJSes;9Fx)R`wrhT~%kgCjwWOa^YA z;Ze{?05w;mJ(##R!~B^oT54-Ld0q>cK(K3P#ikal(T!*mQFU?Zk0y>r=+;~dj-IZg z+wCKHGt~L%%;oF>LNNaYP4X z4i{W{A6zu)qW%oP^L}989K+x5t($8(sF>9fG+FGIof<~V3a@iElVyXK7V9z|)sOWO| zgnxvo%{Er@BLOD+3{+uJZUQ_l>oz!&6e}M%n-vG%s58;yrV*0#RstQp1p0XgJa>}^ zM<(kZgF(zwDOwOD7Jv2hkC%l$++-vST=Iu*InwAz zcor6DK`pJ#aX6*A-ZNg>I)Q%P{=Qjr`nt20CsK9k*LMHIlc%*M8H~q!M++defL>34 zg-Hu-$AB3avGxHOZp(Dv1T3MUy=v`<&pzruR5g{J1wM@_hJ!ap2J5$?dfWCG@TeZDlfE>MiXCHBz}lSSc#-6-V6gD7DJsoz7_DL zCb#1lrsDKG`Bt4#4$~yIG3o~|_!e(TtJjX0IoIqWpxFxfj5?7rJrVeT#7Df&@KEMl zYrsVPJKC9RKlXJAOM^t+cmww)>{k$St6x2YA7chb>8K4bXox8EgjB;c6@y;KW_RJ6 zyw+x+c1fUr9a^>H{^}{JCw9l7!;^ch)UDGmBOMlG3~VDnug-B;f;L@--<1AMFW!HB zjvt=2)p8V(2gZ#d$OlN z50Ag87w7*T0%tF5!T$A2_QT`f&{*_mQV>;Yql(di4EItX-A#Hkj?oj zw?A9xH>ZC)jJc)KbJ)0M@&U^b)4Jz-KG z^F$9ZPb4n`)IuJ+b}e+*?6BUBX;|G1kI7sEQ`Qe{+gc(lZ-vL=DVEAwIzF-J?D*66 z$mw!4d+@zceKBUIu+K+tVia5ZKoQ^SIKAA!+PxmP+9UA2$;nku4-GS|*qdd}nPX$3 zoefrWItk4LTc6g$Rz*1A@HpC9ud`9!u=?5d7`Bdw4U`TxR+3>97Nu$b4R+i=vcLuv zMxH*8ReYW`_&{#~+7P90?%HE}g7x#AH7h`OALFPP?44}h{O&_KQmWHWm?gOT7)Ld< zwQQp0AjtwwsIJ(q>wtNFEQDFV(3w>Q@WmW$bG>RIqt5z*e#@Pf_?(C%J%jTaUK}XHjx2Z!7e*t0aCJ=5EC)$c+c9* zuA>e5Pt0Y@(_dHwZey*}pPFGl+YE59L*jzL-UAdDL+Wf<_UW&+P2c}@zCXJ_#XP#lV2Z`Mh=#ic8{Ka;i-C? z0n@)FZJNehtx@`?%_Fp*hwSxWLclfx$?VX^W2Zm6#jHGS$rk||ThQ`2Sa7i4p#6rb z1nmFRt^dG=s&LY$xjC#r^w)pE#_>MR1C^-bis1ux-PzoseTilc=!iITsVm~_9@<-B zF{B9xGZbaT*-X24$PO<9?QMCudgYF19UMLQ?ygFtT7u{RZLrbD(t_EGwU(Db*eh+? zqd@cZ$h?K4xz)FhE%n9}oc%ZEY+Vyg42Fl2%CT<&YnL2t3A1dc9?}3!|4Cr2*yejH zv<&8GZ}hj0U^x}7n)*4=;;+pUu9YqA!^T+4#@6mf7$=I-f!bqp9Mojh1kbglsj`4`o)rcQ?`vr!<=(`h$TKnZ%U#g##*$~*UkZ- zZ1zuacBs(mV2Kqkt_2yNKq{$DkW@_n;;wBo*eA5JGr8aozWYXzpq3EE+mH-O6$ffE z8tb2!9fZ0iGPk*-W72WQ%(QhZyJmN+o5&mFurbbpOohRXM&mMf3TW$~CP`Sel^bp; z4d)SCS&4RKQk-ygq%S-cg#I0#!d_CFF7*4#W)y)pjK>8-YV0dUQ>Bxo-rEP?)jua; zL8A|jYmS=J1lw(tXUui_;VuSdh*0bQ+h(@d{V#C-1_pNsT4Ft0$yT3G*rtL_PjU<4 zKVUiGUjED+qt}E?SpUYYyMGd*Y9oU8pq3p_2AzbX;;;d_Dh&c0ig88bS1 z@alVrvlbS&7Vd%fM0!W!er#<$~9Oy09fFrz0(9jScM^?(n zQG=qsfzh8d)@IT6ww%r+G2Sj1?x{c3s3`-m;edsX35J;&eRLVtnc3ZDEnqOCW-o-% z8d>R<11a_}c~Xt})%j?0l} z?l-EtI)YDeD!J;DP>X2}Zx_Ppc-naFowzO=Ha!;N^fTUDw6!`y+x-9oPT@H^ z;v7HOXb75r9$Vz(iDGfO2K4bo*H*Gb&=S+VdvLd&)7XSpnjYF|cec znB{2*!eo%@zxJi)s84wTB)->LZ6K$G&12OPgyO&pAIr9mWc#G;i`bLwgvk>NL+_qO z65KqvbH}LaFYGGR*9@ZvmS_X(r-M3dVg8-f3vh(P2H6gs>@7KAB!Jf#X7L=9Y=8$F zfV42vW8g?r4iY|Xp;VWSgp#K2)bVB<@zR=!p=-gWNk_AeSTobDkN7GOc1LQ6;KsaT zv%Bc1w9)7jKpV9Q2Jd<=s}_~+9z4}6ls*zngV6KUx(mpqJ9ZN@KW0o%kafXgNN@la#&~RC%Oe;@>;{ zKi$F6gCFY~l#*cZsd3-F)~_n%YewSq3|E?+h84E%cPLSEcx2O>DyjjnwYg8TKCrZS zWN(T2WE~_l%HK9=3#)#ecnq8Eu)VywL=im@)`fwE#u9FGUT`$Gf2=f#=u^-U(<`Sl zzC+b=5C(}7A$k_59u62j;#o* zyB={(Iye93sii?bb23#5;7Q`k07D@>vRcMfYJ8}_zP1Rv^XqU~glB{1TTSxk4P(`r zTA^Bq+IF!24i5b+EXiw!0e}U#9R?7(MZ{z~Rwm@dB(5WTbcwm`@G!Z~O#n*IgSl(+ zp#YnDBUTde`9Z6g_z2N?=M0Ev_Tb5#dYT_cTe~(*YR74gS$v(&$Pk}rk0V2X+H*T} zvU`FSptVK4FR_*eTFkmkAGFB0!l3_g8vu;u z&B%7W!9dj|{+v88$?!dVbI9%g&q(_&{2aBk{NBK{hXE!Jez!ZOl@YxGwfwXwM~6EG zK0pl8e4yGT{Z)+5Ox@9u!Ay;j4Wa=&iw2?FNYpqDJa}ARUtk=aMyzMkzyl+9DLxzZ z#$5Gj0QzshflPhe8`B>=y4%X`Fv2x%4uHKz0znCn)M@ILJ*{S$@RLn0_=KJ3@wm-j+stvNa|J75I=LWm? zvOL^4J~F7zpA>n&{#}bdiGE||x;1dW-ffF@=Wk5?X&Sg+-&Vz+M!qq3JsN=i8$08A zbkvZ^_l@1E*pNc}j%nY&TkjSLqqMW4+soKPvlyFV7B}dMy-~vaMv?B{`9^my$8WSG zzfH04f77V{U-QY`fBN&ZMZable#^Y?*S}lww_LpcdfB1>#}HHX*lL>{!u-; zaeQRFe(yhN>$8C=vjJ~A`A_t!fue$Be@d*^-c zXId}*z3cH=%YV;E=QhtuzcF9k8o1ZEMqjsr8aVY{;|f^=Yq)Om|E>DBaBMQ3Gh2fF zM@xP;`;YEDZTv2)yS6r_Hfo?z1C1JJ)Ig&Ke%~7S*l9^`&TNz!{lVv>+0&;_|MQ>! z{QKYk{@1_$_0NC)^B@2C$Jbwf{rA8B{j0CO`rF_B_Se7u^)G+<%b)-J=Rf`FPk;R5 zAOG-&Kkz(%`}XZyw{G3MdGp4N8`rO2zjp1~)vH&pT)A@j^5vSEn(FH6OP4NPym+yy zs;aWGvZA7*yu7@utgN)Ow4|h@xVZSjg$qSRMTLch1qB89`T2QydAYf{IXOAm+1XiH zS(%xc85tSr>FH@{X{o8HDJdz*$;nAcNr{Px2?+`D@$qqSaj~(nF)=ac&!0bc?p$& zy}Z0UJv}`_wHT0cJ17`bH|PyUw--J_U+rZZQHhW z>((t>wrt+K`HL^U`26$FH*MOqapT4f8#b(8zkc1ib!*qI{p_>P)~s2xdiCm6t5$vb z>8GE3^2y4TD_5*ov3&XRWy_X*{PD+2mo9a7c3!e%$>PO}7cE+}aN)uQ3l_|uKi|p8 zY2LhfbLY;TGiT21*|TTOnl*Fg%o#IgOrJh|+O%m?r%s(RWy<8qlP67@G;!j@2@@ua zA3uKFxN&30jvX^*%;?dhM~xaaa^%PnBSs7#K781)VMB)w{ph2Qh71`pc<|ssg9Z&8 zIPk*{KO8V%K>z;z`}OPBw{PD*efsq7-Md$>UOjvE{NRHR-hco7_uhN&-FM%8=bd-n ze*5jW-g>J?j~?B-cYpKEH{W>Ujc(n#b?w^q_19m2?X}llef8B>UU}u^mtTJArI%iO z@x?A(y1ekh3!OW6e*XFAJ9X;Rv17*$9XdSs+;i>Qw{O?3UE8*8+q7xZx^?STty;Bg z*|J587R_rr2kiI#>Nb|XQ3H({Xw<;Zrh(r7^W=M%;g9$K^VrpXn_QjO&0hT0q(y(Y zH(+02#r4O%kJ&D@dp+LPcXbW6%J#YYbtRY9 zW#aR_!kfGPc~|7d%8z=i_-J$9UyrVzb*lTEp6B*AjUDsqur;&)vYNa0WM$1A-@^f` zuDbsD-2V0xsxS2%5d5d)gf1f{zIm|NWl)omh4W(`-s--7clF}=TZVS)@%8bB z3(LySIltV?rB!12p5_1OQn2YCcYTibeH-g*IHq8+Il8Mx_!TwqQWp##y1euvMiEj- zx~gN;=`tcic&Upae0`drU^HeIEej@}AucZhkLaq4fIH279hp@*HCcW#f%r7J&5yvRYJ zPDl_&KVCnEVX6fa$jZc3M8(WKO}*>uZ>A1GDgq_krT`fXd1HydeHA_%gdZNK4OWSanNz{WaALI-#O-_ z3F9$iqo;R_feZsj^D+Wpj>Z58X?&mFDoiPdq3i!`Os#@+%a5|Z|91DTuh7Jm7GA~7 z7X1mo(%q}CcjbB$5hB~OHzv&Vpf^pOeegby`p+%pI-dNwE`w#*9j(IZZevt4rcG(eP~|Q0Ps4P22jK(6EKCc z>*`3>jlu&om(3pY;RkQ`ctch=)D6{B|4h#h|D+IId-mi8V#@f#frI-E7&zEK|Mk)I zNu!4i9{3^eCkyX=x`E`>*O8) z4H-RQ+_*6#M~F)hYH9fFWLZve*rrZag-w;yfR04nC`7?M^!OKxri>XeoYV{XB#mQb z#Sl!L#*H2^V$`UyQ?M>VYak(8UtBMZk5r#7-QVa2gwy-hEu1oT6n~|Xav1>)jS0c~ z^&2&B;oKQh$B!M2)gg^c{FQQ1&XFUrc0{0qA)%Wnr%GRfj-Z=U(9P6wqZA3iJw52~ zy2Z1n(Xy5r78`~o&fJ8tW5-XJG8g3Bef@pUVujD$9jknv-d}hJA~N1*->SJ&Ch+`C z!ZZRJ8gu-_sr}!6zyFjqYnLsUJ#F%Y3FF4Aq~iJOOwRG+Cr+F+W$Lu4ld-BdUX39k zn<%G_jy%soH?iLPSI?U^Ns)l(uNB97>{`3rd5Mm`v9MYX|tWt0u@!2 z7iOhm;TDjRc6NwU6(S3w-9C4oJ&otD5~dN*z?f5}&X_mgtsdRq?K^$_=btTGICm!1 zHCZm6zs%&EI&J!_xeKrmyTEDIjHy%QbR}S-oEjaaB&B9SH`$RVx38Q}^ikD`GSAnf zd#s<*ulsAXlB$NTwA9)Szx2mK?E1!=-0Yb%XU(3!0xwnmg{+uhA6nu@?f0Gd>gs$% zmLz(9xnllop1(nuMnD5&&YI=qJOFZa>-y%q6V`6|V$IS8PIIuVElP$OD3oYkj~>v_ zTW@Vzvuq*K^#wOkPDMwt!9Hibyn|nT<>kD%rJL5S`9zceJn&4jyuX+^@V)MDF!hQW zNBFI`-@^JgTLKqDEasi}xCKs5^A|XOhOdPD+<4#P2WW%9?mhdzc>RsAG(?u9`0oA8 zc>%qxz%&9H7<2xDC7<@AZ<^O%d-b(9My%fQ<>#L+UAz!m4VY}y{!ob)F2$05#||Ak z9^d=Lr_KvlqKG1v!9+O~9r+zUxNqOV<9!DV%t(0qjUkKHZrY3nXEE^r_gufNbBFbL z4@wplE`<8@>4zbGpMJgZD}>m!Z-35t@!}=UD>mZOEiWVDl`Px3xcjk*PzBFjrmc2XHeS#L3HMvx)ofj`zvTQZJ zM@NkrGb;4VK0F}o3;9^s9wIl)Cdw)6DDw2NeY^J_bn}nP&dctOts3u5UAuM9md`#} zzH|w==LhXtJno}@{Ykx|#_2*|S)Mc1eVM3$rn|IbHmDbo1p$d=VBu%C!>837H9xqQW{&wHvCyE=AwfBvSuTi35% zxq^1(kcL-K;Wh!M{K}=`7@s3s*M5RsI}6us_-ys3*uaDBI|8OjB~tWtV*Z@jbDb8i zShsomm#<*2OsD5w_-N^d1H0C*`2_FRg~%go=1m?qM$o&geQX0V1aszct3UZ<)#~-z zvCk$yBg}2rfY!tI?AX3*V7n1v=VB3AoDp(-`})jOShbqNey?>K zHt%WOx^+=j)R_az+O}SJ`q<{SZH}FbiA7{_cI4?jn?ac;Oe3IyG1smCVpk8yC4-~Y zYYTSx9N)Wj6A349M}c+&p{lYlA@I!MU0XMQv3XlNhZp+K-s0i1Yun~c8&PHx<&<=k zeg16Irq))LmX>rZZ7V?x2g{Blx1Tw<12n5r{SR+NUC_}swwf7&*Sd1F{cg+7gE*?Z zI5+0(G1qCf&m9aJZr?vXJ~kSWrMc(54({ASZ7gBd4-JjEdB^@Y93YqgHWuA?#8h60 z@^IO`o#dmj5UyKx9zy!S0iGwZQ}Kj*dk0&q=G{iG@i={W&(3XIHk&G^sH432 zz)x3i+_vYy;UhNFM7I^X?jfKu`nl|9AuC%vL4Kyn!OchBXcJ1DS zqYaTe_a1H5tXWw>yx)oAC;B#d!?U@qXG&5`BqGZT;(dAHMddO`PNNw#{2a16+B;(7;?r1Pe0pd^Q^%ifGZR(X&m8q-+xz_ zK7CgTvFiuDING1O|Ii7%OqIpS!Dmi-o@~#($-P~Wl@uL;$g1L`fD?!IQ@=)-^+Q8r zVi@uwkE6$R2=MzTOAWaGFd&&~8c>2knSIVByX zM)>-ML?@)Z^2)0fRklrD{Hzqu;o61tXung(Xe=7AeZi;!z21}5{5}*9)ejsv7_*xL z2Y)zN3bE_JAsp=(c5(H9xR*-PBfQ-`Lv|s2qBJi#I+8`Eg?hN+$=+s|KxUBhqm!>R zK9b_}ue!PPF{GGh!#sTKOee_5am_wTpz3(BF!fyU*;B4ARH#GrCL-YCdZuYJTRQ?< z26lEV4}O}yy(uEn_mr!t+$DWwMg{oz28Kn0RB_3W0|nQ4{z_R+QWV-e(7aI)y6@vD zqXrKlRm<8RIB?1&d^%5>#QqB*7BhJY=Z5{UBU+o`k9L9P~)3c%_1#iES(hyWjtQzxh#u1u>40VyCRr@Z>| zrHhr=V_#lbRf9Z$&a<*^RTn0NdY>^>PFY9U3Fo5E#U+DSX=!0;MP+GGR?7MC0B^{E z_pA7v+s4JSr%Yz*6*Ufp5ejdjUA4cSj z>ipQCvmPWZVb%`~jp^z*`*iB<^lE& z7prTop)A%t(F5?eD{~XV{Jl(-Q_;~rm=x^V2YNMCrFog@sR`#Jg8i8cpjnZ4cF+11 zOUXh&4O?n~ZJaj@9=!d-K+YiWSBnzE{Jlw9!mJ+}8q?c1q~A1Zd2Uu0XD7!-gar8e z!gNCvOyutE;};T@kd_785eB*W7r0K70+7mItH?`@2@CWUG3zf7ds5zpbaeZ2Nmf$K zxroppe_vl%j}T^ccKGQ7JGSYn`z_2;uz4!{NFiL`ewPb`2})pSltJYqlD}S(5)~Rq z?J8l`4-JhO7!(#;SX_RwqBu7VH7_(c2zE5GSTq(QIRgSi!lPs2V3b3UkeHPIX&kh3 z`)bvN?3B2uun?0=WI#v!_0r7vsEE)INd!FI9GVyE{VtTvCgDiuq&s{%q}MYhZY@dJU{_m>mux_-iE@ana#4av;q5p`kIuBckJyGIR2B z(v#z2q9P;6u1NtJ3kh5G@vY9HUA$^ga;#DG`CKQJ3TQ+UP&_SeXrh7aA{1*m7GzyYK)KO2K#=(pZ zuWD*mVOh;}Snv@@S6K92uPLK-n?yVzhDq3ULxW=`CMKo86fiYKvI11gLs}K@nT4Pf zrd6lRtjvsb%9cP$rpl?KBT|#78-+jKuM&)fu%Iv|g6(1>Y_o-SsFp4_*6i>|(1U^)x) zS%4H0uE*Tm1LF#6jG=t3@r3Y;BZunlpB^)2w7iE`3gJ3-+@x8{wx0@5%`Gf~A$+Y+RG623KETs6@O*lnNti?W zd^txNAJs}77Wk&o5A^g5FhY{tv?$NRdk=d?rqx|M6S*6yhuqYNQ`?u#nlui(rzMrM z04(R{JJCNUDa5V|<}Y5hcGq#gi1X4XjPN0&_Zt@z8R&KDq*q|%uZMXG+~rR#Jqd+~ zxbqQyrw;8qbjrWJBAHO4^HSN3;O={T*SckkNx1+~<4`($9;~B3;a9rD?S{{{??2}5 z8xR;23~vp=!Y_r`tsE5;;Olkj#EDa0z5zi1IZ;NCV(^LBFqo%LxDoe2nK=_uD>5X* z9Nmc{hg{q|>MPQ-%Bia+Q68oeaCdjzzy0$K%*llC1C2w?@Ks?L_8mBU?1a15Sxjrx z31_`LPMc&pO3GfAEsR71PN2ggOCZB0Y=jVCOoJ3`GGufr~ir= z3VX;I5a8$Ijekr|0a2B%k{E&-TOvhH%r^F1LQdLSLeh_6S?j~}digJRr125UApGc4(~ptSwMk9}L=iEl7nE~RK)#a$Lh)oI zDPFp&vM?MuUJl4Kbz_J*fuw5T8Nlz*nl-E7euz8}i6QAK$LOTXhzvo-GKGRn!XPj3 z(~H-SA*lq(G{`D36fznNC8I)AgP=sqAx(O{1ejQLWD(>B)~X%kDoOw;Bwcr?(g;J2 zmjf({Ih!(yg7KINFFB-TD)1A3wMjeWEQ-il3?;K1F9(Do$rw_+bX7h~YB>DI{IRG`)0H7EL~dR=pHt5(Y3CKb?5+(TO1}Niro#TM#9a zg26&kMun(?KqQnqDI{IRw7LjLsM1w8i$om-NJvV+f1MxQ7;U=lola(UYluPuCf;@9 z^<#*-DVT(1zT(xIwm^40;7)w_j2_a>nHmOi9lnPZQE#YE5OI>^^TF9ckBTX5I zsf$4USy*l=?~a}5A%$*33Q1S=J7StPU5*wJBrFxaK27R)fM^^qU>S`m(A5;d*vyK+ zy8MjfUONE;QURHipw+it2}11rel>bXBJjiX1NogpA6q6q2s0JPcJo zUO&cEnrgv>yo#W5s9rV-0?|yw~r)egm^T;!9Q@lDfd-V{Ii|_}opd$`)pEk_njb#Z)gnLb$}KF>&}o zm5_~{gP@_H#ndF}+?ayN%C4^?Q8#oLg8)R+WdBaA)2Jw~zJwDU^gEEMf}-Nm@`@@B z{+;ww4aEEcm~`Sqc{xs=&}U!8!M~G!w1F7Y<RE{v~g^Gs7tZDyTmNY(sEM=uI9lCI#xTLfcXMkvhtKi`4Ns2-$fpn|A znk=&ceF=I}7!Y@peLdk2lhTq4h1fNRLr~Ok>-KF#M#QFM7hWiZJsHfVjDWHR$1Ewn za=9u$J2$_usJH|VK@H$uF3X9tSqRkWO4wvMb#(;YM3Qc(9*98PP4@4^cC;1df?O0# zA|m9q=J33TP(=EM#-`(K;IJpZj=gV6Qo~~w6<)o0<4Q$lDvUV_bawoK`*l%HOhy(K z6ck|Y(jb^Fr&dQ1(2ZYMjAmCJXqxWd2@}4MGyBG^TkfZ@9SG;?`1oSO$JvCMvXi%N z+;9(wPRhzFxLI}gGwMv0Gg)zcghEp=H){Fo*v!- zArVng5mDh$k)c;^75m-d!Q)&)MovBl`yj%s7YZ62GdJrdEHrNLx368y%Sq14&nYg< zlf(k|YfR3(+?&_=>o7t|&dn~&!y_onht8>{6&5mNljY3I$$$T+duQ#+581Rn<<=3W z6$$BCdDQ+ei;4Pv8XPkxJG~?$?bfaAnwvMOQuF-7Q-jXKUQ&QALg>S0XMia8@Tp1)i2t$iObB& z;b6xH%=)3hF|#sLH@?t!-IX@sH*b8}>dKPtA)`0;Xd{h}>~^H%xHFpY%Z4O3Nan1} z{oFXte-78d$Fftu9PY>wF84*wr6m_NoqMscAeUj9R=TW=6nYk30g)XnhKFzqxd|J% z9j&;RZ{Ms)PlcIUdPXL3H`&({j%qv3oh;|Mh}1&Pz1p9EBTUQx;&Kf#rEvih9kPS1Poaz$x=7GauHB9KfX{htktdeN!o(lE|4{TNpm z4Jv3DtFzPN;$WzT7QDJ+V2=0XDmc3_+)>UcWY@W|+~VTm z940Ltr&ljP2A*q3%(Rrm#hp&zbq(SxxmOnRgSp-OwXEcn)U>qpbcuUf%5Ls0E@CFv zz2HUjJy*GtXE>gFzpG{Q!;850E?2-3Uc#)mKoVwJN`j#Oh;FT%`ABX8AI|a67Sw<9 z=I!gHd2xwp+%x!hN=r#eKR*HGnQ$VXJ67ev@xELM2a|nwZmt(MKYb~;jl4@htH7)u zAVULVCdDtddiN8a3*kMRt$mdbLY2Rm921wA4B;g1$%#9;j*i#o+AOZjn9QByynLbm zMcfBHmMyVecDXDkO~y33M9GP9(Ek}v|FCXv9p!g%FOvR4nEr2Ia8Q{V5tD>Fll?ov zt}|)lDlU%O8e7C2DLcxcM0s5F5bo@-=7+ejy*s!?WjX28t`cUwkka6o39*YiXW${n z^7FVB93RG&T}X+JIv1A+*}(l8$(b1UB^Sg6&1&slxpNKY&rO@bRdF8N%&tyL+WFU% zWhEt=EN5a|4D^56!#AY!(DP-@dUI~>Tp=DlY*+c~$#7B;5*1HlAyfT3CBo?B?bnv@ z?Oy-9p!td7(=Betv@32G8{axOYh=%5{M;8NC07)p{@>&XvtCGSaLm|q3%jD!Tm6*L;t7TeS$t{JNmT!i9UlonkSxb2T7^|J&wAZ_6d%N#nU(0zf(Ny%)Nc{ z_~N{z+<@eww7|SuMf`=E#gX|nS#TQ@GqY0@(93XySudbIG%#j##4X50P@I{R zmXd+KEFQKH%$EeX-y}I<$-tw57D2~#Lse>2IO)nXInPChL;ojE<3lwCUty`Boe_Jh zJSx)T`0>-8J^>+&rs@8j1fz@dn341HhTo|0(9q!Gixr;m=Mo%@sX6bn!BOX<&r=V} zFa;xt+J74yGb%Fd79PNritxbDkWjcLiHV6j7a2*`DA6S6ZIUx8G8`^c$n++_A67y> zXT5!K_A*pfQy%3L2%9bc8UWC~=4XlpsHE_tU4C)2GvPKJ=~I{Ed=KSD5&n@$wH0 zF}Xw$VZqS9pMP+8)Oj>^=b*4tr`vVR+yduS*uKgo%|0G{q=_=|bx z_v}6B;(F4<+wU1lBR$PW*l5RX;}K9T5h1U&o#@XdD% z{^yKWFmXjS3+FXqxWdDF71s z_;`D{pFVNi)%7?7SAyfXbv=IKw7VB9bg3^O%z7c9;W4p_MCRwXK$Thm_uGc#BwX*a zUU+Dfjq;c*r@oFv-6%qUrs@8jSY0~nh1zk(Ab5Csq0*361x%`Xb-;fyCb?CVC4UAv z^>xH_Ba>uWGS$BmXKq1&UvqOI$nK>d7HMu_PWm^HETJja|HGKNIudoGEqg8goqo1M z=o<+&YT#$oKuo_?yEwB^X7p!<-=|NX{^vjc`S-v7{jY!h>!1Jp=Rf}OkFUS}`tN`L z`&VCm^|!zM?XQ3R>tFuzmp}jc&wu*UpZ@sAKmOqle-J*JZr!?tPcwWST)%$(+O=y} zuU@@!<;vyDmutw^Z#A}nVn1CK+YX0aX4tEQolDr(g8ehtoroPAw4H;NuM4nxoyS&C zvD=+i_p)dyEF*)KS<=$d$fsdSN^){CCV&%}_d?8)#>K_4(JPHxVfujifGFlv0bi%# z;p7K2G&B?gW#%FWcAfBrAr2AI2U4f#O}z>lW=~HVp1|n{Iw5?(o;pR}uVkO=hEoG* zBmm>3qeqXrxVRiSa^&z~a_oKZ;K2h24(#8*A7eI*)Zle}_wL=hcI_gYvK{0EfBW|B z+qP}nx^*i&-)`Pa#}a)0`RAK9ZQ8hTsB7&7z~8X3Ur|efsoi z)22dLr9UwP+`0!!F#KQ%Jqm2jAagR9f zkq&(9-@iYOv+3KnFOIV5-J8zg6i!-%AN}{D)!eL0SzWT~5bSl?NFTI3AbGmft^1=%*bnc8ZTb}RKsZ+;}9XoXBfCEI@w{PFB zUAwkz+qP-b2IpC{YSpS`%a(M+Nb}}DV~uYl)u@3+4K!+?Q3JXf=>0!WzIPe^c>h0- zUG2BY)p_0Q#cxeo^oM%`_61g4f86_+?NYnf<83|e9naXBKl=6ML)Vx6@1Dh@clRIi zcBcDFXScW7IDgq6r}uZyeCN>l+}q#u-~H9$%MVud5BCens&UNUVzIMQ*J8sK<(rHs}5I==xcwy3gr(ZhzC*F|Q6= zGy5;Axob~W*4*(u9I)!D>z~iQqKXwe@ag1GGgMJ2a8<>H5pkrKjz`B?(26~ zFP^_;Xty3;A5T1M_EqzlSKoD>I3?z}qs}J||LF9;$NcPX{&UgHy)*CU{aDm@*pbUF zJ`Zw6{j2{%-y1YT%_V z7(R4)=|zkpq>yw~$Eed~M24WfW28(YP)imycYO)#l*bT%6G`Z!>&MhCLoG#;)hyHM z^3p3Wx?!UE2qS&H% zBqv7IjqodKpr>%eJidP9kP?HF9hBo8aEOL*rv!wM6fMWgh)N7a$#+UX4(Vr6(Dl>U z0UvT+B_M=!?~z|3K_`I-g{X&wfTYf-7eka}a!NoBNt|S)o*$5AnVOYgEk3%LpY9<; zJ{oES2uIf&fjIQn#>98{N5&MXLF5!B0d)1PYwAw-ww7uS*3caW~oiy^juSMF;8x9`#=rQ%EO# z77_z0Ox+|kL4(#3dX6*E!4>ip_6-<$WOjw5^Xu|$omeUZL9LK}{{TVRz zII1JSee6el-s|42>+7%5vFq&T^;dBb&QN7jjX2$tK#1wV^~D^e1igCo?oE2=!+vP) zQcB@r1Fpto@hrIyu-Tmu=p|tiDMSfLLO>zMVtH7#6U|jDH>J#y68vEwIC9O$ zcgEy#qeaY7qsL8~K6}B!xwEHFoxuV#r%o6bOyA?lNILdPJ6o{X5BtVo^~RDus~6Wm1k(N@RebHn*C)DEcTYO^G0BNaSv^{X43# z1mh<`k27cN*hckn+lCcR(MV}*Daej zZIXxyTC-=)n!9Yn+E11_A+UVI+GPu8PoFYzB3ocn(HuW<>OAoC3&WX^Sb3Bo7?H8w z`&P}HI#JDCA*@SJpn09iDHdg`P>As=aRn*IDo zZvQ?V$GZtIb?VIdScIJD=Q(l0#EEB*Zu?~ZOtwCWWSo}H$(U28PMa}%uG7rPv}U=) z`{44alPTbSc*_c>nF1zgIZa38Nku^!CVHX}3ua9d#D%IR zNK#InD$x`roiKUkN}1raSqqSP0_BDZBupkWXiu9l$7#_LXJ=aRU9xEYoEg)E@(_2^ z?ce91$_p@i&iv&ghmRbdo``p8cyfsA7t80*nJuKz`IsW+?Addi7A|m_jIIKm!SDsE z$B!CDp~VUQhc+yoFJR7|J%8yGkQp{~IKAUAB-h_MU5z`OGC!ufNt5)HB<&DnDn ztQiKY5if0fO9D!Vg37%iBTrfw&eg4wPU^imKC|!CaDNZsaIjJa+ZDaxp zu>y-R+K6Ea!TAeUkO~rlnF=IKK@+p*%o{agG}_V8tP$G0 zcEzH3ik3{be_tpZB7olo3zx3Ja{7lA7wES*@$Bw3OCdP}dIy0y&uRXGh0aSC&mD_# zk^qB093TYdm&BglzRFp^1lFo?EPlX%4+l$uAu~68xnt9+j~6dmxM04MNE2*7142PT z;OV1>uu}nB77pU#;X{$hzI#7gx=_RMW$evX2Ai65xEYWcDy|!in&NSttbNUd`~`vu=fe>AZBs zx)GENkTE{^;QbFKtl7SQ$GT6Kf9#AW#b}Cb3v#hjLIvKw$XbvZNJ5C1B#J zKoz|uNT#|9Ii;dtZ~uw)^M@-UNK!79xQhgtpfbVTTX#^z#Z0CG6?af}UcOpDM!^tB z4szYLdbzWpCUDOW+O>GxNB#Qu>4Oa+*bUOJH@ncgGK#%0QixqgkKE+)Sb{&= zUeaRb-B*-c~!d=?GI`1&(K{!cHqREPK zW5a9h6>*8IDCL?}B6mix4-yo3vE8c+{OR_(paKb#*h|tfY@){(M!G^mK~1m}Dvdq8 zZRJAh?KHsh>i?`-&27YfFA+9w*^50-9r;_d_33s=jQid#QYy)S@P-ZZN4?s-9nu+e zkOFia$`?nS*tJ>0+`Q{ubt>oz(AMtFCA)py_HElFVy3u?J6rt-B7lY}u+M&trdCE50nz`|vK> zqDMe&EM2!Ba@o4DYg0#H5Rz~ae*5yJG42O;N|-wjyrD@Ka2>4P+7VY(9PN2@&vprO z>#jqfaPg9wSj(3DZHg?2^*Xd`tAt4sYyn|~uR?DxOQf+71*j;%g7NI><=q5vg-oK9 zN{NWzn<8tVIFf*usxm1?RDp&&ql}VEBJkBoKC+rHYBkyZUGQkXgJ9P_*QQOIHRbuH zxbT%J{;vCWv4kBvXgmPSoqP7X1xER8>)yo5nvn3<)QWxp@9-7z-beRJn0t@DEToGF zz_qfpc<)Rp>PTj!m+SsLA|}`#L-y(#Wy3aw_*)ctA;I_9zFiU~39}P~8DD{(yFl-( z>%l#=y_3d5R3a)0u=s1`MVZ0dnYcnGQOccCi3EZqKfv13;(a1`DL;d5MHQ&Ii%M$R zOcbFhe>p8cRui7S$@cH6bN2QhK4l5udG=eK9(?NXezG+JP`?IDoOF2HBQ!NH@#s6& z=3EoP>tf9bf!Fwp$pLPMB+Nr@&r@;}juTW%Za?r`c`z1`0WZxmT&ieE`L2n-fq`FEal8SPzC^b2!AnEA4 zlDMx6Qtp#VWQbrzZb|~N-~|<^xiiY@1uFh>dXTIpJbjaG-f7dY2rkDx8CyaBHQC{w z$6drE^eh}<9&tH-`fPAa-nouWdD8f(B+s+A1A7QvlKMNcKxe)>E%=P9mSZ$OS)xVGu~dB*7HIy7VZO z>MhAE73)f2LR3_Io+7R&Cr87V5LOxz(PWg9_Cg}VWQQ6WKLDix@?6aTY;arrgG zoZv=DO4!-cq7w1e6rXe3xOg@cJBg+-NZl-e4eN%$c_~Mm>_zZ68%(bmR87BE3SxuL zN`_$IBx1V5@)Ldv&L`!TU5Oj}8lm%iG7D5^p9}O7G2OiaIqv1LOi3K~+V~zQH_9oXGvYcwdT6$Cp2~#S{mBRQ? zxCs!&9Yf+WDPfN-(KJBNKOj`40vVI32}bu3iFsARt9tWFd3IcwkC!MoFip09_fc%d zeEh=(4jnm`=SPnoJC3g@h!2D31OZ3}G3*U9%YeWTI3>-k;4_^@@Ha1Cyv%3L8-Ala z^L&V(i0R`O(rZ#IZf;$=uxVKDHLT4D@345TuDkF8Pg!aKvKjQzM82(qDk~&HRkRX+~qLgItFP6vv!JrVP z2vG$xCNT)WNz$R=(Xk1M@cjhCpV;W|P?*{afU!`H-`2UqdcXVjTW`JnHhu``Li@4s zpEecAA==f{my3jHkO&cx=MyptO3O=&;T5{HAS2;?BpD77(0D+`3=0bnhrf&H*!Yx; zoTB_3Oee!hZDDR!a$HoTh#3(Xm5`j3%M#%^Gaof2B|bJfk|C1x+>$f6;zh0UV7agJIE)&+HC(yjXvgHCPqLY+_ zDV5FuK}~K2Q&587upt(fZ)EzWE)u%t!jOH-ri~anh*ZsVk0*ftLbpu4vmBycdh#@m zOz9*@N=i+GcSiv-(o*Sd695X)U?P@W#3jQUAq?|Um|H>wV45dk8cb9Of`E*foR(cw ze)*bULI^8D0dRZma(Pj9TCz-&$s!XbJ3v`LK}^uREyyVrMJa?zTx3+ZQ$fUHCCuVjf3>BsjCndsVvle8`y!^tFvWwNQ*3^OOi)AH+cq?U0kpLsCM~@O! zm_kw1g@7krmXlFYVdmuM6IA8aV2TnLz5vry`}dB>V;nSM8l$IL?B88rIt%kzfD{t0 z$K2cl;|k<2i@G>mt1K?AyjB;6lx7m<1!HMmFp~R~;>?tcVm6+W1ghnFtxv3GS zwlAACX&lVmC6%)PEa&Gt(LX0C#I6hGFJ88G*Kxmy^Ko^1UyX~24D>pA$}=$1c+40h zXnLMJ(;JaM}NYvbcfpwpKsrP%-t7Xd%-w*J6QOo5WAJ5;N{Ni^a;09UcLcAl&JdCxl>{4 z(-gC@EJ1{M>ck16DPqd(WCjYR$URWzEXknZ9~9u@apDM^A9~0{Rq5(1feLq&NQH#3 z<_=%IvYZm420>9AxVyXV-~Raq=43+nfySX`nq4;tnDsw)!X4h0>VdOf9;Z*9#DOON z^_cD_-CW&H)?cKCDUth$V_2=wQ?Aa05f zF7llmUK)z~Yw08!w=p$%jw08ywP?UnCgczzOO^Yd|t1=5wKbgc&CZI256_wOw*>z(IUc6CV(zU;$$eKpH{a#28fwTqG5_8i!Es!r9B2;oA^8Cc1#LM zS51sMT@T?W6Oef;Je80hJHoC@9)lV5Wvq+DPuGcoA}L~v!hp*$a@bBT-35?B(p8;C z7;?NEVEL3gDI{H0S+tn?2>LNfWXN7s*GB{HNF301l(QV3a;JbuP} zr8nX=23tRT_t4JwFAwYFN z7gIVIRCAXJ>rf;)Cn=bQ(BwD{{+(o+ za;%D=9H+rlA?OFe-DLkx7jc|`8gR6L2*t@Au*uB)J;+oM3{qrr%R;p zOP4Ck%W!-FPA||vNl9fD(XJ*;HFue?4n={cjA;l>j?>VTV^sv@I8}*M$%cZUX|jK( zN*v^%KxJh`1^%<2N>vgEZ%C@!Yd5b|Ro}c+Rdwx3#r5mgFHyfknUF=s6r!qXYN{%$ zFI7}j)l^=>+oiB#m{nBDs><89Z_#lRdQgN-+;|2uO_p2Xr6MKO`o*iAEZh2&mQ-G;#ui-UkT6S2FJG<9&vEb6!t?6;9~LFP+v4+2+I8p;*(Gj- ziH8TR6dQgLJbykhBd@r$OrpthiiGnEi}3JOGO>7(BtIOc1q^yGC5;b>;aAs;&ZUF?8B$Q}gXL5=~kqd$Q!V6W` zZc0+BXc{1>&8_CnxM24k9k#;&0w@yT9LeHXk6mk*JCm;wH839t`aiF{#$gUsgyQ0& z+}qfE9~yD{Hh()DbuS-`ghZT{u3#1wb?$cfMzgou@!cKb`3erUOUPCeaXu+CuTa3m zX+U{bLF|?%=aK8#iHkbSxm>)w;AQ?sbt$H48BxMyfx=wm_Y#hE^pn7stjByqW3lfL z&s63v6TVuWo}30l9oTb;^oSM*|4t|ouyW}j*zj|S8M$QfRZviL@j8wlmZU5yl4u$t zSXiLsE|f8utfcy)0y1^M-g*4w;;ol=b8^q%-wD}8D9SG-{qtVFq|Ts_xTKtd0%opO z2(8}WL`)p9l=r;tf-3Ga?)r`XobN3Tc3xC6pU{|;>^uRppdc^%Drvx%bBtW@erIQX zhSfBF_6wJ;lo#da=QFZ|3EdSImXsiWNN`|4Yk}NEl$Dn+VG3$0$S)-3Fw%h-H*ck7q7G0cAiy)t z^8RAx!1ubp(Y0GQoL$rn7hJn_gE1NG%9v@H7-BK+yvHH82%oKXNxmJulRq`Ruy7~8 zbMp51PnWvo(}7m`km06)30sKloV@4e@<+M;+}VV3;GVL>Wl!YMbJ?D| z!mmBRGz!@=ri*?jKYm@e<~OJC>tvh;YE z|Iy?XVd6RD#&)-SE-R92+3!M2&N`Wk&hBW}|JF(_XhqkX7SHuc2V0Rl2||R|b?CY7 zddmp@_9rc_E$kK&_SeO)OXDM}FF_i#scE2ko1NSD`M0(oYx(}figC?a?P``?*&?82 zM8StIEUDQv^lI11ySu#Rq0kqkK02E}x-4nPkfix5L*G2}&Ij)$p>%FuA?H&vvQ?6h zEQwBo1CI?Fyo^86e`QV5o4r?@&jfRllep)b>gy>JvJ1d@kM6)*aC;&-{{SwU+lAVC zs=Bf`kIr)=jRG?>Gpn#1Hg_TEd{_a0KB~YSkHO;-dlpxZx`)Ihrwf>{+e@bEbUS+m zU-b!JxjJj@j@x_${21`J3e)2gQ_?ds2@_h&Uc`BK|NrcL2Xquyw(VR;Y#cBK+hiGo z2nJ(pjBPNOj0gsig+M|g2ZKlgB%%NjlyjC^p(V9Kx1?_6tX58d1OkL=@{Gqb^WIwj zzrS8sZ@uvMxfQxw-C$&o*ZBSK3#z(x?>_sSd#bvtx~k5(pXD;+8y>e2UD$l{W=S9fA`VQC3ZvoQycO55;;Xnx3icXW0TmCdQZ0a)lO&j2~JOa zA{7&VVCr>PF#*1G!vX!f9 zm|D$*vFzL(HrA)RrIu#WBWuespI#lD&%X)bNQ;8T;HWfhVTp*Ws;MmGlcZaKpEP zpPTRn^AR3a7Z;b(K9KAjJ#QV0Wan7InpeYxi7OmN3rzjOZozKho{7SURm)z8?CZey zHjRkp2rMal*yqOH+&3|e)%HDlfyJVSLhgl-NL7xZgxjfjsl0qQ(+k3(DT2dr!FfJ3Q_)^hoHLc35q8-NA50Stf%bj7!aL2?l z!dCVM6S7!GbBQ)bo6kGxTBxXKqdxa3huI_z%YM+oo;{356F%hs!0^OOT|uDDSNTh?Uuzw9?aY)Z{=x@#ZcT5DJ>T6>W&nh)2MFo# zS|AG^_Iag>)yyB6%nUu_)_JfT7MUe5?{K_|tjiaX%bvSjHDuOqRyA^=8#{tC`-&s% zku%#N44L=^4w|KGX(f);URH!CZ_Tu!_Ba>g%0l#i^`sGV9v!r6{b;f<+kRJjM_s9` zo!gqPb(uiWVU8odN@DTBtfXQ%cEX8R`c_{BY$~TKSI7f zYHQ26Dnx7I4(@KPx_Pa$=W4r9?u%djy3@h++C3qSU9H0veq9bOL5~YTXBsy-=B?kB zv?#M?K3!w<`G>}-v*~-;%#!@P*v0P6LgHybNO2AkjEfsujAaPY=Y_6IQ_k;j_+s`) zGe4gBu~>MG(hbSkhQu0gnZJ;`Xa{`f6cm&xW<*uTUQ1>NwM@3M)W)krUqDBT*Hj9X3cUs;8CqIPB>1(K3Z_p%Uq-#rZ3h?8ow6cOC=_^aiYpP4}{U&PXrc$~I zv9wkemz7qQlvL;u3xSLeD0JNFbcQlxEr|=I_*Gq9SX5E2r=MxORMj@t;%=RBkiwaZ z`v4DdjUfp2hH|a0ysEA)pKi_c`G>@$YI3y}+I3o8CSf1oj{8FDE#x4 zr$d4VAt8a1=_I8fSSC4Hoq?n%XiQDZ%EPfGYbQfcx7!z$up~ON3lsopPtzEO6#asNA|FHPZ{-^ z42_6fF{<^}+ELSnmyg-9dXTV=_3UKzU%h_dWtVrI*S>U**}ZhKvvndk>A=zQBRV@< z%Wupf_XhqOFj+K=h>lIp$fhGu)J}$GY0@eAPRjM0!I7~@_M^_wVE*VVX&4d`W&HRGO>e*k`D*9C+`C8pu{ z5)0Wt^?)la*92}^O%G4+)7BjG zPj~7`*k2dBqxtOB7OzWZBemOGop;1PxYalcoHQTd{G8scOXlAP1b^Nu90~HTG**;LV_5fB%~|g2Q7H zQ`B-VeXmkIr?9*o_mbNiaOGW9SyEnARa$JUtSKul!ySgo{7m{4M@U^sS!H2iO>I?u zRqd_%+Un9;V|i0uRp;&Q+nx7Y@80R^Xs&nxNIGz`G#UNK;|q2+$sY|Pp4}k+LneQ4FZ@{#P`KThXsU(N6|s922vc6LKsGbh<*jw zQd&VudXS(hIf-UtM?n-KCA*Reu7w7i-w831a-kT+xTuKmh)4`DA}THsaf?zPT?0@( zEfW_V1qB8}URG9aHWE$cWKh1Ntel)ob#|@>(TXBcovGDk0Ibc1fL2R0%;)HG5d&UW zTuj$LC8dQpsvq&s6prYI+UhF&oaDC?=#B#lpUgfiGA;#&m#m$PNl8ggOo)w+iiyME zVIYcRBdzFKh_?Aqq9Y=Z4Nkp+a~$8Gk@KhyoH3IT z4~kgRBt)eqs}dywV#)R>6ifSWgOQZ7kT zK|@4zyb1@WqMgi1LZ-U7*f<0?Lo<26ywGvW?G%R+6Qc|Q*u;eRI7lWWkeG?n2BC$t z2`Os=7uZmEMQ$a|f#-K38l@m-U7S*o*G}o6??YunuHds6FBWB;kf1&7<0@6kFh`uvRRQ^V`9h#OQZyjlHjzCibA7;q>oWlR5b6P3KcU2 zB9b3KH~?{6_S4PbILvXd;xlEbopV{4L)MxhMUWIzO?@b4f@VmIb`hu;gG~#h)NOkO zA|Z$c+H2u zhDomj-l3P$Zqa+w;`>E-ou!pt4xu*$@#G&bE#Lt&p2r)F#yUJSq-T+cGN9*SNVUkH zU6fNA#nMvT{l<+RXOdU~EbNwY-otTV@s9z9B-_(zT$K1|bR96EI9;K73j4jkCO9}}tU z+q-u!G9vEYy&Jir@z#mEJEnAUL;eCWU%~e6+qZ4o=Il)KY&bbNVVb7Rn>TOTvr-BS(xF@yQaCHCWzkK1F+VS8&J`EbY=aotN!7=|5QgPO}V$%M_C))n;%FY#+ z=PsO489hG!{F|Px`+l`)Zgk~`H+8jr|7-5$Klt7Kx5INas`RSv*NxtR7_y~j=I*uY^F{>j4)gmjmwyaWz1sV&`WiU-)bEGJl8F$_tfM`g>G%_+THKX4tTS${mTA7+0~!=(?2B!em+BfzJ}A)&*ksv zf$?^@e6Sn;F0LZvn!Gk|G4EG^9ALS{sRl;y7!h;r))qd|9$WecNMQ}PZh5>7j~SBU zW`)ac`~=KLhwC^ha!p>FS}gk&pa`&rTem!sz+AVvPMJntoA+7BSORG4r#d9bY{@*b z6Iazgm%pP2_?(~Ogr+q6C)MONHu>)&X?h1tq9N6kir6GKD}a9e*yKz~zp0|stVJLs zYqwTFT}r>HBG&qElYWItsXdvZzsa(g8PyXB&}k*Yoh!Q6RPC2C+I$ngS}o?N$8TAi zMV!0dW>>$)zc-Rb^fW{IQS5|rbMH#^{-N%)-M3b|m;GWVp0DkEhWE3lE29wq`*h|1 zbL4>I-|5!OcNYQi?>{5I%TMsqfaBjk`z})6FW~t9nVnviR=d?j+AuWzbQSpQd>>P0X`}{9VW!}8`^S{K|<4eAv z8_IH@fcW?Mn8f~Z{ZbF^Ld!_pk_L}CM}KJ%NgBkSg$wv;%tA)gZ$fggHMI!CQb7DW zACbu*We}E4CeC^DtOzZjCZwX~F%@VZaQypH@rr;i7cW`9a?RQ`U*Y!uy49;!EL%c% z_<0d(O4-sykLzE&Xvxy$D_1&@jD%de#9_@>t5-TKTe@VC#L{0{L=wH&vv#$^>a}Yu zWz4mU^+k(qP)l8l772)X=OYp+zcLNN+{UG_$V|I6p@p;wsi-l(_){9W_5sJdufQ`E zsW>>S`s@4OPLZ#VmMvegVy7D(ysUKFzS(h=13i7AA|O_M1+cdJ9agS(T(^3;!;Wp6 z9VO)ICCk=qci*;U{aQGeQ&>rJBy}l04$B>PSjcceNxM{caImJ9y0F3V!Z1Iwn&K}41?by0$9X?(t{nGE6eQ{Z_owC6 zo)0+weIp(~N@c?qSNa)|6idsvz;g#(x6tEBDwr*uZL-n7al@v~PTRJwTCxyd{TrhF zybef6m*oq-oWIb)<&=8@TxCr^E!IpcY-Se%?)_Tee+oU%e%7NrND+2`U+ zkBdEyC!IT}9yZ0&gWs3w;LN`}bct_VoexEemE5oXUolyvXw+a@V1Syy?RaXU_V{ zf0UX`?1UukvflRkwOnQfbBApgJo(FM$|G4-SqtfPMNZyFv0iCk)2x> z&H|bjZsVa{Zmu$?tD70&$D*zK51k-zgMqt1MoNBi--|B1Pau|Pzq3d7x=UTqKH&KG zJxZF6U3(6C+9PQ}&+W;R?I+)HPDs*DdI@^3V>zurH`#vD zq%R?J>BQIj_uxY=BRLq<;NdFq>I6~CFm%(g3QkT5HMi>WLXU3#bn+yTShn#vSY^&# zd&pMwlU|YV+7<7MWXG*a?gAOfJ+W)|eh)%Zp>$CMCe)IL33=qq zOt}^7Q6pwLd-`6vPECD^CPI=WvJJgm^9UdnE_3DF$s>mj?3a-oY=c^Y!EW*!IAzKn zW1#bNYa7oTIjC^%w_)q4fMBxXp6CuU?VS0PY$C01m#S`@;x6M}8hHG>2VN}_%VCd` z7x8k1y$cw|) zg+x%z#7;=kF6-^PH;VvDfsCWywnZ($V5@|bDIXpfKFEfRXOACIIBgPc zOeQPti!LzJPR5=%uULqR(2x~;{)FTvy!6(ZA9?Pe+ctXd%Dj*dZIr`Dm?vKLl8UGI z)j=piFD?68@}jSL%e`cSr$xWee0J3^_8dXw@}ba_6ULDzy?n;Wt+alYy|d+9S}Ijd z>>Np|Iqyq@ga=ax4SI<%ypW7{Lg>|V9yq^4yJVypHOCUnON0R-BPCP&{5B4^VWW@N zNdNBMe5#sN9t_;+u-ekYZ)K7MrX8Q~AK zY%|3B`J9!y=sVWivj0v??q#Pp2`ZO~LTerpClK<|wYTL~T8}uH)!Amqp{j|UBZ*(; z?X@F-Tp-iYoEsZ(#rv#+B(OEL48u@xHO^>6GNsTEw0)S&NNaB6wM%D#gq>Ww6=BZp z+m(csT%aHcEi+R;6``vrQE?NlTC3tuZT#Yc$@FfYd71h?-u}ZsT8cHko;ICb!V8g7 z@$n7jlmcIN7OR4NeWWhB9=K%L-(6E!R1km6%+Di*4t+dFUb-6aDv^j~tUsci?^NZB z{#V#JlK5rbzTvV2V_fETWlntXjVqTFB)~SPWf+D+*FrQRnX;$7sUrD!e;Wg?UIG#$ zBJGxhW60JnV+C0vh%Qi&gqE3QONG0o$%>n>_p1}VoEFUbU>dns_BiTF2=+|5#@DlE zGqZX2uK7i9wW5dal&d5BuHgk%Ds*1+wd}uJo0pkeSzB;QfgVJLL0(uicrp2pJR+PeNWhTilQ zM?~7K2|H?v4ct`G1?JinX4z8VZh4yGCb||KXv{mkG%S^X5F`!3ZWsOEU8RW)36Q#Q zW?}wj{r~)$&mj5w2oiT|b?Vgg{JNH!;IX1*&j@!)5kU+o|KKRe*!MCii`bpUQf+#w z+ENook}fkHT*@S)j*kop@b^=Y0NbLLVCbdemPRL2-fJ*qXY2dh7!_>BX(F5`*;?RG1M}yvcf^lsnq=N=o_Vya zThHi~ZmEPtskmBkU)-zJs-nWAE;=8DTK4xC^U{)%(y|P7t?kK^pW~9Jylsyglj8t__ zKO5sCLrt94ggNTe3~s9E0(0$Le@ecw3yr)yY$?ekI$rRp8F2hNy<{(yn0N~hA-!6B zjMN2Pi23T*Uyz=Zkd&IKEvjw1mp$us958pPv>X{7m%`X9vr5UtuI8#jZ6*THlhV!o zZ_MXN;y2@c?Gp=`ctnB$pdeAVMJ>V1kTT`H27P+6s=tjXanUAD8-%K4(bRj~1?JkJ zKQCq;ObXfE;lAyBw~Fu)l=ljOicEo+AjKeKu#V&~4ObB+I>I z12Q!9>(`{Hl9JQXv-3-8JA{%IGaj^6>O`a}{k?gVOrp2DrKTi5J3S3yrzsjsc8;WI zLz(x{^re(F!%RjBM^ummwn42#E#gW5b}E#g(;zZ232Z+b(^Uxy(iUNIY9>tm9Oqd=~r7o=KT8M0xDET0uyq}F4jLS^B6(M#PIYM%Qf|S&xrE7BY z^_YtdQ?cpub2aH{vVQn(!13={JgEU+WM%6N74@yi6O3HIt@RZKUAEjy*8|9LVY44O z1dws0q@t#wwyGFeGl0}&=je-(P_m|?M4yNJAVgy&&5@*7?rCl^8XM}(Ww=?HNO%HH zscwr}>cWbyg%oAR)>fl52umAtvNa}78-&~-McQ0D*OY~9H%K{yI4g>>%8@N2?E{Z_ zFF?GOT=ENw%B$-r=_?l1rN5!kq1Yl64U(i4B%x8n3{d%$vV~`0LW5LrBs8S^?!!Z*FXt~n0M`QXA6DXp z5M2)`HM%ZZw~JTcUxs{YHDs}TlY^J+0{~# z8hkxCwWQ@chV-M1sH?ds?!xZ%%NO^5e;NVT%Ini|4eM2_9i8@_kI&U zl5nasF2Edtj$GIF(OGj zMq~!EqO?Tzcaz1CQWB$subn@A5|7i!;gZMUX1W<}v-n>33kr)yVz2Kg@kpZ<9v&I< z(?>>!hX#j+fA^4noDoHb1>vEFm8+2wN=!tBbR$wtTEnA>NGL~z-%z0y<+bD6yn+qf z+DcBQyj4Jo$>;j@iy~Z1K_(|lOhh1YnztY;3NoS~v!JM5#+cAV$G13=GRvW&G%2Je z0oX}t^b+t-B2_4?hJ=(XDi!6g<49Zf$%Ds`Wu!88bDhfANqbTv_AB|A|EJ_GJZ%=T z!#u9!AgL?vZ+v&jMfq+NA^xsNQjYR8mOd?R03$-;UNMucrMq3WNw0LdC^fmo)pa{k z+n9=rTvaMNsAjoE80!{MQfXHz3Y53xd}#M4`TB@UJOxhAir7OQ>* zXesu+2xMLI+C*Zi_3QgCdrX3++5jo~!OeUlQ9j8ASy*287m?iuw;S+0t*HN^e~V@R zleQ$Pfe<`K#N4QX(DlbYhW<%|uoUVOmAGCa=v}Ec-11mRm$+ zqvc5iwnb#^`Tx1#p?rNbVCn{CP%_>3p!k9Qu{}K8j#6CCtEA;3C2kZ?Byvq&tB-iA%MT>dA z72pRGD7sBLO*JcZgnp7eHU+G0d=kYE_lb=mnaq}qftDc3qi)LQF4yF>d7lN+1h8mU zs7(E)ng!C-EZ5| z6SAp4ML{AO_7pHcek^47Qx($wRKV^Z2|3{WPPeSE#Uvrt2zlG=<43J# zn`TuDq%D}zHUK2X{up&;nyCuT0q1w>usCaUbhIm_!>o%TzY}fB{hhblap>Oe>h8ML z-OU*=6GU5kdq;&r7cX!tvz`E~Pu*;kzPP}dHZD0U}nO;uaNytul=Sb5| zphsyjRT%O+N$q@c3Q(CkEhNo2xqeb=0fil+v>DP2V51r%UTP{yPD0|MI_Oa-lmqumfOvZjbLi)Y{mY#-6^WZl904tIy&-Ssvjm_A7K-F ztCf`S9Va3U}IOE)MVnc zL1-auLMqB6yZB0JY-@w|0q1uzf2pjo{?VhpK7#?%(exQgD&S4|6*HQXuCYn!|7>DX zLe$_-^T*6hk6_6!eBIV^yXWDfdqt%cbuzN&QSZHu%F>V*cf=GdAC$cDt;B5RHSwHK zS|qcJNYVh_lo4+Rxh?2>v~%zfpUbZ_tX$dh%1!JSQ9mJ@Fx3r}=B7qWP~X#DSz1N* zHRF?DR%jkcLIOoEjuw_w)&aw}8=7w2?-lMAl~x(4N#V3XXeq5AWj$muzAkuy0VWGD zkK};!J0Tnj_jns<`kp3ZO6X22%v}W@vg> z4XQHUvftG=d4)cKmA-TaF2(FYce5ZPA#3mT_CD(E=}35ah4F#sdxFdOqI?!G#YZU8 z5{E`>z)bNyjI=ip@64(C*stt_B6fb|i)xnk{0j*zqoa*fqYx5bVpL#fT~8lg((h?6 zFD}Ce3=CwWR1jWENT6zIH*2&Q1nH=+Z@m2g5w(5YS-PT1ynop!bJ`+os5ePBC`d^~ zV*}=z6(=~NSKje?QeKQiH4rI47eMI=&vJ*+nx zjWj=IZC!08`7S=Gw{6BVXY0mqyElm~O<+Uk;@xZR|D^Oh%s&pKv9=Qar#u5?UGP0`9Tss+HY#=PqFr)WTStX7EItZv> zpH?ND*)sp5X;XPZEuKYd%4F0(nDGJTH{w$qNj2W`;YX~dt~_p6asKg36?I25D}3sY z`KQ6H6}4~hv@%E zRW{}vCuDVb4?%l-@81e!MPH9<+iG8{V+{amlc_l}F|&Y>JPd<)yB9EzjqeLbnUKr! zXH1?s$NqzRU2R4&PJ@tAP)S{FO+`ypg&@@S2z_^o>r|O#X?b9&<9iamdH`g8T2_Oh zwx~-8xbB~xT+^7_T-_twD(e+Go9|wW$V*ACtmWU6#7Ttr`|kA!_quy;wRUO^CAkQ_ z%6)Gfq`@w8u zBb#5%lE$;a7g*B7x1!#0STnYE+@?+JU3?sA{?^K>iW2f&XjpH+vbQ(YkKf#BKf;41 zZbqSl`ff;k2D~aF?-R7QxAo|hv3I=e+PAQ+rK}Uclo)Cbi%rWTByP6hz8ZL2S|^R( zVAqnxa!)W}Cp&hUc|5pPOLN--Lda?!-%?vsT~%^?TZA$v*&qR%s zua921P=OiGs`+lCBfPry^D!Ts4;uRM+K$yPz3KB(b>|x?L$m7Vjoa0IYH`oxb(ihz zV`};6h@Z&s_XTbh0{0ayTv+6KFysBG4`+Q;gbzb#9Og!@Ft>!@g)R$HgT7p_Pw=06 zu)FB}PY>u|t{B<_?Z$!TdMb}$2f8C!-YM3=SQbka*o`ulHihkb*KyN(%@ejdPrBFH ziepS*<>jS?8nAe_=WknAN+S~ge;Gj_` zxFIC&JkWfAqCg_Us5vAimCq_(4sTZwuivL*+?}7BQ}FrZ(ffr+rYmF`;Xz}Op|}hX z;;e*^Q4r@>ynU3G>6l6oUT5+7Z2dFUHI?NE8YF~xB#dy_!~9t*^IH6JNDT`LU>!`g z^7ZR1!2R7vLzmbM^-pc&BO(bRe9*U@#q1cH#E#T^vc<1%JlBv}-FX`;b-@p= zz3grhOJOfBW@`AqfvMkrbMOeKZ4+H9A*lsvAlqNP&ktF|W~ zI*rf&URqXy#031yl7DTAs16?65*7mJqu{6%K2v!qBKOM6DheOfoJ=W+yL`G$2uFsH zTNi~sAKF>B^#w(U59Irl_7wJ2c}d}pcfwc=EWN|Vx(Qz}AK_tjad9c_1HPxqD@M;- z$0FG|mayj4aAD#KhtUF4zpz`dTexSUFk;oR7b5#Q@V$-WL?V3H=f>XLH!+RX_C0!m z#iA#QOb&@uRAK729j_edX|Ew0FdKIMz29f19Pq>Bk9qhmE7JXt)fuX#ZkObtVNbkm`AHWp%LhK73c0w9D@08>f z6k?Y35?l!oa`c<_{zz3aSlGm-3g_4hCxB*O3)4Q>J6Ra*m^Yi9>%_TO<}A`b>~nvE z*-gq|lZu6j><-Q+H(`Ph9HGj}FSOKNQk*lDoe_4~3m;4q4uST4yTUuo)#cnYa1J=X zQ=#tp373-D&bfo`v6Ok_|4Zd8b@Bmkw&Un?{?8qBc_*!>1K)uUSz)1Gmuvs2!}ay! z-%hm;3>kLLe#}{)>9gDgzxO6S+A!9kH#j;OUL|C~?sumN*C)&^%9=g-$obXxzdU+* znCj4s#){A1n$>o~ZuXfdm4+iJyfkps@_c)5;ey@x%fdU8Mr$YKH7y$9-s?FlVe{PV zJbh6iAqmKfA>VCeC7f3vY-MjSA&Yf1muPde`Mi^^g^G$sE+`UW*-qBy^j5*$TE?0M zmOgHQ@VvX*SYi08w%hNGyoKXm<}~C#>T{oRm`&2K><1m}*~54=;Y0op3{T9|6u+|C zotrJh#V2Qq$oyr)Rkbf{_+;6Y@w>)2u`p)u$Z}?}u!6VdkMLVMeZX<--e#40?Xmq{QIlYh5P5Ic%8Yh_8}Zd@w7j zHDqaW#kdx_7SikA-uU2N7`w-=Z)Ou)n%{a3=(Jd7_k5j>O<+L>Ck)!()$$s&i=6q| zM}0fS_p%8ZwzGK~Th6LW*hOgQ3kZu(&&{{gt}nQ`c*5(#uJ?p|wv?SsXZIg=HdPnX zl%{$;_WpqLJLTn97iKlI8!GSLG8k_)3qoT?VdKNjdo|j!yEQq+9;04&ry1XYk62!w zHam$0vGeQ36$#Vk&U>qZ9no%nXD4faZKfbhT~{k)CL(VNN9tBhtWmMMzC#bqST*wW zbIx|7mrbj9ZJcZE*pJ^yT<)CtVxj?O3UE>+`k@hQGn>?mk2OB`EDvASFRwGc{fQ$R zylH%G4YDE-l83C*LYJe9fp@NWhx@k*CsVZt%c>1o*|}nLI~~>e`QDM=ribp5uaDZ= za;^%|nz)0zTdQtf>+HGOE|mM?r?T#JaJ_a2?L*i+Y>!fCscT{LbRH)cv#Wd_?n+3B{B zlaP=qAsuG)l(O9YqxXFL>ZCRY7WN5CyTVqz7CQ6YH@g?DIr(Z*P2sbg6H^d7jG4)N z7@S|tvIM4TW*6)}FM82w>x9e99=9Lz_*E04O?b)4Mj8!_|4w#FraC<%GdC}DkVc(Xwc^Ba@DG|!h8I>OqG?JZzwOvH#|l}B1DLu-h28qO_nxa zTToVtiw+3)`Gv%&GO{eRQ`v@14EDAT0yKVw2O6djuVDJXxESm8ni;x0#pop!I?<3$qzcpw4!#&#w-ntyw{#`{bq1vY(i49IzwYN z1g@R@k;8`)8kL}?siiZJUMeO+({UFUn9+%99Mt@m2p=~myxXo03=D~kQ>CdhA)T!u z7x;%nC8;$Q+OxAURdt3sB?fa&hlE5RN+}5jXe0+h`+)O1Wtf%pw5A4QT|i(R?nDG4 z6frGb?xb;LWTdBMZ|wHG8nkW8!|szOTH3d42o3kF-;sH3?G59}t=>Xjasu~1kY_IR zv?M#9txfdGJd&AluwJwG*7@)UURQ4l^PNzq)6x=5F83ZRa!beROwtgAS5agE>Mu71u!5r zDK3^L)QXOcOH5TO1^_wW{7&k0rKruvJ1+qaR;oU&Dh=A+E`tMd%x9rDM|1@M`jo2733JI0IBI{ZE3A*>8R_duf(I0 zx<=f>!Tv4A5eOtH&nv0E)o`o2qN=H?qNq@7s4lK-Xlre3Yprc%lQ;QTHj0VXRV zBf`VNBctOIR7m8cmTe>|x)!2sH4f3Rz?;G0F^MTasFBb~l^7Qt77!jDMF+Xs#3>Vo z5h0>qIow>@Ts!Gdr==z*(QND}h(bgRF11p@wa|d`J5gM)R1kxh6c-&C5s7KtBVbJu z;ufVYx*9=LBVNHvLq4XQT%AUhlBLbcH540g8D>Cw9bK+Yn}t|Qj!cDIW=2Y~MyJcg z*Ddl2;eP=(@YO&c;T&CVCVoVLlk?+>TbG-q!Iyb%Msgay4soK@7wYryMO%=cl`bMv z#gdYObYe*8788fT!$1_NhgNhgMB6YG?v99vj!P6VXei%O*vx*h3-hn-dItVOU@mgS zB~oCfXfqeHBDZ8xkfaO+ah?dWL^voyOc9dFV?o6p90_%)m)ur;`MEghpFHc~C$lNt zkeF>quJQGkiy0_P1reFCViaa{bZk6Dd`gARaj1%iKq3?;#^ZY!2M!&Z{P01HXflP9 zN=O1H;Lw6&C`g(@9Mb4`lu8oJHzAW#Q$iEHGL*0RR&1<-wCt52vMfGi{gAvzMD>#tITgEr5m`96--5JDNLiIR z!c5Q%X^YTI+5&0LW>p7rp!uEHGf!2>hNl8P^Zz;WG5MW-@pJjv13y6z{L8wIaqJfk zzo5TgVENzw{ojB6>tFx!m%se^&wu{*+i(B$r$2r3%{PDi;~)RsP;K76Y_wV=g;Qg3;c$bmh_31+T z)H`@f5AS!0?}g#DBD~gu*IVdSj%Iob1TRA1ZV(>F8;!V17a#v4$^h9W@ffJGf*yt- z?O|DIX({f07Z=k#SR@xT&{e3upn&c}QPxKt&%8-L*6H^%exK5h&`kVV&%jkOF0lDE z5H1q=g%ZDf!`VwbC*nMblMB91@vV#BIFXT&5%{ec9*zKA#9Sebb8v8QP*4!^gazPd zia#auzIpTJjT<+vU%!6s+BIKaN@8;5%9YEPFZ=lTPypD)i%3y_{`~oK=gyryd)C|A z+sn%flLnkVefrd?Q=XolCr_R{apDBeI&qhTacD+8j=Kp*e(fLhR;y06n)h|>h{?j*|tjuohnAw^k!N2jz_Uv3V{lFrxy59w! zaEh4b{E7D3p!}5+mw0Ub?GbkWKM!{Q?^zZ;PFZ#52op6iy>dusBeLbtYd?e6zx2fSI>er5lk?CMYb>7Nn< zKc68#U&HC@=kj;-z<4`cKG=;j4#|%kvv%+OJe!_eBCl!qQ$j>b{ z;Wz6d{CbrOe#N55TUh^O8_aC9tXf%Y*=@GlKh&MJm#j97U{ZWPHfb^` zQyGmQUyJgSZLqM?d}CDqA((es)PE%8z~bK--IY;_fZ*|;Yy;gw`tCwQ_`4#%EB>8A zvX#Hd>{G@0s0au%|G^D700+upEwa{{Q-yFHYan*u36#p(pzMG=p zm8f^6LKCV^M-l|HA|TBC2R9&C{0DP9(T>?8HvNc;9CPQ&3_>lmt>S z)CQr2vyV=z4%(9$+ohl$tf*I;dZR8A22?YmhE6Od=d%gLLuZNktAT zQn6tvSxRN`(j^XSzCt9=vZYHFN!My(50*sEk&BlsU%6)OSF2YnTOwi>FIuv6`O1|J ztI@O+O$yQ$p@p;wsi-l#pfa~W;4$wz*RNbg-bLYFUW_H4tXP)~8`+9w%N!7mgumqu z%Y=KK|8(uc4Eg#<>O>!Pqmwr*=bI~*J4g*8!3xOB4IE%50u3Z2DiBF|1QgmHN6H0Y zmqIEvV8uo79Egg8!|El=)@*m*wq^ZV>=3b0S;|NUhgHj#uUO%>eY4{#m_c$YS39m- zz1(5Pw#|;K<+1S&YeGwDnNv|hMwp6OGu}TPNc{V*-E7UOufAHd)^XjswRrM{mwkD| zTF3PpH>_W`W{upi#&P|I4eQpfl@O~Sw3Z&2tx-hQtX;oh<9e`&A|fjR6a-ue^@!+lHpqGSU_ybeKsiNKp@wty_hEgLr=YL0DOzhTqbWeYd%ba&ahNov@*VdYY%T|2fri4E)40kdk&*6ont z2ym=jjh*Q3Dv1EFaqX(L&Re%^6cOt;IO6czuwj$Ci<2a>aWhDFDx{Fuyn5+I%Z6o3 zx9{8`Ymq+78@9MC$5;G92bWW)J@&b6+p=k+*{58zc>VefTU_anwI{~E(*sv}=87e)r%YpbAnZJI@|0~y4(xK-ijZW5Pno;tE`ht#n3 z!%6m2olYL!brURmw-S@!lH96ok%7gy_y=hi4rPA+?v)3fH!<}7sb z^giRU*Ue>{Gk>a0-9!$gle5b{faVy|gU=jrciZ8*b;W!vz zp^MuAF0Bqevrim>q@4_K-j0(n9(#+$>(~MJ?auU29R>TeD&A}Jm$(|`o)*1L&X(if zKTs+NgGcl`9?|bw@ZRX%m%Tmqy3+^E&DDL@2!{)Zrn`Llkl5h1XvCD&qo?}&cpjvN z9ot>qc1|8MdheBU$M*6D*B!g3j>hTf=B1Myfye&tt4B}qzThR1?r?S6^4S+NM~}OF z^Wt%dblK>cyGKuvN!?uC7LT6hIL6-Z@+r=Nh83e{EE&1@=J^x*xrjK~fvelDLksah zpPuQ@ob{E*xr?U{@7?L{hKUij10f+@-S&78q@ggu_so%ZhjNMbJ9}iWyVQm7k6P8aZA(6zIfG{z zP`o|kv(M(t!QZE}z~5(l{rOzBd)Mv*CngO&6z+HaD2Dln?b*G5^4t58rVP0las7)XmvLzsO7oJSURwoBR5L@S#IeI4P+;@cvL2mHiu+B7G4;#qF3n^y`Qb zqhmuZpX3~Pu>)n-p8dz?*iYvF?D4yD;Q?>oODDeGzX#t1C|s0K2R$d_6M3sHFZAf< zPbW{Bj4k|4wqMgzo^<6n;1W_K#A_Jn=I>&F@Y)sciv+(_nRdhTAU?1#hsdd5@E(Mw zLhGWm;By}PcXQ>?&ST!!ESQIn=N!q~Je9eeXEb`Bc$A3S!}Yw(Lc1sM^SdBZ`Ey`$cl zJ9x7pEtEnHVZzaoFYPTF_tN!@2yVimLq}hGNtHEe(B-6H5rKDZP{{U~W)HhYA;FO6 zm2)SL9Kw4!`}T1zLV0)-sK*%SJblz?GyF24HtoilBL{KdLF;1(PXz>%$UUPb(Axt? zlZce`dz><(8*{ro!BL3$&IwD&e;@%VSRo{AX%j-^@5yQzxk_alcqPMjUa4rU|- zUcezIFb|It=L4eOXCLNg#9ZeMM~i?XAAdBfpj%h}mc>`GaB*d-Bh%xU}x z#ujT60?vyK$LBEi9D6%2`ubUFAT8%-v)3vN8IdA~$4M_c#-2UXpo|Gfv z&P((ok)ub?FqWP_iXGF$iU_;{g>v}F@w1cg3XrJ`d2yJd-{mvM`CC$4Jy0GeFB0P6 zf#HMRFhNn9E7Ye4o;`l#u!OWtxG|Z8?lN$&$2@=u&;7-aW_Q7>9c3gf5=!)dgL_`;XQ`gUuG;YQ)+;g z3yiHV)T_k?Pfza;*|0@yP)>1bAc=T-o`dsInu^mXy#ez)4FPTO5OydpC4@KNr8Fuh zy?n+E63a`pdX~Mj#VaB7>NyXZF-=B#dS9i^KEI8_*>hBr%ZEZ!PMD9^Nd;+6$Uz`< zx}YcS-j=-RtKRqmhB;g}Ej+z^WiDC^o%vC|UQ#!Z1BrjPpUk|xyf64Z!*=Cm#Q5Q0 zeu##%mwXvpP*s?n0MAf^_sy_m+_1i?Plab5GVinaI8ZrLloBi=&iRI=ea)C}o{Bek zpM&rBbUe%U>XYF+&T(-GW9q`Zv~V2E;2?x^Ib$m;H4!4IPr%MaquH$Hvdlag)lWs{yadgJ*24eM>V+EJ)ELH{k z;&dc(a`iH^Y=UsNG#MDN55L7~61|-k&ia77i^9E3&Yt=4OnwJ?rcyz}tl8}9m8&;` z7;`e@sv_{c`-ok=dTlSbUmskdQ-$*eU%2X7G}Tn(CQyU#HUFTvEXH=VRA$3>Tx8Vq zgMetR$W0Ux0gD-Xjj@(0ZIXz%j@ax|C572ZVO)#vwZLbf1m93beKJS*UJr^K0tsVD zI{XhU*MrxS-U-IiY>^bN(o*rg8A{ghVi$J@ANls`e059+W(>sJwpqtRtdL@aS-?_NE?J5HN^%leWzR<;fJqOn8S6`LSmNrguCTwz=+*+Et-5` zhr<`MKH~mXy!|nvycW!#w_qNHd!fREycT@9fcf3@3kYY-)u2s{!gog>^YfDquUfqt z$1WQDgK_XPcC4jRr=kXb|KOOkUH^4!r+j^+W9)Ea8F`6|zeMP``U-MAp+h2{M?!U zk3#~6S`to_2+Q)avk5D7S7~BHZ~~N&ga&go^~puJU7j8t62QB_iI}ge`!+6J{3Tp2 zd7fN9f4w7qIXkX*#DA(_f&UxUvyk8r1Z1Y>7HHGr@TDxUkdTP5L`_k3O zjKV^MjYo!wh^SO`;)VLQmZ}0Z=LkkHb6iGoNl|VpzIsHCv}<0K&DF)(TnoK=P6g)B z*q@(K0vNnsq0dT9jKv(UyqAljhFmv<5_%f+8L8?VLtSfo^5o}uQ+H)nd}Js;zjGOD z!W?yK28Z6O)vBUIgE>1b08hy`c9C)_4_ityiH;Y1YFe}*p1Zf;K8)yQT9LbV*($sD zu&Br=N;II=W~U|MxI+@6s904-ez~!}!jQ$C85JF;(iD`})>Rm?Q$$2Gf@*W}3-#Iz z?iq+AW$22ltIG8nNhBsI6CyR`dWj<{CMi8PPnV-kjKSFgVOb!}F087ruP)BT@ej3R z2Tdrf%}kCLwSXhPth%BkKa*>rU;rx7aVdW6dxNSb(1JnW8%|9 z4>su25kr}&Evjw1mpu#Le!`t9ZAx4;C0pW1TZF3QbWs`^=Hj_qWbM!&n~+sl*V#i! zAdtzgt-2tS!eMzq%YfqF&oPQLOhTRkjV4W%0C9$Zz+`n!K~b?mtKo-xe0*YZdTv1> zGAd+p@5WQKXL6b*Cr6_e8%QKO-(V=nNf#U96IAM~JZi|08%Q84Gc75BdsiYYDl+Ia z-2WhrSEXcRWrLG{>=2o#O3TXA>+`ckEpo7Bf-3#Jc{w!p?v|R8{Ot5J9t_Qc8RI!Q zArq1_rhhd1bD`U)&%`9KY3bSdCAA$w$%+{d+A4MFD$xwiX@f91HIqws8TA>-+%2+p zFvA@=hKd@>g;;N_sW4#Bh}h%>R(*H;J8oI+n(kOsGEd@t+FB(!(Gc-9` z#6xGmGo}V@4g#UY1` znu~p+kgC&(GgYz!N;F{2MhhV*T82uhT9e=0(tfM6rLMd%FB_b&Tq!a#Rh@0TO?e_} z4A?_yY3Z5Sd4=V5okCZ8Lzzw^DdC(p2(h~qX-n;-C@o!+o3F=QY?zNtpP#G2sH8&I zLaMXdmV7#sZVSm?rZv5oMDHf?C4WhY7N0QKuWJM{dsA;IJDlW*8v~o@xgqG4Wr=kZ(1!k7f zAkfyt}XZ^0QAxAB#SRr^QHjWyvGp=Pz8y^3A8Hp%XoCKnNEVZNCPs zsX-PqM_hX=^k3!cBa$|uVX9?=mby{Q#rq*7h=MTZDBye;e|~|X7+Da@ONx-+0Fh@p z5hZq$C`aZO6qQ%k)m4`l736aWu==8s^2&A()BD9cJkg^3lnN&XF-ozA4 zd5QrzHP@&6?qBb)@Jo1G@;p`x7Vr}?PR#UQydJ_D*Fs`GEy}5dLgxbBfY3TB{Ts{> zqJUY0B=IB>9igLticrWOFGWSgC1r>QEaAD>>B7BxF zd4)Fwg+{09jooHy?{_vgcT$csxuBuxI~%M-tQxF1`Xie9H(0B+M92nOt*tD!LdXqP zgOxk1)=!Vb#cyhKXprP@T5)&NBWJ6!aPji>yD!8QHFw=d?DoTl_q*FFb5m1uE8Dt% z;tkwfTMMfp*aGpk9|hUfToiX<_xk0F7xr^D0cCoVFHVmyl4zjj1E8_e6jI69HCgQ<~wDkUi{5;xW2kPwdNuS!Eh zL|9k^8j$^rvN=#gXqbqw65&F`5f=KiA~LBWB9lsLp%Ru@8U{NcCN8le3i(eo(A;A4 zei_K&G!#jzIC_P|T*T&(`T>Ymq)bamj0yHVf9Avq$=`fM3*{EKWySZpUr<;yZuE#H z9=X!O!y{vU`VEr7)+?(aSVN?i9|sv77KEo2mR`mda!(;e6jF`gPpa{COl*7-a=IZI z8{OJKHaBEzQz4Tbven@h43|;p~;96-LY2~OPIT@5>S~BdA4U?Ld51ha4kP^#WgwDj z@>*%>*RKFMz;cU22S#99lD9n$AHGPbqQoNCsw!KO zF<|Kmk_kRc*hwZ$AOSL22C~p>X#$gh6EZ_WNM;}jOM0PKy4!eZyS-bIWlORwYxN@U zvfbW#@jW@#z3OhxX(ZL6=FFjW>zm*ID_vP`8%`7^Gvu69w{@$&de>+9Kg+w+>qc{- z4ZPu$)`ne~aV;YJ|MebsZTjy$?|aYMyS2Zsd2;^uuPg9pZs1(sulD)syVrG>(tp}` z-mt>!$M~l;@n@&W8%*i^VOL*g7P(#h)yve^-mU#T|GU?ee6_%99-nLK)$d<@_nMNg zK3;pb_V@fg*PgBYJ^#Bup}9Ohzt~#UwZG?o_nMNg7I@9$|F@@<#@AlDd`&q1-#`3+ zP60ngdMLjy>f+(E@7DgF_vE$Te_4S)a|2rcvL;{K-|IVg?e||+`P@X#o4|!O@n@yU z8&2sQnb)X|@P}Lv{omZ{@Mrga_nLq7-`wE;lmX9{Dqr_+@s;Pl3Rk|I|M@HbJUw{J zYex1beaMLae=T`|_dB^u{neL?X^K}rdH3h(fxF-TGhP|-e?~Dy{wtNd!26w^b)WsY zSK)G`Kl1|uc%f~)zRC~3zKu_~e}C;23a`C??cYq{T*)^ocJ5g;<-efhYrFfhPsIh_ z@AR}^5;*rN+^h6we&E`qKXV&zG>&J^)69(cypQL-%@odk^+v_cJu3|Kzo6uKeZBsz z-Y@Wer>D-h8HM|u{@gw|>IWxgFGGInsf=^&!Fhi(g|pAAQi`4T?fErdQ}Xo%+4 zlIOMcMsJG?zTfEyzn+nw&v+tlibMAmuRieT%O0FpVpi$A2UQ#ASE)+8L8DLn$&Jq1 zcwM8j2T!8;Q&0WkD_{FJ*Zd+%qpGtplaj%DpiR$X!Nl^xzSl0uWNMn;PJEE_Nyz;zj*Y)Lk~WDB!gai zdiHM`ubw^rxZiJi{_ukjKXSH=@jUX#(HB1Pz}ZLVO1@Epuc`fN$#b2BYHP1^51)9V zxZwMpvPI5M$RvOI$RqjTIe*F4qmLfR?zyuMQeswQ?Lo>^b=Dp{nxCP0SSxD})RDJ5 zztQ|oOZOqvmOk_1ll$*GaQLAkk34E5=e^Q+N-C8Npu6_$ ze?Xb)^TUrk{gR)#-+kYK2lHsHWQu-ygRiZ9uH;%j)pk3-wv(3uygCBEBYA=MJLNFc z_3wZG?!yl_7vz8gmeBJ{Gs6Oz1XLTQZ=xm9Hw)$1q z_nu$Ebqv=&@Zf_Ft(CY>V(@+MyH=64Mi2hxFTSSHBZuDqOV>PbUK>Xa{n{_>c<|8S zSub+EdHI>42VQ*HCVf9JeD7Z8X)@sOdG<=dZ{}xAslup&{ZO3oS#L;e5LFFv?u-~NL~9`b9i`AMp4Z`!*1K%_8juDu?5@ZpqI z+Au!-nZ5hTK!hMKJiWmCoemv7bnqvN;)4&HH_CjvICSXXUn}0eYp%HK(Eag4;(mK<=}4>^ZSk*LcFsN zKK32odAXz94M|Bc| zv>ZOP@38~>mX;2`xb*U~_dam_t$ROy*CAp^lDyK}VW&@Te|YEN-Je)`*KfV^=8qjZ zvh~q}FD^a3_tQ&9AASBeKX}&-AKM?fNXc1)FTMQ2i%Ty&_vxn}Ke}z_o~?Ip-*Lw$ z(f>o&-geL4$k?o8)dAT%_~gsaAAQ;>!KX0by6g5u%4Xl?cjPbZey0OY|L*^$;@W2( zyg&2)OmX1AzQ0ue{TJ64w>`FhZ}njRzTf zepg^TzVz}lj~<*=Ikh{}<-+cOOi>*iQ_oMaIgKsN7e59y9{=j`zw+E|ZFT~}*o`3%JfBBz(vUB^=%fHZm z>FwWi^KWkXm2Y43kKX)m_xZ)MgVkx6G;{FqxAzwR&3ih3>4%^Cp|9-z`d1!2+P79S&=bzhs`_ucq4?H?$9`uQjBpS5xSeODA8TIv^fJh^|ZgbOR4-BN6SY*u1F8hh>E zfB(Jz@U7d5?S+%x&EofW6o0#Z@X-GIo$O1AjA#FWuY23i7Vj(`FaFi{zvaD$iub&$ zc&fPmZ!~|ac-K!}_L~}?lw)nXzPY&O z6A$d#Sh@g4u7D4u-!VAaNb_w9Du$J199S3kACDsjKx^Ygm@{yn>X;%nbu94c;Fdba4l zed#-jUtjvv!F%t$FFc^mk(hPg`J=^$ieD?P`CIcJSi1ZN-nMS3xarM5vvleA{_N#T zU-yIm)0;o^@>6g-C1(wO>gBf=-FIC6@#65ypLuiPPK6>z?w8*Cq3iG5xra8-N}lci zX9|ZEf8m>!-ge2-kAKC@#f@+JiN_u~SbeAW3%%cIk3)s`p#L+6cHUjhd(R$c4Bu7! zg*%^qV(&faS&3cu{O?!3`R~1SWcQ9dxcA;&y@e0=ihp(F;N8^&Rd(*&_QP&q*|X#B zvn77C_-nVi@MizcwKjI|{0qguedd{icdwOrM{(ut7!rHlV{Y186A`NpMnKXTW%6~A_rEl$b2cHi@2FwC+_dxyn!WPU zUC%yx@cycRHZSmgC#NuX?zpnJ=IMiX-({MgDm=L7uCFhC`RLOR?L?XC!NGm^zpE&A zJaEspJlM4hWpX{n#}Dqz1x4e*dvOI5cb2EjbT< z;<0#@W}- z9dG~o{fKw>5(lAJy1jVn(LLMl+_t0odRFr5zi0Q-M~j~-UjARc`tIis!?C5}=E3(Y zz3C_4-e0=p2cLLm!`DAuc}=qxckcMi%Rl)||E##;w&IRYK2^;9vlsT!DX({b;99@7 zPAt#sefO^W@A}8Z(obK$^takef3I;%@gMH~-T6&%FE->pxv=ysh}DNB=?b*NcODivLp&FTd;kzkl=AsC4GI_PYCbzJFtL z>8Cd=?I`|Q@vm<#Ui#G0M-JXQJC7|EyTJRMoG#zK75*GOuzjm}f2MFU{RXn#Y#iQk z`<>N;yS8sA);EiH+PcGg6AB4)=f8}={+V->WJ@SdiFR4b5=C|L; z1^wqs@A;QU{_c<5^|$}Qb>DaEq3_BqFfYIJeOKRfN0c{XU3=a2(eMAsN0+Ysm8GQ{ ze*C>l4}Sl{k3G0|*X(e;SzYK|PusU|-*(4eE5_bep_+tOGoZOwyMfMRN*`Kz4YY0)q`!@?!4n|?qAyd%;S5` zme~3;#dkjO?1MWHEmgGf@$Z2Azxj!04q#5z#?~8(;`XPX*t7NaS&2Kh{^O$f)`yNB z*>$!JW6f*p?PycI9^ZfO-uw3N*|YB+ry;ggU(VXvx%a`tyHn)8y@ww@xNG;m`|nAZ zR=o}!K5|&L?!m99dYv`+^2?v9uB&-y=l$EZ-+$nN2X^Gh{mbus??-ODEh3unt-ZEw zzcpn)>A#%)-M(l4E_XG|zJ*#Bc)!z~TkpK%_M5jo^u)exwu>ne9Ns{@4D;mZFk&}^C(_b<8JbB8&68zaLcw`JGX7! zzV)W-KfddQDxAIk_N_a1-am8esyb;fLGcUsxX)$Vj%|1Ez3<*#J5+x8Kfd=P*Sk1o z)@Iebe{{6tZWmQubIpgZzVX&uZn-|FSce))ZZ@qoT{Rej5errWLl)ZiX zeMg=;`pEtnF+I3#+n$G?cspmt zZ`*O;(MJyMxOLXc+0!Yv-*$8Et-0a1e&=^T^wDds``Aslxaq}f_I1^G=y9h~OH1$j zy=!i&?vAfBvZcFWV zzW4X8yXowJ&-Q-D9msLZO*eexgCCR$`=FCb*BQWVul9a{_dB`G=9XJ-zV*(nx#%W? z_vhwYZ>LY&?wrj#4_v5o*Iiq0z4_*$zIQdwxe~X)*4H$8%Wb)$=;qltZcQ6^Y~OL`xkhKV$lP+vO-CQO$vt!LdGCil zdhK;L(t%u$boO<2fQI<-N2Sl+{k{)h_i+VozUjv6uldLa-u1BuAAipWuD<>zHC`<_ zYw(@#`rY?w@cNJ6OsQ_JYQO8fzjv+L=St4{Fn}AcyZWQmg<2o}=+)QWc+giZwjeCU7Y=ByS3Aq=RNSzQP#5$RJo}tu=XJ5IA^V_mGFJ_ z8ciEFu9Zlms@!zbS_wp}TD_?%k*awqa>Iu{_<{F-;6oq2`kL!q_oTwBuQZ;|HxbeI zzx#K7_XDnCOS3L?y8ha$Km7i8eZX~kgnZUXRdcPu_oqPzcB|s&*IsLLtrzENt1G>( z@p9PEMAyEFFLYt|JB0#{>3Vq=L!SpeRc9J+{1YE!mwZ*{Y>9lRs+?*aOhINQdJRTT#utCx(VJo=SHu;&dZ!~_7nzN&M#pqWLG@I9#KRB<%tipK@&er(Ts#ND(|FkMOQu_wum{oD2b@saM zx@)ev`lDCp#=98>*1pK!Ora`y?X}ll?JVg>uJ)!XpsXw5u2%D!YeKklB@yy<4Zf!K zt0mWZ3hAA(b?i2;wWn$GLhpB~8d&=$ptttE`upeUL8d!Q&WywIsJ@?fI)^&#Qf2$+f2bgugW90`GVF==ra7bpGd${&{+klhJE0 zr=@dX`VC$g@!2nCg4QiQFBmh7G*ISG>1h|>$h92QLU_vMolwok4Ej4YW1Q$@qSV-2h&lf)+n3pcB5bR8-ud!_lNyKt86w$qe0Pc)pS@EgQDmR zHD1(o*B*CuRnvUER*c)Desk2SsnHk}BdNPVe=zKqgGQq@DBESJRvcC@olrM zg<>!r*GrEzGHSG1Q&Tgsa#Zx|t)@avpNdv7s*l@wIxfbY<<7XMYj#j;H3r^J2Mv{) z&00CsV1KBArdf8O~F%XY2N9<|#=*>N@$d)hdSN zz`?`8s8Dv)L=cl~bJn{x=*>y7fUhZq4_m^}3P!-=H}y`_n-f+Nii) zHVY%HHOIwZR8PBT(HR+#k+ck|Zj235Q7YXSH5)|-MVk27Y?`a8BmBj!Mt#(2%nxd# z)~JalMWZ>Yw~BggY9_VNdoUmhL;ntI&61p9FTojh&_8{e$5<2N_BgFK`r|r=`+Wh! zBo))nH#j-WsbaHW6AovhzvAb2)u|uz@*%**2vXyplI3pxswW2*HT87px zeT!Vhs8h%7X1(3K;&Z3x%&tuV8vXi+@MB+X(8mfIQLCYN1j!dzF>LxUE=SEiE^DUc z@u=-Hoyb_~&0%C}(izvngVXJD+FR{4J9DjRuhH~BtxRcvSsF;_G8(jM21Jh9m|iu15nJMXNn32Yph3Z+J0PaiAsI6zY`qe!V^HwDr*TX@v6{HoJ0Mo07vO zvNs21pK_GZiBxO0YEe{LS8uh(qcL*Uj2rLU)6$p*ct|z}jp=aQ8jxfHLErk*&C~XD z^NGvKHvYi?s$YcKL{@+Gve}Oip@qhqs8|e)WmL&^(HRl6JjDqUYR{2vnt#RTE}GLc z2^%(>9g009#ATrljVM|zZ1k3p)!L;JZGunSAp$@ew(tc_hHyxwb`$-__3^^#&Zt3X zTF_%g|4wV#FN;W4vzWG;gXvJ4q^n8I2RMlabUFAkf?VxZIc*iheu6IT&NvDPe+JEd zy+M4juGXFpO@~o*ct_)F^|IHnV$~Rp=Clkd$spF1VU~d+uai;wFbWRX)r577BmN*NqHm%2RekAN)eY@ zgUYZ8eQG(X_sOGaA${f%ixKMU6G6;}zK;D6$MV8tFvZV4NWcSAf_jQKMlJf&@7K#d z;B1%u+UC{%s59Ms>e6zAJisrqSsT_y9eO|)i6)W|`nE42Cr~P5vH&hc4PZ0}EecX} zf*NChRBK=Lxz9pGKpz7YvTE4OB5_~|vGqV=u@%T;9bjt*VyR$MiS*M}YMa(at)e~Z zes*En*HfcjA2oaP10OoA!L&iZ(7%BgnR`I7n3fG~)zzD}26gD5kJ_MxXaTdLm{9Yw zK50(}#jwS0KuD@lJm6KuAhgE) zV$$fxSL{#mf}FQdm6*rtKx@hY_}SM!NEpFUPRKvy&9QDw4zmSV-^pjB-2xp*9ueXp;*6V5DX02 zX^p!RKFV|zbz))Z0ts&b)7bKocNYX86K(QH+&YLpf*VoAb|?H|Yp77=H}n}cGeeDl zgGteZN#|I1%mdJSe1#@!MsCNb5t`AEvPGB{VbGSTk;O$f{#H3^O}b+WGUmfYUpv!v z)7DtK{G!N4VBEm8($p&GQ~*#>N3)AlN^EE$yTfN0 zu`)5dC{PbCm`o4p35!moB7^*b(+evd4)3%P-@oYe8}OzPyy-wDy1)}6t|h5!*CTmA z#0;A?UZ(k@d@zOuBkzMT`mc2Rje4`kg2#h0j%gFd6B3jhRwFYdT;aP0A2C(q<647% zJ!N^SMyY><1xgQUY)`Y#DV##BaedMq%`Nw}CU2~0gOIR$?O|Dx(N=Sw{13PAeo!7S zE=}|iqL}9jzNNou$0$d=atj^-16HjTXNanKOY>QwqVnLWdpu2msYDcgrYz*&Xb{od zsdbPuUQr+@vci7xej;JRX|&BSX9gm8!A~G`6c5v|o-yT3pxCJ08q!%&l*p;%$PFt) zAgqc%)JAP|;`!7g|80nb@T7an=u|rIb99ZF7%z+!uh;rh)>nf;_ktrus*QyxkaW>f zVn&`oVmAyx#X+12oF$Q3kK@)D4n$?-+h>#GKR5aQ6VBIoPcbTt=!q@mWu{RZ#{a5`UCR#q2|9LO>5O?5z12>6smO!vqyh$~V66@Ztu|b{j zc&yQJr>Ku=oVa-WgYjH{x@kI@TV}=3ANBjq#Xnp;wWSoanC~zY;w2a`3M_Y5))%pA z=-)55uq$y;;!_M;ZODhv#*ga22MKGu^O(z;l|sE9-u9B z?Qr$u4;VZ66%imE8w?MSD7GX`3E}XAGe@|Pk>r{quZDmpsv5`{$WYLP=#!?*H2jP! zL0c}i_+xxZpxH3Uo2Ux20ZSPRQw$4;D7HD(edPh8%P{S7mql@(Yjctf%SA5Z|w z0%%x`7h?(|ZeS|_`1p#?FL&xOncTqv3O5p!)7&Z$hwqU+dOg+fAPKdzNDQ^f>rgmO zisSOey3Umi)F0;?oIyvS82Othy}RgaV3cXhi6Q&^p5klU1fl3u+I$26BGph{!sV%c#cDGJ&aCBYJ#)au8S; z)fqZI%pCh9!fkH;!_Cvh(efq724%6CSJxjd@`K`q3MRaQFbsBLK{#eGow&zs9!7-7 z0Oc$E!`}<8BwR28#wixS{Hi=1v4dFXKf2=cpY2W?J;qK-5ba|`OeH!m>Z!A&-AQjX zpYt*?qlQ$1)?sWsD~lKcjj}aoEaJ@YtX9^?BH-4Pps-+UX!JCgOu%dUEsY8`QVaE) zGI2wg6VXXNhY(h@gpJZnfv+O*5lw+7A!K~j_7L06mxse43;pp1NCu4|ruinTGU9U} zlY%U%NV+iIl!y_R46NkDd^^K7yO3OEy}!D7^}9~=r=z*!?UREo^ZjY7TpZP=VlkvN zVVDHT#jLm-%>gN}uw5Wm%nxfB>qxUHVDN#l@`w&6{fje9Kvglh9ESRe℘iiHo7c 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 sXSct~wkH=(^sMuGf&W>--2WH9pxUal<;l2mR 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 + + + +The New International CD-i Association + + + +The New International CD-i Association - http://www.icdia.org + + + diff --git a/libk3b/projects/videocd/cdi/vcd_on_cdi_41.pdf b/libk3b/projects/videocd/cdi/vcd_on_cdi_41.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cdf4fed523eab1a1a28adca0f4a90b5cb8e0e2f0 GIT binary patch literal 126675 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
X1_iM=+?75}! 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
I(^%uYFo*^LEEkH$;rh0N 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

leq}%8=F(%t>9mHi@*e|AQeuk9cv2!{ts5 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� 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 JR~As5{5Lf$U0whH literal 0 HcmV?d00001 diff --git a/libk3b/projects/videocd/extra/k3bphotovcd.mpg b/libk3b/projects/videocd/extra/k3bphotovcd.mpg new file mode 100644 index 0000000000000000000000000000000000000000..2ddb69e0beb561fc25f5f2fcc5b90866673b7088 GIT binary patch literal 1731138 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�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%0DeX6TCv#0NUOReU3U%bO=RKm$R-BTF& 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

k5Tu|Q)mny_dTjKq{Z8jS^_ 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

E8jWiW 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