pax_global_header00006660000000000000000000000064134211521340014506gustar00rootroot0000000000000052 comment=8c76e36a9183753d09e8d8bcf21fe5f19acfae48 knowthelist-2.3.1/000077500000000000000000000000001342115213400140645ustar00rootroot00000000000000knowthelist-2.3.1/.gitignore000077500000000000000000000002031342115213400160520ustar00rootroot00000000000000knowthelist.pro.user* *.o moc_*.h moc_*.cpp ui_*.h Info.plist Makefile knowthelist.app* qrc_*.cpp knowthelist knowthelist_*.qm *~ knowthelist-2.3.1/LICENSE000077500000000000000000000167431342115213400151070ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. knowthelist-2.3.1/README.md000077500000000000000000000101451342115213400153470ustar00rootroot00000000000000knowthelist =========== Knowthelist - the awesome party music player - Easy to use for all party guests - Quick search for tracks in collection - Two players with separate playlists - Mixer with fader, 3 channel EQ and gain - Auto fader and auto gain - Trackanalyser search for song start/end and gain setting - Auto DJ function with multiple filters for random play - Monitor player for pre listen tracks (via 2nd sound card e.g. USB) - ... more details can be found on the [Wiki](https://github.com/knowthelist/knowthelist/wiki) Runs under Linux, MacOS and Windows ![](https://github.com/knowthelist/knowthelist/blob/gh-pages/images/knowthelist_2.2_mac_s.png) Needed packages for building: ------------------ - Qt5 or Qt4 core,gui,xml,sql,widgets (Qt5 only) http://qt-project.org - taglib http://taglib.github.io - gstreamer-1.0 http://gstreamer.freedesktop.org - gstreamer-1.0-plugins-* http://docs.gstreamer.com/display/GstSDK/Home - alsa-devel (Linux only) Build: ---------- - cd ~/src - git clone https://github.com/knowthelist/knowthelist.git - cd knowthelist - qmake (for MacOS: qmake -spec macx-g++) - make - ./knowthelist MacOS X: ---------- Knowthelist works well on MacOS X. * OSX 10.6.8 is tested and known to work It can be compiled to a .app bundle, suitable for placing in /Applications. Compiling is incredibly easy using [Homebrew](http://brew.sh). Just run this command: $ cp ./dist/knowthelist.rb /usr/local/Library/Formula $ brew install knowthelist And you're done. An icon for "knowthelist" should now be in your main OSX Applications list, ready to launch. Windows: ---------- A prebuilt package for windows is available in the release section on this page. The only prerequisite is a installed GStreamer runtime. But if you what to build Knowthelist on Windows for your self, you can do this like this: Build dynamic version to debug project: - Install [gstreamer-x86 runtime & devel](http://gstreamer.freedesktop.org/data/pkg/windows) - Install [Qt5 MinGW incl. QtCreator](http://qt-project.org/downloads) Due to different exception handling versions (SJLJ, DWARF) of used MinGW comiler for GStreamer and Qt5, it is neccessary to use an own version of taglib. To get this, do this: - Get [CMake](http://www.cmake.org/cmake/resources/software.html) and install - Get [taglib](http://taglib.github.io) and unzip - Open CMake GUI, select taglib folder, press Configure and build taglib - Add the taglib bin path (e.g. C:\Program Files (x86)\taglib-1.9.1\bin) to PATH variable into the QtCreator project build enviroment settings - Add the GStreamer bin path (e.g. C:\gstreamer\1.0\x86\bin) to PATH variable into the QtCreator project build enviroment settings - Rename libtag.dll and libstdc++-6.dll in GStreamer bin path to _libtag.dll and _libstdc++-6.dll - Build and run knowthelist project within QtCreator (Ctrl-R) Build static version for release: - Install [gstreamer-x86 runtime & devel](http://gstreamer.freedesktop.org/data/pkg/windows) - Build a [Qt static environment](http://qt-project.org/wiki/How-to-build-a-static-Qt-for-Windows-MinGW) - Build knowthelist via QtCreator (qmake, build release) - Copy all dll files of the gstreamer's bin folder (e.g. C:\gstreamer\1.0\x86\bin) into the target folder together with knowthelist.exe - Copy all dll files of the gstreamer's plugin folder (e.g. C:\gstreamer\1.0\x86\lib\gstreamer-1.0) into an new folder named 'plugin' in parallel to knowthelist.exe. - Run knowthelist.exe Install packages: ----------------- Prebuilt packages for Linux can be found here: http://opendesktop.org/content/show.php/Knowthelist?content=165335 **Debian:** Knowthelist is available in Jessie and sid archive **Ubuntu:** $ sudo add-apt-repository "deb http://ppa.launchpad.net/mstephan-r/ppa/ubuntu trusty main " $ sudo apt update $ sudo apt install knowthelist Versions: ---------- - 2.3 (2014-09): Qt5 compatibility and usage of GStreamer 1.x - 2.2 (2014-08): Support for stored lists - 2.1 (2014-05): First public version; removed qt3support - 2.0 (2011) : Qt-only + gstreamer version for multiple OS support - 1.x (2005) : Only for KDE Linux with arts sound framework knowthelist-2.3.1/debian/000077500000000000000000000000001342115213400153065ustar00rootroot00000000000000knowthelist-2.3.1/debian/README000077500000000000000000000007621342115213400161760ustar00rootroot00000000000000knowthelist =========== Knowthelist - the awesome party music player - Easy to use for all party guests - Quick search for tracks in collection - Two players with separate playlists - Mixer with fader, 3 channel EQ and gain - Auto fader and auto gain - Trackanalyser search for song start/end and gain setting - Auto DJ function with multiple filters for random play - Monitor player for pre listen tracks (via 2nd sound card e.g. USB) - ... more https://github.com/knowthelist/knowthelist/wikiknowthelist-2.3.1/debian/changelog000066400000000000000000000033301342115213400171570ustar00rootroot00000000000000knowthelist (2.3.1-1) unstable; urgency=medium * Switched from localsrc to uridecodebin (gstreamer) in players * Optimized VUMeter draw algorithm * Added a custom dial to have a unique look of the EQ dials * Auto formatted code * Bugfix playlist drag/drop, improvements AutoDJ * Corrected summarised count of AutoDJ * AutoDJ: save settings before reload * Added DJ label on main panel to show the name of the current AutoDJ * Removed build depends for gstreamer 0.10 -- Mario Stephan Fri, 18 Jan 2019 17:50:46 +0100 knowthelist (2.3.0-2) unstable; urgency=medium * Simplifed the build dependencies (Closes: #767141). * Avoid mismatch of dependency (Closes: #767142). * Enabled parallel building (Closes: #767143). -- Mario Stephan Sun, 11 Jan 2015 20:01:11 +0100 knowthelist (2.3.0-1) unstable; urgency=medium * Made all compatible with Qt5 and Gstreamer-1.0. * Add an ALL node to filter results * Changed ModeSelector style and moved to tree header * Included 'year' tag into quick search -- Mario Stephan Fri, 19 Sep 2014 23:08:00 +0200 knowthelist (2.2.4-1) unstable; urgency=medium * Fixed a bug which prevent correct monitoring of changes * Improved quick search in collection: added search in genre, multiple strings * Changed alignment of some display controls * Allow more audio file formates * Added a mutex to get more thread safety for database access -- Mario Stephan Sun, 14 Sep 2014 01:18:00 +0200 knowthelist (2.2.3-1) unstable; urgency=medium * Initial Release (Closes: #751350). -- Mario Stephan Tue, 26 Aug 2014 07:06:00 +0200 knowthelist-2.3.1/debian/compat000077500000000000000000000000021342115213400165070ustar00rootroot000000000000008 knowthelist-2.3.1/debian/control000077500000000000000000000017431342115213400167210ustar00rootroot00000000000000Source: knowthelist Section: sound Priority: optional Maintainer: Mario Stephan Build-Depends: cdbs, qtbase5-dev|libqt4-dev, debhelper (>= 8), qttools5-dev-tools|qt4-linguist-tools, libgstreamer1.0-dev, libtag1-dev, libasound2-dev Standards-Version: 3.9.6 Homepage: http://knowthelist.github.io/knowthelist Vcs-Git: git://github.com/knowthelist/knowthelist.git Vcs-Browser: https://github.com/knowthelist/knowthelist Package: knowthelist Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, ${runtime:Depends} Description: awesome party music player Easy to use for all party guests. . Featuring: - Quick search for tracks in collection. - Two players with separate playlists. - Mixer with fader, 3 channel EQ and gain. - Auto fader and auto gain. - Track analyser search for song start/end and gain setting. - Auto DJ function with multiple filters for random play. - Monitor player for pre listen tracks (via 2nd sound card e.g. USB). knowthelist-2.3.1/debian/copyright000077500000000000000000000020161342115213400172430ustar00rootroot00000000000000Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: knowthelist Source: https://github.com/knowthelist/knowthelist Files: * Copyright: 2014-2019 Mario Stephan License: LGPL-3.0+ License: LGPL-3.0+ This package is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. . This package is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. . You should have received a copy of the GNU General Public License along with this program. If not, see . . On Debian systems, the complete text of the GNU Lesser General Public License can be found in "/usr/share/common-licenses/LGPL-3". knowthelist-2.3.1/debian/docs000077500000000000000000000000121342115213400161550ustar00rootroot00000000000000README.md knowthelist-2.3.1/debian/rules000077500000000000000000000014161342115213400163700ustar00rootroot00000000000000#!/usr/bin/make -f # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 include /usr/share/cdbs/1/rules/debhelper.mk include /usr/share/cdbs/1/class/qmake.mk DEB_BUILD_PARALLEL:=1 HASQT5=$(shell qmake -qt5 -v > /dev/null 2>&1 && echo yes) ifeq ($(HASQT5),yes) QMAKE=qmake -qt5 RUNTIME_DEPENDS=libqt5sql5-sqlite,\ gstreamer1.0-plugins-base,\ gstreamer1.0-plugins-good,\ gstreamer1.0-plugins-ugly,\ gstreamer1.0-plugins-bad,\ gstreamer1.0-pulseaudio else QMAKE=qmake-qt4 RUNTIME_DEPENDS=libqt4-sql-sqlite,\ gstreamer1.0-plugins-base,\ gstreamer1.0-plugins-good,\ gstreamer1.0-plugins-ugly,\ gstreamer1.0-plugins-bad,\ gstreamer1.0-pulseaudio endif CFLAGS=-O3 CXXFLAGS=-O3 DEB_DH_GENCONTROL_ARGS_ALL = -- '-Vruntime:Depends=$(RUNTIME_DEPENDS)' knowthelist-2.3.1/debian/source/000077500000000000000000000000001342115213400166065ustar00rootroot00000000000000knowthelist-2.3.1/debian/source/format000077500000000000000000000000141342115213400200170ustar00rootroot000000000000003.0 (quilt) knowthelist-2.3.1/debian/watch000077500000000000000000000002311342115213400163360ustar00rootroot00000000000000version=3 opts=filenamemangle=s/.+\/v?(\d\S*)\.tar\.gz/knowthelist-$1\.tar\.gz/ \ https://github.com/knowthelist/knowthelist/tags .*/v?(\d\S*)\.tar\.gzknowthelist-2.3.1/dist/000077500000000000000000000000001342115213400150275ustar00rootroot00000000000000knowthelist-2.3.1/dist/License.rtf000077500000000000000000000206661342115213400171430ustar00rootroot00000000000000{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Calibri Light;}} {\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\lang1031\f0\fs22 \b GNU LESSER GENERAL PUBLIC LICENSE\b0\par Version 3, 29 June 2007\par \par Copyright (C) 2007 Free Software Foundation, Inc. \par Everyone is permitted to copy and distribute verbatim copies\par of this license document, but changing it is not allowed.\par \par \par This version of the GNU Lesser General Public License incorporates\par the terms and conditions of version 3 of the GNU General Public\par License, supplemented by the additional permissions listed below.\par \par 0. Additional Definitions.\par \par As used herein, "this License" refers to version 3 of the GNU Lesser\par General Public License, and the "GNU GPL" refers to version 3 of the GNU\par General Public License.\par \par "The Library" refers to a covered work governed by this License,\par other than an Application or a Combined Work as defined below.\par \par An "Application" is any work that makes use of an interface provided\par by the Library, but which is not otherwise based on the Library.\par Defining a subclass of a class defined by the Library is deemed a mode\par of using an interface provided by the Library.\par \par A "Combined Work" is a work produced by combining or linking an\par Application with the Library. The particular version of the Library\par with which the Combined Work was made is also called the "Linked\par Version".\par \par The "Minimal Corresponding Source" for a Combined Work means the\par Corresponding Source for the Combined Work, excluding any source code\par for portions of the Combined Work that, considered in isolation, are\par based on the Application, and not on the Linked Version.\par \par The "Corresponding Application Code" for a Combined Work means the\par object code and/or source code for the Application, including any data\par and utility programs needed for reproducing the Combined Work from the\par Application, but excluding the System Libraries of the Combined Work.\par \par 1. Exception to Section 3 of the GNU GPL.\par \par You may convey a covered work under sections 3 and 4 of this License\par without being bound by section 3 of the GNU GPL.\par \par 2. Conveying Modified Versions.\par \par If you modify a copy of the Library, and, in your modifications, a\par facility refers to a function or data to be supplied by an Application\par that uses the facility (other than as an argument passed when the\par facility is invoked), then you may convey a copy of the modified\par version:\par \par a) under this License, provided that you make a good faith effort to\par ensure that, in the event an Application does not supply the\par function or data, the facility still operates, and performs\par whatever part of its purpose remains meaningful, or\par \par b) under the GNU GPL, with none of the additional permissions of\par this License applicable to that copy.\par \par 3. Object Code Incorporating Material from Library Header Files.\par \par The object code form of an Application may incorporate material from\par a header file that is part of the Library. You may convey such object\par code under terms of your choice, provided that, if the incorporated\par material is not limited to numerical parameters, data structure\par layouts and accessors, or small macros, inline functions and templates\par (ten or fewer lines in length), you do both of the following:\par \par a) Give prominent notice with each copy of the object code that the\par Library is used in it and that the Library and its use are\par covered by this License.\par \par b) Accompany the object code with a copy of the GNU GPL and this license\par document.\par \par 4. Combined Works.\par \par You may convey a Combined Work under terms of your choice that,\par taken together, effectively do not restrict modification of the\par portions of the Library contained in the Combined Work and reverse\par engineering for debugging such modifications, if you also do each of\par the following:\par \par a) Give prominent notice with each copy of the Combined Work that\par the Library is used in it and that the Library and its use are\par covered by this License.\par \par b) Accompany the Combined Work with a copy of the GNU GPL and this license\par document.\par \par c) For a Combined Work that displays copyright notices during\par execution, include the copyright notice for the Library among\par these notices, as well as a reference directing the user to the\par copies of the GNU GPL and this license document.\par \par d) Do one of the following:\par \par 0) Convey the Minimal Corresponding Source under the terms of this\par License, and the Corresponding Application Code in a form\par suitable for, and under terms that permit, the user to\par recombine or relink the Application with a modified version of\par the Linked Version to produce a modified Combined Work, in the\par manner specified by section 6 of the GNU GPL for conveying\par Corresponding Source.\par \par 1) Use a suitable shared library mechanism for linking with the\par Library. A suitable mechanism is one that (a) uses at run time\par a copy of the Library already present on the user's computer\par system, and (b) will operate properly with a modified version\par of the Library that is interface-compatible with the Linked\par Version.\par \par e) Provide Installation Information, but only if you would otherwise\par be required to provide such information under section 6 of the\par GNU GPL, and only to the extent that such information is\par necessary to install and execute a modified version of the\par Combined Work produced by recombining or relinking the\par Application with a modified version of the Linked Version. (If\par you use option 4d0, the Installation Information must accompany\par the Minimal Corresponding Source and Corresponding Application\par Code. If you use option 4d1, you must provide the Installation\par Information in the manner specified by section 6 of the GNU GPL\par for conveying Corresponding Source.)\par \par 5. Combined Libraries.\par \par You may place library facilities that are a work based on the\par Library side by side in a single library together with other library\par facilities that are not Applications and are not covered by this\par License, and convey such a combined library under terms of your\par choice, if you do both of the following:\par \par a) Accompany the combined library with a copy of the same work based\par on the Library, uncombined with any other library facilities,\par conveyed under the terms of this License.\par \par b) Give prominent notice with the combined library that part of it\par is a work based on the Library, and explaining where to find the\par accompanying uncombined form of the same work.\par \par 6. Revised Versions of the GNU Lesser General Public License.\par \par The Free Software Foundation may publish revised and/or new versions\par of the GNU Lesser General Public License from time to time. Such new\par versions will be similar in spirit to the present version, but may\par differ in detail to address new problems or concerns.\par \par Each version is given a distinguishing version number. If the\par Library as you received it specifies that a certain numbered version\par of the GNU Lesser General Public License "or any later version"\par applies to it, you have the option of following the terms and\par conditions either of that published version or of any later version\par published by the Free Software Foundation. If the Library as you\par received it does not specify a version number of the GNU Lesser\par General Public License, you may choose any version of the GNU Lesser\par General Public License ever published by the Free Software Foundation.\par \par If the Library as you received it specifies that a proxy can decide\par whether future versions of the GNU Lesser General Public License shall\par apply, that proxy's public statement of acceptance of any version is\par permanent authorization for you to choose that version for the\par Library.\par \par } knowthelist-2.3.1/dist/banner.bmp000077500000000000000000002476061342115213400170160ustar00rootroot00000000000000BM†O6(э:POџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџіііэээяяяљљљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџфффžžž\\\+++888lllЋЋЋхххџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџООО===A@@ЉЉЉџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџэээ{z{”””ќќќџџџўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљљљvww }‚QVpppџџџ§§§ћћћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ†††@Bим ˆŽ#&uuuќќќцццяяяїїї§§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџтттHHH   "!вЭДФ ЇЇЇтттееесссьььљљљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЄЄЅ669   x~ѕџCSiii"""111дгггггЬЬЬееесссѓѓѓ§§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќќќњњњќќќ§§§џџџџџџўўўџџџџџџџџџѕѕѕxyx0/0 ЛСат%0:::ЄЄЄњњњЗЗЗ!!!kkkхччЩШШЪЪЪЭЭЭеееъъъљљљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјјјіііііі№№№щщщтттхххшшшьььєєєјјјўўўџџџцццhhh///%%%'''+0сэДЦ"tuu•”–џџџјјјŒ‹‹@AAЛЛЛгггЫЫЫЪЪЪЪЪЪгггхххіііџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџщщщШШШ‚‚‚<<<"""888tttОООоообббЮЮЮвввииирррщщщќќќммм^__555//0///29ш§ЕЩ%јљјњљњмлкDKI‹‘’зжжЪЪЪЫЫЫЫЫЫЪЪЪбббхххњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџєєєЄЄЄ444†††жжжаааЪЪЪЬЬЬЭЭЭвввчччбвв]^_<==888666$$$ ,1жяЬх.6™š›ŒŒŒгггљљљєђђcmmex|бгдЭЬЬЬЬЬЫЫЫЩЩЩЫЫЫиииёёё§§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџъъъkkkjjjпппЭЭЭЪЪЪЩЩЩЩЩЩеееРПП^^`FEFBBB???***"ЏЩшџLVEGFмннЉЉЉя№№џџџˆŒŒ:_fЧаббЮЭЫЫЫЫЫЫЪЪЪЪЪЪбббъъъќќќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕѕѕlllпппШШШЫЫЫЪЪЪбббРРРeefLLLJJJEEE333„šъџ „“ ЊЊЉбввпппџџџ~z{HUЛЪЭдЯЭЩЪЪЪЪЪЫЫЫЩЩЩвввщщщќќќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ!!!222BBB+++вввЯЯЯЫЫЫЫЫЫЮЮЮЪЪЪvvvQQQSSSOOO>>>XeЯљаы&(|}}›œœ`^]&(MaБТХзаЮЫЬЬЬЬЬЪЪЪЪЪЪЯЯЯуууїїїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџххх444444HHH<<qrtm`_:fqСѓ>>;;;;<;;;;=>>455)))цццџџџўўўўўўўўўўўўџџџПППiijvvv€€€€oooXXXBBB888---233‡‡‡onqonouuwRST­­­ддеЪЪЪЫЫЫЬЬЬЮЮЮааазззъъъњњњіііщщщєєє§§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџbbb GGGNNN>>> =<=EDD@@@AAA@@@DDD999 !!!зззђђђїїїўўўџџџџџџџџџџџџБББ``azyy……„„„„wwweeeVVVEEEJJJ„„…vuwtvuyxy’’“ббаЭЭЭЭЭЭЯЯЯгггжжжнннъъъњњњ§§§№№№чччїїїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџxxxLLLZZZIII%%% 888NNOHHGHHHHHHKKK<<<%%%%%%(((мммиииооощщщѓѓѓїїїњњњњњњўўўЙККnooxxy†††ˆˆˆ‚‚‚yyyjjjkjk€€yyzwwwНННтттзззмммооотттшшшђђђћћћўўўіііыыы№№№§§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™MMMcccSSS,,,)))WWXMMMNNNMMMRRR:::''')))999ќќќгггжжжооохххъъъыыыччччччьььКЛЛz{{hii}~~…†††††xxxwww€}}~zzzˆˆ†дддѓѓѓхххшшшыыыёёёљљљўўўќќќїїї№№№ђђђћћћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџзззFFFooo```;;;!!!]^^UUURRRVWWTUU222,,,***uuuџџџхххфффчччъъъэээяяяюююьььшшшђђђяяяИИИ‰‰‰sssrrr{{{‚‚ƒ‚‚ƒƒƒ„€€€•••шшшљљљ№№№ѕѕѕјјјўўўќќќјјјєєєѓѓѓљљљ§§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџььь"""111vvvoooOOO)))+++lll\]]___BBB000000'''ьььџџџјјјѓѓѓюююыыыьььяяяюююєєєѕѕѕїїїћћћџџџџџџя№№ххфќќ§žž~‰ˆŠwwx„„ƒщщщ§§§јјјљљљјјјіііђђђѕѕѕјјјќќќўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљљљooo hhh………eee===""" 333Z\\CCC333555$$$џџџџџџџџџ§§§јјјѓѓѓюююъъъщщщцццчччщщщэээђђђѕѕѕѕѕѕњњњђђђˆˆŠŠŠ‹…††nmogghБББўў§ііієєєєєєїїїљљљќќќўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЫЫЫ ===‘‘‘~~~```222$$$&&&'''$$$­­­џџџџџџџџџџџџџџџўўўќќќљљљііієєє№№№ююю№№№ђђђёёёяяяўўўЩЩЩ„„†——˜ŸŸ ”“•ЈЉЉ№№№ќќќћћћўўўџџџўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџммм000uuu’’’}}}[[[333((("""!!!)))GGGћћћџџџџџџџџџџџџџџџџџџџџџ§§§ўўўўўў§§§§§§§§§§§§ќќќџџџўџџœœ’’“ЂЃЃОППЖЖЗЯббќћћџџџџџџўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџбббABB---’’’žžž‡‡‡mmmPPPAAA:::888888 111мммџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџФЦЦŽŽŽ˜˜™˜™š••• ЁЁЙКЙюяяџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЫЫЫLLMDDDEEE™™™ЅЅЅ‘‘‘~~~sssfffVVV===FFFЙЙЙџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџггд›››ššœž ŸЁ€ЕДДіѕіџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџХЦХNMNbbbMMM ,,,qqqžžžšššjjjeee„„„бббџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџлкк ЁЁžЂЂЃЂЂЃЄІЄ†‡‡­­­ЫЪЪћћќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџУФФRSSfgg^_`€HHH???SSS………ТТТкккђђђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџуффЇЈЈ ЁЁІІЇІІЇЇЇЇЃЄІ†††оооСРРџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџССС\]]lon]^]œœœїїїюююхххщщщѓѓѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџуссЁЂЂЇЈЈЊЋЋЊЋЋЉЊЊЕЖЖ‹‹‹ОООнннФФФџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџТТТcccstsccc›œœјјјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџмооІЇЇЊЋЋ­ЎЎ­ЎЎ­ЎЎЏААОРРmklјјјЌЌЌхххџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўФФХlmm{}}nnoœіііџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџСТТžŸŸБВВЕЖЖГДДГДДДЕЕСТТonoавађђђˆˆˆџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЩЪЪstt‚ƒƒwxx›››ѕѕѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ъъъЗЗЗЌ­­ИЙЙЖЗЗЖЗЗЖЗЗЖЗЗПРР›šœ}}}џџџГГГКККџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџдее}~‰‰Šƒƒ„““”ё№ёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњњњьььЭЭЭББВЗИИМННЛММЛММЛММКЛЛППРВВВьььўўў‡‡‡љљљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџхцц‹ŒŒŒ‘ŠŠ‰тстџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџў§ўєєєхччаббИИЙГДДМНННООМНОНООМООМННССТЛММ‘‘‘дддџџџбббŸŸŸџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕєє———rss™™™ŒŒŒГГДџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњњњёёёъыыфуфкклгггЮЯЯЭЮЮЬЭЭЪЫЫЪЪЪШЩЪЪЩЪШЩЪЬЭЭЪЪЫЌЌЌЪЪЪџџџџџџ„„„тттџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўВВБWWX„„„–——ЯааџџџџџџџџџџџџџџџџџџїїїэээчшшоппЭЮЮХЧЧЦЧЧЮЯЯеежйккклллккйккйййзйидддмннтууЙЙЙбббџџџџџџеее………џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЩЪЪhhh———Ќ­­•••ŽХХХќ§§ѕѕѕыыьфххтттпппопппппноомммккккллйййззизззиййзиикккжиийийъыыпппЊЉЊааа§§§џџџњњњnnnђђђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџккк”””‚‚‚зззыээЩЪЪПППооотттссрррррппррртттуттуттфууфффффффууутттуусссопплккцччџџџЮЮЮŸŸŸиииўўўџџџџџџ•••ЅЅЅџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќќќЦЦЦ’’’ЄЄЄљљљџџџїјјпннкллппосссттттууттттттттттррррррррпррпрррссфххщъъџџџџџџЌЌЌЁЁЁэээџџџџџџџџџЩЩЩЅЅЅќќќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЫЫЫййй‹‹‹ЛЛЛџџџџџџџџџћћћяяячшшфххфххуфффффуффчццчщщыььёђђѕѕѕќќќџџџџџџмммКККџџџџџџџџџџџџмммАААљљљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџщщщЕЕЕьььзззџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўэээЏЏЏЉЉЉѓѓѓџџџџџџџџџџџџмммОООїїїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЖЖЖФФФєєє}}}еееџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјјјцццШШШЕЕЕлллџџџџџџџџџџџџіііЬЬЬСССєєєџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљљљšššЭЭЭыыы–––еееіііџџџџџџџџџџџџџџџџџџџџџљљљяяясссЮЮЮТТТзззўўўџџџџџџџџџњњњфффХХХФФФњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџюююЕЕЕгггкккŸŸŸЗЗЗпппџџџџџџљљљьььтттннниииаааЬЬЬшшшџџџџџџџџџџџџјјјнннгггЦЦЦпппџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќќќрррйййвввЖЖЖКККгггЮЮЮЧЧЧжжжпппууущщщїїїџџџџџџ§§§ііішшшдддЭЭЭгггтттћћћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќќќђђђюююфффЭЭЭНННЩЩЩееекккуууфффлллееегггвввееекккцццџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќќќѕѕѕэээхххсссцццъъъцццчччэээђђђїїїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўўўўўўўўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџknowthelist-2.3.1/dist/build_msi.cmd000077500000000000000000000007641342115213400174750ustar00rootroot00000000000000"%WIX%\bin\candle.exe" -v -dLang=en -out ..\..\knowthelist.wixobj -arch x86 -ext "%WIX%\bin\WixDifxAppExtension.dll" -ext "%WIX%\bin\WixUtilExtension.dll" -ext "%WIX%\bin\WixUIExtension.dll" knowthelist.wxs "%WIX%\bin\Light.exe" -v -cultures:en-us -ext "%WIX%\bin\WixDifxAppExtension.dll" -ext "%WIX%\bin\WixUtilExtension.dll" -ext "%WIX%\bin\WixUIExtension.dll" -out ..\..\Knowthelist-Setup.msi -pdbout ..\..\knowthelist.wixpdb -sice:ICE09 ..\..\knowthelist.wixobj "%WIX%\bin\difxapp_x86.wixlib" knowthelist-2.3.1/dist/dialog.bmp000077500000000000000000016057661342115213400170160ustar00rootroot00000000000000BMі 6(э8Р ФФџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff[[[RRRPPPQQQWWWaaaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffPPP000 999XXXfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџgggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggSSS"""$$$NNNgggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџgggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg666%%%XXXgggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhiiiUUV<<>> €ˆјџчѓжѕ :NGGG^^^YYYZZZ[[[]]]___aaaccceeegggiiijjjkkklllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm``a==>==>899  ?Bьњцѓсњ‚ЇXXX[[[XXXYYYZZZ[[[]]]___aaadddfffhhhjjjlllmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmRRR==>AAB.//   ЎКюџряШё8I+++___XXXXXXXXXYYYZZZ[[[]]]___aaadddgggiiikkklllmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnlllFFF??@CCD&&'  <@цїс№йѓЁЫ  €€€ЁЁЁЁЁЁmmmIII^^^XXXXXXYYYYYYZZZ[[[\\\^^^```cccfffhhhkkklllnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnndddAAAAAACCC""" Œэџнэгі{šJJK†††›››ІІІ™™™žžž———$$$]]]YYYXXXXXXXXXXXXYYYZZZ[[[\\\^^^aaaeeehhhjjjlllmmmnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooonnnnnnmmmmmmmmmmmmlllmmmmmmmmmmmmnnnnnnnnnooooooooooooooooooooooooooooooooooooooo[[[BBCCCDBBC!!!  ГУфјйьЮі [p###ssuwxxuuuдддљљљыыыГГГ‰‰‰CDD___YYYYYYYYYYYYYYYZZZZZZ[[[\\\^^^aaadddgggjjjlllnnnooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooonnnmmmmmmllllllkkkjjjiiiiiiiiiiiiiiiiiijjjjjjkkkkkkllllllmmmmmmnnnnnnooooooooooooooooooooooooSSSDDDEEEAAA###!!!######"""&'афнёжьЪђ DSCCC~~eeeŒŒŒююююююяяяѕѕѕСССƒƒƒxxx ^^^ZZZYYYYYYYYYYYYYYYZZZZZZZZZ[[[]]]```cccgggjjjlllnnnoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppooonnnllllllllllllkkkiiigggeeeeeeeeedddddddddeeeeeeeeefffggghhhiiijjjkkklllmmmnnnoooooopppppppppppppppNNNEEEGHH@@A%%%%%%''''''%%% @DнѓйюдьФэ7BVWW„„…ffg———ьььюююьььюююєєєДДД}}}JIIJLM___ZZZZZZZZZZZZZZZZZZZZZZZZ[[[[[[]]]```cccgggjjjmmmoooppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpppooooooqqqqqqllleeeaaa```cccgggiiieeeaaa````````````aaaaaabbbcccccceeefffgggiiijjjlllmmmnnnooopppqqqqqqmmmLLKHHGJJJBBA)))+++++++++((("""SZрјжьвьФы4>ddeŒŒmmnцццяяяььььььяяяэээ•••mll(/1bbbZZZZZZZZZZZZZZZZZZZZZ[[[[[[[[[\\\^^^```ccchhhlllnnnpppqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqiiiNNN111 333NNNaaaccc]]]]]]]]]]]]^^^^^^^^^___```aaabbbccceeefffhhhjjjlllmmmoooqqqiiiJJKIIIKKKCCC---000///...+++%%%ZdпљгыаыЪя:Elll••–www„„„йййёёёьььььььььєєєЭЭЭvvv:87 Y^^]]]ZZZZZZZZZZZZZZZZZZZZZ[[[[[[[[[\\\^^^```dddhhhllloooqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq```AAA)))FFFaaa___[[[[[[\\\\\\\\\]]]]]]]]]^^^___```aaaccceeegggiiikkkqqqgggLLLKKKLLLEEE222333333222...'''[dнјбъЯщві KWjjjžžŸ‡‡‡|||УУУяяяьььььььььяяяэээ‘’’ROMAX[aaaZZZZZZZZZZZZZZZZZZZZZZZZZZZ[[[[[[\\\^^^aaaeeeiiimmmpppqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrYYY''' TTTbbb[[[[[[\\\\\\\\\]]]]]]]]]]]]^^^___```aaaccceeegggqqqdddMNNLMMMNNHHH666777777555111*** U^кіЯъЭщиљ dt[[[ІЈЈš››{{{­­­ууу№№№ьььььььььєєєИИИd``#$%QWbbb[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\\\\\\]]]___ccchhhlllppprrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrriii--- DDDddd\\\[[[[[[\\\\\\\\\\\\\\\]]]]]]]]]^^^___aaabbblllaaaOOPNNOOOPKKK;;;;;;;;;999444,,,""" EMг№ЭъЬшиј†š>>>ЎЏАЇЈЈŠ‹‹———аааяяяьььььььььђђђиииxww%%%MW[_`]]][[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\\\\\\^^^aaaeeejjjnnnqqqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssZZZ<<>>222'''>EХщУчПфЬъсі7=AABЬЭЭиййЫЬЬЖЗЗмммїїїџџџппп?>> p‚—TSSbbb^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^___aaaeeejjjooosssuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu... %%%+++///000,,,"""???fff^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^___```]]]Z[[YZZZ[[VWWQQQQQQNNNIIIBBB777+++!!!ЁОЪяПфПфх§™Ї111АББНООЎЏЎПРРГГГ„„„111‡ž€—LHHddd^^^^^^^^^_________^^^^^^^^^^^^______```dddiiimmmqqqtttuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvUUU '''///888@@@EEEHHHFFF===(((^^^bbb^^^^^^^^^^^^^^^^^^^^^^^^^^^___ddd^^^]]^[[\[\\ZZZTTTTTTRRRNNNFFF<<33rrrjjjjjjjjjjjjiiifffcccaaa``````___``````aaabbbeeehhhllloooqqqtttvvvwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwttt !!!444===/// PPPkkkLLL BBBggg___________________________bbb```bbbbbbaaaaaa```]]]]]]ZZZTTTLLL@@@333)))%%%#############",.­дОъЗтДрЫыэћNRZZZššš<<< ЈШТ№18<53wwwpppppppppooommmiiieeebbbaaa```______``````aaabbbdddgggjjjmmmqqqtttwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxTTT (((111444jjjIII !!!fffaaa````````````````````````aaafffccceffccccccbccaaa```^^^YYYRRRGGG:::///'''$$$$$$$$$$$$$%%%[jТёЗтЖсВпв№шєGJ+++???cccŸŸŸGGG eqа§ЁХ=;:xxxvvvvvvuuutttqqqlllgggdddaaa```````````````aaaaaabbbdddgggkkkppptttwwwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,,,  (() ///eee<<< UUUeee```````````````````````````hhhbbbggheeeeeeeeedddcccbbb^^^WWWNNNAAA555,,,(((%%%&&&&&&&&&&$#&‹ЉСђДрДсАпвёъѕ_bBCDppqjjljjj††‡``a?DПцФїw ?@@xxxxxxxxxwwwuuuqqqmmmgggcccaaaaaa```````````````aaaaaaccceeeiiinnnssswwwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyykkk $$% !!!;;;\\\))) >>>jjjaaaaaaaaaaaaaaaaaaaaaaaaaaaeeeaaahiighhfggfggfggffffffbbb]]]TTTHHH;;;000+++''''''''''''''(( &.0ЅЮМьВпВрЎоХыюџ•#78nhjffgiijkklhhippqmcc-SWИоКыЙщ>HCDDyyyyyyyyyxxxuuuqqqlllgggdddbbbaaaaaaaaaaaaaaaaaabbbbbbdddfffjjjooossswwwyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyOOO %%%!! !!!!!!!!!!!!!!!!!!!!!###QQQGGG '''gggbbbaaaaaaaaaaaaaaaaaaaaaaaabbbggggggkklhiihiihiiiiiiiigggccc[[[PPPCCC777///***(((((((((((((())%@HЏнЙъБпБр­оЖутџM”™k]]kklyyzxxyxxyxwy}yy‚ƒ.ЇЭРєŒ­HHHyyyyyyxxxvvvsssooojjjfffcccbbbaaaaaaaaaaaaaaaaaabbbccceeegggkkkooossswwwyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz555%%%$$$$$$##$##$##$##$##$##$##$$$$%%& $$$XXX*** ___dddbbbbbbbbbbbbbbbbbbbbbbbbbbbjjjeeemmnjkkjkkjkkkkkkkkjjjgggaaaXXXKKK>>>444...***)))))))))))))***&FPЎнЙыАоАпАсЌн\rziba~~ˆˆ‰…††…††…††…†‡}c—ЇЖш9BSSSzzzzzzwwwtttppplllhhhdddccccccbbbbbbbbbbbbbbbbbbcccdddgggjjjmmmpppssswwwyyyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{vvv)))&&%&&&&&&&&&&&&&&&&&&&&&&&&&&&((' HHH@@@RRRiiibbbbbbbbbbbbbbbbbbbbbbbbbbbeeeeeelmmmnnlllllllllmnnnnnlllggg```TTTGGG;;;333...+++**********++*+++'BJЂЮЛ№АсБу Љдbknmii‘’“–——••–••–••–••–›•”„ Ј!^q ___{{{xxxuuuqqqmmmiiifffdddccccccbbbbbbbbbbbbbbbcccdddfffiiimmmoooqqqtttwwwzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{fff !!!###$$$###!!"***(((((((((((((((((((((((((((((()))&&& ***MMMDDDkkkbbbbbbbbbbbbbbbbbbcccbbbccccccllljjjpqqmnnmnnmnnoooqqqooolllfff]]]QQQCCC888222...,,,++++++++++,,+,,-!*24ƒЄЗыКя"Јдdjmoll  ЁІІЇЄЄЅЄЄЅЄЄЅЄЄЅЊЊЋ“”•&!  !!!jjj{{{uuuqqqmmmiiigggdddccccccbbbbbbbbbbbbbbbccccccdddgggkkkoooqqqrrrtttvvvyyy{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||TTT &&&&&&''''''&&&!!!(((,,,**+**+**+**+**+**+**+**+**+**++++,,,  III+++777kkkddddddddddddddddddddddddeeeeeeiiihhhppppppoopoopooprrrrrrqqqmmmfff[[[NNNBBB888222...,,,,,,,,,,,,,--,---&$.# 'Tc•О!ЊиfnqjgfЃЄЄИЙЙГДДГДДГДДГГДНПП!"##!!!***sssyyyqqqmmmjjjgggfffddddddccccccccccccccccccddddddfffiiimmmrrrsssttttttvvvyyy{{{|||||||||||||||||||||||||||||||||џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||FFF'''+++,,,---,,,)))###---...---------------------------------//0===555,,,kkkfffeeeeeeeeeeeeeeeffffffggghhhhhhsssoootttqqqqqrqqrrrruuuuuurrrmmmdddXXXKKK@@@777222///----------------...,,/#+))0OZinpgggˆˆ‰ЪЫЫУФФРССРССФХХЬЭЭvvw!""######==={{{qqqmmmjjjgggeeedddddddddccccccccccccccccccdddeeegggjjjooosssuuuuuutttvvvyyy{{{|||||||||||||||||||||||||||||||||џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}999---000000111///,,,$$$111000000000000000000000000000000000000222$$$000:::'''kkkjjjhhhhhhiiiiiiiiijjjjjjkkkmmmnnnssssssvvvsttsssrsssssvvvxxxvvvsssmmmcccVVVJJJ???888333000......///////////////,)(7/,lkknophhišš›ЯааежжвггЬЭЭ––—aab***$$$%%%QQQyyyllliiigggfffeeedddddddddddddddddddddddddddeeefffiiimmmrrrwwwwwwvvvuuuvvvyyy|||}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}///444555555555333///$$$556334334334334334334334334334334334334556)))''';;;%%%mmmooonnnnnnnnnnnnoooooopppqqqssstttuuu}}}xxywwwtttttttttuuuzzzzzzxxxtttmmmcccVVVJJJ@@@999444111000000000000000000---778mmnppqnnoihj€•••ДЕЕrrrgghkkl...%%%'''bbbppphhhgggeeeeeedddddddddddddddddddddddddddeeeeeegggkkkpppuuuxxxxxxvvvuuuuuuxxx{{{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}zzz'''999999999999666111&&&999666666666666666666666666666666666666888---###999###oootttssstttttttttuuuuuuvvvwwwxxxyyyzzz}}}}}}{{{vvvvwwvvvuvvxyy}}}}}}yyyuuunnncccWWWKKKBBB:::555333222111111111111...889nnpqqrqprppqjjk``_ЂЂЂbbbiijoop///'''888mmmhhhfffeeeddddddddddddddddddddddddddddddeeeeeegggiiinnnsssxxxzzzyyyvvvtttuuuxxx{{{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~xxx&&&""">>>>>>>>>===:::555((( <<<899899899899899899899899899899899899:;;/00!!!777"""qqqxxxxxxyyyzzzzzz{{{{{{{{{|||}}}}}}~~~~~~~~~{{{|||wwwwxxwxxwww{{{€€€~~~{{{vvvoooeeeYYYNNNDDD===777555222222222222///;;;pqrsstrrsrrsrrsffgЄЃЃlllhiippq111)))RRRpppffffffeeeeeeeeeeeeeeeeeeeeeffffffffffffggghhhjjjnnnrrrwww{{{|||zzzwwwuuuuuuyyy|||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~uuu$$$%%%CCCBBBBBBAAA>>>777***!""@AA<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>344###444"""pppyyyyyy{{{|||}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~yzzyxyyyyyyyyyy~~~€€€}}}xxxqqqggg\\\QQQHHH@@@;;;777555333222///>>>stttuusttstttuucdd———vvwddeqrr222111fffhhheeeeeeeeeeeeeeeeeeffffffffffffgggggghhhhhhkkknnnrrrvvvzzz||||||yyyvvvtttuuuyyy|||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџvvv%%%&&&IIIGGGFFFEEEAAA:::---"""CBB?>>?>>?>>?>>?>>?>>?>>?>>?>>?>>?>>?>>A@@555###000###nnnvvvxxx{{{~~~€€zz{zz{z{{z{{{{{ƒƒƒ‚‚‚€€€{{{ssskkkaaaWWWNNNGGGAAA===999777333DDEvvwvvwuuvuuvvvwddeœœœ€€ccdrrs333OOOoooffffffffffffffffffggggggggghhhhhhiiijjjkkklllooossswww{{{}}}~~~}}}zzzvvvtttwwwzzz}}}џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџwww&&&'''LLLLLLKKKHHHDDD===000"""DDEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCC666$$$+++%%%kkkrrrtttxxx{{{}}}~~~‚‚|||{{{{{{{{{|||ƒƒƒ………„„„}}}wwwppphhh```XXXQQQLLLHHHDDD???QQQyyzwwxwwxwwxyyzghh———………cccnooBBBkkkgggffffffgggggggggggghhhhhhiiijjjjjjkkklllnnnqqqtttwww{{{}}}~~~~~~|||xxxuuuuuuwww{{{~~~џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€yyy***&&&OOOPPPNNNLLLHHHAAA333!!!!!!GGGDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDGGG667!!!!!!!!!%%%'''(((kkknnnpppssswwwzzz|||~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€~~~|}}|}}|}}}~~ƒ„„‡‡‡………ƒƒƒ€€€|||uuuooohhhbbb]]]YYYUUUPPP^^_z{{xxyxxyxxyzz{llmˆˆˆ“““aaappr```mmmgggggghhhhhhhhhiiijjjkkkllllllmmmnnnoooqqqsssvvvyyy|||~~~~~~{{{wwwuuuvvvyyy}}}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ}}}... %%%QQQUUUSSSPPPLLLDDD777$$$HHHHHHGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGJJJ555!!!$$$$$$$$$&&&###---mmmlllmmmpppsssvvvxxxzzz|||}}}~~~€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~………ˆˆˆ‡‡‡………‚‚‚zzzuuupppkkkgggddd___iii||}zz{zz{zz{{||lmn‹‹‹ššš```xxxllljjjjjjjjjkkkllllllmmmnnnooopppqqqqqqrrrtttvvvxxx{{{}}}€€€€€€}}}zzzxxxwwwyyy|||џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ777!!! ###QQQ[[[WWWTTTPPPIII;;;''' EEELLMJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJLLL111$$$&&&&&&'''%%%""" 555pppjjjkkkllloooqqqsssvvvxxxzzz|||}}}}}}~~~~~~~~~~~~~~~}}}}}}|}}‚‚ƒ€€€€€~ƒƒƒ‰‰‰ˆˆˆ‡‡‡„„„‚‚‚~~~zzzvvvrrrnnniiirqr}}~{||{||{|||}}rrs‚‚‚ЁЁЁccctttnnnmmmmmmmmmnnnooopppqqqrrrrrrssstttuuuvvvwwwzzz|||~~~€€€€€€€€€~~~|||yyyxxxyyy{{{~~~€€€џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџCCC###"""!!!NNN```\\\YYYTTTMMMAAA,,,!!!===PPPLMMLMMLMMLMMLMMLMMLMMLMMLMMLMMMMMKKK+++'''(((((()))%%%"""!!!BBBuuukkkkkklllmmmnnnppprrrtttvvvwwwyyyzzz{{{{{{{{{zzzyyyyyywww{{{zzz}~~„„„‚‚€€‚‚‚‡‡‡ŠŠŠ‰‰‰†††ƒƒƒ~~~zzzvvvqqqxxx~€}}~}}~}}~~~xxyxxxЇЇІgggppqvvvpppqqqrrrssstttttttttuuuuuuvvvwwwxxxzzz|||}}}€€€€€€€€€~~~|||zzzyyyyyy{{{~~~€€€џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚OOO$$$$$$ HHHeee```]]]YYYRRRFFF222### ///TUUOOOOOOOOOOOOOOOOOOOOOOOOOOOOOORRREEE)))************%%%""""""TTTzzzooonnnnnnnnnpppqqqrrrtttuuuvvvwwwxxxyyyyyyyyyxxxwwwvvvtttsssuuuzzzwww‚‚‚„……‚‚‚‚‚‚„……ˆˆˆˆˆˆ‡‡‡………ƒƒƒ{{{www|||€€‚€€€‚{{{{{{ЌЌ­hhhsss~~~vvvwwwwwwwwwwwwwwwxxxxxxxxxzzz{{{}}}~~~€€€€€€€€€€€€}}}|||{{{{{{}}}‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ___%%%%%%!!!>>>iiidddbbb]]]VVVKKK999'''"""RRRSSSRRRRRRRRRRRRRRRRRRRRRRRRQQQTTT;;;***---,,,---***$$$###"""!!!iii}}}tttsssrrrrrrssstttuuuvvvwwwxxxxxxyyyyyyyyyyyyxxxwwwvvvuuutttrrrsss{{{vvv„……………‚ƒƒ‚ƒƒ‚‚‚‚ƒƒ„………††………„„„‚‚‚~~~yyy€‚‚ƒ‚‚‚‚‚ƒ€uuuЋЋЊnnnuuvƒƒƒzzzzzzzzzzzzzzz{{{{{{{{{}}}~~~‚‚‚‚‚‚‚‚‚€€€~~~~~~}}}~~~€€€‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒqqq)))'''###444jjjiiifffbbb\\\QQQAAA,,,%%%"""AAAYZZSTTTTTTTTTTTTTTTTTTTTTTTUVVQQQ000---......///'''$$$$$$"""---|||yyyxxxvvvuuuvvvvvvwwwxxxxxxyyyzzzzzz{{{zzzzzzzzzyyyyyyxxxwwwwwwvvvuuu{{{}}}{{{€€††††††………ƒƒƒƒƒƒƒ„„„„„„„„ƒƒƒ€€€ƒƒ„ƒƒ„„ƒ…„ƒ…„ƒ…ƒƒ„„„…sssЋЋЋtttuuuƒƒƒ{{{{{{{{{{{{||||||}}}~~~€€€‚‚‚‚‚‚€€€€€€~~~~~~~~~€€€‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„~~~222((('''***dddpppkkkgggaaaXXXIII333&&&### $$$YYYXXXVVVVWWVWWVWWVWWVWWVVVZZZBBB---111000111---$$$%%%$$$###BBB„„„}}}{{{zzzzzzzzzzzzzzzzzz{{{||||||}}}}}}}}}}}}}}}}}}}}}}}}|||||||||||||||ƒƒƒ„„„}}}…††‰‰‰†††„……„„„„……†††ˆ‰‰†‡‡……†…††…††…††…††…††††‡tttАААvvvsss„„„|||}}}}}}~~~€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€‚‚‚ƒƒƒƒƒƒ„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„FFF))))))$$$VVVvvvooolllggg^^^QQQ===***&&&###???___XYYXXXXXXXXXXXXXXX\\\PPP111222222222333'''$$$%%%$$$###]]]„„„ƒƒƒ‚‚‚€€€~~~}}}|||{{{{{{{{{{{{{{{||||||}}}}}}}}}~~~~~~€€€€€€„„„„„„„„„€€€zzzwwwwwwwwwzzz€€‡ˆˆ‡‡ˆ‡‡ˆ‡‡ˆ‡‡ˆ‡‡ˆŠ‹‹tuuІІІyyyooo„„„~~~~~~€€€€€€‚‚‚€€€€€€€€€€€€€€€‚‚‚ƒƒƒƒƒƒ„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ………………………………………………………………………………………………………………………………………………………………………………………………………………………___******%%%BBByyytttrrrnnneeeYYYHHH222(((%%%!!!NNN`aa[\\YZZYZZZ[[]^^WWW788111444444666,,,###%%%%%%$$$(((zzz………………„„„„„„ƒƒƒ€€€~~~}}}}}}|||||||||||||||}}}}}}}}}~~~~~~~~~€€€€€€‚‚‚‚‚‚‚‚‚ƒƒƒ„„„………………………………………………………ƒ„„ŠŠ‹ˆˆ‰ˆˆ‰ˆˆ‰‰‰ŠŠŠ‹~llltttmmmsss………‚‚‚‚‚‚€€€€€€€€€‚‚‚‚‚‚ƒƒƒ„„„„„„………………………………………………………………………………………………………………………………………………………………………џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ………………………………………………………………………………………………………………………………………………………………………………………………………………………xxx...+++***)))ooo|||wwwssslllaaaRRR>>>,,,'''$$$!!!LLL^^^_``_``^__STT:::333555666888000###$$$&&&&&&&&&DDD………………………………………„„„„„„ƒƒƒ‚‚‚€€€~~~}}}}}}||||||{{{{{{{{{{{{{{{{{{{{{||||||}}}~~~€€€€€€~~~€€€€€€††‡ŒŽ‹‹Œ‹‹Œ‹‹ŒŒŒ~nnooopmmnppqttu|}}„„„€€€€€€€€€€€€€€€€€€€€€‚‚‚ƒƒƒƒƒƒ„„„„„„………………………………………………………………………………………………………………………………………………………………………………………џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††EEE---'''RRR………{{{yyysssjjj\\\KKK666***((($$$ ???PPPNOODDD555444777888999///!!!###&&&&&&&&&&&&jjj†††††††††††††††††††††………………„„„ƒƒƒ‚‚‚€€€~~~~~~}}}||||||{{{zzzzzzzzz{{{{{{|||}}}~~~€€€€€€€€€~~~~~~}}}}}}ƒƒƒ|||ŽŽŽŽŽ‰‰Š||}}}~~~~~}}~~~€ƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ„„„„„„………………††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††hhh..."""---€€€‚‚‚~~~zzzrrrgggXXXEEE111***((($$$!!!+++444888:::;;;999444((("""&&&(((((((((888………†††††††††††††††††††††††††††………………„„„ƒƒƒƒƒƒ‚‚‚€€€€€€~~~}}}}}}|||{{{{{{||||||}}}~~~~~~€€€~~~}}}}}}}}}†††‚‚ƒ‘ŽŽŒ‹‹ŒŒŒŒŒŒŒŒŒ‹‹Œ‹‹Œ€€†††‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒ„„„„„„………………………††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡„„„999!!! ___ƒƒƒ{{{rrreeeTTT@@@///+++)))%%%"""(((---,,,$$$$$$'''))))))))))))ccc‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡††††††………„„„„„„„„„ƒƒƒ‚‚‚‚‚‚€€€€€€€€€‚‚‚‚‚‚€€€€€€ƒƒƒ„„„‹‹’’“‘’‘’‘’‘—˜˜››œš››š››š››š››š›››œœ‹‹Œ‡‡‡„„„„„„………………†††††††††‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡ZZZ!!!"""///‡‡‡‹‹‹‡‡‡ƒƒƒ{{{qqqcccQQQ>>>///,,,***'''###!!!!!!%%%(((******++++++;;;„„„‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡††††††††††††………………………„„„„„„„„„„„„ƒƒƒ„„„„„„„„„„„„„„„„„„„„„„„„ƒƒƒƒƒƒ‡‡‡†††””•’““““”““”““”‘‘ЁЁЂЋЌЌЉЊЊЉЊЊЉЊЊЉЊЊЉЊЊЉЊЊ‹‹‹‡‡‡††††††‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆhhh))* ###UUU–––ŒŒŒ‰‰‰„„„}}}qqqcccRRR???111---+++)))%%%$$$"""!!!!!!"""###%%%(((***+++,,,---,,,---nnnˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡ˆˆˆ‘‘‘•––•––•––•––•––’““Ÿ  ККЛЗИИЗЗИЗИИЗЗИЗИИБВВˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰eefCCC ###""""""zzz˜˜˜ŽŽŽŒŒŒ‡‡‡~~~tttfffWWWGGG888000---+++***)))(((((((((***+++---...////////////SSS‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰Œ˜™™–———˜˜—˜˜—˜˜—˜˜–——•––КЛЛЯааЧШШФХХЪЫЫЧШШ‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰]]^UUU444!!!&&&555———‘‘‘ŠŠŠ‚‚‚xxxlll```SSSGGG<<<666222000/////////000000111222222222111@@@„„„‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰Š‹‹˜™™™š™™šš™šš™šš™šš™šš™šš˜™™“““ЄЅЅШЩЩЮЯЯЗИИ™™™‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰†††\\]VVWRRR+++$$$'''KKK˜˜˜”””’’’†††~~~uuulllbbbZZZRRRLLLFFFBBB@@@???===<<<:::666444333999yyy‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰––—š››››œ››œ››œ››œ››œ››œ››œœ„„„~‰‰‰——˜uuuyyy‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ†††]]^WWW[[[MMM&&&&&&'''[[[ЃЃЃ›››———•••‘‘‘‹‹‹„„„}}}vvvpppjjjeeeaaa[[[XXXUUUPPPKKKEEE>>>999999qqqŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ–––œœœžœžœžœžœžœžœžŸ——˜ŽŽŽ†††ˆˆˆˆˆˆ~~}ƒƒƒŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ………^^^ZZZZZZ^^_JJJ&&%'''((( bbbЃЃЃžžž™™™———”””‰‰‰ƒƒƒ~~~yyytttpppkkkfff```ZZZSSSLLLEEEDDDrrrŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ••–žžŸŸŸ ŸŸ ŸŸ ŸŸ ŸŸ ŸŸ ŸŸ ŸŸ ЁЁЂ‘‘’€€€ˆˆˆ{{{ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹„„„__`]]^]]^]]^bbbKKL)))'''((((((\\\œœœЅЅЅ›››˜˜˜•••’’’ŒŒŒ‡‡‡ƒƒƒ}}}xxxsssllleee^^^WWWQQQUUU}}}‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹••–ЁЁЂЁЁЂЁЁЂЁЁЂЁЁЂЁЁЂЁЁЂЁЁЂЁЁЂ ЁЁЄЄЅŒŒŒŽŽ~………{{{‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ƒƒƒaba````````````eeeSTT...%%%222000GGG„„„ЅЅЅЂЂЂ›››–––’’’ˆˆˆ‚‚‚|||vvvpppiiibbb[[[jjj†††‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹•••ЂЃЃЃЄЄЃЄЄЃЄЄЃЄЄЃЄЄЃЄЄЃЄЄЃЄЄЃЄЄЃЄЄЃЅЅ‹‹‹ˆˆˆ‚ƒƒ‹‹‹}}}‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ‚‚‚ccccccccccccccccccggg^^_===223888222333XXX†††žžžЁЁЁœœœ–––‰‰‰‚‚‚zzzsssmmmrrr‚‚‚ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ•––ЄЅЅЅІІЅІІЅІІЅІІЅІІЅІІЅІІЅІІЅІІЅІІІЈЈœ‚‚‚ŠŠŠ‡††€€€€€€ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ‚‚ƒffgffgffgffgffgffgffgiijjjkiiiOOO999777111555KKKeeeuuu|||{{{zzz}}}ƒƒƒˆˆˆŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ•••ІЇЇЇЈЈЇЈЈЇЈЈЇЈЈЇЈЈЇЈЈЇЈЈЇЈЈЇЈЈЇЈЈІЇЇЋЌЌ’’“‹‹‹}}}ŒŒŒ………|||ŠŠŠŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџƒƒƒijjijjijjijjijjijjijjijjjjjˆˆˆ|||dddTTTIIIBBB???CCCOOO___vvvŠŠŠ–––ЈЉЉЉЊЊЉЊЊЉЊЊЉЊЊЉЊЊЉЊЊЉЊЊЉЊЊЉЊЊЉЊЊЉЊЊЉЊЊЊЋЋŒŒ………€€€………{{{џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџƒƒƒlmmlmmlmmlmmlmmlmmlmmlmmlmm………ŒŒŒŒŒŒ˜˜˜ЊЋЋЋЌЌЋЌЌЋЌЌЋЌЌЋЌЌЋЌЌЋЌЌЋЌЌЋЌЌЋЌЌЋЌЌЋЌЌЏААœœœŠŠŠ|||ŠŠŠ~~~}}}џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ„„„ppppppppppppppppppppppppppp‡ˆˆŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽœœœ­ЎЎ­ЎЎ­ЎЎ­ЎЎ­ЎЎ­ЎЎ­ЎЎ­ЎЎ­ЎЎ­ЎЎ­ЎЎ­ЎЎ­ЎЎ­ЎЎБВВŒŒŒ†††|||ŽŽŽ†††yyyŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ………rtsrtsrtsrtsrtsrtsrtsrtsrtsˆˆˆŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ   ЎЏЏЎЏЏЎЏЏЎЏЏЎЏЏЎЏЏЎЏЏЎЏЏЎЏЏЎЏЏЎЏЏЎЏЏЎЏЏЎЏЏГДДžŸŸ‡‡‡|||‹‹‹ŽŽŽ€€€tttŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ†††vvvvvvvvvvvvvvvvvvvvvvvvvvv‰‰‰’’’ЅІІАББАББАББАББАББАББАББАББАББАББАББАББАББАББАББДДД†††………|||xxxvvvџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‡‡ˆyyzyyzyyzyyzyyzyyzyyzyyzyyz‰‰Š———­ЎЎВГГВГГВГГВГГВГГВГГВГГВГГВГГВГГВГГВГГВГГВГГБВВККЛ––—†††yyyŽŽŽ‰‰‰ooo~~~џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‰‰‰||}||}||}||}||}||}||}||}||}ŠŠ‹   ВГГДЕЕДЕЕДЕЕДЕЕДЕЕДЕЕДЕЕДЕЕДЕЕДЕЕДЕЕДЕЕДЕЕДЕЕГДДЗИИ­­Ў„„„}}}€€€iiiŠŠŠџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŠŠŠ€€€€€€€€€€€€€€€€€€ŠŠŠ–––ЋЌЌЖЗЗЖЗЗЖЗЗЖЗЗЖЗЗЖЗЗЖЗЗЖЗЗЖЗЗЖЗЗЖЗЗЖЗЗЖЗЗЖЗЗЖЗЗЖЗЗЗИИМНН………ŒŒ‹tttqqqnnnџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒŒŒŒ‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘ЂЂЂЕЕЕЗЙИИЙЙИЙЙИЙЙИЙЙИЙЙИЙЙИЙЙИЙЙИЙЙИЙЙИЙЙИЙЙИЙЙИЙЙИЙЙЗИИРСС•––‰‰‰|||‡‡‡‘‘‘‘‘‘‹‹‹eee|||‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘ŽŽ†‡‡†‡‡†‡‡†‡‡†‡‡†‡‡†‡‡†‡‡†‡‡‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘œœœББВККЛККЛККЛККЛККЛККЛККЛККЛККЛККЛККЛККЛККЛККЛККЛККЛККЛЙККРРСЈЉЈ‚ƒƒ‹‹‹vvv‘‘‘‘‘‘‘‘‘}}}ccc‰‰‰‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’‰ŠŠ‰‰Š‰‰Š‰‰Š‰‰Š‰‰Š‰‰Š‰‰Š‰‰ŠŒ’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’™™™­ЎЎЛММЛЛМЛММЛММЛММЛММЛММЛММЛММЛММЛММЛММЛММЛММЛММЛММЛММЛММЛЛМООПИЙЙ‚‚‚™™™qqq’’’’’’’’’’’’pppnnn’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““ŽŽŽŒŒŒŒŒŒŒŒŽ““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““šššЋЌЌММНННОННОНООНООНООНООНООНООНООНООНООНООНООНООНООНООНООНООННООППТУУ‰Š‰žžž|||“““““““““‰‰‰mmm“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““””‘‘’’’‘‘‘Ž““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““ЎЎЎМННОППОППОППОППОППОППОППОППОППОППОППОППОППОППОППОППОППОППОППОППОППХЧЧ™™™žžž€€€““““““““““““€€€pppŽŽŽ“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““—˜˜€€‰‰‰”””‘’’‘’’‘’’‘’’‘’’‘’’”“”““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““•••ЂЂЂВДДПРРРРСРССРССРССРССРССРССРССРССРССРССРССРССРССРССРССРССРССРССРССРССРССШЩЩЃЄЅ›››{{{““““““““““““ŽŽŽzzz““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ”””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””™™™lllfffœœœ•––“””””””””””””””•••””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””ЌЌ­ННОЫЫЬЪЪЫФХХТУУРССПРРРРСРССРССССТССТСТТСТТСТТСТТСТТСТТСТТСТТСТТСТТССТССТССТЦЧЧ­­­š››­­­€€€”””””””””””””””†††{{{‡‡‡””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••€€€DDD‚‚šš›™™™––––——–——–—————–––•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••–––ЋЋЋЛЛЛЪЫЫбвгййкноонннлммиййдееаббЮЯЯЫЬЬШЩЪШШЩХЧЧФФФУФФУФФУУФУУФУУФУУФУФФУФФФФХХЧЧШЩЩЦЦЦ­­­›››ГГГ‚‚‚•••••••••••••••‚‚‚yyy•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••NNNabblll›œœššš˜™™˜™™˜™™˜™™™šš–––•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••šššІЇЇБВВНППЭЮЮдеекккопппппоооннннннннноооооопппоппооннннммнлллкйкййййййийииииииииййййййййккклллЮЮЯ­­­ПППŒŒŒ••••••••••••••••••„„„{{{ƒƒƒ•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––‰‰‰eeeeeeMMMijjЂЃЃ›œœ›œœ›œœ›œœ›œœš››–––––––––––––––––––––––––––––––––––––––––––––––––––––––––˜˜˜ЁЂЂЎЏЎИЙИСТТФХХФХХЧШШЮЯЯдееиййлммноооппппппппппппппоппопоооооопоппоппоппппппппппппррпррпррпрррррпрроппШЩЩЃЃЃЂЂЂННН–––––––––––––––––––––zzz•••–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––iii]]]ZZZNNN™™™Ÿ  žžžžžžžžžžœ––––––––––––––––––––––––––––––––––––––––––˜˜˜ЁЁЁ­ЎЎНННЫЫЬжжзйккззигггЯЯЯЫЬЬШЩЪХЧЧФХХФХХЧШШЪЫЫЮЯЯбббдддззиййкйлкмммнннннннннноонооноомннмннмннлммйккииизииззиККК———ŸŸŸИИИ–––––––––––––––––––––}}}{{{ƒƒƒ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––kkkXXXqqqXXXƒƒƒЇЈЈžžžŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ———––––––––––––––––––––––––›››ІІІВВВРРРЭЮЮззилммпппттуууууууууфууутттрссопплммиййжззгддаабЮЯЯЭЮЮЫЬЭЫЫЫЫЫЬЫЬЬЬЭЭЭЮЮЭЮЮЮЮЮЯааЯааЯааЮЯЯЯааабббвввггвггТСТ ЁЁ‹‹‹   ЕЕЕ–––––––––––––––––––––‡‡‡~~~www•••––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ—————————————————————————————————————————————————————————————————————————————————————————————{{{WWWsssaaadddЊЋЋЄЄЄЁЂЂŸ  žžœœœœ›œœš››•••———šššЁЁЁЉЉЉГГДОППЪЪЪгддкклооосссууууффууууууттттттттттттттттттууууууууууффффффффуууууутуусттсссррррррпрроппоппопппппппппрррррссстсттттлллЗЗЗ™™™‰ˆˆŸŸŸЌЌЌ‹‹‹—————————————————————”””|||~~~„„„—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ—————————————————————————————————————————————————————————————————————————————————————————————ˆˆˆ^^^pppuuuWWW˜˜˜ЁЁЁЎЎЎДЕЕДЕЕЕЖЖЕЖЖЕЕЕЗИИШЩЩежжлммноопррссстуууфффхфуффтффтуутуутуутуутуутуутуутуутуутуутуутуутуутуутуутуутуутуутуууффуффуффуффуффуффуффуффуффуффуффуффуффнннОООžžž‘‘‘‡‡‡ЅЅЅЂЂЂ………————————————————————————}}}†††vvv————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜”””ooohhh‰‰‰ddd]]]˜˜˜˜˜˜˜˜˜ЊЊЊРРРежжпппчччшщщххххххххххххфххфффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффуффиййЛММ   ˜˜˜ŠŠŠЅЅЅ–––‹‹‹˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜††††††|||˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜fff˜˜˜www```zzz˜˜˜˜˜˜˜˜˜˜˜˜ЂЂЂЖЖЖЮЮЮккксссххххццхххфффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффффххуффоооЪЪЪААА›››˜˜˜˜˜˜ŠŠŠ’’’ЅЅЅ‘‘‘˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜‘‘‘‚‚‚˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™uuu’’’rrr]]]‘‘‘™™™™™™™™™™™™™™™ЎЎЎУФФжжжоппуффцццхццхххфххфххфххфххфххфххфххфххфххфххфххфххфххфххфххфххфххфххфххфххфххфххфххфххфхххххфххфххнннЫЫЫДЕЕЁЁЁ™™™™™™™™™———ŠŠŠœœœŸŸŸŠŠŠ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™žžž‡‡‡™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™˜˜˜‰‰‰rrr™™™„„„rrriii™™™™™™™™™™™™™™™™™™™™™™™™ЁЂЂГДДЧШШиййпррфффцццццццццхццхццхххххххххххххххххххххххххххххххххххххххххххххххххххфххууукллЬЭЭОООЌЌЌžžž™™™™™™™™™™™™›››’’’‘‘‘ЁЁЁ–––™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™†††   ‘‘‘™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™’’’zzzŽŽŽ™™™lll|||™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ЁЁЁЏААСТТбггноосуууфффххфххфххфхххццфххфххфххфххфххфххфххуффоппйккбввШЩЩМММЏЏЏЅЅЅ™™™™™™™™™™™™™™™™™™™™™œœœœœœЅЅЅ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™“““ЂЂЂŸŸŸ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™”””‰‰‰www™™™}}}iiiŠŠŠ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™šššЂЂЂЉЉЉЎЏЏБББГГГЕЕЕЖЖЖЗИИЗЗЗЖЗЗЕЖЖВГГЏЏЏЋЋЋЉЉЉЅЅЅŸŸŸ›››™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ЂЂЂ›››˜˜˜ЄЄЄ›››‘‘‘™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ЂЂЂЄЄЄ˜˜˜™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™’’’|||™™™‹‹‹}}}kkk’’’™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ЁЁЁžžž›››ЁЁЁЄЄЄ•••™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™˜˜˜ЄЄЄžžž™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™“““ŠŠŠzzz™™™™™™………|||sss–––™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ЂЂЂœœœЄЄЄЋЋЋ”””™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™”””ЁЁЁœœœ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™~~~‹‹‹™™™™™™ˆˆˆ~~~www˜˜˜™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ŸŸŸЇЇЇЃЃЃЃЃЃЌЌЌЄЄЄ•••™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™˜˜˜ŸŸŸ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™‘‘‘‚‚‚zzz———™™™™™™ŒŒŒ†††~~~™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ЂЂЂЉЉЉЈЈЈЈЈЈ­­­ІІІ˜˜˜™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™’’’‹‹‹ššš™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™‡‡‡‡‡‡™™™™™™———••••••………ššš™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ІІІЊЊЊЊЊЊЎЎЎВВВЉЉЉššš™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™‰‰‰‡‡‡˜˜˜™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™———‰‰‰†††”””™™™˜˜˜›››ЇЇЇšššœœœ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ЁЁЁЉЉЉЌЌЌЎЎЎБББЕЕЕЊЊЊššš™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™”””………ŒŒŒššš™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ŸŸŸ———˜˜˜ЃЃЃ™™™™™™œœœМММ›››™™™ЂЂЂ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™   ІІІЊЊЊЏЏЏВВВЗЗЗЖЖЖІІІ———™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™———‹‹‹‹‹‹™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™’’’­­­ЎЎЎЂЂЂЈЈЈЏЏЏЁЁЁ™™™ОООЄЄЄ”””ЅЅЅŸŸŸ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™šššЄЄЄЇЇЇ­­­БББЕЕЕЙЙЙМММЏЏЏ   ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™‘‘‘ŒŒŒ™™™   ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™“““ЊЊЊТТТДДДЄЄЄЄЄЄЌЌЌЊЊЊЭЭЭУУУ™™™   ІІІ™™™™™™™™™™™™™™™™™™™™™   ЇЇЇЈЈЈЎЎЎЎЎЎДДДКККМММНННГГГІІІ˜˜˜™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™”””“““šššЁЁЁ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ДДДЧЧЧОООАААЊЊЊЇЇЇПППТТТЄЄЄГГГРРРЏЏЏЈЈЈЇЇЇЌЌЌЎЎЎЏЏЏАААЕЕЕИИИЛЛЛСССОООБББЄЄЄ———™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™žžžœœœ™™™šššžžžЁЁЁ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™–––ЈЈЈЛЛЛХХХЧЧЧНННЙЙЙННННННИИИЙЙЙЙЙЙЖЖЖЕЕЕЙЙЙИИИЛЛЛЗЗЗГГГЉЉЉœœœ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ЁЁЁЂЂЂЂЂЂЁЁЁЁЁЁЄЄЄЁЁЁ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™šššЃЃЃЊЊЊББББББ­­­КККгггПППЎЎЎЌЌЌЂЂЂ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™   ЄЄЄЄЄЄІІІЈЈЈЊЊЊЉЉЉЉЉЉЇЇЇЁЁЁ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™šššЊЊЊЏЏЏЌЌЌЈЈЈЅЅЅЁЁЁžžž››››››ššš›››ŸŸŸЃЃЃЇЇЇЇЇЇЌЌЌЎЎЎЎЎЎЎЎЎББББББВВВАААЉЉЉЂЂЂ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™œœœЃЃЃЈЈЈЉЉЉЋЋЋЊЊЊЊЊЊЅЅЅЈЈЈ­­­ЕЕЕНННОООЙЙЙЙЙЙЙЙЙЕЕЕЗЗЗБББЎЎЎІІІ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™›››ŸŸŸ   ІІІЈЈЈЋЋЋЋЋЋЊЊЊЈЈЈЃЃЃЁЁЁ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџknowthelist-2.3.1/dist/headset.icns000077500000000000000000001240201342115213400173240ustar00rootroot00000000000000icnsЈh8mk A}ƒŠ›˜q--qЇСЩкЈi5 'gˆh›ЎЏпg!KЇŠ7bcЂLqЌ,€Њ^jDQ_j‰`Ў[DmŽG #>GJG<. kЇ61ƒ6ŠŽŸ€Ё‹ˆƒŠ KV6,ƒ~eNC>942‹…€›’Ÿx‹ ?!f‰sL0&""',-+† ,JfŒ–•ЎКЛr‰=*4tN,"(0*$(' †  R“”“^(†4)Xt]1"AXL50%%„ %!$:‹ƒsh‡+(idE$0WVWC0*#… \uru‚††‹U ‡&.cV4F€PL-*#… &q‚„…€|€ŠNŠ"3WJ)‚I-%"€ M{€…„{pn|z‡C‰#1J@!BA+%€ `|}ƒ|lYKPxtƒRˆ+?7;:&()Lxy}waG83=soV‰"4/‚3+itwt^A2//7nŸV ˆ'&*+/ 'opp`B/,+E‘|ЗЖn!ˆ!€$! 'TklcI0)([жгvŽŽ &"‡  ; €gfdS6'&Hиф˜Xq\Єx!† € +)$E+a^YB(#&Пх…S)Ћ ˆ€  '=I:A\VN3!`фУZ3yŠ€ GVLC(ЌчPhРз™TŠ„‚LOB8 ог9БЦъЬI‹‚†LG80'ь­n—хьЎ0ˆ "J@.))№‘nЁэшo™>;" ъ—UЅыЌ$œ>: НОY9 1< Pш6€Ÿ5 €jУ4€œ$1 5 ž#ƒ Є ІТМНПСТЅ ЕЙДЌБЙХСЛУЛВœЎНСУУЗЗСНЗФЙЕВЋЁ™†˜ЕДЏДКМЦРСМЕНКАЄš—š–wž–ЙƒаЯСБГГ€‘“•rw€†Љ‡зЦЎЅž€ˆ”‡’ imbo•Юбм€помйзвбЙ—žЇ’˜‚‘ oX\˜Ибмтфхƒф рндР™ŽЈŒŠ|`YlЄЩйууф†у ффтжЈz”oaPhžЁЂАЫегилрспмкизиййкйК›ŸˆrmŽ[Z…›œЄкжЯЯЧЬзкмннммллб­œ€nŽ…€•”’‡ЮЪЫЬЧФУ€ТУР ‡ŠzfŒ|ŒŽŠ‰ЫЧП„ОИƒq_Œ†……†ŒФО„КЉs}`m‹{}||~ŽКЖ‚ЕЖ–zsh‹suttvЖВ‚АЌ€r‹ imllo^XWYeŒЎЋЌšvr‹ ]dcaG;e††{hQ‹ЉІЂ†|‚Š S]Y67Š—‹}o`N>6Šž€ ‹ˆƒŠ JU6,ƒ~eNC>942‹„›š›’Ÿx‹ >!f‰sL0&""',-+† ,JfŒ••ЎКЛr‰<*4tN,"(0*$(' † QŽ€“^(†3)Xt]1"AXL50%%„ %!$9€Š‚sh‡+(idE$0WVWC0*#… \uru‚……‹T ‡&.cV4F€PL-*#… &p‚„…€{€‰NŠ"3WJ)HI-%"€ M{€…„{pm{y‡B‰#1J@!BA+%€ `|}ƒ|lYKOwsƒQˆ+?7;:&()Lxx}waG83=so~V‰"4/3€23+itwt^A2//7mŸV ˆ'&*+/ 'opp`B/,+>w{ЗЖn!ˆ!€$! 'TklcI0))NЉЉuŽ$! ‡  ; €ffdS6'&@­МŠWp[‰b † € +)$E+a_YB(#%œО|S)Ž ˆ€  '=I:A\VN3!TОЏZ3g Š€ GVLC(“ЧIhРз™HŠ„‚LNB8 РК 9БЦъЬA ‹‚†LG80%а–n—хьЎ,ˆ "J@.)'з|mЁэшo™>;" еUЄыЌ$œ>: ЏЃY9 1; Kе+€Ÿ5 €fЗ2€œ#0 3 ž#ƒЄ ІТМНПСТЅ ЕЙДЌБЙХСЛУЛВœЎНСУУЗЗСНЗФЙЕВЋЁ™†˜ЕДЏДКМХПСМЕНКАЄš—š–wž–ЙƒаЯСБГГ€‘“•rw€†Љ‡зЦЎЅž€ˆ”‡’ imbo•Эал€онлйзвбЙ—žЇ’˜‚‘oX\˜Залт„ф упмгР™ŽЈŒŠ|_YlЄШитŠусеЈz”oaPhž ЂАЪдгилпспмйиззиййиК›žˆrmŽ[Z„š›ЃйеЮЮЦЫжкмннмллка­œ€nŽ„€”“’‡ЮЩЪЫЦУТ€СТП ‡ŠzfŒ{‹€Š‰ЪЦО„НЗƒq€_Œ~€…†ŒУН„ЙЈr|`m‹z€|}ŽЙЕ‚ДЕ–ysh‹r€tuЕБ‚ЏЌ€€r‹ ilkko]WWYeŒ­ЊЋ™vr‹ ]ccaG;e††{hQ‹ЈЅЁ†|Š S]Y67Š—‹}o`N>6Šž€ ЇƒŠ JU6,ƒ~eNC>942‹„€š‘Ÿx‹ >!f‰sL0&""',-+† ,Jf‹•”­ЙКr‰<*4tN,"(0*$(' †  QŽ’“’](†3)Xt]1"AWL50%%„ %!$9€Š‚sh‡+(idE$0WVVC0*#… [trt……‹T ‡&.cV4F€PL-*#… &p‚„…€{€‰NŠ"3WJ)HI-%"€ M{…„{pm{y‡B‰#1J@!B€AB+%€ `||‚|lYKOwsƒQˆ+?7;:&()Lxx}waG83=rn~V‰"4/3€23+iswt^A2//9mŸV ˆ'&*+/ 'opp`B/,,)+zЖЕn!ˆ!€$! 'SkkcI0))%!rŽX‡  ; €fedS6'&$Sp[ ‡ € +)$E+a^YB(#" S)ˆ€  '=I:A[VN3!Z3Š€ GVLC(hРз™ Š„‚LNB8 8АЦъЫ‹‚†KG80n—хьЏ Žˆ "J@.)mЁэшp™>;" UЄыЌ$>: Y9 1; €Ÿ5  €œ#0 ž#…ЄІТil32aЄЗЙВЗФСПИ’ žЖНОЗТМЖОВЎž~ŸЇЖ€ЩЪОВВš““Œlo|Ѓ„ЯЖ›ŽŽ‹lZ‚­Юлттутснжȟ’…ŠYrЋЦлрƒуттг”šskˆf\›žАзеегЯезйкййЙŸŒqˆ‚Š“‘ƒ бЫЪФТССТ­„€d‡†ˆˆ‡СМ€ЛМzf‡{{|ˆКЖ€ДБ€o‡nnpa_c‡Џ€Ќyw†`aCZ†‚lN†ЁЄЅЃ‡€†U7Y‘uXI=3†„œ’„† <5…`1""&+)ƒ &H„”ЌБk… ,]h2," ‚mzz…nƒ(,W5;KKC&! ?„€r{|]… )F(9??="Z{€rTAlza„ 6!/442$.txjC2/a‘d„$"))#"FojD-,ƒ‰­‰ „ , ffP,&›нnv‘H!ƒ -.7!_X7"\х@Nq „€  € 0UH&Г•0Ј}I†‚ 8I9ц>œзг5‡„ A<,"яšьЂ 71ч ˆЮ5’ 40 ˜^ ” 3 ‡6’ €– ЈЄЗЙВЗФСПИ’ žЖНОЗТМЖОВЎž~ŸЇЖ€ЩЪОВВš““Œlo|Ѓ„ЯЖ›ŽŽ‹lZ‚­Юкттутснжȟ’…ŠYrЋЦлрƒуттг”šskˆ f\›žАзеегЯезйЙŸŒqˆ‚Š“‘ƒ аЫЪФТССТ­„€d‡†ˆˆ‡С‚Лzf‡zz{ˆКЖ€ДБ€o‡nnpa_c‡Џ€Ќyw†`aCZ†‚lN†ЁЄЄЃ‡€†U7Y‘uXI=3†ƒœœ’„† <5…`1""&+)ƒ &G„“ЋБk… ,]h2," ‚mzz„€nƒ(,W5;KKC&! ?„€rz{]… )F(9??="Z{€rTAlz`„ 6!/442$.txjC2/`c„$"))#"FojD-,kЌ‡ „ , ffP,&Жhv>ƒ ..7!_X7"PР;N_ „€  € 0UH&˜„0Ј}>†‚ 7I9Ш7œзг/‡„ A<, гšьЂ 71Я ˆЮ5’ 4/ ŽP ” 3 €3’ €– ЈЄЗЙВЗФСПИ’ žЖНОЗТМЖОВЎž~ŸЇЖ€ЩЪОВВš““Œlo|Ѓ„ЯЖ›ŽŽ‹lZ‚­Юкс€трме͘Ÿ’…ŠYrЊЦлптуттсв”šskˆe\šЏжедвЮдзййииЙžŒqˆ‚‰’‘ƒ аЪЩУСРРС­„€d‡…‡‡‡РЛ€КЛzf‡zz{ˆЙЕ€ГА€o‡mmoa^c‡Ў€Ћœyw†`aCZ†‚lN† ЃЄЂ†€†T7Y‘uXI=3†ƒœœ’„† <5…`1""&+)ƒ &Gƒ“ЋАk… ,]h2;H3&$R‹u ƒ -(gJ ,UU>," ‚mzz„€nƒ(,W5;KKC&! ?~„€rz{]… )F(9@@="Z{€rTAkz`„ 6!/442$.txjC2/ac„$"))#"FojD-+"cЌ‚„ , efP,'Du;„ ..7!_X7"N„€  € 0UH&0Ї} †‚ 7I9›з㇄ A<,šьЂ 71 ‡Ю5’ 4/  ” 3  ’ €— Јis32}ЖМРЖ†ЇМССЛЏ˜’„ h”ЯониЙ”‚ hqАимкноЦЃw‚ ‹ŽЭЪСОЙƒesugeГАžuWMyd?ˆ ‡ 6`82+ '~•4€ +O(P57{{r€ !1$:(HwOOt€ % `KF–%€  %U'Ђ^2  ;ŠUЮ….#~'Hˆ'‰‚ЖМРЖ†ЇМССЛЏ˜’„ h”ЯониЙ”‚ hqАимкмоЦЃw‚ ‹ŽЭЪРОЙƒesugeГАžuWMyd?ˆ ‡ 6`82+ '}”4€ +O(P57{{r€ !1$:(HwOOs€ $ `K?‚Š!€  %U'‹^*  ;yUЮ….#p'Hˆ%‰‚ЖМРЖ†ЇМССЛЏ˜’„ h“ЮнниЙ”‚ hpЏзмймнЦЃw‚ ŠЬЩРНЙ‚estgeВЏžtWMyd?‡Ÿ‡ 6`82+ '}”4€ +O(P57{zq€ !1$:(HwOOs€ $ `K'8x€  %U']   : UЮ….# 'HˆŠ‚it32AOЄ§§§§§ џпЯмкотцсил№ь МШЛГА­ЋЅЈ­ЕНО€ЙИППЩжчфЁОИЎЈЅЂЁœžЅžЄАЗЛОИИЗБЏББДИОгк ІйлреСФдПЎЎЊБ‹ џђаЖЏЋЊЉ­ЙкгднзЭОЙННИЙЙЖЕЙМХЪЯбГдАІЂЁЉЛЯ’ЮаОАЊЇПТЄГХЩЭПРМЕБЕИЛТЩЩХrŒуЃššŸБЫ ЛХДЄЅДГбУ™ЁЕƒ їзНЙВДКМСЧШ€Œ›’šАШ rВЎЂ­Ю№šУЄ”Ўз‰ џуРИГЕЙПСПŒЃˆ‹™КХ bŸ—˜КžМ›™КџЧЕБВЗРН}‹„}‰˜йТ „†’ч›Ї›п“џУВЎБИЛ‹t}‹С tџ“•„›˜пЗЋЎГЖЁ‹s†—”О St}…†|˜›џЛЉЈ­АŠa‡š–Н†~V{~q“žџЛЅЃ­­sŠ…ŸšЛpŠbj|m€ЁџЎЄЌЂŠЁЁКŽzf}flЄљЃ›ЁЇŽ‰—ЄЂИc‰X5ziX‰ГЮекл€мноонммквˆзœ˜ЄZˆ™ЂЊЗ‹ztlN‡Ъбжмпуфхц†хффуусне„ЄŽœЅ€ˆ‰ЂЃЖ†_drO…Щаелрф‚цхффутпзџŠ‘Ё”8‡t ŠДlu0DpV%‚ФЬвипфццšхфтри€…œŸk‡vžpГqbf`>ЩЭгксхцхф хфтснЪ}’Ѕ‡†~CВjJEdI€йвзпчщ‚хЁфтонtˆЅ•6…Q†xАN^%eUџЕЖЕЕЖЖЕКгмморсуфуŠфсмџ3ЅЃY…h†`А ZU3a[НІЂ ž€œŒНШЬЯбезлосуфууƒт€у€ф€утс€р‚п ррсттрую|ŸЌx„Jw~DЏ[LVXƒЈž‚ŸЁВ„“НШЬадимп€уфутспмйздбЯЮЭЫЬЬЭ€Ю€а Яабвггаи{ Е‚„c~mЏdJMN™ ‚ž џŠБТШЭвзкигЯЬЪЧХХШЫЯбдиккм€н€о€н мкиийэ› И‹„r{V­;c`KjЃ‚œЋАСХФ€ХШЯеймоƒпоо„пƒрпуЕЃН–ƒo~r­CNblœš™š ” ХЧХЧЮекппо€ноопп€нлкйй€и€йклнРžП„ƒy{SЌfD‚›™–—›˜НОСХЫгконмйебЯЬЪЩЧ†ФХЧЩЫЖ›Гn‚noЋжhfœ–‚”–œ —МРХЬЫХУСР€СŒТЩА›­a‚~{DЊœ€‰”ƒ’•ŸАМПР“СЩІ›?pfЉЁ’‘ƒ•Ђ•ПЧ™žxn"Ј“†ŽЃЄ“ОПУ‰žvpmUЈŒ†Š‹Ї’МПЙ‚™Z€‰k_ЈŠ†‡‰ЉЛКСЈƒ‹9€hb;Ї††ƒ†Њ˜ЙЙИŒЙ ИС–‰yfeWЇ‚†€ƒЌЗИН…‹a€i`Ї†}ЎЕД‹Е ДИЎ„Bjg2І|†z~ЏГ ВЛ—†rdnWІx†vzААБД†…WsfІv†swВŒЏДŸ‡xupІr†ptГŒЎВŒ†YoxFЅo†mp‚GA­ЌЋ‰ЌАœŠwT}gЅl†j{€98301687Њ‹ЊЋ…_‚sЅi„gjkO48715Keu|{zz{woЇ‰ЈЇЌ“‹y~zЄfƒcg_<3823X†žЁœ–‰‚zsle_ІІЅ‡ІЈ‚†t€GЄc‚`eT.%20G„ЅЂ›–’ˆ‚|vpib[TQЅЄЃ‡ЄЅ‹ˆ€ŠeЄb_€^bL)'((\œЅ›˜•’Œ‡ƒ}xsle^WQKFЅ‡ЂЁЅŒŽŸƒrЄ`[ZZ_J%'( bЃž™—”‰ƒ~ytpkf`ZSLE@:Ѕ Ÿ… Ђ’€”†xЄ _YW[M&&'[Ѓ›—•‘‹„}vpjea[XUPKE>965Ѕž„žŸ˜Ž†ˆ‡|+Ѓ!`VWR+$'K˜”’†~ulbZRLFB@?=<:64332Єœ›„œ„~‰œu9ЃiTU4!&5—‘Š‚xl`SG<620€/001€2112Є›™ƒš™“ЅЩЯИЊЄVC #""z˜ŽŒ‡~tfWG80-+*)€(*+-.‚/Ѕ•™—˜—–ЛаШХЫЩШЃ"M* #U–Œ‰„}qcR?1-+)%$"!!"#%(*+,-,-,Ѕƒ–“ Л‚ИКzЂ+!"/‡‹‡ƒ{qcQ>/,*'#!!%(**+Єƒ•“€”‘ЂЌƒЊšЁ6+! _ƒ{reT@/+)%"(-,$$'‚)Ѕ“€’‘˜œ‚›œ•Ё .."-€‚~zrgXE1*($!+48:;94("&€(''Є‘€ŒŒŒlЁ --'R…{ysj\K6*($ ?POD54789/!#‚&ЄW‚ŽŠ}~~}Ё€+*)o|wslaR>,'$!L^``_T:35680#$€&%Є‡Ž€Œopnqs\Ё€*$%BytrneYH2(%!Na\ZZ[^W81446,#%%$##Є„‹€‰Š‹ltmLЂ€)$Vvolg^Q=*&#?_Y‚X\P1€23'$%$#!k\TSTZd{ƒˆ‹uІy.Ё€('*dpkgaXI3&# $YXV‚W VZB-101-$%$# š ^†‰†…„…†Šˆƒ†‡tАvKЁ€'#4jifb\QA,%"AZ…T VQ0-../'$$" —h††…ƒƒ€„ƒ€„„€…„…sЋt[Ё€%!>idb]VK9'"RS…R QT;*-,-*$#"•G}……ƒƒ‚ƒ…†…„‚~y€ƒ€‚ƒ€uЊnfЁ€$ He`]YRF2# /U‡ORE)*%""”j‚…€‚ …ˆˆ‡…ƒ{w|‚€€‚{{­hiЁ##"!N`\YTMA,!=PˆM K+'(()%"!“{„‚€ ‚‡Š‰†ƒ~zvqx€€~yxІgjЁ!! #Q[WTPI;' EMˆJ L1$&&'%" ‘H|ƒ€€ƒ‰ˆ‡„‚~zvrnir~€|}s‚Ёcq € %QUSPLD7$HHˆGJ5!€$&#w€~~~…ˆ‡…‚zupkgd_i}€{|n‹š`v €&OPNLHA3!!G‰DG7€!%'—~€}~„‡…ƒ€|uohb]YUP_{€y{mˆ“aqŸ'LLKHD=0"E‰A C6$+ƒ|€{|ƒ…„}wph`XQLHD?Qz€xzh—…co1Ÿ€&IGFEA:-"B‰> @5#0ށ‚{ƒ‚€{skaWNGA=973Ewwvvweœds3ž€%CBBA>7*"A‰< >4#4„zy~€}xqg\QH@;7532/>tuttud—wer2'"€> =:5( <‰9 ;0!7Œa|wxxw{€~{voeYND=752/;rt€sgЃliq1)€9 61&9‰6 8-#9Œzvwvvy}}yuncWKB:5321.9prrqk_Ђbjp/'%ž4€5 3/$6‰4 6)';‹rw€t uzzxtmcVJ@941ƒ0-8nqoj•Еrhl.%&-001/,$1‰0 2$0:Š2ut€s vxvsmcVJ?830..‚/(,kpi›ажгЭ—b*$% €'+,-,)#-.ˆ- 0=5Šetq€r uurmdXK@72/‚-.,)Zpg‰ЫФССХЭw"##! &&''&!(,ˆ+ ,  I+ ‰op rrqmf[NB82., --$ cОиqfЄЙДП#! œ  !#$#€"*‡( )& *M ‰[q€n oqolf]QC82.,€+ ,,4ЄыядmlЁЇЅЋ•  œ)%†& ' H@ˆkn€l nnlg`TG;3.+€* ++JЮ№судni“—–”Јq€€%‡$ & $X* ˆKn‚kjgaXK>4.*) *Pныопснza‰€†‡}ЇшB € % „! #QG ‰al‚igc[PC7/*( )Hнъпроуџ™]lzyƒЭє­‚ % „ !;\) ˆ'hh€gffb]TH;0+'(0Юьпроыџ•8jgjliqcWоыщHžƒ €ƒ ) /e< ˆMh€e dcb^WNA5,(%€&#ЉђрспёѕbDqlj‡aDцї ž € … (14jI ‰\f€ca`^YRG:/'$ %jётсп№єJ€+?cŸG€q§Хž „  €  !4=/ PkL ˆ`baa`]]ZTL@3)%#.дътрыћR„Zš<€Ш№8Ÿ… ‚  #*9JK8*2QkdEˆ=a€_\ZYVPG:.&‚"‰єтсфџ€…g,iџV †  #,4=IV`d^P9€‰O`€] XWVRKA4)" €!0йщутњХ…t‡ яrЁ‡ '/8@EHF=(Š U^\\ZTTRNF2'Eщчфъі=„ BЭйЬЗмїџп>‚˜ЃŠ€€€Š'W€VMIJFB:/#€ {іххїКƒ 4ЫЭСЈкчсьљ‰eŒЄƒ‹3V€TIFFC=5+ €Ќєцц§mƒЎЧОЧпуююя™W~Ѕ„Œ9€SRECB?:2'!бючыь/ƒiХИŸЅгфяьюя• ZwІƒ ?RQRN@@?<7/$7цычђЧ‚ЄВЉ‹Он№ььяъŠ"]]Ї’ŽEPOPK€;94," M№ъшјšƒ>АЈ‹—ая€ьђиw%T!Љ‰„ INMNH67751* ^іъщљtƒ[Ј›{­у№€ьєИ`$KЎ› KLKLE2332.'dјъщіWƒjŸ‡|Уя€ьяэ’M@а IKIKC-0/.+%dљыыяEƒl–w„йё€ьєЭv7аNIGJA)€+("Zјььы>ƒ enцяььяэ•lб lHEHA%%''% DѓюьэBƒ W…g—ьюьюєД}I в HDEA#!##"'фёьђSƒ CeŒююяѕСƒx д HCDC! Ујьіpƒ #uxuдљыГ‰г IAAC"‚Œџэіš„ K†›І™ž—$д PA@D' ‚ @ї№ѓЫ… €ЁЁmе B>B/ ‚ КџяёI‡€ж ?>>9 ‚  BњѓњЇ‹ж=<>ˆ ˆџѓѕN‰и;;=*ˆ Їџќр)‡к<:9 ‡ќџу@„л?9;"†CЎі§ЄKм<97†FdT' о;:*ƒ‚€‚€р6:Œ„тC:“фЙ:шUыя…­§§§§§Є§§§§§ џпЯмкотцсил№ь МШЛГА­ЋЅЈ­ЕНО€ЙИППЩжчфЁОИЎЈЅЂЁœžЅžЄАЗЛОИИЗБЏББДИОгк ІйлреСФдПЎЎЊБ‹ џђаЖЏЋЊЉ­ЙкгднзЭОЙННИЙЙЖЕЙМХЪЯбГдАІЂЁЉЛЯ’ЮаОАЊЇПТЄГХЩЭПРМЕБЕИЛТЩЩХrŒуЃššŸБЫ ЛХДЄЅДГбУ™ЁЕƒ їзНЙВДКМСЧШ€Œ›’šАШ rВЎЂ­Ю№šУЄ”Ўз‰ џуРИГЕЙПСПŒЃˆ‹™КХ bŸ—˜КžМ›™КџЧЕБВЗРН}‹„}‰˜йТ „†’ч›Ї›п“џУВЎБИЛ‹t}‹С tџ“•„›˜пЗЋЎГЖЁ‹s†—”О St}…†|˜›џЛЉЈ­АŠa‡š–Н†~V{~q“žџЛЅЃ­­sŠ…ŸšЛpŠbj|m€ЁџЎЄЌЂŠЁЁКŽzf}flЄљЃ›ЁЇŽ‰—ЄЂИc‰X5ziX‰ГЮекл€мноонммквˆзœ˜ЄZˆ™ЂЊЗ‹ztlN‡Ъбжмпуфхц†хффуусне„ЄŽœЅ€ˆ‰ЂЃЖ†_drO…Щаелрф‚цхффутпзџŠ‘Ё”8‡t ŠДlu0DpV%‚ФЬвипфццšхфтри€…œŸk‡vžpГqbf`>ЩЭгксхцхф хфтснЪ}’Ѕ‡†~CВjJEdI€йвзпчщ‚хЁфтооtˆЅ•6…Q†xАN^%eUџЕЖЕЕЖЖЕКгмморсуфхффуŠфсмџ3ЅЃY…h†`А ZU3a[НІЂ ž€œŒМШЬЮбдзкосуфууƒт€у€ф€утс€р‚п ррсструя|ŸЌx„Jw~DЏ[LVXƒЈž‚ŸЁВ„ НЧЬадзмптутспмйздаЯЮЬЫЫЬЭ€Ю€а ЯабвггЯи{ Е‚„c~mЏdJMN™ ‚ž џŠВТЩЭбжкзгЯЬЩЧХХШЫЯбдзйлм€н€о€нмк€иэ› И‹„r{V­;c`KjЃ‚œЋБТЧХШЯеймо„пооƒпƒрпуЕЃН–ƒo~r­DNblœš™š ” ХЧХЧЮекппо€нооппонмлйии€йклмРžП„ƒy{SЌfD‚𙖁—›˜НОРФЫвйонмйебЯЬЩШЧ€ФУ€ФЧЩЫЖ›Гn‚noЋеhfœ–‚”–œ šЛПФЫЪХУСРРС‡Т€СЩБ›­a‚~{DЊœ€‰”ƒ’”ŸБМПРР’СЩЅ›?pfЉЁ’‘ƒ•Ђ•ПЧ™žxn"Ј“†ŽЁЄНО€НОНПУŠžvpmUЈŒŠ…‰‹Ї€МЛМЛОЙ‚™Z€‰k_Ј‰†‡‰Љ‘КРЉƒ‹9€hb;Ї††ƒ†ЊАЙ ИС–‰yfeWЇ‚†€ƒЌЗИН…Œa€i`Ї~†|€ЎЕД‹Е ДИ­„Bjg2І{†y}ЏГ ВК–†rdnWІx†vyААБД†…WsfІv†twВŒЏДŸ‡xupІr†ptГ­‹ЎВŒ†YoxFЅo†mp‚GA­ЌЋ‰ЌАœŠwT}gЅl†j{€98301687Њ‹ЊЋŒ…_‚sЅh„fijO48715Keu|{zz{woЇ‰ЈЇЌ’‹y~zЄeƒcg^<2823X†žЁœ–‰‚zsle_ІІЅ‡ІЈ‚†t€GЄda`eT.%20G„ЅЂ›–’ˆ‚|vpib[TQЅЄЃ‡ЄЅ‹ˆ€ŠeЄb^€]bK)'((\œЅ›˜•’Œ‡ƒ}xsle^WQKFЅˆЁЄŒžƒrЄ`[ZZ^J&'( bЃž™—”‰ƒ~ytpkf`ZSLE@:ЅŸž…ŸЁ‘€”†xЄ _XW[M&&'[Ѓ›—•‘‹„}vpjea[XUPKE>965Ѕ…œ—ކ‡‡}+Ѓ!_UVR+$'K˜”’†~ulbZRLFB@?=<:64332Є†›„‰›u9ЃiSU4!&5—‘Š‚xl`SG<620€/001€2112Єžœ„š™“ЅЩЯИЊЄUC #""z˜ŽŒ‡~tfWG80-+*)€(*+-.‚/Ѕ•™—˜—–ЛаШХЫЩШЃ"L) #U–Œ‰„}qcR?1-+)%$"!!"#%(*+,-,-,Ѕƒ– “ КИЗИЗИКzЂ+!"/‡‹‡ƒ{qcQ>/,*'#!!%(**+Єƒ”“‘ЁЌƒЊšЁ6+! _ƒ{reT@/+)%"(-,$$'‚)Ѕ’˜ƒ›œ”Ё .."-€‚~zrgXE1*($!+48:;94("&€(''Є~Ž€‹Œ‹‹kЁ --'R…{ysj\K6*($ ?POD54789/!#‚&ЄW‚‰|}~~}~|Ё€+*)o|wslaR>,'$!L^``_T:35680#$€&%Є†Œ€‹Œnompr\Ё€*$%BytrneYH2(%!Na\ZZ[^W81446,#%%$##ЄƒŠ€ˆ‰ŠltmKЂ€)$Vvolg^Q=*&#?_Y‚X\P1€23'$%$#!k\TSTZd{ˆ‚‡‹uІy.Ё€('*dpkgaXI3&# $YXV‚W VZB-101-$%$# š ^†‰†…„…†Šˆ…ƒ†tАvKЁ€'#4jifb\QA,%"AZ…T VQ0-../'$$" —h††…ƒƒ€„ƒ€ƒƒ„sЋtZЁ€%!>idb]VK9'"RS…R QT;*-,-*$#"•E}……ƒƒ‚ƒ…†…„‚~y‚€‚uЋneЁ€$ He`]YRF2# /U‡ORE)*%""”j‚…€‚ …ˆˆ‡…ƒ{w|€€{{ЌhiЁ##"!N`\YTMA,!=PˆM K+'(()%"!“{„‚€ ‚‡Š‰†ƒ~zvqx~€}~xxЇgiЁ!! #Q[WTPI;' ELˆJ L1$&&'%" ‘H|‚€€ƒ‰ˆ‡„‚~zvrniq}€|}r‚Ёcp € %QUSPLD7$HHˆGJ5!€$&#w€~…ˆ‡…‚zupkgd_i|€z|m‹š`v €&OPNLHA3!!G‰DG6€!%'—~€}~„‡…ƒ€|uohb]YUP^{€xzlˆ“aoŸ'LLKHD=0"D‰A C6$+ƒ|€{|ƒ…„}wph`XQLHD?Qy€wyh—…co1Ÿ€&IGFEA:-"B‰> @5#0ށzz€{ƒ‚€{skaWNGA=973Dvvuuvdœ€cr3ž€%CBBA>7*"A‰< >4#4„zx€y~€}xqg\QH@;7532/>tuttud—vdr2'"€> =:5( <‰9 ;0!7Œa|wxxw{€~{voeYND=752/;qs€rfЃlip1)€9 61&9‰6 8-#9Œzvwvvy}}yuncWKB:5321.8nqppj`Ђbio/'%ž4€5 3/$5‰3 5)';‹qw€t uzzxtmcVJ@941ƒ0-7mpnh•Еrgk.%&-001/,$1‰0 2$0:Š2ut€s vxvsmcVJ?830..‚/)/kohšажгЭ–a*$% €'+,-,)#-.ˆ- /=5Šet€q ruurmdXK@72/‚-.,#)OngˆЫФССХЭv"##! &&''&!(,‡* +,  I+ ‰op€o rrqmf[NB82., --&#T•ЊngЄЙ€ДГП#! œ  !#$#€!*‡( )& *M ‰[q€n oqolf]QC82.,€+ ,,!2ƒЗКЈjl ІЄЊ”! œ)‡& ( H@ˆkn€l nnlg`TG;3.+€* ++BЂЛАБЉki’—‚• ^€€%$$„# $% $X* ˆKm‚kjgaXK>4.*)*FЎЙ€АЌrb~ˆ†—Ж9 € %…! #QG ‰ak‚igc[PC7/*‚(@ЏЙББ­Жт”]kyxxwy‚ЇРŒ‚ $ „ !;\) ˆ'hh€gffb]TH;0+‚' .ЅМВВЎХю7hfikhpcSИКЙ>žƒ €ƒ ( /e< ˆMg€e dcb^WNA5,(%€&$‹СДДАвъ_Cpjj†`?ПФwž € … (14jI ‰\f€ca`^YRG:/'$ %[ТЗЖВвшG€+?cŸG€eаЁž „  €  !4=/ PkL ˆ`baa`]]ZTL@3)%#,­ОЗДЫэN„Zš<€ ЈТ1Ÿ… ‚  #*9JK8*2QkdEˆ2'>ХУПЬс7„ AЭйЬЗмїџп>p‚ЃŠ€€€Š&W€VMIJFB:/#kвТТнЈƒ 4ЪЭРЈкчсьљ‰WxЄƒ‹3V€TIFFC=5+ €•бФШтbƒЎЧОЧпуююя™KnЅ„Œ 9TRRQECB?:2' ДЮЧЮб)ƒiХИŸЅгфяьюя•"NhІƒ >QPQN@@?<7/$2ШЭЪеЎ‚ЄВЉ‹Он№ььяъŠ$PRЇ’ŽEONOK€;94," EгЭЬи†ƒ>ЏЈ‹—ая€ьђиw%IЉ‰„ INMNH67751* UкЯЭиdƒ[Ј›{­у№€ьєИ`#BЎ› KLKLE2332.'[нбЯвKƒjž‡|Уя€ьяэ’O9а HJIKC-0/.+%ZпгаЪ:ƒl•w„йё€ьєЭv8аMJHJB)€+("SржвФ4ƒ dŒmцяььяэ•l б mHEH@%%''% @нйдФ7ƒ W„f—ьюьюєД}I в GDEA#!##"&анжЪDƒ C~eŒююяѕСƒx д GBCB! ГфйЮ[ƒ #sxuдљыГ‰г IAAC"‚энг{„ J†›І™ž—$д QA?C& ‚ <цсйЁ … €ЁЁmе B=A/ ‚  ЎюрШ8‡€ж >==9  ‚  ?ьцс‚‹ж<;>ˆ €јчж:‰и;:<*ˆ žћ№Х‡к<98 ‡‰ёџв;„л?9;#†?Іыє›Gм;86†C_P% о::)ƒ‚€‚€р6:Œ„тB9“фД9шRыя…­§§§§§Є§§§§§ џпЯмкотцсил№ь МШЛГА­ЋЅЈ­ЕНО€ЙИППЩжчфЁОИЎЈЅЂЁœžЅžЄАЗЛОИИЗБЏББДИОгк ІйлреСФдПЎЎЊБ‹ џђаЖЏЋЊЉ­ЙкгднзЭОЙННИЙЙЖЕЙМХЪЯбГдАІЂЁЉЛЯ’ЮаОАЊЇПТЄГХЩЭПРМЕБЕИЛТЩЩХrŒуЃššŸБЫ ЛХДЄЅДГбУ™ЁЕƒ їзНЙВДКМСЧШ€Œ›’šАШ rВЎЂ­Ю№šУЄ”Ўз‰ џуРИГЕЙПСПŒЃˆ‹™КХ bŸ—˜КžМ›™КџЧЕБВЗРН}‹„}‰˜йТ „†’ч›Ї›п“џУВЎБИЛ‹t}‹С tџ“•„›˜пЗЋЎГЖЁ‹s†—”О St}…†|˜›џЛЉЈ­АŠa‡š–Н†~V{~q“žџЛЅЃ­­sŠ…ŸšЛpŠbj|m€ЁџЎЄЌЂŠЁЁКŽzf}flЄљЃ›ЁЇŽ‰—ЄЂИc‰X5ziX‰ВЭдйк„мннмллкгˆзœ˜ЄZˆ™ЂЊЗ‹ztlN‡Щаекосуфх†фууттрмд„ЄŽœЅ€ˆ‰ЂЃЖ†_drO…ЧЯгкпф€цхффутспжџŠ‘Ё”8‡t ŠДlu0DpV%‚УЫбиоуцхх–фхффуспз€…œŸk‡vžpГqbf`>ШЭгкс€хžф утсмЩ}’Ѕ‡†~CВjJEdI€ибжпчшхЁф усноtˆЅ•6…Q†xА N^%eUџДЕДД€Е Йвллнпстуфу‘тŠусмџ4ЅЃY…h†`АZU3a[МІЁŸœœ››‹МЧЫЮаджкосуƒту ффуутссррп€о€п рсттртэ}ŸЌx„Jw~DЏ[LVXƒЇž‚ŸЁБ„ ’МЧЫЯгзлпту тролижгаЮЭЫЬЭЭЮ€Я ЮЯабвваз{ Е‚„c~mЏdJMN™Ÿ‚ŸџŠАСЧЭбжйзгЯЫШХФФЧЪЮбдзйймƒн€м лйизиь› И‹„r{V­;c`KiЂ‚›œЌБРФУ€ФЧЮдилноп„о„прпотДЃН–ƒo~r­DNal›š˜™Ÿ” ФХФХЭдкопо€н оопоонмлкййиййклмПžП„ƒy{SЌfDš™–—š˜МНРФЪбйннлидаЮЫШШХФ…УФХШЪЖ›Гn‚noЋеhfœ•“”•œ –ЛПФЫЪФТРП€РŒСШАš­a‚~{DЊ›‰”ƒ‘•ŸЏЛНП“РШЄ›?pfЉŸ’‘Žƒ”Ђ•ОХ™žxn"Ј’…ŒЁЄ“НОТ‰žvpmUЈ‹†‰ŠЇ’ЛОИ‚™Z€‰k_Ј‰††‰ЉКЙРЈ‚‹9€hb;Ї††‚…Њ—ИИЗŒИ ЗР•‰yfeWЇ†‚ЌЖЗМ…Œa€i`Ї~†|€ЎДГ‹Д ГЗ­„Bjg2І{†y}ЏВ БК–†rdnWІx†vyАЏАД†…WsfІu†rvВŒЎГž‡xupІr†psГŒ­БŒ†XoxFЅo†lo‚GA­ЋЊ‰ЋЏœŠwT}gЅk…ij{€98301687Њ‹ЉЊŒ…_‚sЅh„fijO48715Keu|{zz{woЇ‰ЇІЋ’‹y~zЄeƒcg^<2823X†žЁœ–‰‚zsle_ІЅЄ‡ЅІœ‚…u€GЄc‚`eS.%20G„ЅЂ›–’ˆ‚|vpib[TQЅЃЂˆЃ‹ˆЁeЄb^€]bK)'((\œЅ›˜•’Œ‡ƒ}xsle^WQKFЅ‡Ё ЄŒŽ~ƒrЄ_[ZZ^J&'( bЃž™—”‰ƒ~ytpkf`ZSLE@:ЅŸž…ŸЁ‘€“†xЄ ^XW[M&&'[Ѓ›—•‘‹„}vpjea[XUPKE>965Ѕœ…—ކ‡‡}+Ѓ!_UVR+$'K˜”’†~ulbZRLFB@?=<:64332Є›š„›œ„‰šu9ЃiSU4!&5—‘Š‚xl`SG<620€/001€2112Єœš„™˜“ЄШЮЗЉЄUC #""z˜ŽŒ‡~tfWG80-+*)€(*+-.‚/Ѕ”˜–—–•КЯЧФЪШЧЃ"L) #U–Œ‰„}qcR?1-+)%$"!!"#%(*+,-,-,Ѕƒ•’ŸК‚ЗЙyЂ+!"/‡‹‡ƒ{qcQ>/,*'#!!%(**+Єƒ”’€“ЁЋƒЉ™Ё6+! _ƒ{reT@/+)%"(-,$$'‚)Ѕ’€‘—›‚š›“Ё .."-€‚~zrgXE1*($!+48:;94("&€(''Є~Ž€Œ‹Œ‹‹kЁ --'R…{ysj\K6*($ ?PND54789/!#‚&ЄV‚‰|}~~}~|Ё€+*)o|wslaR>,'$!L^__^S:35680#$€&%Є†€‹Œ~nompr[Ё€*$%BytrneYH2(%!N`[YYZ]W71446,#%%$##Є‚Š€ˆ‰Š~ltmKЂ€)$Vvolg^Q=*&#?_ƒX\P1€23'$%$#!k\TSTZczƒ‡ŠtІy.Ё€('*dpkgaXI3&# $YX„V ZB-101-$%$# š]~…‰†€„†‰‡ƒ…†tАvKЁ€'#4jifb\QA,%"AYS„T UQ0-../'$$" —h~††…€ƒ„„ƒ€ƒƒ€„ƒ„sЋtZЁ€%!>idb]VK9'"RS…R QT;*-,-*$#"•F}„…‚„……„‚~y‚€‚uЋneЁ€$ He`]YRF2# /T‡ORE)*%""”i‚„ „ˆˆ‡…ƒ{w|€€{{ЌhiЁ##"!N`\YTMA,!=P‡L MK+'(()%"!“z„€€‚‡Š‰†ƒ~zvqx€}~xxЇgiЁ!! #Q[WTPI;' ELˆJ L1$&&'%" ‘G{‚€~ƒ‰ˆ‡„‚~zvrnir}€{|r‚Ёcp € %QUSPLD7$HHˆGJ5!€$&#x€~…ˆ‡…‚zupkgd_i|€z{l‹š`v €&OPNLHA3!!G‰DG6€!%'•~€|}ƒ‡…ƒ€|uohb]YUP^z€xzlˆ“aoŸ'LLKHD=0"D‰A C6$+‚|€{|ƒ…„}wph`XQLHD?Qy€wyg—…cn1Ÿ€&IGFEA:-"C‰? A5#0Ž€z{ƒ‚€{skaWNGA=973Dvvuuvdœ€cr3ž€%CBBA>7*!@‰< >3#4„‚y~€}xqg\QH@;7532/>stsstc—vdq2'"€> =:5( <‰8 :/!7Œa|w {€~{voeYND=752/;ps€rfЄlhp1)€9 61&9‰6 8-#9Œz€vux}}yuncWKB:5321.8nqqpj`Ђbio/'%ž4€5 3/$5‰3 5)';‹qw€t uzzxtmcVJ@941ƒ0-7mpni€•Дrgk.%&-001/,$1‰0 2$0:Š2ussrsvxvsmcVJ?830..‚/,7lnhšЯевЬ–a*$% €'+,-,)#-.ˆ- /=5Šet€q ruurmdXK@72/ƒ-./+0igˆЪУРРФЬv!##! &&''&!(,‡* +,  I+ ‰op€o rrqmf[NB82.ƒ,-.'!fjЃИГН!"! œ  !#$#€!*‡( )& *M ‰[p€m oqolf]QC82.,‚+ -*"do ІЄЊ“& œ)‡& ( H@ˆjm€l mnlg`TG;3.+‚* +' bm‘–•›„! €€%$$„# $% $X* ˆKm€j kkjgaXK>4.*‚) *&\i~ˆ…c € %…! #QG ‰ak€h iigc[PC7/*‚( )%Mkky€x}.‚ $ „ !;\) ˆ(gg‚fb]TH;0+‚'(&#nfikhpm-žƒ €ƒ ( /e< ˆMg€e dcb^WNA5,(%‚&€Bpjj†`€ž € … (14jI ‰ \eccba`^YRG:/'‚$%€€+?cŸG€ ž „  €  !4=/ PkL ˆ`baa`]]ZTL@3)%‚#"€„Zš<€Ÿ… ‚  #*9JK8*2QkdEˆ2'‚€„ AЬиЫЖмїџп? ЂŠ€€€Š&W€VMIJFB:/#‚€„ 4ЪЬРЈкчсьљ‰ Єƒ‹3V€TIFFC=5+ ‚€ ƒ­ХНœЧпуююя™#Ѕ„Œ 9TRRQECB?:2'ƒƒhФЗžЅгфяьюя”-Іƒ >QPQN@@?<7/$ƒ€‚ЃБЈŠОн№ььяъŠ- Ї’ŽDONOK€;94,"†ƒ>ЎЇŠ—ая€ьђиx%Љ‰„ IMLMH67751* ƒ€ ƒ[Іš{­у№€ьєИdЎ› KLKLE2332.'‚€ ƒjž‡|Уя€ьяэ‘Rа HJIKC-0/.+%‚€ƒl•w„йё€ьєЭv:аMJHJB)€+("‚€ƒ dŒmцяььяэ•mв lHEG@%%''% ‚€ƒ V„f—ьюьюєД}Jв GDEA#!##"‚€ ƒ C~eŒююяѕСƒx д GBCB!ƒ ƒ #swuдљыГ‰г IAAC"‚ „J†›І™ž—$ж QA?C& ‚  … €ЁЁmе B=A. „ ‡€ж >==8  ƒ  ‹ж<;>‰  ‰и;:<*‹€‡к<98 Š„л?9;"‡ м;86‡ ‚о::)ƒ‚‚р79Œ„т@9“фД9шRыя…­§§§§§l8mk5^Z_iS1‰Ч›˜ygMY;Sr›<\zPS i‡.I@;XthБелиЪЌFF„=Dƒ†žдаіџџџџџџџю˜”;kцўЦ 7vКѕџџџџџэОHyKџў) WОўџџџ§э;Tџш8Хџџџўх^—џдsњџџџž]”џЯ4EѓџџќlџїљџќЫN@іџџЋM|џџџџџџўhN§џіyiџџџџџџџј(Ёџџё Иџџџџџџџџ  Eџџб  јџџџџџџџџэ,ЬЫўџ• -џџџџџџџџџџD! [єџџџџџД"  >џџџџџџџџџџJIњџџџџџџя>0-(3џџџџџџџџџџIъџџџџџџџџŠ.22-ќџџџџџџџџўD10œџџџџџџџџџС,22#Ьџџџџџџџџх035ёџџџџџџџџџр02,fџџџџџџџџ™23fџџџџџџџџџџу00Ыџџџџџџэ>33џџџџџџџџџџв.12&Ъџџџџѓ_21.џџџџџџџџџџЅ232"M™РC,'џџџџџџџџџџg32- eџџџџџџџџџр21)ћџџџџџџџўi+ •џџџџџџџ— šќџџџўŒ5ЈЪЁ;s8mk%./rgD=7*)P2FlhWU&.Л‘sЋыџњЦPB6љ EОџњcKшlќц7B§§ёmaўšHџџџ§1 Й№‹џџџџ cжёб œџџџџЄ T§џџћJ. wџџџџ–2уџџџџn*-ђџџњOVџџџџџ},9Йзp*Zџџџџџ\1 ўџџџб+ўџт,7[t8mk@$1:AB:4+ :nžЧтѕљњ§џџџџџ§ьЩn6.uЕшџџчЕŒeM9,+7H\u•Глѓџџ№Лq('BUfРњџџц„*2d–зџџЬsA€ЗтѕџџџџџџџџќрЦwH"aЌёїЌB‚иџџџџџџџџоsL_{žЫђџџџјУƒB UЕђЫW €юџџјЏЂэџџчu9lЂзџџџф”F !ŒхбT)ЫџџФkSоџ§–%`Јыџџх‰-zтР7(хџйQџџбDLюџџЛ]„ц˜ЪџАЄџџ“ _Оџџф'ЗчV|џБ­џѓ^0‘ёџіŒ$gыŸ їзЃџч;yхџќŽ!Яж*žџ3Žџк)lпџі†ќS$џkџк" mщџыr zџy›єBџъ&…јџаLbџ“ќƒцћ8 .FT`elqspqk`SD<. %ŸџџІ WџЃt§Вџb+jЉнњџџџџџџџџџџџџџџљъмСІ{Q.DЯџђmcџЁкЎfџЃ,zЧїџџџџџџџџџџџџџџџџџџџџџџџџџљтЕE|§џЎ‚џŒ:џ@ѓфhНјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџшЎe$6ХџхQЋџq•яІџT3’щџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџђЏYƒџџ‘ мџGфœ.џНIГќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџо„?цџФ$?џу2џWЌљ+SТџџџџџівщџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџёИџщHŠџšwї\§кˆвџџџџџџЬ74Y‚ЎвіџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџюlŠџџbзџ;Зд’џіџџџџџџџ­ %S†МцџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџУ*fџџvMџФ фРгџџџџџџџџ­ByЗчџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљl[ёџ‰БџO&їщњџџџџџџџСG‚С№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЇmъџ)ќЫ=џџџџџџџџџцX—гџџџџџџџџџџџџџџџџџџџџџџџџџџџџЭъџŽœџFqџџџџџџџџўN6ЭџџџџџџџџџџџџџџџџџџџџџџџџџџщЙѓџ} љЛхџџџџџџџџП<Žлџџџџџџџџџџџџџџџџџџџџџџџџінћџdœџ*zџџџџџџџџџc [МўџџџџџџџџџџџџџџџџџџџџџџќєџўI(џŽЯџџџџџџџџѕ$8žєџџџџџџџџџџџџџџџџџџџџџўћџы&Ея &їџџџџџџџџе*•ѕџџџџџџџџџџџџџџџџџџџџўўџЫ CџSBџџџџџџџџџВ-Ѕџџџџџџџџџџџџџџџџџџџџџџџ–оДMџџџџџџџџџ‘CЧџџџџџџџџџџџџџџџџџџџџџџM}њXџџџџџџџџџtlыџџџџџџџџџџџџџџџџџџџџу#џ[]џџџџџџџџџf'ЖџџџџџџџџџџџџџџџџџџџџšШЖaџџџџџџџџџXpѕџџџџџџџџџџџџџџџџџџў>pѕbџџџџџџџџџL9еџџџџџџџџџџџџџџџџџџЦ$ўO`џџџџџџџџџEАџџџџџџџџџџџџџџџџџџXгœ]џџџџџџџџџBџџџџџџџџџџџџџџџџџвˆлYџџџџџџџџџAtџџџџџџџџџџџџџџџџџWAў,SџџџџџџџџџE^њџџџџџџџџџџџџџџџЩ яiJџџџџџџџџџ?4{­ЪжжЯЖ‰CSїџџџџџџџџџџџџџџџJТЏCџџџџџџџџ§А§џџџџџџџџџжžg$QјџџџџџџџџџџџџџџФ}ф?џџџџџџџџўџџџџџџџџџџџџџџџѕЉ9Z§џџџџџџџџџџџџџџ::џ+5ўџџџџџџџџџџџџџџџџџџџџџџџџџџ˜gџџџџџџџџџџџџџџЗћb*јџџџџџџџџџџџџџџџџџџџџџџџџџџџз3tџџџџџџџџџџџџџ§=ЮŸ яџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№M‡џџџџџџџџџџџџџ”ЅгчџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјJ˜џџџџџџџџџџџџоЃёрџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя.Иџџџџџџџџџџџ§аћ3Ьџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџдпџџџџџџџџџџџџџ~Џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ›Nџџџџџџџџџџџџџ§SˆџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџHЕџџџџџџџџџџџџџй }џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџгCџџџџџџџџџџџџџџ: иџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџb  ЭџџџџџџџџџџџџџNXџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџб  |џџџџџџџџџџџџў3 ИџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџK  5љџџџџџџџџџџџС %їџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ­   аџџџџџџџџџџу1   kџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџђ  ™џџџџџџџџџџQ  Ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџd   ;DFF>_ўџџџџџџџџџ=  уџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЈ  ,uМюџџџџџыв§џџџџџџџџџK  2ќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџм KЏїџџџџџџџџџџџџџџџџџџџџZ  bџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќ= !! ! 7­џџџџџџџџџџџџџџџџџџџџџџџw  Šџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџm%(('$!kыџџџџџџџџџџџџџџџџџџџџџџџџ—  Љџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ˜+,*(%!  ™џџџџџџџџџџџџџџџџџџџџџџџџџџЋ!   УџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЗ!-,)$  ГџџџџџџџџџџџџџџџџџџџџџџџџџџџУ%(('%$"     кџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЫ(*(" Рџџџџџџџџџџџџџџџџџџџџџџџџџџџџж*-.-,*)'&$"    сџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџе*#   НџџџџџџџџџџџџџџџџџџџџџџџџџџџџџєP&2100/-,*('%$! цџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџл( ЏџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЧ(0321110/.-+*(&" щџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџо#Šџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџz!333222110/.-+)&    цџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџп Tџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџс2-2333221110/.-,'!  сџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџн ъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџu0122333221110/-(!   йџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџй АџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЧ +/1223333322210-(  Тџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџг YџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќB*-0123333332210,%  ЇџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬ$'**))('&$! сџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџx"(,/12333333321/)   †џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЛ#.000//..,*)ŒџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџА&+/12233333320,% `џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŸ"1222211100(8ьџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџу&+.1233333321.' 1ќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ}"3333332322Žџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћ. %*/123333322/)!  рџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§Z&333333333.4рџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџL %,0123333320,%Јџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџх9-333333333"sџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџk &-013333321-(!eџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЛ%1333333331%Оџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџƒ  )/12333320/+% !ѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ„ 233333333*Iѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ&-123333210-'  ЕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїL)333333333"џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ•$,013333210-(  UџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџУ&0333333331'Нџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ˜$+02332210.*$ жџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџu"333333333-:чџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ–'-013321/,(# `џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџп3-333333333&`џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ’ $*/123210,&  бџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ„!3333333332"Žџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ…'&%&'+.113320-' Kџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџр3,3333333331&Еџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџw /---./022321/)!Ѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџx!333333333300бџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџb%222111233310-%мџџџџџџџџџџџџџџџџџџџџџџџџџџџџџМ%03333333333-=чџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџіJ*333333333320+# 7ѓџџџџџџџџџџџџџџџџџџџџџџџџџџџц>)33333333333*Kіџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџн4/33333333333/*! Kќџџџџџџџџџџџџџџџџџџџџџџџџџњ]"333333333222%[ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџИ'133333333333/+" Qѕџџџџџџџџџџџџџџџџџџџџџџџџz 2333333322110!aџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŒ"3333333333320*! 8зџџџџџџџџџџџџџџџџџџџџџќy!133333222110.,bџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџў[&333333333321/)  œ§џџџџџџџџџџџџџџџџџџъf1332222100.-+'#]џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџц8.333333333311-&9ЉѓџџџџџџџџџџџџџџџЗB#33211000/-+)&"RџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЎ#333333333322/*! &mЄмџџџџџџџџџћТb$(210//.--+)&#Cџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџp$33333333321/+$N‘ТршчмЛN$-.--,+*)&$" 5ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџщ9.3333333221/,&  %' %'&&&%#"   ёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЅ"3333333211/,&   иџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§X'333332210/+%   ЖџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџФ'133332110-)" „џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџe%3332211.,'! HџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџТ'132220/,)$ цџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћV&3210/-*%   џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ!210/-*&! Cџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџк1+0.,)%! ЦџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћZ .+'$ MџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŒ)&! ГџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџИ  #ьџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџв# Nџџџџџџџџџџџџџџџџџџџџџџџџџџџџџж' hџџџџџџџџџџџџџџџџџџџџџџџџџџџж$ ]іџџџџџџџџџџџџџџџџџџџџџџџџР3ТџџџџџџџџџџџџџџџџџџџџџџЅ dвџџџџџџџџџџџџџџџџџџёn|їџџџџџџџџџџџџџџџЇ&1­§џџџџџџџџџџѓЉ?6‰ШыџџџѕоБq$175& knowthelist-2.3.1/dist/headset.ico000077500000000000000000003073661342115213400171620ustar00rootroot00000000000000€€ (f@@ (BŽ00 Ј%ЖJ  Ј^p ˆ  hŽŠ(€ 175& 6‰ШыџџџѕоБq$1­§џџџџџџџџџџѓЉ?RRU|їџџџџџџџџџџџџџџџЇ&ДДЙ99:dвџџџџџџџџџџџџџџџџџџёn@BC399:ТџџџџџџџџџџџџџџџџџџџџџџЅ 766]9::іџџџџџџџџџџџџџџџџџџџџџџџџР::;h:::џ))*џџџџџџџџџџџџџџџџџџџџџџџџџџж$ ;;>>џџџ џ џ џ џ џ џ џ џ џ џ џ џџ€ˆџјџџчѓџжѕџ :NџџџџџџџџџџџџџћZ .+'$ >>?C==>џ==>џ899џ џџ џ џ џ џ џ џ џ џ џ џ џ џ ?Bџьњџцѓџсњџ‚Їџџџџџџџџџџџџџџџк1+0.,)%! BBB ==>џAABџ.//џ џ џџџџџџ џ џ џ џ џ џ џЎКџюџџряџШёџ8Iџџџџџџџџџџџџџџџџ!210/-*&! QQPAAAц??@џCCDџ&&'џ џџџџџџџ џ џ џ џ џ џ<@џцїџс№џйѓџЁЫџ џџџџџџџџџ џ€€€џЁЁЁџЁЁЁџmmmџџџћV&3210/-*%  IIIHAAAџAAAџCCCџ"""џџџџџџџџџџџџџ џŒџэџџнэџгіџ{šџџџџџџџџџJJKџ†††џ›››џІІІџ™™™џžžžџ———џ$$$џџТ'132220/,)$ GGH„BBCџCCDџBBCџ!!!џџџџџџџџџџџџ џ џГУџфјџйьџЮіџ [pџџџџџџџ###џssuџwxxџuuuџдддџљљљџыыыџГГГџ‰‰‰џџџџe%3332211.,'!   GGHЖDDDџEEEџAAAџ###џ!!!џ###џ###џ"""џџџџџџџџџ&'џафџнёџжьџЪђџ DSџџџџџџџCCCџ~~џeeeџŒŒŒџюююџюююџяяяџѕѕѕџСССџƒƒƒџxxxџ џФ'133332110-)"   lmlHHHиEEEџGHHџ@@Aџ%%%џ%%%џ'''џ'''џ%%%џ џџџџџџџџ@DџнѓџйюџдьџФэџ7BџџџџџџџVWWџ„„…џffgџ———џьььџюююџьььџюююџєєєџДДДџ}}}џJIIџ§ X'333332210/+%  %' %'&&&%#"  MMN JJIёHHGџJJJџBBAџ)))џ+++џ+++џ+++џ(((џ"""џџџџџџџџSZџрјџжьџвьџФыџ4>џџџџџџџddeџŒŒџmmnџџцццџяяяџьььџьььџяяяџэээџ•••џmllџџ Ѕ"3333333211/,& N‘ТршчмЛN$-.--,+*)&$" HHI5JJKўIIIџKKKџCCCџ---џ000џ///џ...џ+++џ%%%џџџџџџџџZdџпљџгыџаыџЪяџ:Eџџџџџџџlllџ••–џwwwџ„„„џйййџёёёџьььџьььџьььџєєєџЭЭЭџvvvџ:87џщ9.3333333221/,& &mЄмџџџџџџџџџћТb$(210//.--+)&#KKKCLLLџKKKџLLLџEEEџ222џ333џ333џ222џ...џ'''џџџџџџџџ[dџнјџбъџЯщџвіџ KWџџџџџџџjjjџžžŸџ‡‡‡џ|||џУУУџяяяџьььџьььџьььџяяяџэээџ‘’’џROMџџ9@p$33333333321/+$9ЉѓџџџџџџџџџџџџџџџЗB#33211000/-+)&"IIIRMNNџLMMџMNNџHHHџ666џ777џ777џ555џ111џ***џ џџџџџџџU^џкіџЯъџЭщџиљџ dtџџџџџџџ[[[џІЈЈџš››џ{{{џ­­­џуууџ№№№џьььџьььџьььџєєєџИИИџd``џ#$џBKЎ#333333333322/*! œ§џџџџџџџџџџџџџџџџџџъf1332222100.-+'#DEE]OOPџNNOџOOPџKKKџ;;;џ;;;џ;;;џ999џ444џ,,,џ"""џџџџџџ џEMџг№џЭъџЬшџијџ†šџџџџџџџ>>>џЎЏАџЇЈЈџŠ‹‹џ———џаааџяяяџьььџьььџьььџђђђџиииџxwwџ%%%џITц!8.333333333311-&8зџџџџџџџџџџџџџџџџџџџџџќy!133333222110.,>>?bQQRџPPQџQQRџNNNџ@@@џ@@@џ???џ<<<џ777џ///џ$$$џџџџџџџ27џШцџЭыџЪчџеђџЎЧџџџџџџџџЃЄЄџБВВџЈЉЉџŠ‹‹џОООџнннџ№№№џьььџьььџяяяџъъъџŠŠŠџ-$"џP]ў R][&333333333321/)  Qѕџџџџџџџџџџџџџџџџџџџџџџџџz 2333333322110!999aTTSџRRSџRRSџQQRџEEEџCCCџBBBџ???џ:::џ222џ'''џџџџџџџ !џДбџЮюџЧчџЮыџбьџ)/џџџџџџџhiiџФХХџЗИИџžŸŸџЅЅЅџгггџфффџяяяџьььџюююџяяяџ”••џ-" џNZџhwŒ"3333333333320*! Kќџџџџџџџџџџџџџџџџџџџџџџџџџњ]"333333333222%333[VVVўTTTџTTTџTTTџIIIџFFFџFFFџCCCџ===џ555џ+++џ џџџџџџџ•ЌџбєџФцџШцџт§џ bmџџџџџџџџ­ЎЎџХЧЧџНООџœџЧЧЧџпппџуууџюююџюююџяяяџ™™™џ#џKWџn~И'133333333333/+" 7ѓџџџџџџџџџџџџџџџџџџџџџџџџџџџц>)33333333333*&&'KWWWіVVVџVVVџVVVџMMMџIIIџJJJџFFFџBBBџ:::џ///џ###џџџџџџ џk{џвіџТхџТхџнїџЈКџџџџџџџџ444џЪЪЫџЬЭЭџРРСџЈЈЈџкккџчччџсссџьььџљљљџ‰‰‰џ џWeџxŒн4/33333333333/*! мџџџџџџџџџџџџџџ џ џџџџџ џџџџџџџџџМ%03333333333-=YYYчXXXџXXXџYYYџSSSџMMMџMMMџJJJџEEEџ>>>џ222џ'''џџџџџџџ>EџХщџУчџПфџЬъџсіџ7=џџџџџџџџAABџЬЭЭџиййџЫЬЬџЖЗЗџмммџїїїџџџџџпппџ?>>џџ p‚џ‚˜іJ*333333333320+# Ѓџџџџџџџџџџџџџ џџџџ%%%џ+++џ///џ000џ,,,џ"""џџџџџџџџџx!333333333300XXXбZ[[џYZZџZ[[џVWWџQQQџQQQџNNNџIIIџBBBџ777џ+++џ!!!џџџџџџџЁОџЪяџПфџПфџх§џ™Їџџџџџџџџџ111џАББџНООџЎЏЎџПРРџГГГџ„„„џ111џџџ‡žџ€—џ b%222111233310-%Kџџџџџџџџџџџџџ џџџџ'''џ///џ888џ@@@џEEEџHHHџFFFџ===џ(((џџџџџџџр3,3333333331&TUUЕ]]^џ[[\џ[\\џZZZџTTTџTTTџRRRџNNNџFFFџ<<<џ///џ$$$џ џџџџ џ џfxџЬєџОуџЛуџЫъџцјџ;@џџџџџџџџџџrrrџ~~~џCCCџџџџџџЉШџs‰џw /---./022321/)!бџџџџџџџџ џ џ џ џ џџџџ###џ,,,џ444џ===џIIIџVVVџ```џdddџ^^^џPPPџ999џџџџџџџ„!3333333332"OOOŽ__`џ]]]џ]]]џ]]]џXXXџWWWџVVVџRRRџKKKџAAAџ444џ)))џ"""џ џ!!!џ!!!џ!!!џ џ -0џГйџСщџЛуџКтџуњџИХџџџџџџџџџџtttџ‡‡‡џџџџџџ џЩяџ`rџ…'&%&'+.113320-'  ` џ џ џ џ џ џ џ џ џ џ џ џ џџџџџ###џ***џ999џJJJџKKKџ888џ***џ222џQQQџkkkџdddџEEEџџџџџџп3-333333333&<<=`aaaџ___џ___џ___џ]]\џZZZџYYYџVVVџPPPџGGGџ:::џ...џ&&&џ"""џ"""џ"""џ"""џ"""џ#џt‰џШєџЙтџЗсџПфџёџџ x€џџџџџџџџџgggџџ,,,џџџџџ [iџеџџIVџ’ $*/123210,&    ж џ џ џ џ џ џ џ џ џ џ џ џ џџџџџ!!!џ444џ===џ///џџџ џџџџPPPџkkkџLLLџ џ џ џџџu"333333333-:```чbbbџaaaџaaaџ```џ]]]џ]]]џZZZџTTTџLLLџ@@@џ333џ)))џ%%%џ###џ###џ###џ###џ#џ",.џ­дџОъџЗтџДрџЫыџэћџNRџџџџџџџџZZZџšššџ<<<џџџџ џЈШџТ№џ18џ–'-013321/,(#  U џ џ џ џ џ џ џ џ џ џ џ џ џ џџџџџ(((џ111џџџџџџџџџџ444џjjjџIIIџџ џ џ џУ&0333333331'\\\Нeffџcccџcccџbccџaaaџ```џ^^^џYYYџRRRџGGGџ:::џ///џ'''џ$$$џ$$$џ$$$џ$$$џ$%%џ%џ[jџТёџЗтџЖсџВпџв№џшєџGJџџџџџ+++џ???џcccџŸŸŸџGGGџџџџ eqџа§џЁХџџ˜$+02332210.*$  Е џ џ џ џ џџџџџџџџџџџџ џџ(()џџџџџџџ џџџџџ///џeeeџ<<<џџ џ џ їL)333333333"MMMgghџeeeџeeeџeeeџdddџcccџbbbџ^^^џWWWџNNNџAAAџ555џ,,,џ(((џ%%%џ&&&џ&&&џ&&&џ&$#џ&џ‹ЉџСђџДрџДсџАпџвёџъѕџ_bџџџBCDџppqџjjlџjjjџ††‡џ``aџџџ?DџПцџФїџwџ џ•$,013333210-(  !ѕџџџџџџџџџџџџџџџ џџ$$%џ џџџџџџџџ!!!џџџџџ;;;џ\\\џ)))џ џ џ џ„ 233333333*(''Ighhѕghhџfggџfggџfggџfffџfffџbbbџ]]]џTTTџHHHџ;;;џ000џ+++џ'''џ'''џ'''џ'''џ''(џ( џ&.0џЅЮџМьџВпџВрџЎоџХыџюџџ•џ#78џnhjџffgџiijџkklџhhiџppqџmccџ-SWџИоџКыџЙщџ>Hџџ&-123333210-'  eџџџџџџџџџџџџџџџџ џџ%%%џ!! џ!!!џ!!!џ!!!џ!!!џ!!!џ!!!џ!!!џ###џџџџџџQQQџGGGџџ џ џ Л%1333333331%aaaОkklџhiiџhiiџhiiџiiiџiiiџgggџcccџ[[[џPPPџCCCџ777џ///џ***џ(((џ(((џ(((џ(((џ(()џ)џ%@HџЏнџЙъџБпџБрџ­оџЖуџтџџM”™џk]]џkklџyyzџxxyџxxyџxwyџ}yyџ‚ƒџ.ЇЭџРєџŒ­џџџƒ  )/12333320/+% Јџџџџџџџџџџџџџџџџџ%%%џ$$$џ$$$џ##$џ##$џ##$џ##$џ##$џ##$џ##$џ$$$џ%%&џџџ џџ$$$џXXXџ***џџ џ х9-333333333"KKKsmmnџjkkџjkkџjkkџkkkџkkkџjjjџgggџaaaџXXXџKKKџ>>>џ444џ...џ***џ)))џ)))џ)))џ)))џ)**џ*џ&FPџЎнџЙыџАоџАпџАсџЌнџ\rzџibaџ~~џˆˆ‰џ…††џ…††џ…††џ…†‡џ}џc—ЇџЖшџ9Bџџџk &-013333321-(! рџџџџџџџџџџџџџџџџџ)))џ&&%џ&&&џ&&&џ&&&џ&&&џ&&&џ&&&џ&&&џ&&&џ&&&џ(('џџ џ џ џ џHHHџ@@@џџџ§Z&333333333.4jkkрmnnџlllџlllџlllџmnnџnnnџlllџgggџ```џTTTџGGGџ;;;џ333џ...џ+++џ***џ***џ***џ*++џ*++џ+џ'BJџЂЮџЛ№џАсџБуџ Љдџbknџmiiџ‘’“џ–——џ••–џ••–џ••–џ••–џ›•”џ„ Јџ!^qџ џџџL %,0123333320,%1ќџџџ џ!!!џ###џ$$$џ###џџџџџџџџџ!!"џ***џ(((џ(((џ(((џ(((џ(((џ(((џ(((џ(((џ(((џ(((џ)))џ&&&џџ џ џџ***џMMMџџџџ }"3333332322[[[Žpqqџmnnџmnnџmnnџoooџqqqџoooџlllџfffџ]]]џQQQџCCCџ888џ222џ...џ,,,џ+++џ+++џ+++џ+,,џ+,,џ-!џ*24џƒЄџЗыџКяџ"Јдџdjmџollџ  ЁџІІЇџЄЄЅџЄЄЅџЄЄЅџЄЄЅџЊЊЋџ“”•џ&! џџ џћ. %*/123333322/)! `џџџ џ&&&џ&&&џ'''џ'''џ&&&џ!!!џџџџџџџџ(((џ,,,џ**+џ**+џ**+џ**+џ**+џ**+џ**+џ**+џ**+џ**+џ+++џ,,,џџ џџ џџIIIџ+++џџџ Ÿ"1222211100(8oooьpppџoopџoopџoopџrrrџrrrџqqqџmmmџfffџ[[[џNNNџBBBџ888џ222џ...џ,,,џ,,,џ,,,џ,,,џ,--џ,--џ-&$џ.# џ'Tcџ•Оџ!ЊиџfnqџjgfџЃЄЄџИЙЙџГДДџГДДџГДДџГГДџНППџџ!џ"##џ!!!џ у&+.1233333321.' †џџџ'''џ+++џ,,,џ---џ,,,џ)))џ###џџџџџџџџ---џ...џ---џ---џ---џ---џ---џ---џ---џ---џ---џ---џ---џ//0џџџџџџ===џ555џџџЛ#.000//..,*)eeeŒtttџqqqџqqrџqqrџrrrџuuuџuuuџrrrџmmmџdddџXXXџKKKџ@@@џ777џ222џ///џ---џ---џ---џ---џ---џ-..џ.,,џ/#џ+))џ0OZџinpџgggџˆˆ‰џЪЫЫџУФФџРССџРССџФХХџЬЭЭџvvwџ!""џ###џ###џ!!!А&+/12233333320,% Їџџџ---џ000џ000џ111џ///џ,,,џ$$$џџџџџџџџ111џ000џ000џ000џ000џ000џ000џ000џ000џ000џ000џ000џ000џ222џ$$$џџџџџ000џ:::џџџЬ$'**))('&$!222 uuuсsttџsssџrssџsssџvvvџxxxџvvvџsssџmmmџcccџVVVџJJJџ???џ888џ333џ000џ...џ...џ///џ///џ///џ///џ///џ,)(џ7/,џlkkџnopџhhiџšš›џЯааџежжџвггџЬЭЭџ––—џaabџ***џ$$$џ%%%џ x"(,/12333333321/)   Тџџџ444џ555џ555џ555џ333џ///џ$$$џџџџџџџџ556џ334џ334џ334џ334џ334џ334џ334џ334џ334џ334џ334џ334џ556џ)))џџџџџ'''џ;;;џџџг qqrYwwwџtttџtttџtttџuuuџzzzџzzzџxxxџtttџmmmџcccџVVVџJJJџ@@@џ999џ444џ111џ000џ000џ000џ000џ000џ000џ---џ778џmmnџppqџnnoџihjџ€џ•••џДЕЕџrrrџgghџkklџ...џ%%%џ&&&ќB*-0123333332210,%   йџџџ999џ999џ999џ999џ666џ111џ&&&џџџџџџџџ999џ666џ666џ666џ666џ666џ666џ666џ666џ666џ666џ666џ666џ888џ---џџџџџ###џ999џџџй zzzАvvvџvwwџvvvџuvvџxyyџ}}}џ}}}џyyyџuuuџnnnџcccџWWWџKKKџBBBџ:::џ555џ333џ222џ111џ111џ111џ111џ...џ889џnnpџqqrџqprџppqџjjkџ``_џЂЂЂџbbbџiijџoopџ///џ'''џ%%%Ч +/1223333322210-(  сџџ"""џ>>>џ>>>џ>>>џ===џ:::џ555џ(((џџџџџџџ џ<<<џ899џ899џ899џ899џ899џ899џ899џ899џ899џ899џ899џ899џ:;;џ/00џџџџџ!!!џ777џџџн aaa|||ъwwwџwxxџwxxџwwwџ{{{џ€€€џ~~~џ{{{џvvvџoooџeeeџYYYџNNNџDDDџ===џ777џ555џ222џ222џ222џ222џ///џ;;;џpqrџsstџrrsџrrsџrrsџffgџЄЃЃџlllџhiiџppqџ111џ)))џu0122333221110/-(!  цџџ%%%џCCCџBBBџBBBџAAAџ>>>џ777џ***џџџџџџџ!""џ@AAџ<<<џ<<<џ<<<џ<<<џ<<<џ<<<џ<<<џ<<<џ<<<џ<<<џ<<<џ<<<џ>>>џ344џџџџџ###џ444џџџп „„„Tyzzџyxyџyyyџyyyџyyyџ~~~џџ€€€џ}}}џxxxџqqqџgggџ\\\џQQQџHHHџ@@@џ;;;џ777џ555џ333џ222џ///џ>>>џsttџtuuџsttџsttџtuuџcddџ———џvvwџddeџqrrџ222џ'''с2-2333221110/.-,'!  щџџ&&&џIIIџGGGџFFFџEEEџAAAџ:::џ---џџџџџџџ"""џCBBџ?>>џ?>>џ?>>џ?>>џ?>>џ?>>џ?>>џ?>>џ?>>џ?>>џ?>>џ?>>џA@@џ555џџџџџ###џ000џџџо#€Šzz{џzz{џz{{џz{{џ{{{џџƒƒƒџ‚‚‚џ€€€џ{{{џsssџkkkџaaaџWWWџNNNџGGGџAAAџ===џ999џ777џ333џDDEџvvwџvvwџuuvџuuvџvvwџddeџœœœџ€€џccdџrrsџ333џz!333222110/.-+)&    цџџ'''џLLLџLLLџKKKџHHHџDDDџ===џ000џџџџџџџ"""џDDEџAAAџAAAџAAAџAAAџAAAџAAAџAAAџAAAџAAAџAAAџAAAџAAAџCCCџ666џџџџџ$$$џ+++џџџл( ‚ƒƒЏ|||џ{{{џ{{{џ{{{џ|||џƒƒƒџ………џ„„„џџ}}}џwwwџpppџhhhџ```џXXXџQQQџLLLџHHHџDDDџ???џQQQџyyzџwwxџwwxџwwxџyyzџghhџ———џ………џcccџnooџ111Ч(0321110/.-+*(&" сџџ&&&џOOOџPPPџNNNџLLLџHHHџAAAџ333џ!!!џџџџџџ!!!џGGGџDDDџDDDџDDDџDDDџDDDџDDDџDDDџDDDџDDDџDDDџDDDџDDDџGGGџ667џџ!!!џ!!!џ!!!џ%%%џ'''џџџе*#  •—— Н~~~џ|}}џ|}}џ|}}џ}~~џƒ„„џ‡‡‡џ………џƒƒƒџ€€€џ|||џuuuџoooџhhhџbbbџ]]]џYYYџUUUџPPPџ^^_џz{{џxxyџxxyџxxyџzz{џllmџˆˆˆџ“““џaaaџooqєP&2100/-,*('%$!  к џџ%%%џQQQџUUUџSSSџPPPџLLLџDDDџ777џ$$$џџџџџџџHHHџHHHџGGGџGGGџGGGџGGGџGGGџGGGџGGGџGGGџGGGџGGGџGGGџJJJџ555џ!!!џ$$$џ$$$џ$$$џ&&&џ###џџџЫ(*(" xwwР€€€џ~~~џ~~џ~~~џ~~~џ………џˆˆˆџ‡‡‡џ………џ‚‚‚џџzzzџuuuџpppџkkkџgggџdddџ___џiiiџ||}џzz{џzz{џzz{џ{||џlmnџ‹‹‹џšššџ```џvvvж*-.-,*)'&$"    !!!У!!!џ џ###џQQQџ[[[џWWWџTTTџPPPџIIIџ;;;џ'''џ џџџџџџEEEџLLMџJJJџJJJџJJJџJJJџJJJџJJJџJJJџJJJџJJJџJJJџJJJџLLLџ111џ$$$џ&&&џ&&&џ'''џ%%%џ"""џ џџЗ!-,)$  GHH{||Г‚‚ƒџ€€џ€€џ€џ~џƒƒƒџ‰‰‰џˆˆˆџ‡‡‡џ„„„џ‚‚‚џ~~~џzzzџvvvџrrrџnnnџiiiџrqrџ}}~џ{||џ{||џ{||џ|}}џrrsџ‚‚‚џЁЁЁџcccџppqУ%(('%$"    ###Љ###џ"""џ!!!џNNNџ```џ\\\џYYYџTTTџMMMџAAAџ,,,џ!!!џџџџџџ===џPPPџLMMџLMMџLMMџLMMџLMMџLMMџLMMџLMMџLMMџLMMџMMMџKKKџ+++џ'''џ(((џ(((џ)))џ%%%џ"""џ!!!џџ˜+,*(%!  z{{™„„„џ‚‚џ€џ€џџ‚‚‚џ‡‡‡џŠŠŠџ‰‰‰џ†††џƒƒƒџџ~~~џzzzџvvvџqqqџxxxџ~€џ}}~џ}}~џ}}~џ~~џxxyџxxxџЇЇІџgggџiijЋ!   $$$Š$$$џ$$$џ џHHHџeeeџ```џ]]]џYYYџRRRџFFFџ222џ###џ џџџџџ///џTUUџOOOџOOOџOOOџOOOџOOOџOOOџOOOџOOOџOOOџOOOџRRRџEEEџ)))џ***џ***џ***џ***џ%%%џ"""џ"""џџm%(('$!ijjk‚‚‚ы„……џ‚‚џ‚‚џ‚‚џџ„……џˆˆˆџˆˆˆџ‡‡‡џ………џƒƒƒџџ{{{џwwwџ|||џ€€‚џ€џ€џ€џ‚џ{{{џ{{{џЌЌ­џhhhџiii—  %%%b%%%џ%%%џ!!!џ>>>џiiiџdddџbbbџ]]]џVVVџKKKџ999џ'''џ"""џџџџџџRRRџSSSџRRRџRRRџRRRџRRRџRRRџRRRџRRRџRRRџQQQџTTTџ;;;џ***џ---џ,,,џ---џ***џ$$$џ###џ"""џќ= !! ! FEG7}}}­„……џ………џ‚ƒƒџ‚ƒƒџ‚‚‚џ‚ƒƒџ„……џ…††џ………џ„„„џ‚‚‚џ~~~џyyyџ€џ‚‚ƒџ‚џ‚џ‚џ‚‚ƒџ€џuuuџЋЋЊџnnnџeefw  '''2'''ќ'''џ###џ444џjjjџiiiџfffџbbbџ\\\џQQQџAAAџ,,,џ%%%џ"""џџџџџAAAџYZZџSTTџTTTџTTTџTTTџTTTџTTTџTTTџTTTџUVVџQQQџ000џ---џ...џ...џ///џ'''џ$$$џ$$$џ"""џм  hhhK~Џ†††ї†††џ………џƒƒƒџƒƒƒџƒ„„џ„„„џ„„„џƒƒƒџџ€€€џƒƒ„џƒƒ„џ„ƒ…џ„ƒ…џ„ƒ…џƒƒ„џ„„…џsssџЋЋЋџtttџZZ[Z  ((((((у(((џ'''џ***џdddџpppџkkkџgggџaaaџXXXџIIIџ333џ&&&џ###џ џџџџ$$$џYYYџXXXџVVVџVWWџVWWџVWWџVWWџVWWџVVVџZZZџBBBџ---џ111џ000џ111џ---џ$$$џ%%%џ$$$џ###џ Ј  ]^^,~u…††М‰‰‰ю†††џ„……џ„„„џ„……џ†††џ‰ŠŠы‡ˆˆв……†§…††џ…††џ…††џ…††џ…††џ††‡џtttџАААџvvvџKKKK  )))Ў)))џ)))џ$$$џVVVџvvvџoooџlllџgggџ^^^џQQQџ===џ***џ&&&џ###џџџџџ???џ___џXYYџXXXџXXXџXXXџXXXџXXXџ\\\џPPPџ111џ222џ222џ222џ333џ'''џ$$$џ%%%џ$$$џ###џ!!!d  kkk \\\;TTTDSSSFTTTFZZZ>cddz{{_‡ˆˆў‡‡ˆџ‡‡ˆџ‡‡ˆџ‡‡ˆџ‡‡ˆџŠ‹‹џtuuџІІІџyyyџ...=  ***k***џ***џ%%%џBBBџyyyџtttџrrrџnnnџeeeџYYYџHHHџ222џ(((џ%%%џ!!!џџџџџNNNџ`aaџ[\\џYZZџYZZџZ[[џ]^^џWWWџ788џ111џ444џ444џ666џ,,,џ###џ%%%џ%%%џ$$$џ###ђ###  ‚ƒ„™ŠŠ‹џˆˆ‰џˆˆ‰џˆˆ‰џ‰‰ŠџŠŠ‹џ~џlllџtttџmmmџKKLQ  +++%+++ї+++џ***џ)))џoooџ|||џwwwџsssџlllџaaaџRRRџ>>>џ,,,џ'''џ$$$џ!!!џџџџџLLLџ^^^џ_``џ_``џ^__џSTTџ:::џ333џ555џ666џ888џ000џ###џ$$$џ&&&џ&&&џ&&&џ%%%­    ††‡аŒŽџ‹‹Œџ‹‹Œџ‹‹ŒџŒŒџ~џnnoџoopџmmnџppqџrrsу[\\1   ---И---џ'''џџRRRџ………џ{{{џyyyџsssџjjjџ\\\џKKKџ666џ***џ(((џ$$$џ џџџџџ???џPPPџNOOџDDDџ555џ444џ777џ888џ999џ///џ!!!џ###џ&&&џ&&&џ&&&џ&&&џ&&&K  VWW5ŽљŽџŽџŽџŽџ‰‰Šџ||}џ}}~џ~~џ~~џ}}~џ~~џ||}С ...X...џ"""џџ---џ€€€џ‚‚‚џ~~~џzzzџrrrџgggџXXXџEEEџ111џ***џ(((џ$$$џ!!!џџџџџ+++џ444џ888џ:::џ;;;џ999џ444џ(((џџ"""џ&&&џ(((џ(((џ(((џ'''б'''  ~~|‘џŽŽџџџџŒџ‹‹ŒџŒŒџŒŒџŒŒџŒŒџ‹‹Œџ‹‹Œўkkl3 666 +++и!!!џ џџ___џџƒƒƒџџ{{{џrrrџeeeџTTTџ@@@џ///џ+++џ)))џ%%%џ"""џџџџџџ(((џ---џ,,,џ$$$џџџ$$$џ'''џ)))џ)))џ)))џ)))џ)))b  Э’’“џ‘’џ‘’џ‘’џ‘џ—˜˜џ››œџš››џš››џš››џš››џš››џ›œœџ“”•N+++}!!!џ"""џџ///џ‡‡‡џ‹‹‹џ‡‡‡џƒƒƒџ{{{џqqqџcccџQQQџ>>>џ///џ,,,џ***џ'''џ###џ!!!џџџџџџџџ!!!џ%%%џ(((џ***џ***џ+++џ+++џ+++г+++ƒƒƒC””•џ’““џ““”џ““”џ““”џ‘‘џЁЁЂџЋЌЌџЉЊЊџЉЊЊџЉЊЊџЉЊЊџЉЊЊџЉЊЊџ™šš:LLMˆ))*џ џ###џџUUUџ–––џŒŒŒџ‰‰‰џ„„„џ}}}џqqqџcccџRRRџ???џ111џ---џ+++џ)))џ%%%џ$$$џ"""џ!!!џ!!!џ"""џ###џ%%%џ(((џ***џ+++џ,,,џ---џ,,,џ---џ,,,H•––Е•––џ•––џ•––џ•––џ•––џ’““џŸ  џККЛџЗИИџЗЗИџЗИИџЗЗИџЗИИџЙККйyzz UUVЏCCCџ џ###џ"""џ"""џzzzџ˜˜˜џŽŽŽџŒŒŒџ‡‡‡џ~~~џtttџfffџWWWџGGGџ888џ000џ---џ+++џ***џ)))џ(((џ(((џ(((џ***џ+++џ---џ...џ///џ///џ///џ///џ///›”••N˜™™џ–——џ—˜˜џ—˜˜џ—˜˜џ—˜˜џ–——џ•––џКЛЛџЯааџЧШШџФХХџЪЫЫџШЩЩ§ЧШШSiiiSSTЬUUUџ444џ!!!џ&&&џџ555џџ———џ‘‘‘џџŠŠŠџ‚‚‚џxxxџlllџ```џSSSџGGGџ<<<џ666џ222џ000џ///џ///џ///џ000џ000џ111џ222џ222џ222џ111џ111д222œžšœ›п™š™џ™ššџ™ššџ™ššџ™ššџ™ššџ™ššџ˜™™џ“““џЄЅЅџШЩЩџЮЯЯџЗИИџЉЊЊ~__`UUVрVVWџRRRџ+++џ$$$џ'''џџKKKџџ˜˜˜џ”””џ’’’џџ†††џ~~~џuuuџlllџbbbџZZZџRRRџLLLџFFFџBBBџ@@@џ???џ===џ<<<џ:::џ666џ444џ333џ333я222.››œИš››џ››œџ››œџ››œџ››œџ››œџ››œџ››œџœџ„„„џ~џ‰‰‰§š›œаuuuћ9993^__XXYчWWWџ[[[џMMMџ&&&џ&&&џ'''џџ[[[џЃЃЃџ›››џ———џ•••џ‘‘‘џ‹‹‹џ„„„џ}}}џvvvџpppџjjjџeeeџaaaџ[[[џXXXџUUUџPPPџKKKџEEEџ>>>џ999џ666ј555Jž˜œœџœžџœžџœžџœžџœžџœžџœžџŸџ——˜џŽŽŽџ†††џ‡‡ˆо‡‡‡Ѓ}}|ё+++_`` [[[яZZZџZZZџ^^_џJJJџ&&%џ'''џ(((џ џbbbџЃЃЃџžžžџ™™™џ———џ”””џџ‰‰‰џƒƒƒџ~~~џyyyџtttџpppџkkkџfffџ```џZZZџSSSџLLLџEEEџ@@@№:::MŸŸ ‡žžŸџŸŸ џŸŸ џŸŸ џŸŸ џŸŸ џŸŸ џŸŸ џŸŸ џЁЁЂџ‘‘’џџ€€€џ“”””†††Ѕxxxгbbb*^^_ј]]^џ]]^џ]]^џbbbџKKLџ)))џ'''џ(((џ(((џ\\\џœœœџЅЅЅџ›››џ˜˜˜џ•••џ’’’џŒŒŒџ‡‡‡џƒƒƒџ}}}џxxxџsssџlllџeeeџ^^^џWWWџQQQџKKKзFFF3ЁЁЂtЁЁЂџЁЁЂџЁЁЂџЁЁЂџЁЁЂџЁЁЂџЁЁЂџЁЁЂџЁЁЂџ ЁЁџЄЄЅџŒŒŒџŽŽџ~§žŸ=ƒƒƒЮrrrŸcdc5`a`ў```џ```џ```џ```џeeeџSTTџ...џ%%%џ222џ000џGGGџ„„„џЅЅЅџЂЂЂџ›››џ–––џ’’’џџˆˆˆџ‚‚‚џ|||џvvvџpppџiiiџbbbџ[[[џTTT˜QQQЃЄЄgЂЃЃџЃЄЄџЃЄЄџЃЄЄџЃЄЄџЃЄЄџЃЄЄџЃЄЄџЃЄЄџЃЄЄџЃЄЄџЃЅЅџ‹‹‹џˆˆˆџ€€ЗŠŠŠћeeebeef?cccџcccџcccџcccџcccџcccџgggџ^^_џ<<<ў223џ888џ222џ333џXXXџ†††џžžžџЁЁЁџœœœџ–––џџ‰‰‰џ‚‚‚џzzzџsssџlllѕeeeЉ___9ЅІІZЄЅЅ§ЅІІџЅІІџЅІІџЅІІџЅІІџЅІІџЅІІџЅІІџЅІІџЅІІџІЈЈџœџџ‚‚‚џ…††:utt:€€€џGGG+hhiCffgџffgџffgџffgџffgџffgџffgџiijџjjk§OOO444А888§777џ111џ555џKKKџeeeџuuuџ|||џ{{{џzzzџzzzж{{{žwwwgooo$ЇЈЈQЇЈЈјЇЈЈџЇЈЈџЇЈЈџЇЈЈџЇЈЈџЇЈЈџЇЈЈџЇЈЈџЇЈЈџЇЈЈџІЇЇџЋЌЌџ’’“џ‹‹‹џyyyФ~~~}zzzфkllJijjџijjџijjџijjџijjџijjџijjџijjџjjjџ{{{?9994999{999­888Ъ333ж000ж111Я666Ж888‰777CЉЊЊSЉЊЊїЉЊЊџЉЊЊџЉЊЊџЉЊЊџЉЊЊџЉЊЊџЉЊЊџЉЊЊџЉЊЊџЉЊЊџЉЊЊџЉЊЊџЊЋЋџŒŒџ………џ___J‚‚‚ТsssЏoooSlmmџlmmџlmmџlmmџlmmџlmmџlmmџlmmџlmmџoppEGGGAAAЋЌЌ^ЊЋЋњЋЌЌџЋЌЌџЋЌЌџЋЌЌџЋЌЌџЋЌЌџЋЌЌџЋЌЌџЋЌЌџЋЌЌџЋЌЌџЋЌЌџЏААџœœœџŠŠŠџwwwЩTTT }}}яgggirrrYpppџpppџpppџpppџpppџpppџpppџpppџpppџsttA­­Ўt­ЎЎџ­ЎЎџ­ЎЎџ­ЎЎџ­ЎЎџ­ЎЎџ­ЎЎџ­ЎЎџ­ЎЎџ­ЎЎџ­ЎЎџ­ЎЎџ­ЎЎџ­ЎЎџБВВџŒŒŒџ†††џXYYWoooAxxxўFFF,uvv]rtsџrtsџrtsџrtsџrtsџrtsџrtsџrtsџrtsџvwwBЎЏЏЎЏЏџЎЏЏџЎЏЏџЎЏЏџЎЏЏџЎЏЏџЎЏЏџЎЏЏџЎЏЏџЎЏЏџЎЏЏџЎЏЏџЎЏЏџЎЏЏџГДДџžŸŸџ‡‡‡џxxxвuuuˆpppлxxx`vvvџvvvџvvvџvvvџvvvџvvvџvvvџvvvџvvvџyyzEЏАААББААББџАББџАББџАББџАББџАББџАББџАББџАББџАББџАББџАББџАББџАББџАББџДДДџ†††џ………џWWWXsssгfffœ{{|byyzџyyzџyyzџyyzџyyzџyyzџyyzџyyzџyyzџ}}~LВГГ9ВГГеВГГџВГГџВГГџВГГџВГГџВГГџВГГџВГГџВГГџВГГџВГГџВГГџВГГџВГГџБВВџККЛџ––—џ†††џrrrЦddd$nnnўWWWO~~a||}џ||}џ||}џ||}џ||}џ||}џ||}џ||}џ||}џ€€XДЕЕpГДДѕДЕЕџДЕЕџДЕЕџДЕЕџДЕЕџДЕЕџДЕЕџДЕЕџДЕЕџДЕЕџДЕЕџДЕЕџДЕЕџДЕЕџГДДџЗИИџ­­Ўџџ„„„ўBBB>jjjpgggѕ222‚‚]€€џ€€џ€€џ€€џ€€џ€€џ€€џ€€џ€€џ‚ƒƒfЖЗЗ'ЖЗЗЖЖЗЗџЖЗЗџЖЗЗџЖЗЗџЖЗЗџЖЗЗџЖЗЗџЖЗЗџЖЗЗџЖЗЗџЖЗЗџЖЗЗџЖЗЗџЖЗЗџЖЗЗџЖЗЗџЗИИџМННџ………џŒŒ‹џaaašiiiШ```Ж†††X‚ƒƒџ‚ƒƒџ‚ƒƒџ‚ƒƒџ‚ƒƒџ‚ƒƒџ‚ƒƒџ‚ƒƒџ‚ƒƒџ…††t—А˜ИЙЙlИЙЙыЗЙИџИЙЙџИЙЙџИЙЙџИЙЙџИЙЙџИЙЙџИЙЙџИЙЙџИЙЙџИЙЙџИЙЙџИЙЙџИЙЙџИЙЙџИЙЙџЗИИџРССџ•––џ‰‰‰џyyyуfff#eeeџWWW[‰‰ŠM†‡‡џ†‡‡џ†‡‡џ†‡‡џ†‡‡џ†‡‡џ†‡‡џ†‡‡џ†‡‡џ‰‰‰‘ККЛCККЛЧККЛџККЛџККЛџККЛџККЛџККЛџККЛџККЛџККЛџККЛџККЛџККЛџККЛџККЛџККЛџККЛџККЛџЙККџРРСџЈЉЈџ‚ƒƒџ‹‹‹џ999Mhhh}bbbњ;;;‹ŒŒB‰ŠŠџ‰‰Šџ‰‰Šџ‰‰Šџ‰‰Šџ‰‰Šџ‰‰Šџ‰‰Šџ‰‰ŠџŠ‹‹ВЛММ-ЛММЅЛММџЛЛМџЛММџЛММџЛММџЛММџЛММџЛММџЛММџЛММџЛММџЛММџЛММџЛММџЛММџЛММџЛММџЛММџЛЛМџООПџИЙЙџ‚‚‚џ™™™џZZZ–‰‰‰kkkо___Д’““&їŒџŒџŒџŒџŒџŒџŒџŒџŽŽеЁЁЃННО*НОО•ННОѕННОџННОџНООџНООџНООџНООџНООџНООџНООџНООџНООџНООџНООџНООџНООџНООџНООџНООџННОџОППџТУУў‰Š‰ўžžžџvvvЫ pppCmmmџUUUSŸЁЁЯ’’’џ‘‘‘џŽџџџџџџѕ”••$ОПП8ОППžОППєОППџОППџОППџОППџОППџОППџОППџОППџОППџОППџОППџОППџОППџОППџОППџОППџОППџОППџОППџОППџОППџХЧЧў™™™ћžžžџы&xxxЕnnnя""" ›œœz€€џ‰‰‰џ”””џ‘’’џ‘’’џ‘’’џ‘’’џ‘’’џ‘’’џ•”•cЏБА ЛММ[НППМПРРўРРСџРССџРССџРССџРССџРССџРССџРССџРССџРССџРССџРССџРССџРССџРССџРССџРССџРССџРССџРССџРССџРССџШЩЩќЄЅІє›››џў???Ippp(џfffŽеежhhhхfffџœœœџ•––џ“””џ”””џ”””џ”””џ”””џ•––П–š—ЛЛМ<ППРŽФФХлЫЫЬџЪЪЫџФХХџТУУџРССџПРРџРРСџРССџРССџССТџССТџСТТџСТТџСТТџСТТџСТТџСТТџСТТџСТТџСТТџСТТџССТџССТџССТџШЩЩіАБАнš››ћ­­­џaaad~~~œ{{{џDDD*fffqDDDџ‚‚џšš›џ™™™џ–––џ–——џ–——џ–——џ———ўš››NМНННОО6РРСФФХЭЪЫЫџбвгџййкџнооџнннџлммџиййџдееџаббџЮЯЯџЫЬЬџШЩЪџШШЩџХЧЧџФФФџУФФџУФФџУУФџУУФџУУФџУУФџУФФџУФФџФФХџХЧЧџШЩЩџЪЫЫщЖЖЖЙ›››ѓГГГџnnn}nnn љoooЛDDC=NNNџabbџlllџ›œœџšššџ˜™™џ˜™™џ˜™™џ˜™™џ™ššцŸ  ФХХХЧЧXФХХ—ХЧЧгЭЮЮџдееџкккџоппџпппџоооџнннџнннџнннџоооџоооџпппџоппџоонџнннџммнџлллџкйкџйййџйййџийиџиииџиииџиййџйййџйййџкккџлллџммнЭПРРžžžъПППџ„„„Žyyyœ{{{џSSSF;;;&cccї```щKKKњijjџЂЃЃџ›œœџ›œœџ›œœџ›œœџ›œœџœСЌЋЋББАРТСGФЧХ‚УХФСФХХ№ФХХџФХХџЧШШџЮЯЯџдееџиййџлммџнооџоппџпппџпппџпппџпппџоппџопоџоооџоопџоппџоппџоппџпппџпппџпппџпррџпррџпррџпррџрррџпррџоппџтууЇДЕЕmЃЃЃъНННџ–––ooo)~~~ќrrrЫ dddфJJJРMMMгNNNџ™™™џŸ  џžžџžžџžžџžžџžžџŸ  ­џџџАВБСТТBЧЩШyЭЭЭЗббвчжжзџйккџззиџгггџЯЯЯџЫЬЬџШЩЪџХЧЧџФХХџФХХџЧШШџЪЫЫџЮЯЯџбббџдддџззиџййкџйлкџмммџнннџнннџнннџнооџнооџнооџмннџмннџмннџлммџйккџиииџзииџиийљьээl›››[   ёИИИџ‹‹‹‰rrrБ{{{џVVVO[[[ЗLLLдVVV’XXXџƒƒƒіЇЈЈџžžžџŸŸŸџŸŸŸџŸŸŸџŸŸŸџŸŸŸџЁЁЁ­БВВ ’“МНН%ЧЧШSЫЬЬ†ЯааМгддцззиџлммџпппџттуџуууџуууџууфџуууџтттџрссџоппџлммџиййџжззџгддџаабџЮЯЯџЭЮЮџЫЬЭџЫЫЫџЫЫЬџЫЬЬџЬЭЭџЭЮЮџЭЮЮџЮЮЮџЯааџЯааџЯааџЮЯЯџЯааџаббџбввџвггџвггџаЯаУзии*{{{f   џЕЕЕџ‚‚‚vcccM~~~џmmmФZZZwUUUї333\aaa§[[[кМННˆІІІвЁЂЂџŸ  џžžџœџœœœџ›œœџ›œœЬ7‹ŒŒММНЧШШ4ЫЬЬYЮЮЯ‚аббЎддевжззікклџоооџсссџуууџуффџуууџуууџтттџтттџтттџтттџтттџтттџуууџуууџуууџуффџфффџфффџуууџуууџтууџсттџсссџрррџрррџпррџоппџоппџоппџпппџпппџпррџрррџсссџтстџтттџрррютууlэяю}||ŠŸŸŸџЌЌЌџxxxbJJJwwwз~~~џDDD;NNN2^^^џ%%%WeeeЌUUUљ+џџџДЕЕSЕЖЖТДЕЕџДЕЕџЕЖЖџЕЖЖџЕЕЕџЙККівггвлммщлммџнооџпррџсссџтууџуффџфхфџуффџтффџтууџтууџтууџтууџтууџтууџтууџтууџтууџтууџтууџтууџтууџтууџтууџтууџтууџтууџтууџуффџуффџуффџуффџуффџуффџуффџуффџуффџуффџуффџуффџуффџсссёмммџџџ433ИЅЅЅџЃЃЃщYYYHhhhІ††џ```šjjjфJJJœEEE.dddџIIIНиййIбввГжззќпппџчччџшщщџхххџхххџхххџхххџфххџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџуффџсттоноо„оонttt?ˆˆˆцЅЅЅџ•••Ф666$QQQ?†††џxxxуqqq•bbbяfffІ```џ>>>TШЩЩ3ЭЭЭ’гггщкккџсссџхххџхццџхххџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфффџфххџуффџтттђсссЏмннYЩЪЪ}}}ƒ’’’џЅЅЅџ‡‡‡‘ ~~~мџCCCGlll:uuuџ000@DDDpppѓVVVф%%%УФФЫЬЬhбввНииијоппџуффџцццџхццџхххџфххџфххџфххџфххџфххџфххџфххџфххџфххџфххџфххџфххџфххџфххџфххџфххџфххџфххџфххџфххџфххџфххџфххџфххџфххџхххџфххџфххџуффшсттЎпррeзии$6………ХœœœџŸŸŸхkkkQvvvЋžžžџpppq†††к___ЎdddfrrrџOOOЃЧЩЩ,ЯааzгееЧкллїпррџфффџцццџцццџцццџхццџхццџхххџхххџхххџхххџхххџхххџхххџхххџхххџхххџхххџхххџхххџхххџхххџхххџхххџфххџфффљуффттууЕсттпппEжззџџџŠŠŠ|‘‘‘§ЁЁЁџ”””Ў888ttt‚   џŠŠŠŒ‹‹‹tzzz§tttВlllџNNNbЩЪЪ+аббjежжЉкммноппњсууџуффџфххџфххџфххџфххџхццџфххџфххџфххџфххџфххџфххџфххџфххљфххъуффмуффСтууІтуу{рссQмнн.дееЄЄЄDŽŽŽЯœœœџЅЅЅђ€€€m‰‰‰cЂЂЂџЃЃЃЁccc‰‰‰ќXXXƒ555zzzцiiiћXXX8ВГГ ЭЮЮ.дееFйккTклл`мммeмммlмммqмннsмннpмннqмннkноо`нооSмннDлмм<лмм.кккгвв ззз%œœœŸ˜˜˜џЄЄЄџІZZZ ™™™WЂЂЂџЊЊЊЃŽŽŽ›zzzєfffB}}}џfffъlll&љљљЃЃЃ…›››јЁЁЁџЇЇЇаŽŽŽL———bЄЄЄџЂЂЂ“ppp$ŠŠŠџbbbjjjk|||џmmmк€€€"џџџ ЎЎЎmщЄЄЄџЌЌЌыЂЂЂr zЁЁЁџЁЁЁy†††ž~~~џVVV3{{{Ž~~~џqqqк“““)џџџЛЛЛlЅЅЅпЃЃЃџ­­­і­­­†sss………ŸŸŸќšššSSSSїtttз}}}………Ѓ†††џ|||ч˜˜˜;џџџЛЛЛyЉЉЉхЈЈЈџ­­­ќАААސaaa!‡‡‡Яšššж–––*ttt|џБџџџ“““­•••џ„„„ѓ›››^ппп0ЗЗЗ‘ЋЋЋёЎЎЎџГГГіЖЖЖŒЁЁЁ$sssg†††ы———Ÿ””” „„„Ъ†††џ’’’Аччч›››ЄЇЇЇџџ›››“ппп џџџУУУ_ВВВОЎЎЎџБББџИИИфЛЛЛttt'}}}З‹‹‹чVbbb(ŸŸŸх———џ˜˜˜йКККQžžžМММџ›››џ™™™бКККDџџџЧЧЧLЕЕЕБББюВВВџЗЗЗџРРРЛННН]}}}„„„}}}„‰‰‰ц˜˜˜˜йййrrr)ВВВЫЎЎЎџЂЂЂџ­­­ФЮЮЮk№№№šššSУУУоЄЄЄџ”””§ЎЎЎ–зззџџџууу%РРР`ИИИЈГГГыЕЕЕџЙЙЙџПППхССС‰ППП-ЃЃЃˆˆˆz‹‹‹т™™™РККК7 ЛЛЛ€ХХХюДДДџЄЄЄџЅЅЅјДДДЏГГГЂбббэУУУџ™™™џЁЁЁчЕЕЕuїїїззз9НННlЙЙЙЂВВВзДДДџКККџМММџСССфЧЧЧ”ШШШF€€€ ›››!Œ’’’хšššбАААT’’’ЮЮЮ‚аааиОООџАААџЊЊЊџЇЇЇџПППџТТТџЄЄЄџГГГџХХХоЩЩЩsЭЭЭLППП_РРР{МММžЕЕЕЫБББђЕЕЕџИИИџЛЛЛџТТТјЩЩЩУЩЩЩƒХХХBrrr уууЃЃЃUšššЕšššђŸŸŸЫБББWдддAннн€зззЗЭЭЭтОООѕЙЙЙџНННџНННџИИИџЙЙЙџЙЙЙџЖЖЖџЕЕЕџЙЙЙќМММрХХХЦЪЪЪЯЯЯwбббHГГГддд"АААaІІІЌЂЂЂёЁЁЁїЉЉЉЌЛЛЛBІІІййй'лллBрррUеееfСССФФФРдддњПППџЎЎЎџЎЎЎцЊЊЊ„БББ*џџџђђђааа2ЖЖЖdЏЏЏ–ЋЋЋзЊЊЊџЉЉЉџ­­­ЬЙЙЙsкккЁЁЁ.ОООuИИИЕЎЎЎшЈЈЈџЅЅЅџЂЂЂчЁЁЁЕœœœŒžžžeЅЅЅMžžž9ЄЄЄ,ААА+ЗЗЗ7ЛЛЛHООО\ИИИuИИИ•ЗЗЗГБББлЏЏЏѓБББџБББџДДД№ИИИЛОООqггг(МММШШШ:ЛЛЛnГГГžАААЧ­­­тЋЋЋѕЅЅЅљЈЈЈњ­­­§ЕЕЕџНННџОООџЙЙЙџЙЙЙџЙЙЙ§ИИИьПППЩПППЩЩЩnжжж6чччџџџпппЯЯЯ$ммм1ккк:оооAтттBццц:ссс4иии+ллл№№№ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўџџџџџџџџџџџџџџ№џџџџџџџџџџџџџџР?џџџџџџџџџџџџџџџџџџџџџџџџџќџџџџџџџџџџџџјџџџџџџџџџџџ№џџџџџџџџџџџр@џџџџџџџџџџџР?џџџџџџџџџџ€џџџџџџџџџџ€џџџџџџџџџџџџџџџџџџџў?џџџџџџџџўџџџџџџџџўџџџџџџџџќџџџџџќџќџџџџџ€ќџџџјќ?џџџрxџџџ†џџџ№џџџ€џџўџџјџџ№џџрџџРџџ€џџџџџўќ?ќјјј №№ №рррррр РР0РјРќРўРўРр€ррр?рр€џ№pџ№ рџ№?џјРџџј№@@џџј?ў@џџќ?џР€Oџџџќџў€џџџќџџџџџџџџџјџџџџўџџџџјџџџџќџџџџјџџџџќџџџџјџџџџјџџџџјџџџџ№џџџџјџџџџрџџџџјџџџџРџџџџјџџџџџ€#џџџџј€џџџџџ'џџџџјљџџџџџўGџџџџјџџџџџџќGџџџџјџџџџџџјGџџџџјџџџџџџрЯџџџџјџџџџџџРџџџџјџџџџџџ€џџџџјџџџџџўŸџџџџјџџџџџјџџџџјџџџџџ№џџџџјџџџџџР?џџџџјџџџџ?џџџџјџџџќ?џџџџќџџџр<џџџџќџџџ|џџџџў?џџјјџџџџџўџџРјџџџџџўџќ№џџџџџўџРёџџџџџџјсџџџџџџУџџџџџџ?Чџџџџџџ€‡џџџџџџ‘р`џџџџџџџ€јƒџџџџџџџˆџў?џџџџџџФрќќџџџџџџФ?ќ№?јџџџџџџтџџџџРџёџџџџџџџуџџџџџуџџџџџџџё‡џџџќџ‡џџџџџџџ№Уџџџ№џџџџџџџџјAџџџРўџџџџџџџј џўџјџџџџџџџќ?џ№џрџџџџџџџџўџ?џƒџџџџџџџџџ№џўџџџџџџџџџРџ№?џџџџџџџџџ№џ€џџџџџџџџџџџџрџџџџџџџџџџџўџџџџџџџџџџџџРџџџџџџџџџџџџџўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ(@€ B/s™“g%!ЕўџџџџќЙ3 %%&Šѓџџџџџџџџћ„ !!!445дџџџџџџџџџџџџЋ (((99:Юџџџџџџџџџ kpџŒ’џ47џџџГ 555556џџџџџџџџ *-џйсџ­Кџџџџџџ—  000<<=№'''џџ џ џ џ џ џ џвнџШтџџџџџџџўa-)"@@?f@@Aџџџџџ џ џ џu}џтєџk„џџџџџ(((џWWWџџх31/+" DDEВBBBџџџџџџџ џСбџеёџ5BџџџџRSTџšššџШШШџœœœџ444џ“/21/)  (((FFFуCCCџ###џ%%%џ!!!џџџџџиэџЮэџ%џџџ&&&џsstџПППџэээџцццџ‹‹‹џя53321-#W‚‚\,&)(%" 888IIIћFFFџ,,,џ,,,џ&&&џџџџ-0џкђџЬьџ џџџ444џ‚џДДДџюююџьььџаааџLKKџ z13321.%pУіџџџџю/10/.*%777%LLLџIIIџ444џ444џ,,,џџџџ/3џе№џб№џ+2џџџ111џ™ššџ™™™џыыыџьььџяяяџ~}џ-2Ч+33332."Hхџџџџџџџџџв:22210.) !9OOPџNNNџ===џ;;;џ111џџџџ$'џЭъџаюџ NZџџџџЊЋЋџ”••џжжжџэээџюююџБААџ8>ј9333331*fќџџџџџџџџџџџм4333221@TTTўRRSџEEEџBBBџ777џ###џџџџКзџШчџЁџџџџz{{џЕЗЗџЖЗЗџхххџэээџТУУџ49џ 5=c233332-Iќџџџџџџџ џ џџџџџЗ,333337WWWіWWWџMMMџIIIџ???џ***џџџџЇџСхџЬфџџџџ џЈЉЉџТУУџдееџ№№№џЈЇЇџ2:џ >I”/33332-шџџџџџџџџ---џ999џ777џ џџџџk13333-XYYсZ[[џUUUџQQQџGGGџ333џ џџџMXџФъџЪыџ nwџџџџ џ{||џ‹Œ‹џOOOџ џLYџ>>џ џџи-3333+RRSЛ^^^џ\\\џXXXџPPPџ===џ'''џ!!!џ!!!џ!џЌЯџЙтџвшџ!џџџџ666џUUUџџџ…џ*2Х ")021,  є џ џ џ џ џ џџџ+++џ(((џџџџ;;;џGGGџ џџ`23331333bccџaaaџ^^^џYYYџIIIџ111џ$$$џ###џ#""џR_џЛчџЙтџНЬџџџ џ???џoooџџџЖоџЫ $   .220,#r џџџџџџџџџ!!!џџџџџџ333џ444џ џБ+3333EfggќeffџdeeџbbbџUUUџ>>>џ+++џ&&&џ&&&џ&" џ‡ІџЕуџИуџПаџ 13џa`aџjjkџoopџ+23џœМџŒЎџШ  .2320*Тџџџџџџџџ"""џ"""џ"""џ"""џ"""џ"""џ џџEEEџџ ч/3333*aaaЫijjџijjџiiiџaaaџMMMџ666џ***џ(((џ(((џ())џ—НџВтџАрџ5ЅЛџojjџ€џ~~џ„€€џ-­дџ>>џ777џ222џZ[[џtuuџtuuџ~~џoooџRRRџk12210.+& {џ:::џMMMџHHHџ888џџџџ333џBBBџBBBџBBBџBBBџBBBџBBBџ===џџџ&&&џџ €fgg/}}}ю{||џ~~~џ„……џџxxxџkkkџ\\\џRRRџJJJџhhiџwwxџxxyџ||}џwwwџJJJТ,10.+)%  $$$iџ:::џVVVџPPPџ???џ"""џџџ000џIIIџHHHџHHHџHHHџHHHџHHHџ???џ###џ%%%џ$$$џџ r*" ***)))___7~ь~џ€€€џ†††џ………џџwwwџnnnџfffџutuџz{{џ{{|џz{{џџ999z*)&"  +++L###џ555џ```џXXXџIIIџ(((џџџ$$$џOPPџMNNџMNNџMNNџMNNџNNNџ999џ(((џ)))џ###џ џ K)("3|||е‚‚џ€џ………џ‡‡‡џ„„„џ~~~џvvvџ||}џ~~џ~~џyyyџˆˆˆџ444X ---%&&&ў---џhhhџaaaџSSSџ333џ"""џџџOPPџRSSџSSSџSSSџSSSџRSSџ000џ---џ+++џ###џ ѕZZZ€‚ƒƒщƒ„„џƒƒƒџ„„„џƒƒƒџ~~~џ‚џ‚‚ƒџ‚‚ƒџzz{џŽŽџSST4  222(((у'''џhhhџkkkџ___џBBBџ&&&џџџ333џYYYџWWWџWWWџXXXџGGGџ000џ111џ'''џ$$$џ!!!Т GHH fffLuuu’kllЂnnn {||††‡ў††‡џ††‡џ~~~џ‘‘‘џFFG"  ***Ё)))џTTTџvvvџlllџUUUџ111џ$$$џџџFFFџ\]]џ\]]џPPPџ444џ555џ---џ$$$џ%%%џ"""o    ,,,444+++222666__`\ŠŠ‹џ‰‰Šџ‡‡ˆџqrrџoopџ\\]Y 667D)))џ,,,џ€€€џyyyџgggџGGGџ+++џ$$$џџџ555џ???џ777џ777џ+++џ###џ'''џ&&&ѓ"""  999 ||}ЊŽџŽŽџ‡‡ˆџ„„…џ„„…џ„„…я]^^  @@@&&&дџhhhџ………џzzzџcccџ???џ+++џ&&&џџџџ###џ џ$$$џ)))џ***џ*** ))) 333 ZZZ‘‘’ђ’‘“џ‘‘’џŸ  џЁЂЂџЁЂЂџЁЂЂџ|}}"XXXBCC CCDЭ!!!џ,,,џџ‰‰‰џ|||џcccџCCCџ000џ)))џ&&&џ$$$џ%%%џ)))џ,,,џ---џ---ц---WWWŽŽ€•––џ–——џ•––џЊЊЋџССТџППРџПРРЪsstOOOTTUъ444џ$$$џKKKџ———џџƒƒƒџoooџZZZџGGGџ===џ888џ666џ555џ333џ222ћ111D††‡4š›šїšš›џšš›џšš›џ’““џўЅЅІђxyy,VWW YYYѕXXXџ//.џ%%%џ```џœœœџ•••џŒŒŒџџtttџjjjџaaaџWWWџKKKџ???ћ777c„„…!žхžŸџžŸџžŸџžžŸџ‘‘’џˆˆˆм€€€Уsss[\[^__§^^_џ\\\џ444џ)))џ[[[џšššџšššџ‘‘‘џ‡‡‡џ|||џqqqџcccџUUUхHHHHš››ЁЂЂмЂЂЃџЂЂЃџЂЂЃџЂЂЃџЂЃЃџ‹‹‹џ‰‰ŠvvvВaab ddeџddeџddeџeeeџIIJт555ъ<<<џiiiџ………џ‡‡‡џєwwwРdddpQQQЉЊЊЅІІгІЇЇџІЇЇџІЇЇџІЇЇџЅІІџŸ Ёџ„„„№‚‚‚ИИИ~ЋЋЋЖЕЕЕž­­­;ГГГ КККJЖЖЖ­­­МІІІКЄЄЄЈЅЅЅ—ЖЖƘМММЈИИИСЗЗЗаКККПШШШЙЙЙKЛЛЛ КККШШШЫЫЫЮЮЮ аааЫЫЫЪЪЪџџџџџџџџџџџџџџџџџџџџРџџџџџџџ?џџџџџќџџџџџјџџџџџ№?џџџџ№џџџџрџџџџрџџќрџџРРџ€?ўќј№ррРР Р €€€€€<€€€€€РРРџР№џрџ§џРџўџџРџќџџР?џјџџРџ№џџРџџрџџРџџџРџџРџџџ€џџРџџўџџРџџќџџРџ№'џџРџ€'џџрќGџџр?рЯџџрџџ№Ÿџџ№џџ№Р?џџјx <џџј?џ№јџџџќџСёџџџќўУџџџў№џџџџќ?џџџџРРџџџџџўџџџџџџр?џџџџџџџџџџџџџџџџџџџџ(0` €%3& .В№ўјжx ###‘јџўџџўџи 5##$001Н ўџџўџџў35џ џыA 555‰ ўўўўўў fjўЗУў24ўўўц=111;;<їџ ў џ џ ў KPџешџ+6ўџџџўЪ2) >>>j:::џџўџ џ ўЏНџЃОџўџџYYYџў999§ƒ10*  >>>Є;;;ў"""ў ўўўўеъў—ўўўUUUўЄЄЅўыыыўЌЌЌў$$$ч321/% 7xЂ”a,*($ """ JJJЩ@@@џ...џ)))ўџџ')ўз№џ|‘џўџmmnџЁЁЁџэээўшшшџpooџr2320)bжіўџџќШM10/,%KLLдGGGџ888џ000ўџџ%'ўаьџ–­џўџnnnџ———џхххўьььџЏЎЎџ ,0Ж13220# œќџџўџџџўфK32210LLLжNNOџBBBџ888ў џџўРоџКгџ ўџ899џАББџЦЦЦўъъъџЫЬЬџAIу 93232)Žўўўўў ўўўўўж32222GGGХVVVўLLLўCCCў(((ўўў“ЌўЧчўIPўўўhhhўРРРўзззў™™™ў HTњO2222*9њџўџ џў'''џ===џIIIџ:::ўџў…1230AAAЄ[\\џVVVџNNNў333џ!!!џўT`џОфџЏУўџџџZZZў333џџgyў ](*/2.   Г ў ў ў ў ўў+++ў)))ўў$$$ўEEEўўм7222+++taaaў^_^ўYYYўBBBў(((ў###ў"%&ўœПўОхў |…ўўўSSSў)))ўўŽЋў[ (11-!* їџџўџџў џџџўџ;;;ў ўb233;ffgїeffџdddўSSSџ666џ'''ў&&&џ$@Hџ­иўМфџŠ˜џSWXџppqў[[\џ‰Єџbxў !U (121+kўџџўџџ!!!ў$$$џ$$$џ$$$џ!!!ў џ'''ўџ™032/STTЗkkkџkllўcccџIIIџ000ў)))џ))(џ%N[ўЉжџ!ЉгџruvџŽŽўŽŽџX џ$&ў!"B  .220%Єў'''ў&&&ўўўў***ў***ў***ў***ў+++ўўў///ў Р-10/'''Yoooјpppўpppў```ўBBBў///ў,,,ў,++ў)>Eў+w‘ўz{|ўЖЗЗўЕЖЖўnnnў!!!є)-222.Ц"""ў444џ///џўџџ333ў223џ223џ223џ333ўџў+++џвiiiЅsttўwwwџtttџ^^^ўAAAџ222џ///ў///џ977џmmnџўŸŸŸџVVVџ Ь'.2221' ж+++ў???џ777џўџџ;;;ў:::џ:::џ:::џ:::ў&&&џў(((џж)))LLLxxxпxxyџ}}}џwwwўaaaџGGGџ888ў333џ===џrssџnooў~~џVVVџ€/220/) ###з111ўJJJў@@@ў!!!ўўўBBBўAAAўAAAўAAAўBAAў+++ўў%%%ўе ```?|||ѕ|}}ў‚ƒƒў|||ўlllўYYYўKKKўOOPўwwxўsstўƒƒƒўQQRм31/,)# """Щ333ўWWWџJJJџ)))ўџџHHIўIIIџIIIџIIIџIIIў---џ%%%ў"""џШ(" MMMK{{{ъ€€ў………џ„„„џ{{{ўpppџmmnџ{{|џyyzў‡‡‡џBBC–'$  &&&Њ...ўcccџVVVџ444ўџџFFFўPPPџPPPџPPPџLLLў---џ***ў###џž#&&&BppqУ‚‚‚њ„„„џ………ў€€€џ{{|џ€€џ€ў‰‰ŠџNNNt  +++v(((ўiiiўdddўEEEў$$$ўў000ўWWWўVVVўVWWўCCCў000ў***ў###ў\ [\\Ituu”rrrИtuuВ‚‚ж……†ў……†ў‹‹‹ўTTU[  3341)))љXXXџtttџ]]]ў111џ"""џўAAAџWXXџLLLџ555ў000џ%%%ў%%%ъ  %%%!!!$$$99: €€ЫŠŠ‹џ‚‚ƒўsssџhhh›<<=***Т444џџtttўNNNџ,,,џ"""ўџ(((џ000џ***ў$$$џ(((ў'''—    QQR1ŽŽѓџ’““ў““”џ’““ћ]^^(((>>?—!!!ўfffў‰‰‰ўsssўLLLў000ў&&&ў"""ў"""ў'''ў,,,ў---№+++,,,JJJfff‹ŒŒŽ••–ў”••ў­ЎЎўЙККўКЛЛсrrrJJKUUVД666џ,,,џƒƒƒўџ~~~џeeeўNNNџCCCџ>>>џ999ў444ї222Y„„…Cš››њšš›џš››џ‘’’ўŸŸŸыxxxYSSS]]]ФYYYџ666џ777ўŠŠŠџ———џ‹‹‹ў}}}џoooџ```џNNNя>>>f666Ž7žžŸц  Ёџ  Ёџ  ЁџŠ‹‹ќ‡ˆˆЅƒƒƒ.]]^cddЮcccўaabўGGGю;;;ѓeeeў†††ў†††ў{{{фhhh QQQ/ЈЉЉ+ЅІІрЅІІўЅІІўЅІІўЁЂЂў†††Ч|||„‚‚ iii lmmгkllџkllџoooЗ]^^WXXDWWWOYYY3eee­ЎЎ0ЊЋЋхЊЋЋџЊЋЋўЊЋЋџЋЌЌџ™ššџvvvWrrr‚rss tuuжtttџtttџuvvИЕЖЖБВВIЏААцЏААџЏААџЏААўЏААџЌЌЌџ€€€в€0rrr[z{{ |}}з||}џ||}џ}~~СЙККЕЖЖДЕЕєДЕЕўДЕЕџДЕЕџДЕЕўЕЖЖџ–––њyzzQsssghhh%~ …††в……†ў……†ў†††дУФФНООCЙККЪЙККўЙККўЙККўЙККўЙККўЙККўЈЉЉўrssЁ|}}```mmm{||‹ŒŒЗџŽџŽŽєŠŠŠ ЪЫЫЦЧЧ;ОППБНООїНООўНООџНООџНООўНООџНООџЗИИ§ƒƒƒвqqq€0___l„……V€€€џ”••џ“””ў’’“RЮЮЮЩЪЫoЪЫЫФЫЬЬњЦЧЧџУФФџТУУўСТТџСТТџСТТўТУУџПРРю   ц‡‡‡,ŠŠŠzzz•fff[[[ZZZя„……§š››ў›œœрЃЄЄ#йккежжЮЯЯEЮЯЯ†ЦЧЧЫЫЬЭњжззўкккўмммўнннўнннўммнўлммўлллўкллўаббТ­­­Чœœœ9€€€1nnnˆPPPЌhhhлžžžв ЁЁќЂЂЂбААА:ЪЫЫ1дееYггд‹иииТлллщпррћсссџпппџмммўйккџиииџззиўзииџиййџйййўйккўиййсКККŒ›››КžŸŸ7ˆˆˆrrržmmm#_``|YYY”lll@ЄЄЄUШЩЩТиййїтуу§уууџуфуџуууўуууџуууўуууџуууџуууўуууџуууџуууўуффџуффўсттлежжuЈЈЈnzzzЌ”””!ooobaaaooooоппGоппJоппGноо<лмм.йййззз вввбббЙЙЙk———Їžžž6ЇЇЇ’’’1˜˜˜ƒ‚‚‚rrrQwww_€€€j†††‰ЉЉЉзззЦЦЦ`ЎЎЎЎЅЅЅ[žžžˆˆˆD”””m‡‡‡wwwЂžžžL–––qЌЙЙЙаааЯЯЯ,ССС€БББЊГГГ^ГГГ‘‘‘j“““D†††˜˜˜›ЕЕЕЎДДДЏЏЏЏпДДДgКККМММХЦЦ!ПРРKСССМММЇЕЕЕŠННН7КККАААЄЄЄšššb———cšššЎЎЎ-НННqСССЇУУУСУУУЩЗЗЗкЗЗЗЈСССiННН5ЗЗЗ ФФФЙЙЙ'ЕЕЕgВВВˆЋЋЋhЁЁЁЕЕЕЙЙЙAДДД}ЌЌЌБББƒЙЙЙХХХŠССС›ЛЛ˘УУУqЛЛЛ-ВВВНННПППСССТТТџџџџџџџџџƒџџџџџџџџџќџџџјџџџјџџџ№џї№?џ0ќ№ррР€€€€€€€€€@€pџРџџ€џјџ€џ№џ€џрџ€џРџƒџџџƒџўџƒџјџџр?џСџ€?џР№џрџр џџрџџрР1џџ№руџџ№?џџј џџќ`џџџрџџџџўџџџџџџџџџ( @ € 5ЈЪЁ; šќџџџўŒ333• џџџџ €‡џ36џџ— 444//0ћ џ џ џŽ˜џ P^џџ џўi+  777e111џџџџЯчџџ џ‡ˆˆџЮЮЮџ555р21)M™РC,' AAA<<<џ,,,џџ "џгяџџџšššџьььџЂЂЂџg32-Ъџџџџѓ_21.778IIIџ999џџџШцџ7>џџ›œœџзззџгггџ/5Ѕ232"Ыџџ џџџ џэ>33000UUUџHHHџ&&&џџ˜Гџ„•џџ000џЇЈЈџ}}}џ >Iв.12& f џ џ џџ..-џ...џ777џџ™23!!!f___џXXXџ777џ"""џP\џРхџ;@џџNNNџџ_qу 00Ьџџџџ џ џџ,,,џ х035effёfffџPPPџ,,,џ'&&џ›џЖнџDhnџuvvџ;‘џ>Hр!02,ќ$$$џџџ"""џ)))џ)))џ###џџ"""ўD10FFFœoooџjjjџDDDџ---џ+,,џ"kƒџc‰џЌЌ­џ‚‡‰џС ,22#3 џ666џ!!!џџ///џ444џ444џ222џџ$$$џI...tttъxxxџjjjџCCCџ222џ///џa`aџ‘џccdџŠ.22- >)))џFFFџ(((џџ999џ@??џ@??џ===џџ"""џJZZZI{{{њ€€€џrrrџTTTџAAAџkllџzzzџ``aя>0-((((-,,,џWWWџ555џџ;;;џKKKџKKKџCCCџ&&&џ!!!џD!  ???[~є„„„џ€€€џrrrџzz{џ{{|џ]]]Д"  --- (((јgggџJJJџ џ,,,џUUUџUUUџ>>>џ,,,џ"""э ,mmmzzzЬzzzЫ„„…ў€€џnnn• ,,,И]]]џhhhџ222џџ;<<џHIIџ333џ&&&џ$$$   RRSE‹‹Œџ‚џuuvб <<aЫ:ЁIDATxкэ]|еѓŸ+щ!$$„zM:в›Š (‘оё' ˆвDŠв"MЄ) TQP@ZЄ§шН‡$в{ЙЛџЬоЮхнf/ЙтёџсР~іrЗэНљN}ѓоjр_zЉIушј—Kџр%Ї№’гПxЩщ…€ЩdrКwяžOttДW>$ЃбшІзы]pгр–œ–––š„Єгщb ,хээяшgўџF/ 8рчщщY!..ЎNrrr ƒСˆ[2н755ULж899щ\]]ЕИFЃŸnDАDЙИИмЦЯ—мннЯ#^Nњјјм(RЄHДЃлі"“CАnнКъХ‹oƒ nž˜˜Xї…щ€[2є,2јЊVЋНŽŒ KIIyъьь‡ 1спžЈ|~xNМT)<О~Ў„€)Œчxвѕёї<юžЗ5ФОjеЊ]st‡Пh”чиИqЃOэкЕ§‘)(СО >OŸ>-‚Ьi*Лс“'OœЂЂЂшааєєєеШмoП§і•мм A A RрЮ;%CBBj!hjс5[рї•pУаІвЅKџXЁB…џtgПˆємрВџў†nnnЭP"ыЃdW‰‰‰ёEivGHЧъ&ND/3Ч€ ЦѓB(WqЛ 9џрСƒЫэлЗј,ЯtщвЅ2Зnнj†ЯвбячŒfdO–ЖnнњGtќ‹BЯ ‹-*оИqуAШДЎ‘‘‘ccc 1ИpсТЄŽ™ љѓчьјЛШ№%И]Чу| Х1eQbЋсО"~ŸŽЇ 5B nЇ№‡№З?Зmл4oоМ„м>чУ‡}:єњŽ}ёЯ&Дыј><<<ŽЁ}нTІL™[Зnmјѕ§ћїK#(ŒE‹]ŽOХ-,'ї@щ‚ƒƒЫмО}ЛFmб|ДB†љ‘9A „рч шјmhбЂХХмЖућяПї~єшбpд8CНММю`ЦНўњыAџIЙ@џў§+5iвф 2Ѕ(Jу dњЇиi;шЗеЋWŽ’?хюнЛ€ЬЙ€њўvрy<0ТчфЩ“аЬtBрuТ{ћ Vє ЙYъ}чДiгbrsэщгЇ{ЃЦљХўЈСv"ЈЦWЌX12oКўХ \C7Ї!C†CщЋ‹ѕK—.]њЪёЖеъzќЎЊyР§7ЏНік8@b^<<‚СяшбЃэаєє!o_іс~%њЋбЬфЪyќју+"  6ЈўС‡x­yёќ/х иAQнOУ;бwD)4сg§тХ‹З (оA†Ф*ThФ AƒжџS AmSукЕk§аѕExЁV  сR 3ПэгЇЯ­м\ѓЃ>тыы;нЧЧg7j—#GŽЬ ;’r €wп}Зxѕъеo`М}ЅфUVЗ3fЬј№†Zaшv:tш1G4Е‚џ ‰‰Ÿ‹"(М\„ŽхТQЃFнЯщѕњѕыWКB… л.Јe:>э1{іlJмDЃ$ДD[№ёуЧO0$kќЭ7пмptƒlzїОЈБЦ іњŸеЗѓЁЁЁ1”н“ы,[ЖЌО|љОC­ђ ‚шGЗыYЩn '\ma№ЙsчfnоМyRнКu‹Дnнњ JVAмšрw'srу]Лvz”EЉ,Œvк §OFы„?ЙрцЄб€їљSёwЪўХЁDЧр–ŒŸcFг“фф”˜ъеЋйэœ]НzЕќБcЧЦ#€ћb”BРиt№рСё7nМgя5–/_о §ŸЭЈM6tэкѕ}ќЪ”Ї\ЪCВ_§ѕЧШшYЈ Ё=ХH`'юлcИ5`чЮЋэЙЦпUA†7C†7svvЊЃгщ‹ыѕ:dЖж26`y0ќ›ЦВ Tм БИ„ћGИПŒ’y™{Ÿэ^•*UcmМaУ†за?јšB=dfмЭ›7' љZloЬš5k†ОЋ№9зїюнЛOоА'яЩ^hбљЛv§њѕKыж­{gрРƒБу–пО}{У/Пќв;Ћƒ‚NTuqqэрфЄošЗ2пUЏw’вКdfДщЙШ‘‰Ўƒр0=FP\ФэДС`<šœœєпРРЪOЌŽ4™œиу”_x{{kб‰нРјрфЩ“ьЙ СдЊUЋNB Э§ф“O>~n\љЩ.`ќKЃ{Ч~џ§ї~~~WАбЗCBBbаTEЩЩTpqєш_…Q=vD;л™оШХХй…ВuZ­dС?Ѓ55.гcдЧqл‡ксЯJ•-Й дKHH˜ўLCŒfBNŸ>=rЩ’%;ьЙ2ўЧJ•*uОpсТМЮќ QЯН‡ВЅбЃG/A/П'zў>шјmLMMэqчЮ.GŽБ8 :YЅЛ2ОyмИб0/v'І›žˆчОБѓ3 я@ОФСєєД­{ъеЋ/™ŠI“&M+XАрDŒfhфrбgŸ}6ПЮrфї6lиYŒЪюкЕЋ-њћкШœі‰Ч8cЈwчоН{Пb МЈdЩ’ч=zєЧО}ћZёзЏ_{Љс(хoИККQйJЛвг ŠK™ž“š^D`0оEŸaЃ 4ЫЫ–)ѓеz3дr›Š/^$::њšМОџ§w–™ФN:5CЇјPlll№œ9sjрѕ"н2{)[tшаЁкЧ3'NœшоМyѓ.и)э8P+22ђъоН{h0цC”І&вХdGŽ˜Œ6? Є[h: сWT$й}rјвБЌž30”Ѕ=„~B,|UйВegдЉSзиЁCћЭхЪ•kƒ пЛwoŸM›6§šељC‡]ЂD‰Б7nмXЙvэкСЯ“IyIйіTЯž=ЧaЧLA•?ЈzѕъыP§пюпПпіЧУпDZ ;ˆЄHR­‚m??%сП5kдєі№є@o__^ЇеjuкЊzОюЫсоM‡&‚qЬрШpm™ ‘ЙцХё&ЫГ(ПS6›ЯЇkв?њm‰вщД“ё™WЬ›Л`zйВeЦbмш јъЋЏlF;oОљІkЕjеЮЁйЋtќјёЦ($I…ч”В@Џ^НіЁ§/юююў2щƒ*UЊ$•/_Ю-11IU⹘э>>оН;txлflОxў"—Ъе+—№pїЈЎwвЃп Џ‡[eDќЁ=‚BцХ•33ж 8Йx4у3šЃI"в$7NcMЦГj$ ФDЧѓятq†tуQW7—!пПЁqљђх—Ѓ­‡3gЮŒ›E:2;џF†‰љцлpљ9œiHŸe­Bщ$­FЇЂ9Ь$jГƒh”Џk"­ъWаяЃэлwDсГ,-\ИАзХ‹g;vœ­vŒ3ц4{0:ъИuыж_ХX{)K4jдЈ†8чQТbŸё˜QЃFUB_рjhhшќ+VŒЩэНђšTЛgнК5њЈЈшSЈіj˜=cƒъЁиН‰(uЏŒ12W5wyIўљЧЋИЃ„LWм<žїѕ]]]L.\2`ћѕ&?>}zЃˆˆЋzˆO?§tObbbCд%а”цzўB^’*/^T!55э<ъ>з,OжhЎєѕЋбЛOŸ4xAщƒ+c+G я‹Клnuˆ" ­†Ђгё'  _A :|ЇgЯžн Еф?P ДB3p ,,Ќѓ?ўјB–‘ЉvХœ9_ЗDлy0Л4vТЎБc?щршFиCќ^ wŸтжSjзs…Ÿфk§ … 4Ы6nм8œ™5k–іСƒЗ0$МВnнКЗнjЄк ГgЭjo0ВѕъбD,7nм‡ŽnDNшїп~ЃAЌщИНњЌзЂабХйB‡СЭ7а,ИСіэл;œ8qb3tшаIЉЉЉ“Ў_П^ CЧpGЗ_IЊјђЫ/Л щ›В;%`ьјёц8К9Ѕo^І)эVz~ќ™шї,ž"љHnnnpљђeˆ‹‹‡шшш`4Џ ъ—fa(]Йћо–-[~ptл•ЄкђЉSПш& лI€!“&M^сшFф–іэл[wTФёЦГ\‡ET№rђd8ЛИPНCCЫˆрАaУN&%%EЎ]ЛіMGЗ9гГЋ}љљфЩ§йжљЁдуѓ)S6;КЯJ{іь…R:щž›ѓхt1$&$ТХK—H0LќёGsмŽая”6F0удЉSХЯž=ћBЭ5TРФ њ#ВэБбэЇN›–ЃВъ•vэкйw”аЉœ›ѓ%S€>Р­[З *:ž>}zbоМyё'уРЫЙЛЛпxќјq'4/д‘*0~э‹X“нЩzюѕ/gЮќнбx^єѓЯ;ќP оЮэ5h(ћТ…  pп.iШ>њшb\\\аŠ+:К"Љр“OЦіЦ( [@ЏгЗš5kіџм+;vl'П`TnЮ%_рЩ“'іbbb.~ѕеWЕёыДБcЧ~•––ію‚ ШяxaFU0fܘЈ6fwВ^Џk9gЮм?нˆМ элЖ}ŒНѓunЮ%рЦ›в9/^шОiгц-~јa ŒЂP§Зп~Лфші1Љі]ЃбэR)шьМО`СТL& M›6jќŸўљТWФdE?§єућЈЪiђ‡SNЮ#<}‘‘‘ёїЌYГъwюмй=00№QxxјјхЫ—/stл˜T0rфˆ7QьЩюTŸц3fЬ8м Aƒ:јEмja‡GUчi6жЄ J еjЕ4AуЗ   ПР<Ѓчџ mнКх]мmРЭ5'чQhјрўHNIAmpЃнКuыіN:ѕš…ˆЙsчvrtЛ,ЯЉіхАЁC[!l.щB)Pl 1јбЃE=*Mб2XKROшїїї‡ЂE‹‚ЗЗЗTЙ#j\ХѓNІЇЇ%''\Иpс 7ˆЄF›7o"†QbЬХžуЉ­ф „†„J@MplцЬ™'Ož< л>§‚RиПщŽn‘*дЬ`4Rћœœ”Зям1%%&jœœ%[Gˆ/_ОƒтўіzШgн)YбњuыhhЖб a˜ Ёaa еi!&:кXЊdЩцСBFEEŸ7o^?GЗ…H}ћі)•––~рM;Ёкђє)мМu‹Š#%ц“*oйВ%ДhбТТXЎЛ%žГЅD рї1ј]яуЧяЪY3ўYZЛfЭLь›OГгTЉL gR-%э§ќ|—ФЦЦљФЦЦVG? šЃлAЄк‚>}оїOMI=^˜l>-ћz§њuѓ иhRџЄђлЖm+‹.YвUЄлJА†СРfПOСЮ}чдЉS{н9YбъяОћŸsHV#‰„l["іѕ Я]t…%$&vиБ}{ЙЫ—/?ЩС-ѓ„д5@Ÿ>^ЈЮ/ ГKв„ b>1ˆ;RѓфшНѓЮ;ІѓYЕSC ДбБє7m >ž'a№^ќ)їЭЮž={Сбd‹ЬŸЏѕєєм‹ЊОM– @g044 RБ<мнО|.^ПqГЪбЃG_EgасцN= 6Lћ$<ќoV[›VћŒˆˆ@b0…xНzѕ’Т;b(3Ÿ˜L Ї%ci‹‹‹“іф+oЙЙЦКіžI>ц2~зA /(}Зz•?Ж)Шh4•ВЉB95 №rхЪI“YЃ/…ZѕѓЎ]ЛMutlBЗk—.;""#;оО}[’|f\їюнЁD‰Г™љ,эd*bbb${G{Япу\€žЭУ{›КъќљѓƒнIYб’%пt@3љ‹ш3q{)<ІЙ…м<žоrвѕеW8ДVа&кПѕжWШќqdПФфFIN{ћЌіIв‰љєтвє™%žеЛЈђЅѓŒdО8Е‹7žД‰ћ7.]КєЋн-z>эЯXZ$ыsЄ™%K—.ЁЌiІbъ# •ŠHs-Еˆђл|уаЁC5ПќrІУV Е €*UЊLBFOхwѓ(P@’~r yЖ Ћ}bИœї–$_œЕ+ЮЪ1Щ3‹Ь|žиЩ@,CšhрЄ.:LЯ:чP9qPќ[э{aкjŸё>eкДi­ јј йЩЂ?@LїёіwwеЩДDЈ- <ф8HгXmо3ЯHѕъеsCл}™[‘˜ERўњыЏKЮЋ~ВыЄШж“ф?Х0‘іbD €Ељююю’OAˆјхOє\Нz57‰Аi…яДŠп4ŠуEF˜„MЋr,mцЯ{RяфTЫdfSбЈЋ‹”0Љ№•@ž’œќіˆ‘P.8…ћф1(T€ŒюŽЛMЄк‰љ$§яОћЎФQњЩС#‰'Щ'аБJцГЉ ЛGc”02Oу6Ћ|і#ш^IВЙсп-i2Q4PЃ{ђчJІѓž7P|ЏиёFХ^ЃrQфч“'OФ~šІєH (дќкнЛwЏю7K–P4ръ ЫS@Ј ZЕjdsщm^’T7nмjзЎIњйюS1™/€Ž%‰/SІ J“6)GNРЁN–ЄЭ ›НuуЦ=йДEdŽNСxЅ`с‹ЂуioОSmqнКu­QП^§ЃјйY|(ъв’Ђ“Ыў із‘iгЇЗžWdД’йт3™р9!аі—ЧIœ+{БЄўЩ™сИŸ$ЅŸ$ŸьПœФБ’|:Žц’щ -Т+sа5щќPщ1 ЭТІалoоМљn6ŒзЊ0^Mе‹чк’:ЃтГи_ЪыІыtZ˜>mњ g—WŒТєyjGl\,DGE[4žlц‚‡?юАaУџѓPГТEЬDy†L7Њ\Й2еЫCŸ‰ЉХ‹‡њѕы[RНФ\’~’x’ў№№pKT ”|Вщuыж_п–ѓЙSЈRRRсў§{вž%ž˜NзЃ{0d вмК*™<ž/2]—геlЛѓAбС|ŒВшшщгІ.wqq,:|,љё ёh*#ibЉњЛwюМГ{ЯZ‹аCОЎј"дU%у•`Ш=ЗуЎ V­ZPЊT)щЁйžГѓGвOі_dМИU­ZU:—І–Ћ­љDЖž€tџў}Х.щ{ЙЈФOcЧК{їю*ГmIМ­ЮВѕијLk)b1bD)д|ЈЉмЈ‚ž§›dwwЗл… z 5хх(*-uCТRГf-Иxё"ьйГЇщ… Ј@ЦlKДЈ дVЕу•РЕ•*UЂ%X(ь*ЦіЙaУ†єъЋ\>€д?5ˆ€ ІњIх“єsќЏ6nB  аыeШ ЯlYгˆРkoAЇ‰T'yг P2™ЇЦ|Еі+?гq”…4Нџ~яЊЅK—~#˜6:О>‡IZЪœяЇН^їлj4Ћ€2…1F Љ$ъјёу4“ш-љ4љU˜gДёьj&H Ъѓэ@ХŠkсюoъTb9mД8Чя Вп”э#ІБf?Ы+ЏМEŠ–ŽЯj&&љiiщєЪ‹ФK&8вw'ЭЙ„лшoдAаQNРCfО^бЂЭVvЂј Ж"њ›VM:thѓB…ќЂZo ВO”aЦ2КOLrщeS&ц(ЄіDЂЩ|ѕеW!((BCBz§АqуF"ХgWn"дЂёjчe €ђхЫїЧ4!„˜IіB‹§цЬ€?ЅѓЧ5фјQ€+~["ааPЩЇрД3Ыз4€MC 4;gёд`энЋ5м–йђш˜ш6­_ЏXяењŸИККМC‡ђт,ёьДђZ„ьQ_И`И+ІЮЬд–єmъЂ@§ы/ЊЊњtХЪ•Г№g^ˆЁŸAоŒ`‘ЈY тљY \ЙrДоXš ЬdŽШ>“§чЌŸ4VPЁByiФЂ#Sœ)^ц{™+k’џѓјёуяёЯ‚`:);Š?ЋIш3АA›8|јАї .2Нz?О/3еМ4ёƒ+ІКy#ЧзM™Q1ц‘’jv#jеЌ П8@эќvйВeєжбXЩ†JлФ-+PГ# ђБщђ– VН]ЖlYz}jW–ИjеЊIЖ\Tэ RџЄ ФEyУHhСeZгЯ>2‡GhпЅ{‰f€яЭfЖ}†)јГЏќќЬ`БЁщŠЮA T›ФQzuŒvТ„ёsммм“Ф‹ЋŒj4:K–’ŸC™юЖhpuve((i2ќ\MусC‡@ЇеўДtй2ŠИ<@=ф,Жб Д/ЌЭчDпˆAЊ+ ЃC^icVЫПSGєђ ”ЌсЬŸВ#јш-7ŒC4оDц‹%J”UД0nмЇ^ТэЄ)Zz’њ€Ѕ^дtb™GGќ=ЕпЕŸU.нX4—ХK””^žMQ€ППџейГgw† u­ ЈAдvЬTЅŠзЪp–A ‘ЯIњШˆLrF(+U‚žrі)dГ`Pьњ›ђ§*Tб~к €htУ?ЖЪђИ…„цтŠд+шt‘УJQt„и6iйВ%љТУŸўŒЯквЄXgЩ™г[к.j@.aKнXфїђ‚bХ‹IЫлŠ І> (VLrЯž= о^^ [~ќёНZBŽЕ™­q%(DS € &љ˜d&+ уцL(BMJ… вгa 5œGyO”@й2e =‡ NЂыR4 f‰$‰є›ln…‡‡ЗЧŸуф' Wѓ’mвДiSwЄЄЄvTzьt?zeјЫ%oМ‰хя ђ™бy5]+2*Cу’рмЙsG2GŽќuђмЙsTLЉ`ЪГлJђ0(D-Р‚&€€_Тх,ѓ:M€С ХŠ+f @eNRђBЋj”`чLд”;(UЊДє9ЇHHˆ”+3h‚:NюшЛ@‰$€mЗЭљт‹)ГSSRЧ‚U/˜%Ÿ™/–ЛqэЇЉYˆ+‘вОЖŸВЇќќ *zўњЏО 1вyє№Ёd >Lхa0њЁYGŒW~V›@ВР`Ѓ *g`"Xв­šр/ €Т9nK€TšˆйбЁфNN˜h bА)"PQжQ–Ж{ш+4ХŸ#хŽэНZЖ/MŸ>Н3оыG“bсSЅЇЯQ1"к’ф _Б –лOчcыеЋk•ЁЯЄ1kзЎїюо•РЯ+:t˜ЎљрюнЛRЭ1Г(|€PnЬX@dиy6:ЙXSHквrГ"EŠxуƒ’(љфЬ VШИЋа)N yzKаyі‡€ І ZєTˆJщbbvњti-~.Е5*І:HвЏ_ПbіГиŽ‚œrр”4@єg˜љ\мJŸYђљ8‘шoœњZ[X4-tЦMšв{•ЄОquq•4€\WёЩƒh! mm йƒQAŠЬќDє;ƒьЈ pсТЈР’G<• ЄŽЁЮ`›ЬŒb€H5p9v3`­P хд№ Œ@ZЩфG)jAЩё?~ќЯЂЗ3оNb’‹PЬ9Ќв9уЩUЮЂф‹fQй?ињѕъ–"9”$РФ#xZЕl‰RH ‘Щдќ‰ŸщšxН“7oоьцœ€2W)I 2hK—ЯР&РD… ЂEš№ьVд V™9ЖsЌE РZ€œЧЂxž19@v4ЉzО']ƒЊi§ќќЄ$‘\qt Uh{ЙЪAЅ“$&‚ЂЧŒнУЩйyЃN^сKlK>—ЖГфsVвVxЫ ё•фC f/TЄЖЁ њF%срС? Qš,Њ‡#§Х^4ЏЃiЛ†—ЁйXb6O­ŽA AКЬмќbN 1иiЖО0J9#нщСщЉѓ9&“2\ЦŽžяІйС9}E‡Jb€:œ*‰Ш ч,KНЎЖЛаIjЁЬƒ'ЂcцйЊUЋУю•ШxЗ‘ЦRƒШm#i™Oэ™/ж4()%еzghжИ.8щЕR9„uб$ФѓѕџњN:'ƒ‚,3ЋёњŸ!ШрeHэВФŠ#YЭCлœ Z Iўž“CЌ%8!d}Q”Д/qї7Bѓ{џ2JЕЙJ РDЧьI‡L сR_ЃЪ*рHШz fu™љѕЃ™гЇєwј Aƒ>Csђ‘4тШgШ…)Db­OlaЇOЩ|‘FЃт’4рюœ5+8Щ”b„2ЅKCЫV--S"ъ’­[ЖТ?§<лЏ§ :ƒTёфfЏ]z‡2иgИнВH† 3РЩ 1jВΘЏЏo_м­сПЩžrEФSИЃ8Р$eвyўЈ9ЄБ}{Э€ 0š}œ(WБ9! BIreЌEцаKђЋt†Zј”ŒQ‰wЧŽwу=|ХЪ­Ь|1Фeџ†UП8ЋIЩxЂЄ Є4аЊf єjE КРђЃ­!!EM›4ДЈU?сэ=<нсПџН ,Т~вШoa1#АkЂv‹“лц*oЅIАіиLым‡Э–„‘еХPтkb'Ђ›Б#HgяpgёЄPЫн3р‹šУЯЕзрсRЪ№šвш2ƒІRQ.‚–]у"RьЬЩШZrеЧЦхФ’*Ђˆ^Нz}шя_pДЕэзfR§,§dŠВžвfоЧ$hЁFuJ€6u’AЏ3РЃH/X~Є%˜ДPЗNMždѕ€є]xјcјzюb’юзt<ЎіУ‡Љ3Ÿчѕm€ЅœCBfƘ4ВŒX]уmКёEмJвпЄYˆѕњ\,J†h"Hr)#˜.ЊлЌ@9ьpВџЂІiжЌ™ДK—.qкйˆРшлiЙ“ВЃ4l“sЯž=~Тч/ijіЭЊeщ<ЪЩвЯПвщcцGХi FЙt˜о7ЪI—Р е &йV вŒP9АœДЎ‚8W@ъ?4ё~!шя`§>xК[~oџў}Zxг28naИј%+ˆf€“BЬ|ЮZ$!гEqvcІfМёSc)с&тpIL‰UЏ4lщИЌ|ѓ ™ЄСЅxKOЮ•єS€ЌaBPњ;у=тAQ~mƒЂкЕkзЉl™2s Vo<Щ™(§œпUПвЁцѓыІУмЁqрхa’ьПyh‘ДЃО;оBЃѓA‰b%VМ7—˜ц•§/A‹’?CЯipўњЎ’–‰m]"цЄd$tФвv%Xе3УйыWKg:J4гВ43\иyЂhA8~& @ЮM/ЯJ аuIвhЦ,]“юёц›oJŒ8wюœД—k Ѓx(8ЛЕzштћѕыЗCГjрАЃЅєgВћИE'hр•ВщАфУxШ‡’›LЬGг—ŽсЄ› ŠUMƒ;Тб п РЫЫKzj'pwгТ›хw@Х"`џi25­^ђWЇ‡„„LтЎŒ$1пCо;ƒmS &ПиоГ&H‚ “`Вю №KƒЙ0д]€Ш0бЈйyњŽbkђвTЄHy=J“ђ\bMBЅѕ†Юœ9h-€Упf ЊІЊрйZ—ЄŠ+•lбЂ­wшn§‚Hѓžp”ž?Їy•ЬOD‡Џ€—V‹‡… —h–|Zя+_!tпАt}4|ПЉ8дЊй%?йb: и$Бqˆ>3=„|Z7ЉrЈЯ -œМŒщbZ:ZИ-IiWД)MЂ3ШрФP2(JлU;НейЎЪвmfŒёx‚j‚xЙrH9чB?ђњI§ГЃEХЄ”HЙzѕ*\ЙrE’Fљ>ЩЈ–ЛPa(ƒ3ŠjпО}я€ЂEЇˆ…)bтŠ=Vџœёуё}ы)^фёЬџO"МQ/ "у2˜_ Œ є…№Си8XН.YъжзZЕ€jеЊCЅё›тХŠбzАkїnЩзy­™3ЌŸт>NZXО `тЗЈжмŒKУТxУKЎr›=хЯ ЅT€GџАv&B'ŽЦлЗfХx[$њ ДQЂ ŠёSh™a:8йYЪќБ!›OЬЇ aВ§4h"8—GёјrGш kЂ &Оїо{KнннZ,cѓ&Й2ЙВє‹•ШmˆŒе@ЗзRaцdtјЬЁФ|ŸRШ|tэ {їЇZѕ•ЦQћ)šЁr№Э›7Уў§ћ-ЧŒфsFф‡“чах3$%›–GE†SŽƒ'Š2“]фvГ#fМv9рЄP dUЦ„ sЦаИ@ -&Ћif:q с\r ^QбGЂМ u8]‡FkжЌ)!а$ђњй'–‘љ%“SАў‰”ŠїЬ‡`>Gaхˆ&;ФpVџєLj1 vcќ&ијEјћ!MЙЈіНЫЁ[ПиО3ХцУєьйSZIm§њѕpєшQЫїЎn8ДЦ*u‚ЖрдeУ2Cji.Ш№X 8CfGP™§@іиДRй6Хж„ЄдО#цѓ\.ц uhXW#{ќВ‰4tLƒN$‰Ф|R“Ф|‘iИнCЦtЦ}*ич§Ч5iмИaЙђхзˆЬ$S`Д.0ЕRџЪмS4JџИОЉ0Ђs*DЦ єу%uЎ&Ј№ХЬ˜ђU|–3dШЉТњЛяО“Р-вА^Аt|~шіq:lнgX A™XQ\шЩQ2 Њ}БB(ЌЋ…8-nЭ3[LsBfQМ]=ЋЦ)@Œ'Щ'0ѓIњ‰йД'П€2Œб1Ф1вНЄі™„бЦШ0šЏPВ'ЉЖџэЗп‰ўЧhбўs ›hџ9яЯ9хєюфђиђe x{бШžй‰,hB‰M‡–"$ ‘}ќёЧ’œ;wЎdџE*UBч~,г–™`ок”/ёбy@HYэЫclў”ѓ!” RљѓЋ–„g эp—эAд@РoїІMэЙ№‚:›$аМО~˜Х$H­ЪcИЬЂ9Љ0{жъЅ†&tщвyО›Ћл›ˆЄ|НIžЅdў‰PЦ§Rи‡ЮоаЮщ0qpDХšЛгйу`‚Ж]bраБ”,†4п€$р;vL2тлзi(рФ&_8ќЗЦЭMў –Jѓѓ+fkЁ х 3>2†|ГœаšmЂH“0оГЃу­€ šкуљuяюёzЄ~гхА8И$ў Fbєш;w^ЇгiЋ‹s yЂŠX№Сcў<УйъBђВ>ОL…šДЎЙ}E* ‡М;z ‰ЮђAШЏ™2хsIуEЧФHхbєfБѓчЯУЖmлЄбъ™љёY\`и”xtrЉ4_Ьr*ч2*gБЧЯЮ;|Љ@lѓ,ЛоDi%{Dуes q(і Dœ+kT–ˆc:ˆLѓэЁTяV­ZmХkцчрu •р!_Й0УъBˆ ЈUХf’cˆчЁ"uЮgЯ‚mКFУ_AЖuЫ-ры9_K’O†Д\љђ$G—„Ь]Ÿ>}сШ‘У0u”'јpK:9Њ3jы{`NјиCb5‡{< hзД,{RѕФМњИЃху=э|0›LU['P™KџХ}wмh5ЭœМЭ+Љb… ЅkдЌљ#žkщHŽяYˆ@^ GЉўi\nTo#Lb„(Yи hрЏSЉаЖg$иыЂpvйвЅвСё(ёД^0j’&рЙ“єyС‚№щјi0ЫŠЅНю|ќегn2ує9h/{ќ$ѕ"ь*ЩВ DђшW:5Іх–l\' П€л1А/ь/WЛvэzeЫ–§оHѕ2q§‘r8ЪbЦs™?ЋІЁmcФв -ВЅPQ Œš‹W'Ј>еPЌZЕRš””,х4*WЎ"еH$цK@мКu+Lœ<ZжЙЫцп?uQН…•Рnз’є2ё\=%РЎђxЛ@„*œŽи9“HuŽe ќmn4u:Л”ЏIeг AƒцEVГˆвНтф5ŒФтVжџ‹Dю‚ъЛŸП1BёЂшQ!єш‚jt&hе= Ю_UзАУ† …їо{Я2ЧСййE*jЁ˜˜Oїцq•€Џч.‡†UЏу=<цЮњ6j)иxБ§bХЃЊ?[”#сУг;w)?P)ЇчfzњЬ  ‡ž„пгˆ$…BЖFМ”ŸХ:РˆfM›Оaзw;œMОЇ”`22МR€KЉ>EŒ?И|=Zєˆ”ТC%‘є/ZДP"“C…,T NЙ dќ2ЕkзТЗ+О‡FUЏ™@ыкћћэqфkй3ЬЭmЮ vcфD*[њ ;ГфL]eEdы'т5)WЪsџE&+`]ЪЊ№IыжЏНэсюБž@R4‘…IЙО11K €xьЦV ОŸRьOCњоž:XП= Wїў›6m cF’^CƒXžžљЕ‘ёњ б˜5kжТіэлр•rwBЯ\вПsїa 1ЯоT1ƒyьŸЮхbаTШKXNжhшm›є~=8ЪжAЬBэџŠзњПfЩШ\уТgхLYf>5<ќ7ошшфЄпЦ №ЧЄžSTџ”@ ZгюэОA <”§ѓіаС„9q0g•zцбnпОънЛw_rќhlƒ>бФP@љ€Э›‚Ѓэ„Š%Ÿюиѓ‡qЌаіlЛRоЋ•‚gђЭ’‡9gЛ*ad mАƒ)Z Q6†ƒќєЎ ЕИQ9:yОю`кШ,ёЪyђьѓчиvэкЕТg9Р FSњYŒ:DpPЄhД}Лhр›Љˆ7 Њю~ŸEУ–=IЊ >|8дХ€JлШДДiгFša-J?'Р~јaќ~№0œћ{7”+e}шD%мђCіЄ№'ƒˆй?Лшy@$šнв7šМQЗБЉЈЛ`^‡№0nWфілkіqЂ#;цѓїioДm[ЭTбdв№кƒ4ъШyq,€ kT @џЎX2C+€ЎЌOеBзQQ№ћqѕьпШ‘#Ёr` мGлORпЅKЩћ‹BIњщ§ [ЖlУGŽТ­ыЧУн]ѕ†ІSпdЅў•ўŽ˜њ“?vKџѓ€ИF @F‚ЬЁšCFk:dŒn‰Г{ФЊM‡7‘щЂI€эл—J3ЮЃЄyQЭA L˜qD$†‚jˆFtяЈеsu’?@w3Хjс]Р‘гъ4p 4шCƒZ%K•‚=zHщoж,§4,|ѕъ5иКe#$'FlŒMЊЪЪћWjAeБ‡ШќЭШyо@ЙbЇј=hё FV 9*чХЋ-”Єœ7oЁ‘ŒtЙuѓжyьјŠД‚g КєСIП‰еLьЊ•QмпЂБv|‡;vЋ!­‰жC—Ђр ѕ…ЫЛuы еЋU—Мџ5kJ€+iOЮM ЃUТNŸ>ћіэ5zКk{Х')'ЌцCЉiDqœŸ7ЋZG@y]qивжjVJR.ёІœрЉЖ†N&jлІЭ^ џорЬ1EЌJ§5$%гHnеЃ:ЧоEYsŽзC?ŒЖPїZЕj5‚д6+VЄЗЏ™;C^pтєщгвђ0ф,\ИœOJtq‘‹­ъўЬZ =ЙРC4ЙfT^“кj—j 3*Џ–шБ‹г‘БИЂшЮнЛ’Дѓ`чИLЄtљЯ_79AнšцHР=С ЦЯƒ?ФЉо“ц0МгБ#шœє@UH}њє‘й ФЩ“'Ѕ7›?Оd&ДZЭ`ЃбtЬ>иvqЯšOœл/xЈŽѓч”1Ž {2|Й& л"Уїбg’zJЩвфŠЃq…S%ХЦš`ЮN№бH=DF›Р-Q6ЇРр‘6я[ИP!ieѕFKГ‚(ћGYA~чемКu‹ЪЬўТлSЖšЄ4}тќf<3џ™^EяHф)uьдЉ@Ltє%“бX„Єž3Єš‰\К&.ђЈ€ј4oЄ‡}[!Л[—Ќ…k'MаjјˆMШЃДFrпО}Ѕъf"RџTF DJGі’—фЁЬŸкъЬxe}ПXнѓЬ‚ђ? Ђ–-[ЎMOKыCˆˆŒ^yЫЉ<ЩE\їOIyxЯWhн\бЈДazшŽ‘РО“іНС†RР<мЬ„ї]їЅ_ЖjњR!ѓ"P9Z);њŸ@ГІM[aGKoAOKOƒЫ—.KяяS{A•­™П (щ-›щсзmЎ’j—4l[—=&Gфъ™№о7qз яG ЅЈШVF3 д—О{>УАмЦ„"WWmн:u"ƒаLр›7oJ5yЄь%J$'›рЋ)Ў0юS'ˆB-Ѕ‡caчёœНь ™OЊПjzI9~b>ƒ-2]ДѓЯdыmбџ4ˆ5jдЙИS+Џ?@UЧ9iJфб~§r7шо=|Œ‚/ЃЃй3ЎоЗo=dйя˜‹ўЦ\0чќ•Ћ}ІЋlyЦxKћђђт/ 5nмx—б`x‹T§ЅЫ—ЅєЏ8б5;’оLyg€YSн`фP'аyi јЂz‹…CЧRГ8з2Е~?2Ÿb~VћjЫН*3›yN/š5kV6555с wямЕЌ dщ;Р`. Ч(}‚CœЁmk=ИИi`гІиєS œ:“Q\„bNuШ‰Ї‹Јі;сЙДЖ!еі‹/2]™џШsz)@дИQЃШщЏWЏ]“bsЅ)АфЄЅ™yTВ„*–зC‰bˆŽ1ТХЫxl€Tk…pяIЬПцbOЕ1Œ”щVmvФME6ŠНМŒІЇ]Л~]њNх%•цŽQƒВfа`P&эHт3‘@КŠчt@мsТGmѕr‡0овNGомTЏ^§оzНvy№У`ЗZBТмR5‡ёЗžДЈ˜Р*щЖшЅQЋ–Эk'%ЅЬПyыVЊзЗЅžЈ uJ>Х‰ЪqŽŠ^JэпН[џХŒ}/_ЙђŸиииjЯщВБЈM&!у9К}івK І.яМуКэчŸ?ІRt0Љф–Ј’љsМЮ GЗ)'єв€ %—Ъз&тжьЏtІbБНИ-EЦvtrеnG?Р‹F„zИ{—^!цтV?сgВщДrХE<ююwсqЗ§ЬЯд^G?Р NИб{(yC^<х†‚y жџ§ €—œўРKNџр%Ї№’гџРЌчШХ IENDЎB`‚knowthelist-2.3.1/dist/knowthelist.rb000077500000000000000000000013331342115213400177320ustar00rootroot00000000000000require "formula" # Documentation: https://github.com/Homebrew/homebrew/wiki/Formula-Cookbook class Knowthelist < Formula homepage "http://knowthelist.github.io/knowthelist" url "https://github.com/knowthelist/knowthelist/archive/v2.3.0.tar.gz" sha1 "e97a68784b7056c8e7cfb11e926215116688380d" head "https://github.com/knowthelist/knowthelist.git" depends_on "gstreamer" depends_on "gst-plugins-base" depends_on "gst-plugins-good" depends_on "gst-plugins-ugly" => "with-mad" depends_on "taglib" depends_on 'qt' def install system "qmake" system "make" bin.install buildpath/"knowthelist.app" system "cp -R #{bin}/knowthelist.app /Applications" end test do system "false" end end knowthelist-2.3.1/dist/knowthelist.spec000077500000000000000000000137241342115213400202700ustar00rootroot00000000000000# # Copyright (C) 2014 Mario Stephan # %define name knowthelist %define qmake qmake-qt4 %if 0%{?suse_version} %define qmake /usr/bin/qmake %endif %if 0%{?suse_version} >=1310 %define qmake /usr/%_lib/qt5/bin/qmake %endif %if 0%{?fedora_version} >= 20 %define qmake /usr/bin/qmake-qt5 %endif Summary: awesome party music player Name: %{name} License: LGPL-3.0+ URL: https://github.com/knowthelist/knowthelist Version: 2.3.0 Release: 1 Group: Multimedia Source: %{name}_%{version}.orig.tar.gz Packager: Mario Stephan Distribution: %{distr} BuildRoot: %{_tmppath}/%{name}-%{version}-build %if 0%{?suse_version} && 0%{?suse_version} <1310 BuildRequires: libqt4-devel >= 4.8 qwt6-devel BuildRequires: pkgconfig(gstreamer-0.10) BuildRequires: update-desktop-files BuildRequires: libtag-devel Requires: libqt4-qtbase Requires: gstreamer-10-plugins-base Requires: gstreamer-10-plugins-ugly Requires: gstreamer-10-plugins-good Requires: gstreamer-10-plugins-bad Requires: libgstreamer-10-0 Requires: gstreamer-10 %endif %if 0%{?suse_version} >=1310 BuildRequires: taglib-devel BuildRequires: pkgconfig(gstreamer-1.0) BuildRequires: libqt5-qtbase-devel BuildRequires: libqt5-qttools BuildRequires: update-desktop-files Requires: gstreamer-plugins-bad Requires: gstreamer-plugins-base Requires: gstreamer-plugins-ugly Requires: gstreamer-plugins-good Requires: gstreamer Requires: libqt5-qtbase %endif %if 0%{?suse_version} >=1320 BuildRequires: taglib-devel BuildRequires: pkgconfig(gstreamer-1.0) BuildRequires: libqt5-qtbase-devel BuildRequires: libqt5-linguist BuildRequires: update-desktop-files Requires: gstreamer-plugins-bad Requires: gstreamer-plugins-base Requires: gstreamer-plugins-ugly Requires: gstreamer-plugins-good Requires: gstreamer Requires: libqt5-qtbase %endif %if 0%{?fedora_version} >= 20 BuildRequires: taglib-devel BuildRequires: pkgconfig(gstreamer-1.0) BuildRequires: qt5-qtbase-devel BuildRequires: qt5-qttools-devel BuildRequires: qt-devel >= 5.0 Requires: qt5-qtbase Requires: gstreamer1-plugins-base Requires: gstreamer1-plugins-ugly Requires: gstreamer1-plugins-good Requires: gstreamer1-plugins-bad-free Requires: gstreamer1 %endif BuildRequires: glib2-devel BuildRequires: gcc-c++ BuildRequires: alsa-devel Requires: taglib Requires: alsa %prep %setup %build %{qmake} -makefile %{name}.pro %{qmake} make %install %{__install} -Dm 755 -s %{name} %{buildroot}%{_bindir}/%{name} %{__install} -Dm 644 dist/%{name}.desktop %{buildroot}%{_datadir}/applications/%{name}.desktop %{__install} -Dm 644 dist/%{name}.png %{buildroot}%{_datadir}/pixmaps/%{name}.png %if 0%{?suse_version} > 0 %suse_update_desktop_file -r %{name} AudioVideo Player %endif %clean [ "%{buildroot}" != "/" ] && %{__rm} -rf %{buildroot} %files %defattr(-,root,root,-) %{_bindir}/* %{_datadir}/applications/%{name}.desktop %{_datadir}/pixmaps/%{name}.png %description Easy to use for all party guests Quick search for tracks in collection Two players with separate playlists Mixer with fader, 3 channel EQ and gain Auto fader and auto gain Trackanalyser search for song start/end and gain setting Auto DJ function with multiple filters for random play Monitor player for pre listen tracks (via 2nd sound card e.g. USB) %changelog * Sun Sep 19 2014 Mario Stephan - 2.3.0 - Made all compatible with Qt5 and Gstreamer-1.0. - Add an ALL node to filter results in case of a manageable number of tracks are found - Changed ModeSelector style and moved to tree header - Included 'year' tag into quick search * Sun Sep 14 2014 Mario Stephan - 2.2.4 - Fixed a bug which prevent correct monitoring of changes - Improved quick search in collection: added search in genre, multiple strings - Changed alignment of some display controls - Allow more audio file formates - Added a mutex to get more thread safety for database access * Tue Aug 26 2014 Mario Stephan - 2.2.3 - Get rid of dependency to Boost - Bugfix where adding a song caused a segmentation fault - Switched to Homebrew package installer for MacOS - Set CUE button to untranslatable - Translation updates * Wed Aug 06 2014 Mario Stephan - 2.2.0 - Added a new left side tab "Lists" to manage lists, dynamic and stored lists - Added a new feature to handle track ratings - Added a combo box for AutoDJ artist and genre filters to be able to select also from a list - Added a new way in how to add and remove items of AutoDj and lists - Added "Open File Location" at playlist context menu - Added a playlist info label (count,time) to player - Added French translation (thanks to Geiger David and Adrien D.) - Changed to a better way to summarise count and length of tracks for AutoDJ - Optimized for smaller screens - Fix to be more flexible for empty tags - Enhanced algorithm to fill playlist and simplified handling of current and next item - Fixed some size issues and cosmetical issues - Stabilized to avoid crashed in some cases * Thu Jul 03 2014 Mario Stephan - 2.1.3 - Added new widget ModeSelector to select collection tree mode - Added a counter for played songs - New: Generate a default cover image if the tag provides none - Optimized: gain dial moves smoothly now to avoid hard skips of volume - Optimized function to decouple database requests from GUI activities - Optimized for size scaling of form * Tue Jun 10 2014 Mario Stephan - 2.1.2 - Added translation for hu_HU (thanks to LУЁszlУГ Farkas) - AutoDJ panel rearrangements, new record case stack display added - AutoDJ names settings in settings dialog added * Tue Jun 03 2014 Mario Stephan - 2.1.1 - Add localization, cs_CZ (thanks to Pavel Fric), de_DE * Thu May 29 2014 Mario Stephan - 2.1.0 - First Release knowthelist-2.3.1/dist/knowthelist.wxs000077500000000000000000000131311342115213400201470ustar00rootroot00000000000000 ""]]> knowthelist-2.3.1/dist/package.sh000077500000000000000000000023131342115213400167600ustar00rootroot00000000000000#!/bin/bash dist="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" version=$(grep "APP_VERSION.*$" ${dist}/../src/src.pro| sed 's/^.*APP_VERSION.*\([0-9]\.[0-9]\.[0-9]\).*$/\1/') target=${dist}"/../../knowthelist-"${version} if [ -d ${target} ]; then rm -rf ${target} ;fi mkdir ${target} cp -R ${dist}/../../knowthelist/* ${target} rm ${target}/knowthelist.pro.user rm ${target}/src/Makefile rm ${target}/Makefile rm ${target}/locale/*.qm cd ${target} if [ ! -f ../knowthelist_${version}.orig.tar.gz ]; then tar -czf ../knowthelist_${version}.orig.tar.gz ../knowthelist-${version}/ else dpkg-source --commit fi dpkg-buildpackage -k${GPGKEY} -sa # Suse / Fedora spec sed -i 's/Version: 1/Version: '${version}'/g' ${target}/dist/knowthelist.spec mv ${target}/dist/knowthelist.spec ${dist}/../../knowthelist_${version}.spec #process=$(objdump -p "$1" |grep NEEDED | cut -d ' ' -f 18) results(){ for package in $process do dpkg -S $package | cut -d: -f1 | sort -u done } knowthelist-2.3.1/gst/000077500000000000000000000000001342115213400146615ustar00rootroot00000000000000knowthelist-2.3.1/gst/directsound/000077500000000000000000000000001342115213400172045ustar00rootroot00000000000000knowthelist-2.3.1/gst/directsound/gstdirectsoundplugin.c000077500000000000000000000027761342115213400236470ustar00rootroot00000000000000/* GStreamer * Copyright (C) 2005 Sebastien Moutte * Copyright (C) 2007 Pioneers of the Inevitable * * gstdirectsoundplugin.c: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301, USA. * * * The development of this code was made possible due to the involvement * of Pioneers of the Inevitable, the creators of the Songbird Music player * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstdirectsoundsink.h" static gboolean plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "directsoundsink", GST_RANK_PRIMARY, GST_TYPE_DIRECTSOUND_SINK)) return FALSE; return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, directsound, "Direct Sound plugin library", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) knowthelist-2.3.1/gst/directsound/gstdirectsoundsink.c000077500000000000000000000720111342115213400233020ustar00rootroot00000000000000/* GStreamer * Copyright (C) 2005 Sebastien Moutte * Copyright (C) 2007 Pioneers of the Inevitable * Copyright (C) 2010 Fluendo S.A. * Copyright (C) 2014 Mario Stephan * * gstdirectsoundsink.c: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301, USA. * * * The development of this code was made possible due to the involvement * of Pioneers of the Inevitable, the creators of the Songbird Music player * * Patched version of GStreamer sink plugin for Windows to enable selection of audio output device */ /** * SECTION:element-directsoundsink * * This element lets you output sound using the DirectSound API. * * Note that you should almost always use generic audio conversion elements * like audioconvert and audioresample in front of an audiosink to make sure * your pipeline works under all circumstances (those conversion elements will * act in passthrough-mode if no conversion is necessary). * * * Example pipelines * |[ * gst-launch-1.0 -v audiotestsrc ! audioconvert ! volume volume=0.1 ! directsoundsink * ]| will output a sine wave (continuous beep sound) to your sound card (with * a very low volume as precaution). * |[ * gst-launch-1.0 -v filesrc location=music.ogg ! decodebin ! audioconvert ! audioresample ! directsoundsink * ]| will play an Ogg/Vorbis audio file and output it. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "gstdirectsoundsink.h" #include #include #ifdef __CYGWIN__ #include #ifndef _swab #define _swab swab #endif #endif #define DEFAULT_MUTE FALSE GST_DEBUG_CATEGORY_STATIC (directsoundsink_debug); #define GST_CAT_DEFAULT directsoundsink_debug static void gst_directsound_sink_finalize (GObject * object); static void gst_directsound_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_directsound_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstCaps *gst_directsound_sink_getcaps (GstBaseSink * bsink, GstCaps * filter); static GstBuffer *gst_directsound_sink_payload (GstAudioBaseSink * sink, GstBuffer * buf); static gboolean gst_directsound_sink_prepare (GstAudioSink * asink, GstAudioRingBufferSpec * spec); static gboolean gst_directsound_sink_unprepare (GstAudioSink * asink); static gboolean gst_directsound_sink_open (GstAudioSink * asink); static gboolean gst_directsound_sink_close (GstAudioSink * asink); static gint gst_directsound_sink_write (GstAudioSink * asink, gpointer data, guint length); static guint gst_directsound_sink_delay (GstAudioSink * asink); static void gst_directsound_sink_reset (GstAudioSink * asink); static GstCaps *gst_directsound_probe_supported_formats (GstDirectSoundSink * dsoundsink, const GstCaps * template_caps); static gboolean gst_directsound_sink_query (GstBaseSink * pad, GstQuery * query); static void gst_directsound_sink_set_volume (GstDirectSoundSink * sink, gdouble volume, gboolean store); static gdouble gst_directsound_sink_get_volume (GstDirectSoundSink * sink); static void gst_directsound_sink_set_mute (GstDirectSoundSink * sink, gboolean mute); static gboolean gst_directsound_sink_get_mute (GstDirectSoundSink * sink); static gboolean gst_directsound_sink_is_spdif_format (GstAudioRingBufferSpec * spec); static GstStaticPadTemplate directsoundsink_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw, " "format = (string) S16LE, " "layout = (string) interleaved, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ]; " "audio/x-raw, " "format = (string) U8, " "layout = (string) interleaved, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ];" "audio/x-ac3, framed = (boolean) true;" "audio/x-dts, framed = (boolean) true;")); enum { PROP_0, PROP_VOLUME, PROP_MUTE, PROP_DEVICE, PROP_DEVICE_NAME }; #define gst_directsound_sink_parent_class parent_class G_DEFINE_TYPE_WITH_CODE (GstDirectSoundSink, gst_directsound_sink, GST_TYPE_AUDIO_SINK, G_IMPLEMENT_INTERFACE (GST_TYPE_STREAM_VOLUME, NULL) ); static gchar * guid_to_string (LPGUID in) { WCHAR buffer[256]; if (StringFromGUID2 (in, buffer, sizeof buffer / sizeof buffer[0]) == 0) return NULL; return g_utf16_to_utf8 ((const gunichar2 *) buffer, -1, NULL, NULL, NULL); } static LPGUID string_to_guid (const gchar * str) { HRESULT ret; gunichar2 * wstr; LPGUID out; wstr = g_utf8_to_utf16 (str, -1, NULL, NULL, NULL); if (!wstr) return NULL; out = g_malloc (sizeof (GUID)); ret = CLSIDFromString ((LPOLESTR) wstr, out); g_free (wstr); if (ret != NOERROR) { g_free (out); return NULL; } return out; } static void gst_directsound_sink_finalize (GObject * object) { GstDirectSoundSink *dsoundsink = GST_DIRECTSOUND_SINK (object); g_mutex_clear (&dsoundsink->dsound_lock); G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_directsound_sink_class_init (GstDirectSoundSinkClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstBaseSinkClass *gstbasesink_class = GST_BASE_SINK_CLASS (klass); GstAudioSinkClass *gstaudiosink_class = GST_AUDIO_SINK_CLASS (klass); GstAudioBaseSinkClass *gstaudiobasesink_class = GST_AUDIO_BASE_SINK_CLASS (klass); GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GST_DEBUG_CATEGORY_INIT (directsoundsink_debug, "directsoundsink", 0, "DirectSound sink"); gobject_class->finalize = gst_directsound_sink_finalize; gobject_class->set_property = gst_directsound_sink_set_property; gobject_class->get_property = gst_directsound_sink_get_property; gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_directsound_sink_getcaps); gstbasesink_class->query = GST_DEBUG_FUNCPTR (gst_directsound_sink_query); gstaudiobasesink_class->payload = GST_DEBUG_FUNCPTR (gst_directsound_sink_payload); gstaudiosink_class->prepare = GST_DEBUG_FUNCPTR (gst_directsound_sink_prepare); gstaudiosink_class->unprepare = GST_DEBUG_FUNCPTR (gst_directsound_sink_unprepare); gstaudiosink_class->open = GST_DEBUG_FUNCPTR (gst_directsound_sink_open); gstaudiosink_class->close = GST_DEBUG_FUNCPTR (gst_directsound_sink_close); gstaudiosink_class->write = GST_DEBUG_FUNCPTR (gst_directsound_sink_write); gstaudiosink_class->delay = GST_DEBUG_FUNCPTR (gst_directsound_sink_delay); gstaudiosink_class->reset = GST_DEBUG_FUNCPTR (gst_directsound_sink_reset); g_object_class_install_property (gobject_class, PROP_VOLUME, g_param_spec_double ("volume", "Volume", "Volume of this stream", 0.0, 1.0, 1.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_MUTE, g_param_spec_boolean ("mute", "Mute", "Mute state of this stream", DEFAULT_MUTE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_DEVICE, g_param_spec_string ("device", "Device", "DirectSound playback device as a GUID string", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_DEVICE_NAME, g_param_spec_string ("device-name", "Device name", "Human-readable name of the audio device", NULL, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); gst_element_class_set_static_metadata (element_class, "Direct Sound Audio Sink", "Sink/Audio", "Output to a sound card via Direct Sound", "Sebastien Moutte "); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&directsoundsink_sink_factory)); } static void gst_directsound_sink_init (GstDirectSoundSink * dsoundsink) { dsoundsink->volume = 100; dsoundsink->mute = FALSE; dsoundsink->pDS = NULL; dsoundsink->cached_caps = NULL; dsoundsink->pDSBSecondary = NULL; dsoundsink->current_circular_offset = 0; dsoundsink->buffer_size = DSBSIZE_MIN; dsoundsink->volume = 100; g_mutex_init (&dsoundsink->dsound_lock); dsoundsink->first_buffer_after_reset = FALSE; dsoundsink->device_id = NULL; dsoundsink->device_name = NULL; } static void gst_directsound_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstDirectSoundSink *sink = GST_DIRECTSOUND_SINK (object); switch (prop_id) { case PROP_VOLUME: gst_directsound_sink_set_volume (sink, g_value_get_double (value), TRUE); break; case PROP_MUTE: gst_directsound_sink_set_mute (sink, g_value_get_boolean (value)); break; case PROP_DEVICE: if (sink->device_id) { g_free (sink->device_id); sink->device_id = NULL; } if (sink->device_name) { g_free (sink->device_name); sink->device_name = NULL; } sink->device_id = g_strdup (g_value_get_string (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_directsound_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstDirectSoundSink *sink = GST_DIRECTSOUND_SINK (object); switch (prop_id) { case PROP_VOLUME: g_value_set_double (value, gst_directsound_sink_get_volume (sink)); break; case PROP_MUTE: g_value_set_boolean (value, gst_directsound_sink_get_mute (sink)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static GstCaps * gst_directsound_sink_getcaps (GstBaseSink * bsink, GstCaps * filter) { GstElementClass *element_class; GstPadTemplate *pad_template; GstDirectSoundSink *dsoundsink = GST_DIRECTSOUND_SINK (bsink); GstCaps *caps; if (dsoundsink->pDS == NULL) { GST_DEBUG_OBJECT (dsoundsink, "device not open, using template caps"); return NULL; /* base class will get template caps for us */ } if (dsoundsink->cached_caps) { caps = gst_caps_ref (dsoundsink->cached_caps); } else { element_class = GST_ELEMENT_GET_CLASS (dsoundsink); pad_template = gst_element_class_get_pad_template (element_class, "sink"); g_return_val_if_fail (pad_template != NULL, NULL); caps = gst_directsound_probe_supported_formats (dsoundsink, gst_pad_template_get_caps (pad_template)); if (caps) dsoundsink->cached_caps = gst_caps_ref (caps); } if (caps && filter) { GstCaps *tmp = gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST); gst_caps_unref (caps); caps = tmp; } if (caps) { gchar *caps_string = gst_caps_to_string (caps); GST_DEBUG_OBJECT (dsoundsink, "returning caps %s", caps_string); g_free (caps_string); } return caps; } static gboolean gst_directsound_sink_acceptcaps (GstBaseSink * sink, GstQuery * query) { GstDirectSoundSink *dsink = GST_DIRECTSOUND_SINK (sink); GstPad *pad; GstCaps *caps; GstCaps *pad_caps; GstStructure *st; gboolean ret = FALSE; GstAudioRingBufferSpec spec = { 0 }; if (G_UNLIKELY (dsink == NULL)) return FALSE; pad = sink->sinkpad; gst_query_parse_accept_caps (query, &caps); GST_DEBUG_OBJECT (pad, "caps %" GST_PTR_FORMAT, caps); pad_caps = gst_pad_query_caps (pad, NULL); if (pad_caps) { gboolean cret = gst_caps_is_subset (caps, pad_caps); gst_caps_unref (pad_caps); if (!cret) { GST_DEBUG_OBJECT (dsink, "Caps are not a subset of the pad caps, not accepting caps"); goto done; } } /* If we've not got fixed caps, creating a stream might fail, so let's just * return from here with default acceptcaps behaviour */ if (!gst_caps_is_fixed (caps)) { GST_DEBUG_OBJECT (dsink, "Caps are not fixed, not accepting caps"); goto done; } spec.latency_time = GST_SECOND; if (!gst_audio_ring_buffer_parse_caps (&spec, caps)) { GST_DEBUG_OBJECT (dsink, "Failed to parse caps, not accepting"); goto done; } /* Make sure input is framed (one frame per buffer) and can be payloaded */ switch (spec.type) { case GST_AUDIO_RING_BUFFER_FORMAT_TYPE_AC3: case GST_AUDIO_RING_BUFFER_FORMAT_TYPE_DTS: { gboolean framed = FALSE, parsed = FALSE; st = gst_caps_get_structure (caps, 0); gst_structure_get_boolean (st, "framed", &framed); gst_structure_get_boolean (st, "parsed", &parsed); if ((!framed && !parsed) || gst_audio_iec61937_frame_size (&spec) <= 0) { GST_DEBUG_OBJECT (dsink, "Wrong AC3/DTS caps, not accepting"); goto done; } } default: break; } ret = TRUE; GST_DEBUG_OBJECT (dsink, "Accepting caps"); done: gst_query_set_accept_caps_result (query, ret); return TRUE; } static gboolean gst_directsound_sink_query (GstBaseSink * sink, GstQuery * query) { gboolean res = TRUE; switch (GST_QUERY_TYPE (query)) { case GST_QUERY_ACCEPT_CAPS: res = gst_directsound_sink_acceptcaps (sink, query); break; default: res = GST_BASE_SINK_CLASS (parent_class)->query (sink, query); } return res; } static gboolean gst_directsound_sink_open (GstAudioSink * asink) { GstDirectSoundSink *dsoundsink = GST_DIRECTSOUND_SINK (asink); HRESULT hRes; LPGUID id=NULL; if (dsoundsink->device_id) id = string_to_guid( dsoundsink->device_id); /* create and initialize a DirecSound object */ if (FAILED (hRes = DirectSoundCreate (id, &dsoundsink->pDS, NULL))) { GST_ELEMENT_ERROR (dsoundsink, RESOURCE, OPEN_READ, ("gst_directsound_sink_open: DirectSoundCreate: %s", DXGetErrorString9 (hRes)), (NULL)); return FALSE; } if (FAILED (hRes = IDirectSound_SetCooperativeLevel (dsoundsink->pDS, GetDesktopWindow (), DSSCL_PRIORITY))) { GST_ELEMENT_ERROR (dsoundsink, RESOURCE, OPEN_READ, ("gst_directsound_sink_open: IDirectSound_SetCooperativeLevel: %s", DXGetErrorString9 (hRes)), (NULL)); return FALSE; } return TRUE; } static gboolean gst_directsound_sink_is_spdif_format (GstAudioRingBufferSpec * spec) { return spec->type == GST_AUDIO_RING_BUFFER_FORMAT_TYPE_AC3 || spec->type == GST_AUDIO_RING_BUFFER_FORMAT_TYPE_DTS; } static gboolean gst_directsound_sink_prepare (GstAudioSink * asink, GstAudioRingBufferSpec * spec) { GstDirectSoundSink *dsoundsink; HRESULT hRes; DSBUFFERDESC descSecondary; WAVEFORMATEX wfx; dsoundsink = GST_DIRECTSOUND_SINK (asink); /*save number of bytes per sample and buffer format */ dsoundsink->bytes_per_sample = spec->info.bpf; dsoundsink->type = spec->type; /* fill the WAVEFORMATEX structure with spec params */ memset (&wfx, 0, sizeof (wfx)); if (!gst_directsound_sink_is_spdif_format (spec)) { wfx.cbSize = sizeof (wfx); wfx.wFormatTag = WAVE_FORMAT_PCM; wfx.nChannels = spec->info.channels; wfx.nSamplesPerSec = spec->info.rate; wfx.wBitsPerSample = (spec->info.bpf * 8) / wfx.nChannels; wfx.nBlockAlign = spec->info.bpf; wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; /* Create directsound buffer with size based on our configured * buffer_size (which is 200 ms by default) */ dsoundsink->buffer_size = gst_util_uint64_scale_int (wfx.nAvgBytesPerSec, spec->buffer_time, GST_MSECOND); /* Make sure we make those numbers multiple of our sample size in bytes */ dsoundsink->buffer_size += dsoundsink->buffer_size % spec->info.bpf; spec->segsize = gst_util_uint64_scale_int (wfx.nAvgBytesPerSec, spec->latency_time, GST_MSECOND); spec->segsize += spec->segsize % spec->info.bpf; spec->segtotal = dsoundsink->buffer_size / spec->segsize; } else { #ifdef WAVE_FORMAT_DOLBY_AC3_SPDIF wfx.cbSize = 0; wfx.wFormatTag = WAVE_FORMAT_DOLBY_AC3_SPDIF; wfx.nChannels = 2; wfx.nSamplesPerSec = 48000; wfx.wBitsPerSample = 16; wfx.nBlockAlign = wfx.wBitsPerSample / 8 * wfx.nChannels; wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; spec->segsize = 6144; spec->segtotal = 10; #else g_assert_not_reached (); #endif } // Make the final buffer size be an integer number of segments dsoundsink->buffer_size = spec->segsize * spec->segtotal; GST_INFO_OBJECT (dsoundsink, "GstAudioRingBufferSpec->channels: %d, GstAudioRingBufferSpec->rate: %d, GstAudioRingBufferSpec->bytes_per_sample: %d\n" "WAVEFORMATEX.nSamplesPerSec: %ld, WAVEFORMATEX.wBitsPerSample: %d, WAVEFORMATEX.nBlockAlign: %d, WAVEFORMATEX.nAvgBytesPerSec: %ld\n" "Size of dsound circular buffer=>%d\n", spec->info.channels, spec->info.rate, spec->info.bpf, wfx.nSamplesPerSec, wfx.wBitsPerSample, wfx.nBlockAlign, wfx.nAvgBytesPerSec, dsoundsink->buffer_size); /* create a secondary directsound buffer */ memset (&descSecondary, 0, sizeof (DSBUFFERDESC)); descSecondary.dwSize = sizeof (DSBUFFERDESC); descSecondary.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS; if (!gst_directsound_sink_is_spdif_format (spec)) descSecondary.dwFlags |= DSBCAPS_CTRLVOLUME; descSecondary.dwBufferBytes = dsoundsink->buffer_size; descSecondary.lpwfxFormat = (WAVEFORMATEX *) & wfx; hRes = IDirectSound_CreateSoundBuffer (dsoundsink->pDS, &descSecondary, &dsoundsink->pDSBSecondary, NULL); if (FAILED (hRes)) { GST_ELEMENT_ERROR (dsoundsink, RESOURCE, OPEN_READ, ("gst_directsound_sink_prepare: IDirectSound_CreateSoundBuffer: %s", DXGetErrorString9 (hRes)), (NULL)); return FALSE; } gst_directsound_sink_set_volume (dsoundsink, dsoundsink->volume, FALSE); return TRUE; } static gboolean gst_directsound_sink_unprepare (GstAudioSink * asink) { GstDirectSoundSink *dsoundsink; dsoundsink = GST_DIRECTSOUND_SINK (asink); /* release secondary DirectSound buffer */ if (dsoundsink->pDSBSecondary) { IDirectSoundBuffer_Release (dsoundsink->pDSBSecondary); dsoundsink->pDSBSecondary = NULL; } return TRUE; } static gboolean gst_directsound_sink_close (GstAudioSink * asink) { GstDirectSoundSink *dsoundsink = NULL; dsoundsink = GST_DIRECTSOUND_SINK (asink); /* release DirectSound object */ g_return_val_if_fail (dsoundsink->pDS != NULL, FALSE); IDirectSound_Release (dsoundsink->pDS); dsoundsink->pDS = NULL; gst_caps_replace (&dsoundsink->cached_caps, NULL); return TRUE; } static gint gst_directsound_sink_write (GstAudioSink * asink, gpointer data, guint length) { GstDirectSoundSink *dsoundsink; DWORD dwStatus; HRESULT hRes; LPVOID pLockedBuffer1 = NULL, pLockedBuffer2 = NULL; DWORD dwSizeBuffer1, dwSizeBuffer2; DWORD dwCurrentPlayCursor; dsoundsink = GST_DIRECTSOUND_SINK (asink); GST_DSOUND_LOCK (dsoundsink); /* get current buffer status */ hRes = IDirectSoundBuffer_GetStatus (dsoundsink->pDSBSecondary, &dwStatus); /* get current play cursor position */ hRes = IDirectSoundBuffer_GetCurrentPosition (dsoundsink->pDSBSecondary, &dwCurrentPlayCursor, NULL); if (SUCCEEDED (hRes) && (dwStatus & DSBSTATUS_PLAYING)) { DWORD dwFreeBufferSize; calculate_freesize: /* calculate the free size of the circular buffer */ if (dwCurrentPlayCursor < dsoundsink->current_circular_offset) dwFreeBufferSize = dsoundsink->buffer_size - (dsoundsink->current_circular_offset - dwCurrentPlayCursor); else dwFreeBufferSize = dwCurrentPlayCursor - dsoundsink->current_circular_offset; if (length >= dwFreeBufferSize) { Sleep (100); hRes = IDirectSoundBuffer_GetCurrentPosition (dsoundsink->pDSBSecondary, &dwCurrentPlayCursor, NULL); hRes = IDirectSoundBuffer_GetStatus (dsoundsink->pDSBSecondary, &dwStatus); if (SUCCEEDED (hRes) && (dwStatus & DSBSTATUS_PLAYING)) goto calculate_freesize; else { dsoundsink->first_buffer_after_reset = FALSE; GST_DSOUND_UNLOCK (dsoundsink); return 0; } } } if (dwStatus & DSBSTATUS_BUFFERLOST) { hRes = IDirectSoundBuffer_Restore (dsoundsink->pDSBSecondary); /*need a loop waiting the buffer is restored?? */ dsoundsink->current_circular_offset = 0; } hRes = IDirectSoundBuffer_Lock (dsoundsink->pDSBSecondary, dsoundsink->current_circular_offset, length, &pLockedBuffer1, &dwSizeBuffer1, &pLockedBuffer2, &dwSizeBuffer2, 0L); if (SUCCEEDED (hRes)) { // Write to pointers without reordering. memcpy (pLockedBuffer1, data, dwSizeBuffer1); if (pLockedBuffer2 != NULL) memcpy (pLockedBuffer2, (LPBYTE) data + dwSizeBuffer1, dwSizeBuffer2); // Update where the buffer will lock (for next time) dsoundsink->current_circular_offset += dwSizeBuffer1 + dwSizeBuffer2; dsoundsink->current_circular_offset %= dsoundsink->buffer_size; /* Circular buffer */ hRes = IDirectSoundBuffer_Unlock (dsoundsink->pDSBSecondary, pLockedBuffer1, dwSizeBuffer1, pLockedBuffer2, dwSizeBuffer2); } /* if the buffer was not in playing state yet, call play on the buffer except if this buffer is the fist after a reset (base class call reset and write a buffer when setting the sink to pause) */ if (!(dwStatus & DSBSTATUS_PLAYING) && dsoundsink->first_buffer_after_reset == FALSE) { hRes = IDirectSoundBuffer_Play (dsoundsink->pDSBSecondary, 0, 0, DSBPLAY_LOOPING); } dsoundsink->first_buffer_after_reset = FALSE; GST_DSOUND_UNLOCK (dsoundsink); return length; } static guint gst_directsound_sink_delay (GstAudioSink * asink) { GstDirectSoundSink *dsoundsink; HRESULT hRes; DWORD dwCurrentPlayCursor; DWORD dwBytesInQueue = 0; gint nNbSamplesInQueue = 0; DWORD dwStatus; dsoundsink = GST_DIRECTSOUND_SINK (asink); /* get current buffer status */ hRes = IDirectSoundBuffer_GetStatus (dsoundsink->pDSBSecondary, &dwStatus); if (dwStatus & DSBSTATUS_PLAYING) { /*evaluate the number of samples in queue in the circular buffer */ hRes = IDirectSoundBuffer_GetCurrentPosition (dsoundsink->pDSBSecondary, &dwCurrentPlayCursor, NULL); if (hRes == S_OK) { if (dwCurrentPlayCursor < dsoundsink->current_circular_offset) dwBytesInQueue = dsoundsink->current_circular_offset - dwCurrentPlayCursor; else dwBytesInQueue = dsoundsink->current_circular_offset + (dsoundsink->buffer_size - dwCurrentPlayCursor); nNbSamplesInQueue = dwBytesInQueue / dsoundsink->bytes_per_sample; } } return nNbSamplesInQueue; } static void gst_directsound_sink_reset (GstAudioSink * asink) { GstDirectSoundSink *dsoundsink; LPVOID pLockedBuffer = NULL; DWORD dwSizeBuffer = 0; dsoundsink = GST_DIRECTSOUND_SINK (asink); GST_DSOUND_LOCK (dsoundsink); if (dsoundsink->pDSBSecondary) { /*stop playing */ HRESULT hRes = IDirectSoundBuffer_Stop (dsoundsink->pDSBSecondary); /*reset position */ hRes = IDirectSoundBuffer_SetCurrentPosition (dsoundsink->pDSBSecondary, 0); dsoundsink->current_circular_offset = 0; /*reset the buffer */ hRes = IDirectSoundBuffer_Lock (dsoundsink->pDSBSecondary, dsoundsink->current_circular_offset, dsoundsink->buffer_size, &pLockedBuffer, &dwSizeBuffer, NULL, NULL, 0L); if (SUCCEEDED (hRes)) { memset (pLockedBuffer, 0, dwSizeBuffer); hRes = IDirectSoundBuffer_Unlock (dsoundsink->pDSBSecondary, pLockedBuffer, dwSizeBuffer, NULL, 0); } } dsoundsink->first_buffer_after_reset = TRUE; GST_DSOUND_UNLOCK (dsoundsink); } /* * gst_directsound_probe_supported_formats: * * Takes the template caps and returns the subset which is actually * supported by this device. * */ static GstCaps * gst_directsound_probe_supported_formats (GstDirectSoundSink * dsoundsink, const GstCaps * template_caps) { HRESULT hRes; DSBUFFERDESC descSecondary; WAVEFORMATEX wfx; GstCaps *caps; GstCaps *tmp, *tmp2; LPDIRECTSOUNDBUFFER tmpBuffer; caps = gst_caps_copy (template_caps); /* * Check availability of digital output by trying to create an SPDIF buffer */ #ifdef WAVE_FORMAT_DOLBY_AC3_SPDIF /* fill the WAVEFORMATEX structure with some standard AC3 over SPDIF params */ memset (&wfx, 0, sizeof (wfx)); wfx.cbSize = 0; wfx.wFormatTag = WAVE_FORMAT_DOLBY_AC3_SPDIF; wfx.nChannels = 2; wfx.nSamplesPerSec = 48000; wfx.wBitsPerSample = 16; wfx.nBlockAlign = 4; wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; // create a secondary directsound buffer memset (&descSecondary, 0, sizeof (DSBUFFERDESC)); descSecondary.dwSize = sizeof (DSBUFFERDESC); descSecondary.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS; descSecondary.dwBufferBytes = 6144; descSecondary.lpwfxFormat = &wfx; hRes = IDirectSound_CreateSoundBuffer (dsoundsink->pDS, &descSecondary, &tmpBuffer, NULL); if (FAILED (hRes)) { GST_INFO_OBJECT (dsoundsink, "AC3 passthrough not supported " "(IDirectSound_CreateSoundBuffer returned: %s)\n", DXGetErrorString9 (hRes)); tmp = gst_caps_new_empty_simple ("audio/x-ac3"); tmp2 = gst_caps_subtract (caps, tmp); gst_caps_unref (tmp); gst_caps_unref (caps); caps = tmp2; tmp = gst_caps_new_empty_simple ("audio/x-dts"); tmp2 = gst_caps_subtract (caps, tmp); gst_caps_unref (tmp); gst_caps_unref (caps); caps = tmp2; } else { GST_INFO_OBJECT (dsoundsink, "AC3 passthrough supported"); hRes = IDirectSoundBuffer_Release (tmpBuffer); if (FAILED (hRes)) { GST_DEBUG_OBJECT (dsoundsink, "(IDirectSoundBuffer_Release returned: %s)\n", DXGetErrorString9 (hRes)); } } #else tmp = gst_caps_new_empty_simple ("audio/x-ac3"); tmp2 = gst_caps_subtract (caps, tmp); gst_caps_unref (tmp); gst_caps_unref (caps); caps = tmp2; tmp = gst_caps_new_empty_simple ("audio/x-dts"); tmp2 = gst_caps_subtract (caps, tmp); gst_caps_unref (tmp); gst_caps_unref (caps); caps = tmp2; #endif return caps; } static GstBuffer * gst_directsound_sink_payload (GstAudioBaseSink * sink, GstBuffer * buf) { if (gst_directsound_sink_is_spdif_format (&sink->ringbuffer->spec)) { gint framesize = gst_audio_iec61937_frame_size (&sink->ringbuffer->spec); GstBuffer *out; GstMapInfo infobuf, infoout; gboolean success; if (framesize <= 0) return NULL; out = gst_buffer_new_and_alloc (framesize); if (!gst_buffer_map (buf, &infobuf, GST_MAP_READWRITE)) { gst_buffer_unref (out); return NULL; } if (!gst_buffer_map (out, &infoout, GST_MAP_READWRITE)) { gst_buffer_unmap (buf, &infobuf); gst_buffer_unref (out); return NULL; } success = gst_audio_iec61937_payload (infobuf.data, infobuf.size, infoout.data, infoout.size, &sink->ringbuffer->spec, G_BYTE_ORDER); if (!success) { gst_buffer_unmap (out, &infoout); gst_buffer_unmap (buf, &infobuf); gst_buffer_unref (out); return NULL; } gst_buffer_copy_into (out, buf, GST_BUFFER_COPY_ALL, 0, -1); /* Fix endianness */ _swab ((gchar *) infoout.data, (gchar *) infoout.data, infobuf.size); gst_buffer_unmap (out, &infoout); gst_buffer_unmap (buf, &infobuf); return out; } else return gst_buffer_ref (buf); } static void gst_directsound_sink_set_volume (GstDirectSoundSink * dsoundsink, gdouble dvolume, gboolean store) { glong volume; volume = dvolume * 100; if (store) dsoundsink->volume = volume; if (dsoundsink->pDSBSecondary) { /* DirectSound controls volume using units of 100th of a decibel, * ranging from -10000 to 0. We use a linear scale of 0 - 100 * here, so remap. */ long dsVolume; if (dsoundsink->volume == 0) dsVolume = -10000; else dsVolume = 100 * (long) (20 * log10 ((double) dsoundsink->volume / 100.)); dsVolume = CLAMP (dsVolume, -10000, 0); GST_DEBUG_OBJECT (dsoundsink, "Setting volume on secondary buffer to %d from %d", (int) dsVolume, (int) dsoundsink->volume); IDirectSoundBuffer_SetVolume (dsoundsink->pDSBSecondary, dsVolume); } } gdouble gst_directsound_sink_get_volume (GstDirectSoundSink * dsoundsink) { return (gdouble) dsoundsink->volume / 100; } static void gst_directsound_sink_set_mute (GstDirectSoundSink * dsoundsink, gboolean mute) { if (mute) gst_directsound_sink_set_volume (dsoundsink, 0, FALSE); else gst_directsound_sink_set_volume (dsoundsink, dsoundsink->volume, FALSE); } static gboolean gst_directsound_sink_get_mute (GstDirectSoundSink * dsoundsink) { return FALSE; } knowthelist-2.3.1/gst/directsound/gstdirectsoundsink.h000077500000000000000000000062631342115213400233150ustar00rootroot00000000000000/* GStreamer * Copyright (C) 2005 Sebastien Moutte * Copyright (C) 2007 Pioneers of the Inevitable * Copyright (C) 2010 Fluendo S.A. * Copyright (C) 2014 Mario Stephan * * gstdirectsoundsink.h: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301, USA. * * The development of this code was made possible due to the involvement * of Pioneers of the Inevitable, the creators of the Songbird Music player * * Patched version of GStreamer sink plugin for Windows to enable selection of audio output device */ #ifndef __GST_DIRECTSOUNDSINK_H__ #define __GST_DIRECTSOUNDSINK_H__ #include #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define GST_TYPE_DIRECTSOUND_SINK (gst_directsound_sink_get_type()) #define GST_DIRECTSOUND_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DIRECTSOUND_SINK,GstDirectSoundSink)) #define GST_DIRECTSOUND_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DIRECTSOUND_SINK,GstDirectSoundSinkClass)) #define GST_IS_DIRECTSOUND_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DIRECTSOUND_SINK)) #define GST_IS_DIRECTSOUND_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DIRECTSOUND_SINK)) typedef struct _GstDirectSoundSink GstDirectSoundSink; typedef struct _GstDirectSoundSinkClass GstDirectSoundSinkClass; #define GST_DSOUND_LOCK(obj) (g_mutex_lock (&obj->dsound_lock)) #define GST_DSOUND_UNLOCK(obj) (g_mutex_unlock (&obj->dsound_lock)) struct _GstDirectSoundSink { GstAudioSink sink; /* directsound object interface pointer */ LPDIRECTSOUND pDS; /* directsound sound object interface pointer */ LPDIRECTSOUNDBUFFER pDSBSecondary; /* directSound buffer size */ guint buffer_size; /* offset of the circular buffer where we must write next */ guint current_circular_offset; guint bytes_per_sample; /* current volume setup by mixer interface */ glong volume; gboolean mute; gchar * device_id; gchar * device_name; GstCaps *cached_caps; /* lock used to protect writes and resets */ GMutex dsound_lock; gboolean first_buffer_after_reset; GstAudioRingBufferFormatType type; }; struct _GstDirectSoundSinkClass { GstAudioSinkClass parent_class; }; GType gst_directsound_sink_get_type (void); G_END_DECLS #endif /* __GST_DIRECTSOUNDSINK_H__ */ knowthelist-2.3.1/gst/gst.pro000077500000000000000000000025521342115213400162070ustar00rootroot00000000000000# # Knowthelist # Copyright (C) 2014 Mario Stephan # License: LGPL-3.0+ # # Patched version of GStreamer sink plugin for Windows to enable selection of audio output device DEFINES += PACKAGE="\\\"knowthelist\\\"" \ VERSION="\\\"1.0\\\"" \ GST_PACKAGE_NAME="\\\"knowthelist\\\"" \ GST_PACKAGE_ORIGIN="\\\"gst-plugins-good\\\"" \ TARGET = libgstdirectsoundsink TEMPLATE = lib CONFIG += dll DESTDIR = $${OUT_PWD}/../ win32 { GST_HOME = $$quote($$(GSTREAMER_1_0_ROOT_X86)) isEmpty(GST_HOME) { message(\"GSTREAMER_1_0_ROOT_X86\" not detected ...) } else { message(\"GSTREAMER_1_0_ROOT_X86\" detected in \"$${GST_HOME}\") } INCLUDEPATH += $${GST_HOME}\include\gstreamer-1.0 \ $${GST_HOME}\include\glib-2.0 \ $${GST_HOME}\lib\glib-2.0\include \ $${GST_HOME}\include \ LIBS += $${GST_HOME}\lib\libgstreamer-1.0.dll.a \ $${GST_HOME}\lib\glib-2.0.lib \ $${GST_HOME}\lib\gobject-2.0.lib \ $${GST_HOME}\lib\libgstaudio-1.0.dll.a \ $${GST_HOME}\lib\libgstbase-1.0.dll.a \ -ldsound \ -lwinmm \ -ldxerr9 \ -lole32 } HEADERS += \ directsound/gstdirectsoundsink.h SOURCES += \ directsound/gstdirectsoundplugin.c \ directsound/gstdirectsoundsink.c knowthelist-2.3.1/images/000077500000000000000000000000001342115213400153315ustar00rootroot00000000000000knowthelist-2.3.1/images/DJ.png000077500000000000000000000030771342115213400163460ustar00rootroot00000000000000‰PNG  IHDR szzєtEXtSoftwareAdobe ImageReadyqЩe<сIDATxкЌ—{L“WРЯз”RкЏEhKIЫЛСq8д'SуœЙ8pўAйК-&@b6І‰љcџ:—(.Y„%ƒE„љШ "йР ƒl€­‚(ДHKiћЕ;ЗSЃHPNr“іћюНчwЮ=ћQnЗ•ŒŒŒm"‘Ј”Усh].—јЭwl6лЪ0ŒСjЕžюььЌ tO*€ЌЌЌB@p* e||&&&`ffl6 №x<РW ‹A"‘EQ3‹ЅЂНН§ћ vэкu ­кЈзыarrТУУgљ|~=>ћihhЈ…Ь‘JЅZќї*“уoHNN&@чЯŸЯЇрm=zДFЇгЙ#""м*•j*''чs_ѓЩШЭЭеЂђaЁPшЮЯЯw;vЌЦз|ЏЈЈЈЈ›ššњЌЗЗЬfss[[лVX€lиАЁ НU˜’’BJKKП"XLШпŽЅ@Ыo‘ъ‰еRy№рA•WДњ@\\ :дjѕ…Ѕ8{іьЩ‘‘ІДЇФx@ЫЅ„PTTФE›KP^^ЎУFЦУє†ШШШ=^ађ*Œ|шююЌч6\Ј]ŒТ8E œІљ€ФєКuыĘUЇГГГЁЕЕАЈ§рЗс":44єжsљХ‹MјHёЦыЧq]Ы|ЪeJ5MеE иŠФфєU‚t3ЕšІПћ!њ§`оjЕ™Yэ›Зl Ѕ…BиОm $8S§+<z7[Z`Рј зVЭ]ЋHвw:Хb‘’’G“TЪЇ˜U;*OžЈ rZ•”њWоЦMЁ8pђєЯžЌ0 аиtD"1ƒFЛђ Ю]?G9ЭbstМ мжЎЩ‰jhМЂЙдt­ШлqНV&—ЧѓnwtТ•Ћ€s˜TFЛн&3œЋo€О{Шћp#™^2gљN—‹-‹Š™<С…iЧВйx[т@РЫЂЂїbƒ>ьbf‹Х*&зѓџRc3Ю‹7dЧлw W‰лavˆ6mЪcZл:=‚ћP- ‰нa'‡ёъL^{РѓŒњ є?žљЉZУhhZˆяYЛfїvч]Bќ8€'(нk<#^‹ŠвLс<@%рЦ{ ёЪлEŒ)™БО67 д)*ћ… Р8ISsTћJйw\ŒѓБ@юQBЦ–ЭyžЫ'ё@цŠtВЁˆXъtиЛЩšЈиС EBX­Ш]›Э%Бтp:Њ|Мxё,зюзІІ&“ж ri,мЙлх FMF^ЯL 7КхљГ•ЋGGЧСd6У#c?dЈг уvмг?tЁwі`̘^zЂ–GУгбQЪт8MП_'ѕЄhb|ЈkQ–iйј}RhbbbJ•ЪD„ŽpWџRmДZ,чТШ}ќњGiBкњЁў>“}жZЩ уЩещщзн S9љlИ+аОA-фгь•ХбД@(nС ь6ю ЊUњћа№6$б2 е њZБи=|~˜"Ё<>Љ„qГ6ыЉХюС Ц{<~DŽА`і Р<1њ<,\x'˜=ў`Љ_@№гом2IENDЎB`‚knowthelist-2.3.1/images/backward.png000077500000000000000000000002271342115213400176210ustar00rootroot00000000000000‰PNG  IHDRN‘'о^IDAT(‘вK @!аŒЗ!qџKˆ–dЁКЯшФ!RМет‹d—‚“шћкtзцияцšfНЦ(dŒ@Ю|БgО)y Їa”Р |§ЬjŽTЊзГгт„И3HIENDЎB`‚knowthelist-2.3.1/images/clear_left.png000077500000000000000000000012041342115213400201370ustar00rootroot00000000000000‰PNG  IHDR(-SsBITлсOр pHYsЛЛ:ьутtEXtSoftwarewww.inkscape.org›ю<5PLTEџџџ:B:,2, =><=>;ccc01/$%$   !"!"""''&/0.111231777:::=>;???AAAAB?DECEEEGGGJJJJKHKKKMNKNNNNOMPPPSSSTTTVVUVWTXYVYYY[[[ddcdfbfhdhhhjjjjkgqqquuuyyyzzz„„„†††ŠŠŠŸŸŸЌЌЌЎЎЎВВБЗИЗСССФХФЦЦЦЯаЯдддооосссчччщщщъъъэээ№№№ѓѓѓєєєњњњћћћќќќuJїЊtRNS..??TTeeИЪЪдххх№№јј§§ ЉЌšIDATСРŸmлЖmлv[{џ#„=@я5ќ‰. SјbЪъуAП7ьД}ј`+Š3bRѓЂo\UЊЖмyЩй№5бLВtx<Щ[!b ёGBСр”$ŸSS €ЇЖXm‰Уѕt=цt:Мq”§іМ)ЏЯ;—,Й#ОЬЧ*ЋFР€/†д›Ў6Л­jж MhІˆёл \rН+/IENDЎB`‚knowthelist-2.3.1/images/database.png000077500000000000000000000023771342115213400176170ustar00rootroot00000000000000‰PNG  IHDR йsВsRGBЎЮщ pHYsььu85tIMEй 39й…Ё$bKGDџ‡ЬПƒIDATСKoTчаѓ}їŽЧЦЦ#JPаPб5HЅ4‹>дUз]vЉнU‚љнД›dпJHU›ˆ*­DA Я6ji„ƒbА ј=cЯ{ю§zИ1 ˆW~єѓЗТЇыћ'ВZ`'э џNЗџ|ыђ'J\9§Х‡Ын2 г0)Ѕ”RJ)Ѕ2i˜†ЉLЫн/>МrМwшцеfкM­дIНдOУ4LE*S‘†i˜ЉŸzЉ“Zi75гЭЋяРЮ\јћоz)“‰Ђ  IJIR* E/ЖџqёWw Р•љ_ќgr,‰rQ” ‚Є”DJЅB!hvўtђђ"nќѕШOJd‚ )•ˆЂ()ˆєЮOЩ!^шI € Л9яЧNЅ ’$I‚‚’$!‚€Vх§xЉЬ9ЉйŽЕ=J Q@RJкж[ЇѓлЪoF“Ў ™ @ЁЅcqьНœAжŒ+NišPк,jФaFNV вš5G QPъKFl[SVЙ<Ш6ƒV|Љ4.ŠrUUUUUUUUЙ “ћмЛšІз/ ˆ|НTЫЌ|ь{ь7mв”šššIuSІЭкkзmЗUlЉЊO~‘ѓ"пЎОюцнГЅЅfЬg’ ушik8сЈgкf-‰оД8К•D‚ЖћЮxеВ†e=Iзsm]-}=kЂТКroxлз ЇZ­rђЉY]tл5гR7iZЎЅАу‘%ЋrП4ДeЫŽЉнzAN'~k№а† Ÿ:ф]UыjљJD2bŸУfŒюј›ѓ*šО3ќ(’гmзпrУœšEs^ЕЯœ9ЙŠ ЅBCн”–­ШE_:gЕоеЭŒь†u?vWaз–`ш–ŠšЊЈЏkЫМя*tЌЩ<ёC vТ`„\шEУ#›~ +јЮ›СИI{dКšкиqл‚)hXWvЃг #­8В)ГцœЯ\УŽЬИ1QOGЧЊ{^wвЎ5ЁэhЋШ)GGk/YvаВ'Ю›їІBO•(Uкђм-Нbгкp”\Ш+ СМEЧмДiNЁъ3СЄЊЈЏmУО­авpРŠ†žЩ*B”†нЇЫІ}Яа˜G:JCMЅR’[XВfоsžk<-КRFцѕCяd!sNЭ‚olxЊjЪŒ }лV5-ZpРїmк‘џцЮЭеП<Пйн0€‚Ќ2:ZŸ82uЂ:_;85YšээfуYoБёUыqw{аUHќкІНБњDIENDЎB`‚knowthelist-2.3.1/images/down.png000077500000000000000000000003131342115213400170060ustar00rootroot00000000000000‰PNG  IHDRѓџasBIT|dˆ pHYs  šœmIDAT8эЮ= ƒ`„сGЋЩ!А xƒ:Ађjc,>№'’вЗ›н™йхфямqй№ˆО"– žИ.„Ktж.ФЈ‘ѓђяf"М‘NКBЖd\+yЁЧэоыaЩэH№фFd{ѕG4=IENDЎB`‚knowthelist-2.3.1/images/folder.png000077500000000000000000000462451342115213400173300ustar00rootroot00000000000000‰PNG  IHDR€€У>aЫ pHYs  вн~ќ IDATxэ ŒfйUппїе^ееећ:нГ{fМŒg№Р˜ёюdƒ,Ђ€ AФ1V0Ф СˆC’ !ˆIHQАB"ˆ@“ QHЛРлc=[я{UWзО|kўПџЙї}ЏЊЋЛЋ{КmcњVНїюrюЙчžsюЙы{_QмvЗ9p›З9p›З9p›З9p›З9p›З9p›‹8Pћj­ыТТТОСССяvЛчTЧ—ъѕњ‰ўўў3ђOеjЕљЏжz_oНО, №дSOеO,-5;ЮН[Ж,+мЙ^ТЏпh4^?00№gЎнnR†y]ЅgTєI)Х…(|\сSЋЋЋ“ууу3 ЗrОЏіч—TОџGџХЃ}EёоЂнўњfЋЕЇл)ZнZqБшtOзjѕcЕОњБz§xЇл>Uыі]hmИјБЇžZК!H˜п! №>; ЖаsА|JјEЋеZбсŸеѓДъBAŽщyBёчGFFPž…Пjм—Jjја}И^д~М[Ћэи6Q>ИПи6БЕ($”ХХхbv~Θ›_(‹ЅЅЅNЋнžmЗ;‹nqІ[/NіЉ•жŠкбОўў“нЂ{ЊПЏ=Е}p№’ЌGc#iH№?"aџLU2œ„joѕ‰rpЁ U%‘bВ&mСЮъšTF)kэ˜№“пжCŠvfqqqjЧŽѓJ ф.с+џі%Q€ќ№G~X­ћЃƒХ“ozЂxєсWуccEНO­Qьъ` Zm],ЏЌH –‹љ……bvnΘб5;Зр№ТтRБИДTЌЎЎ4$€йNЗ8/Ёœ‘ѕ8QяЋI В ЕњЩхNыєПъŸџЫБббїаКЋЎ*tтЋс+љГrdЩa”kEє*п‚Ъ™–тœQж"[у*тЄъ5yњєщ™Ч{ЌYЅх+СЫрќШ#E_ёЧCCƒcпљwпU<єŠћ,шщ™йbA-72:RHXХ№№PЁZбЇV“iJ] F7›­bЅБZ,/IAЄX‹Y]sRЙ…E) ЪБ\,-/#”…ќОї ІgaАЙ'Ѕр)+BH$ЄhMXЋбh“S‹sч/hБЌAbЃјЎяxЗТч‹?ќу?-іэн[ьнЛЇиОm[БUнЩ№№№eњГŸћМ+œх‡˜ЭKЄ+w|Сл “кƒ”е5gwN--йѕ`ия˜K33l+††Ќ$sjzК8wсBб~FUї‚ыя‹qƒЭлЗ[9іI)іэлk?c gT–ƒю+їё(F[гWЌSЖFFИЉ[—йЬФиии646hHђ­FkЕ^ыЮЬЌж/ќрGўѕ™ZН~ЌЏЋщm_qМо­Ÿарш\Н9052В2ГVOo™ht{HbЃ?+гмЇ9ПФnЋпUˆTБb™b“BџˆUМЂ /oЖ<Чg~Џ…ЂbяюнŽZвЌ`B ЈЅЂЅi$ІЄЏш—BTК Я-]t^š—‚\*О№м …К/•лѕ`US蘽зю];m1іЉKСŠьд€tBcQMc5aъё‹,хЂt8ЪрЪŽДлЗчo+VVcіЂiьІГ{ѕдЕђšeбOкЊІ“L)еэ-vћгЋкљњБŸ8)~БцpЄжэžшtkЇФЂѓѕеЁщ~єC‹Йœk=o™H№ŒŽж4G_VП,…B˜ˆ;œUBоФTu ГЫ№ВH ŽБЅШи:юcaіЛоёХ[žx}13;WL]Мшnш‚’eІ/ЭxqiIы ІлRLПœiPPZї‚ъ0ЋХЉ—ŽЗх лСŒ3…eЦ‘Л–Нš~rэ–r0[aPЪь„юЏ.рДLэч%бАИДЈYŒf8ъ~XЩжХiАі!ихх•4Н]“rŒiœshqyхБCуЦ@ЊƒШьЮw†–'?јуџцœfP'd%iьhбщћфП{ъG>эBзнn™hЃч•ŒЮчЅ-iЛЬY-ю"П*QбўЃH”Ф.ФPAДТъG’P€–иlцЗЈ%NШ\#4˜ОwЯ. їˆБї'ФŒ%;^СcUqffЎИЈc”I)Ч$Ъ1=Ѓ…І91UЧ†[1ТУHFгSŽU™pЌмЩгgJх€Ф~;F5ю@РL_wkъz`џотЩЗОй4ўњџќЭт/ўђЏœЭЌ`QшrЖЋ+"Žn‰ыn­‰`н` ‹FЙЌD.…‚дЕ‚:БИМ<Ё№}+ЂлDVЄ[ы4>ќ?ѓ[2J?јГO}˜бвн2 }pTѓwVћB–\IЖи“PEЁ q–IЎЋЛў1ёБS„YR†йДH„fŒБ\5Сšƒk‘iB}ўЖто{ю*[НцenQKЫБкˆЅРbXAЄ$гъ"fцЄZФZVыDнОЖІЗ№4шРG=ЁЁЅЎ…n…)ьgšЯZ˜oyу…6Уl…šCФ fR№š…(‹ yŠ‹20‹A9P&шІыбЂи%џ~ fЩ ”KЗСЊшщГŠЯ=їв`Лг§іfЋЙWc‡wш*7иn‰Мћ‡~hЄГмО[+_Х…Щ С\jU6oљ{2'T?ВbXВyw€dСЊpMiн09ЗZ_ЇиЖ}Т-?x‚Љ–щB„Bq9ОлNeS|‚­k€‰"q:xРЄrЃпf1ЧћВl—дЕ Е€Х"жE њвЌ–Ищід2›2Эu Е Ъ’ая<|Hk[,œUЅKАД ІЕЬhќT=МЂ0Bœ_\(NŸ9kСвѕАЕ % УШ+Уv)ƒX,ЩС§ћ‹ƒіiщ§)ЭDё‰?ћ+fBoZlжоЅЊўFb…FDЗРmmдї4‹іўСОb^9H,3—>Ю.ЫRСRђфщЁЅgCAЭ ыFRцRtрDѓwkŠ‡ЙІ%W0G™ыю™&ЂГ??С…cЩ—уyŽh6РŒ€ООVЛW$жd–c ‰щЅы`#kZ] JaхrђbqЯ‡-8т%ЫbLТCБl=žй^ќNЯ тg( ],щФЉS'ZсзWПђЁтлОѕ]Ию(^qїХГ/—тдПI ЗVФМЛ4‡Y‹+ЫШM „А#a*ТMЮЇ;Ё“A=JeШ>*:)FR.тФФ=ъgqY`јГ‚TуˆЧUуЊўHнјž•Ѓ[сg\ƒš&Nx„Я]‡SДž SYF1;КцД§­­ёbX-&PЪЯ‚ЗаІЌjœgФ%% 0†“_РђGм'?ѕtџё?њžbпžХsGOЈ{kпY­е-Б2–їжиСcхО‰*RЫфv„хСЏєggЏnДЎиbТ‰UЫk+L#г4VuWl5~#Ž[џЌт^яЯЪ‘Ш›ѓУ.ђ’і>šЭv1Є~E АЁІtЛФ ј`zЖqJ д%ѕBiО•%Y”ыФЩ3Х3Я~QжрAOSWЋЉ€(ц–(€ Ыщ`‡чгЌйSЛ*"Э‚ "œ@drЙХДР1ЇVžъŒЫщ5/ш0ŠFLбЊЬЯBЈфЖЗП‘?ЧmіYХŸѓфИ2,i30”ШєЇ:XЪ…2„ >Y1ИхYTbd№K€‚DЋUбPŠАЯNž:SМњЁН/+9›щсyk е~ˆ ‡:LoЅ‚I Њ4Xћ­ŽХЄчЌŠУѓaл#)žЪ'Lh>ч иТЬžŸœt_Э9KVBСвb`N0(ч†‰сЯOаfџњg*ВL_Ю№9ОњtšЪВИLDѕŠj*œЋЉŒЕNJуЁЫ‚з“AА;Z %^k,ЅiT— ‘&+-д)UЩОˆ)ЋЂ ’ЌF9tЖШc$„щAцЭl§дGС .ŒŒwjdМ{з.­мэд лШZ бшх`™˜е;ˆЩ}gV ШДчg5.шСфp&чЫOвPPиюvМы%ЈЋQM8E”юЎЃД ћK.*Птi§,“уB9ŠbPжxe%ŒД!ї'ІлMW€Fпи^qђ@ПњВM_шП“Ш]AkЗЈ†Ф5Длєѕ*}YоЦ  ™1)gВЁT–І€['М№rњЬ9Тч<шšб`ыЅc'”%ш№9ѕЛLŸtиѓщМ9ДGуцйЬЏ9 2Œх,ДцО–ЉцеЄ*hъPuЄбН1dфŽп5ж­фGЮ€d‰„{fšСƒФ@ dOJ'-Хѓ@Љ™ЕАXФЊЂh‰\йнtXИ4yчР№Ш8 g•ЪmW~гDЉAuЊœˆN A>бјz‘с 8ќАЬАD%0fЇVЫXŸТZ]m*_эљшнoЊєяогm­юч„ ]€ЩИ–6Qккb’‰аш:œXЎф€SLЂ?%*Ќˆ”ПЧ€шK%аSЗzO~м,v№Ь|чE№И У›У!4ОTžSЙЙŒ`:X[Q*ˆЫŠ ЁуЌР"ˆaBa0Ци„ ЄH7#ѕXРeE^R†rхІ‘VЁпbЦEРˆ\.;ВљŠnЇ§"ЉUwS лiмЉзV˜АЌA”ЩЮu$ЄZв%АС2ЄQ4§, 7ˆђаŸ!QБeо\ЅЬˆHbі ‡'`.ѓz6YxYd,я\ЦkJС*@*4i—mBщW%№щЪ(/#вidШ)ŒxЏƒ!,Г lTр ŸI_1SЪ•0…6РВDє-d2e –1”Ћщ.3ЂfЃЁ%%wA_КпTа0їУУ56>8ТДЦм'ЊЈCs•.ЁЉбђˆOZ ‡WJ7ўs Ш-ЋЌU&_0P€уU˜;іыQ>и€Т1šЮ]E‰1DfŽšхР­4—@:ўT^шNофœUЗ@UIP:[г(шˆVGй%œгi((™ЩчЪA ЗЃЉ(Ѕ™К[Й­dHАђRОыЌXf0HсhœЖВѕтkпщРйЛпTP?ї#aІQьћToЅ‚.6бژ`IKХX‚1Цб_’?ьƒ*ьЊ+5хN,; .€ ѓ~}ВьЩђ/-„р [м…ЇYЄ‰ЛСkJE$цGйНј„.‘Ђp2ЩХ=pD™F)њx!–5 vujGРд —rЅl–ЖЃoёЈ)b(IЕ"dzQРwќR ‹@Ÿ›ыc`ЖЦнTачƒьCs  KpE’Ё,U Jh­є‹XƒxYTЈБ2•`xРG†^lцЫс (х\˜œвhМSєЋѕGЙЮ”ђІќ _Є”Хх`/:ьx*S‰њtхфя0iЯiђЂ LY—`†€udœф•р• .s-ЂрHЮCpдїœ5з+бCdI~ю]bqьщ оЄОi №ЮwОsh~Е}Я цœєУарM{Њ5"к˜Z3ЋЉыYж@љI)žсJpЬ'dЌрaА:ч/ш юŠђPV&ђŠe<Р—Hд№]7›иT&qvV…тпеˆxнЁЩѕ"& R Ы‘  _L[ВVŒHU$ЎДѓ‘7"u-irvwJK@*0л"b9Є"š.‚уЊ  Гc§/^ь{fчЮі'žz*ŽЦk7пlъ=€к–GѕЎМ!ЬDs{ еQч н `}"ˆЭ В§ ‰м ?цI4І•srзbаВа+`uЗGА9“ђи]БІ(d3 tъ6г oBZ2?@KL‚ЃхГŒЬ˜dRЇ“ѓъb"Ыu „ьtˆ3‘,ХMcNъщ’В`рƒ3‘xŒ4”|D Хщсnчђ) (6T€ї|џ|ьжћž;~ю~хиПxЎљяћўгкr}VФ?ЋНX tO?§Б•{Ыfѓ`Н>И•ЖЦWЖЂ*бNqЊnСрЬbyA"Ќˆll bŽЦQ,Fџью-ыєчѓ СнOј\J'ЗаTjŒЊHЋ~( Gl™":“Љю)A†Ž'ѕ!w`8:Ю йЧУ\_%Œ ›Dœ# g˜ŠфФРєPNшКd‰’Б Шт”ˆюіц,Рwя?}B']џ‡^Ѓьk^йМѓаСЎ–,kšF<увЏзЙЈП=tцмљЗ]˜œьœлЕc”)fјРС;ЌuM)‚ЧšOЋNђЖ@СѓъЕ•юбЇЗg5]di7mЎФАОAџС‹їњиђфф,Ÿ˜1ыR v'X`m^U$y2M9†pŠN˜*аф.]Ю‘гйкЊ "шcє?Ѓ§ъ аЃЮ…‹0 Ѕйй›АІhШУ9жД&ЉЁ4mЋёp@r›jіЗљZкenМћняд{jwгыkоЯнžВœ:sЦылp€ЯК№Ц‹ібЛwoпuзЁЖЮЅ5є†ЎоЗу NТržОmŸбЈ—eHVйšЬ’Ю `ЎQŽlтБa-ТrИJЊP[&ŒХ#њљA­ІБx”†Xb@ЖмЅSЏlЌLЩМВЫ,Ы"1;Ъ\Sн#"ИЅ`АUmeЌ25K›'ЅшY#G•‹X цxJŽжŒmeж(XЂf†„ !ІBSŽЫ(Šа‚ э7x*š)›$nŠN#GСX’Їџ—6œњ•Ÿџy™ЦЫн y Пох4ы‘ЃG‹џєё_.žўŸЌvєrBmпО}нУ‡я(ю>|И8tш NкьVcъі3лЇИџ^ЗzVНиwЇU.7ДQ2ПЈ%тE}вE;…ьjNW{цsЯ ЃЊ˜^LЈЫ їнqЧAПQЛ_Џ?I)Š­:YУ л h$ц:жЅѕжŠ›з!…yсу?<ѕqG+Ц‚NЫ  к;р\›IПЅеCЌ_aw‘Љ ч%M=чЯOкєeЋBm‘-Œ‹і’ež8W'˜,yВњРHr™ЇО)œ9I ТXziЦЁ8•СЖ0итMЂњ -[1.|И„,с…’RY Т-A‡зсВfЊ+Ис SђfSч2Лэаe5 ЉнуЯ=џb§”ŽUmз[+Dš{Сњ.ZB•†wѕ‹О“gЮ(ЯYЏuгyЅ‰=pоППћюЛ§N\МIЋ%Qѕ‡уЙяrжЩnМЪДЊ—0Ѕzэj^_ уУO ь­(Хœ•bQ–cu•ї xЁГOoяђР‘Dр +ЛžЬЬ=ЅЉ:aЯ{ с{@@EР)˜Г9СEш†2шпy{С­QаєGИ Є/ˆщ•#mЁдPWЂ-~Ч8Ю‰(i.ёY.Ѓ!Цz)ыsђФqdrй. 3ъv™шЌњЩ'OЉСЫ ЋХgFи‹ xЩSР џK ZэЖv8|Р ‘Шые,]аоќ‰3чmі0нLйvшА4§­NёФД#bдˆuа:є=я'ш5,™LН k…АRЈ›рН<њвyY,ТЂжК5еA‹X€bрѓ`>єzlA…з<Ь-8Х9щeс”ЉЎ SѕФ|p• *Ы"Q>)ƒWІв5БJI$Т*Ы(:ЪЁ@\†­0ЌоTо0ј4Oћ%ЏJЃдТг‡.N^шЊы>bR7И]Іfq|n~ЉЉЦЅ˜Ш"ЙLgЌLˆф./8Ф+вЂWЧюд}К–A\фƒ /‚ьц[ иZњоOЋ8}юBqL/,PK`8ˆI_Щ8х€iёнŸ-ZD™ˆќЊ,ЏL/KЩXпF!x|GOœ.КЛиВm—ЧŒ)<иT7Ує‹ВЁЫJС/”УŒж-sнOзV7Ы"CNQ5жЅС ЌJ#•:ћеqЭx…›A* ‰Д5N ЦVU№кВuЫeU3ЌCv]iрЄЈ5Юѕ€aВёДЈйJБЄAЉ>6oіІњєœЂмєЋОT9ДDў`ЎЙ@сAШзs€чўApFGАчЁUU}Dгb]дє5­Wa Xx{8Ѓм_~7`ˆF$ЭX_ЪeEV]ЮЙFk–/œnш.S€Zб<ЇM%кик^\ЎyЫТЋВ(К'†-u C:5iЏпPžFSс l"‡™ЪшЗпйЫŠКя*жЃэ-ЕиЖЧ—цNЯНt ЎК_ƒ™лe-xс‘гКwшэн;нЁйKŸ`›Э}Œ+xEКщ­P”!+Х’ІŸ|pV0Рd|БИˆЕшНбЋ ‚]IгжТLH‚ сЃдўЛ…ŠFžVn)8SвЛ№!б3g/'ŽГP"Ÿ2сВ‚Q^ТЮœ`ЗV;DьU\J†ƒjх<ў‰O|тŠп7ОLц''Їwям;ЃЙєŒl‹РК'ЊЃ.‘BяђW‰x;)€žu„JI­Э/ЦфжB~ъbІтСТHxн8yT–qE БYT˜жТ,тЬЙЩтј)Н.­0{є-ыuŒ+итнЬр.уо#+ТИ„2P КEXЮŠСвѕВТЌM`-Е ™-ЦJъBXЂІМ /):ТFaЕuЫД›еŒВШJMk›z1Џ„d –oбx“y&=HJ#С.У*œЃR  №-$бДц=€ ˆН—)€ДeёŽ{˜дОў]ƒш@ƒJаŸIЂ,оV"^Š ќ>Н Hл–€b‰& Q"S­8ˆ 8љ<(‹XƒЎУ‡IˆЂv0WОh]ђ›ёmЯ+дДЕ:Љ]@О№ёљ/ОhJ§ѕQКЅГxХK|`a\]Ÿca\+П2ЊqƒMf!ЌисG)hХ|,b^sј™KгХмьLС4uE0ЌzЂXІYt3рФѓCѕоЏOдБЭ­еRu;Ћ~mль0”nL§"gJH—Х“e ЌBk#<Ю` ˆТIБЎ8 ЄЫќъћOŽ?^Cz4u“&ђєйюIЈ^‘гГгэЇu[ан P„*o˜tзбёT’4”{’50ЭщрqI„U&‘КdђG€ќCbў6Y€­вЊ=fU^жXADˆ3ѓЇŠчѕ]eр n(SГ]3№AŸжб@tЋЮЯSS5„Ы6ъ–BxАœЌYжв*§9–bAЭy)D(ХЌЛ‘А6™^›иЃЏсЮi–тўЛnT*9xЁ )k—)‡#K ežˆ6х ˆ|Ї@ЭeУM \ЮF P4кЭгвfN>‹ЇТœKбР[€"HДіЉПѓžc3Hqаl‰™—-зчџЈГk*(Кѓ)1Т №ЭщѓPЪ‰т#VwkЃyзr'S­КЌ€пЕ‡ )­„Ъ e`РЉ…$™p„zZгву'OлЂА`Т7ˆ'xMl'п)ŽГќМјСxc‹6™˜FВафзн5€ ЅbИыBЈesюŽ•Lš,bЭЩbЬiZŠ‚aeNыћA(Sсъ€3ИЄ:С*Зо•ЪQILРС—JEа0xГ‰E3ОЊЎ}МcˆЫМ*РjcхИŠы0ЏЇпГЄ% o9"8: YђЋ‹С§y€9DZЕб?г/vYŸЗ3‘ЉкЎUЬC+Ѓ0“H‘<•+џ”Ј+ZБhYLѕ|Ё 6ЩZ BИњDЄ™ЯPR/Фа…Є‹С&є]дЧЂЮOMЋ•О œкТU+b ХJ&hкЩИB~f&ЛЖo-іюŒх\„‹RХz…ЌDХR@гбsкљУ?/jCcХУОNfyо–#КіщUCШ№ЪVQe‡+=)LGДЃ| 8Ђp(<;Ѓ tХ}sшlЄl|пXVVOЩtЗњњыЫЋMб&uЙaЋ$˜ЬBлэn]@єѕ4iЇZPI|ЋЙъ|0Žš ђpШтж3y“PtЪR­*%еk/ @4žŒy*Xzc1HпёSbќ–:ЉR(nV%Aq—dюge)^д—5€щWЯ!KО(Ъ‚n„A( YлЌWylb1иу0c•|@BSRu!Ыšu,hіЁ}u[ f$І65И‘М)ыnтSˆx7H #њйДc х:§;vФўsFЖюЙЁhP?|аYв@bЫBWпјƒлД>•С0‡В`Дўъкшг{9юп<џTу[ HЋkШT‹q(HЈcЉ є[У„€КP9”ЋŠх$пК2Ї,FеeZcNM_VMљqј‰Ч‘/Аъ‘”/qз|ж№ŒъуЂо5,‡ЛДкВАNщ…R–Џщfx%Œ7;~ЌW№йYX „Nм~}žeЯЌhЉлц|`Šї8 ‚Rаmœ=}J–,ŸЅшЊ ёЉсхžЁВEfі3/K#O?э›^ŽЕО  ГЁ/q€ o*БrЯ=wy0(Zѕ“2ЖЌ_€ZxMќљ_аЦcОєМ—гБИQed™0и!|‰ FLNІьУ№ЁlЅ_q(хкpPh*8їїнЫT№ ŒcM›ў&€\[OMпщoњ˜Cб ”жфW•U+šFyL•†v7t^Sа_Ўqn“eD„РС›Љ–‡М§ъЇ‰фTБ‡Š‚3- гB1уМ3Еш$dГOљJ|/ЯшХlсЌ”ŠВPn*І*xеK‘ СYtbш‡)ŸŸЛљТŸїh|VнGеYЁѓїˆѕЫУZРКS[ъПюQ/џбŸ§…г}щЅ #бY ‚˜HшёO&’nБц#h>wаэм˜}gЕЙzvttыыЈ!Ю%hКЋС'ѕ7ZзЊД€0ˆD%Њ8ѕЛММPŒŽёй€рАХiЌСXуЄ˜2ў3*ƒљF_)Tt@цЗ)“™ЇaДFЎ 'ђІ\  ЇЬФЙJ JEфdGЄЂгУuJЄ%А^&шb?C;.ž ‚w@k"[uT}Žšгm}Рхфl‡dž1ж+vяк]Мё‰Ч‹G^ѓътuЏ}uёGОфЬЪЄзн‰А6ѓ3БеД7=z0ЫР1MеО4щъnУ.€,ZЏ>%SІrЕ(ФЬ”OгA­§0Евo4Х>Zƒ–…”&f˜к”УЭH_ЦжЮнˆ'жdрhкrxС#!ž оєћѕb-‰Ю“C!mMЅЂu7‹KњМЫМ”`њТy/ЬИ…mUьбv\[ълЄРz”Є:†[аmš2™‰ж1СЎ‡ѕ'‚Т9}WO7Р1wКЊС‘!gЇыŠеCБU С‹"П§Лџз‡Eо№њЧ‹/Њ+8ЅЎ`AёъI’Ѓ™A7и“ЯŒSŒў‰sš’˜а%jWvОИџdЦpЅч@ѓкуА‘ў 3OIIОz*Ѕж­kазЏЮсыVТ5L*W_Хаќ˜ƒlсh)n-˜EНOЏcˆžЃЌrQ>Џ˜гЪйи˜›гwЕ”+\єУ0упRыЂЬLі XИžƒFрєLВэђSФAnЩS*Š=Н,ЙLѓ ‚кQH,cŽ ЌЪоЈ??›г)ўђЏ?SдОпўЌx@н<ЃЩ8Oe ke$А а@ё>‡,с…њRуŠ›@QƒWІoзŸдЋо-о`YYбŽ-96ЬзN­#hы<†ЬТHLeєoІЏщ@!Ў%S}ЉиЙ{ хTsы­њЎBG^Ў•ž-)\KѓXЦ> ІVOZПчUвЃ\•фyМЌC”Jрf =ёŸч*+ВRVФ*.Ј6г’Сy*9є„Ў]‚v’ђdрв#Ž%mOƒщ–1†рh<Нц+%Єѓ=ПюПЯpцi‰нкVfЭбF:І€œЗрžЮ‰Я>ѓйk~6ўЪ БzКнlЏШгŸа"Н3dТЅзv]S<Љ§"Ь8#ЮŒ’п#sзКІЉЮœОВUЧЦіkvЇ—fiсX–|лš7ЏxЗŽuvIТFЛH‡|ОŽu}авx @ўвЅђ` Л…œ@<Ш’Ф?ІЕ‘TIv.Ѓ"‹џPnЌH‘/У˜PхЂЌ(ЂіIмџ“Ї‡KI‚)ѓ(Х4>iЯaмќ“6р!iJO2eK@Йv  Р”t^ƒOсПъpЮzE˜^lMЊ/™гgдFд"­ЃŒ!\ПтЉЏ`wњM  EѓЂџ…`‘ЋtЬ^^ШSHЅЕТ&‹СoјИ/DРbœїVXН’ЅpЦLЁ+ €•˜‚/§wN ЏRˆ0…Ы/tg‡\„›ЛЩ{ЙsЯE†<жЁЖЉЦ&О јќyk[ТШlТ‘qуш–ŸЌ™0ЖbЌ€ЫЩД:BЗuDЄ\ОC0Љ'хЙц TWT€чџЊ˜yѕ§ЫгCC§ћеBе@Јћф"L@–€!‚L?‡р!ТwЎщЦbAvэмЅWУW‹KZќиІ5r–Cэbц!о№ЬГ@„tьxfбШ7,LEЋе4ДЪ œH ЈШ—s“зџz”ŒO‰I'zEEС7Q+xzPшВpR`xcлжmўŽПеNqІЯшuф]уш ˆ‹С’/Ș№‹` CŽU!ќ8xШt—_ёлMЪWђƒlРEФ)‚И„2+-нЊЦdgŽйБЉп#ОЊh7ь$У}iъъx“-LёpG{Њ$цщФкšmŠ ъ8ЌБЄ>Љйj()еB№P?=5ЉўДOнƒ>я–Эxц‘+*0з’ЇœŠъ9Vжтšѓl!ZVj_*Њ‚ЊDƒР‰€Bؘy~ǘ…(pК8GЉxMz/s$|(б*†ю‘1€T™фM4€5ё!•Ў;pГRШ/Ц’/wСЯРlЄАЬOБњu4эЧшТкЋ>ЎЊЭеХSкj]ъX\^в/Рk/UЖZ#ѕО N gЊŒ{+ˆ2…ЊДвШФ,Aє–L€Šbъм9хЋЉ›ицJ82’’WЭќтIНOYТАU16'”йГВe!ŽTЊёQі Aё)•aэтщwwdэ W’Qz7Š‹цXF&е*3КЈ‹ šЩ" OJы•1(Ь)џ@•ОЕˆGИx’%ЉИ})‘Fщ.ˆя3Ki65$яU`jvvR‡єžљ6„Јˆz6 г ­ЦtsEM<-’—ўœ6‚щЁХmіЇњЙєcwguРSyј‘ЧРiШ=e1я‹pЪІЮha)@3ŸR/‘hЪ9UrђšІhЌ!|%ађwk†Т€‹VKAгЬvP7џHoD‡LЫ$х„JfШР.ZББE&ЃPыёйщл :P‚c:‡r†u#&р(ЦcЌ2[рŽхѓK—t Ќ~ѕs€`ЫюЊ pR'JYmLы5уj%]VЗрІ6ЮGеGkƒi"F•jёЩUœ~ЬЃ|1й•Ёд,xХ™g–ˆоы;ЋŸ\SkйОC?љ’г2•™гFSJ;x3ЦИ•” q!К%ќ@_vЏ•‚ёЭN-Jyо-&ЂиQм:%0‚`6о5eZЁze8Пъх—;мЕ‘Ж6ншˆCMКnажа›д lGќюЃоД™‚›Ў”Щ9@чŒ=М№˜уюR†—2ўk=ЏЊХ‹/Ў6|е9 J$QeЩW?zЏA н„ю“)Њ ТЇ!WOЅ 1ˆ B}PD‰Іъ"ГщдG&МИs—R‚€4Рx)GJИ*г?Љї3ѓl€ ‹аp•|)dЫNЅС@ЫYyА1хrЫGќG}’Œ%NхЅЮF…р2•—рЁtд_ЫщНК:Нw3 ЉšІOIЌА.‚UтШ[gEљЅЄkЋф"Žђхр1]™N/еЛ'"ікїЋ+€ђ///вšН~в–КРН Ђ=ŽGХJU›Z”qЫP>xйб{f„ф|aЫvи/!˜‹ 8БizzЪ§њю=ћb$ЌŒфХБКЦjйYuœЗcЛдт ”ˆ&uяѕЯС!Ї˜@'‚зЏ›К!+Иь№'o/Bx,%к‚љ28Ч‘™Nѕџ4ъdPˆ§~9ѕ]GЦабШXHb71PШGvJ œ rж(шv5эМаlЬЧ[В$]У]SДЈp<–>Ф^йsН Ќэю˜xАфŠёТ-mЯ•–ТЈt`€О= 2ZO7d%Ј>9nM+иЉ)ЂVMЕfХ™уеЌ'ФƒЦ%тLДЊR[3†0э=9fFЃЬ#:œaыdг/Hѓ”ДG^sй~лљјF4у aЏB$=@ІЋgЩЄєoPˆТ'~ІжŸœзlЄ#ўАо€,k”ЪТ.є Г$}k˜ššт• MЙk*РъђЪq МгЏзuШБц€˜Gпnѓ&"иŒ e "ŠшедGЅyIƒ#жСT%CxHЭ†в`RЂ>!…:wц”–ŒѕуЬZ6žж!Š)§юх"|žц"хсTtVО`gD;)I щВѓЦФиjёпэЯљўr ЁЋ ЉъЫ+ƒš’ё—”ЅwРMdfiТAЃсHОф†#ќќiVG1рWZ‘T”kцtvКGDC"Ьд\ѕvMX^]:Ѕ~ЉЁЏMдy'_§š_ad q^їjWЪЌ ™з˜еy…,ЁС&/“h1‚pjЁ0‡J’чєЉ“ХБЃGtќkаŸˆгyЭРЯеЫЬЭaд!сvі“;œ‹“‰…yYŽ!~A!РўLpJ/Ы‘ЄJ6Ю6CЕыИ”˜(•"сq‘VќцЇи2^‡‡GІWЪМ.7 uЩ, xгS@ŠОІЬ/-зЋЭKњЄыxgvІЫ UE8žцЈЅк™л‰ ЂкЬШwfе‚Ёrb…%Sо9ˆ,ЊanšЊЇ-‹Bєѕ+щ ^№зъKў*ЇŠX‚5­"ЪŽLЪdLŽУиШAyЂOfŸў5ZX0И7n0hЅŒФtЃ(KЅ8УјFС(AјCš“nС ЬrЙRО /‡Г`Yпрзжу…l…Lќдое—Ј.дЧ3€bѓk`ЙІœ=zєтъЋ_;=2<ДЕЉжЂ‘ПЦ&1тdФФQQScŒZ {UЊ5{ оЈпфА 4ЃŒ›гКЌ№…uЩiž№Џhœ/‡ шДaТши­CEЛ(!JdP7ѓ9пн+)ЮTJоаЫ›<љўЮр[дo‰ Ч-%lpЕRњhО{фЯС (єš:Q‘OIžrzfS1Q6Ъ}n(RvЖЫЉ х^BЩcGЩE3)NЛнlI ›z\S„EПўКrabbќ HдеЗЕXІГјъї–‰ юG0%QКЁRˆX}TLƒ›\Ѕфs%џ=РѓFк.ГК4Џ/­pxr,О#(ЦGY2ј|ŠЩ!!T„KƒжЦЉЂ НрС;ƒ™жœцlљ&јШ’2:dl‚ џ–_xБr—є•4 H­B[s„RJЏЫˆ1‰ЬœААœ  ‘4:ЋRv№ЅВЯХ;П&Вf‹ЭДšgRдІ›Q€ЎŽfдћј_/&бiвќC+@Ij 0СДљVЁАЂA•r!C':SиЌЩ-„єф7Л+OЋ˜зЮ–dXoпјƒ’р l\…ЌIК+вYЇч№ФОНћ =))йEљТЏК–ЉNдƒЦРяђC™„KPI™p‘=ќЉis5 ŠAkцMbОѕO§XOр=HмFJ€хс $šЁ]Zв‡ˆЎУmFX 8Љ~Сз™ягzНЭIMSџэъ&ІИЪйЌ †pюцЭ,•&ЈЅ†R81"Сям<Т. ЪfюЫХПrїЁпг@№[Y<СLfgЦЛAP"PU)R8/ъSzJaWЪ‰™a нzkљ{Œ4ž$h0чЫBRі{э ?IDATT”ќWšpW•Т@‰ЭБщЅs2Ч™#'uш—§‰…з _јЪт„8Л\%:Vсмкs8%8?BfS‰я№! 9,/zњpeAZ иќ9Рœ›чІ-€`YўIээЃЭ­+#ГЦWП‘RŒЦеЈ†sLЎbАЊЧ0ЪЅќ043CGaC8L)lO0ђ–x’+v!Ю e /ƒ`.­(…аQRК )„-у­†ЂfB@Rn %КzФчz†ВІUKЫЬ˜ОтТ ИифXнtP гЙЎM Œ ˜sшЯ“ЧŽYв<љ0†єдq}‚-ЕX+JBxьJ\Yр$–‘†ЬсШЁ{5™@%Œw Cц† @Әћё„№њъ™пРУ*T|ŠЦЫвiЁЫAwт*a№Тw“qG‰ хЅ”ѕTцћяПЗ8zє˜пЁ№ЮЇq­ПuљиOыbётКмѕX#жюџЈŸmЙG[Т?@  !Sе@žу\aеЬ^пRнШ“Т†RОъN§ОКЕy€ІtRFІс)QЩƒѓ#ЅgПЂ'*Є@‚5^љKtQZ.Юш +Ъ}NB !Eh:ЛшТJhУ†mtw!~ц=[oЊ‚|њі яъи:3Y”ъ ŽзРЎk(уЙnPЦЎV?Ј/ˆНаWыџgЊбс@–™™Ьkf^U)4S€•Ч~0ђ/FeЦBЅУ ёC1JЅ BщНАRЏ‡4ВсŸh32С%дQl„]ŠР%бЅфH!5Аg$б…€и9§Ш툕‚7lг"*tx )Ѕал6=х Lтt–ЇuBXŠФ!š>-gkЮJЙcŠМbтFrм(y;Эец/JЧcppфэЂљ›їQ~w–QˆK|€O‰ёd\6O{Œ/[\тaX уKіXЁН№ZЅˆ іXоR %mD+PQJ'•aJЩДƒ)Тф*•VА†Iw%”ъ_:yсAŒшеъеЈнЎ RQ 1•]W^4бЪ%›БWq74п*@ІхBЃБќы pkћђaѕSo#п&~<ЊЊn‡)eGhE€СЊ†Фс 4ДТpЩг gTЦƒ^WuёЈФP g€[дYП@‘ИgV‰сЖk/и5ae^Уxјз "ХQГшF™њЛЂR$иЄ6U.?e†џOVRŠ‚†N‚wU‰Џy“?СVщЎ}`ђ^сA`ЪДўСЏРчrЗLжQГЂ•ЕПVзЯыwї(,%(ž”апЂYь+Uз‘Ь‹2/2#3уa]R €’"D>s6JІ$GX‡k ­гЯŠр0ш‰Єш(Йї `˜^|†Ъў*=ЎŠb#С:eoIЁ ‡ryџ‘Г ь^в…aХж9§YБЉAЌЫчр—Jж”­“4МКєЛщв‘џСћєъ&д]t‹ЧWДb104@QbŒ]ВUaGЄ†–лi2Џ‰‡a”Ч|“Hу{­SЈq’"ь(Ћ[”KXиЫМђ{\AŠ 6A“'ќ–ЏжРQ/г’№–J’№Щ‹: Эbd†РŒb;Љ№uЯџ3Ž/‹фТгSч;_”ŸыуК&њћ‡_[Џwо.ЅxЛ&Т‹ЩНў“\Сж`!NЄ[i!о<)УJC РZ9XršХkЦћ–•I$QžС /Y>ЁuZBмIK‘Љќ^ЃЅpТцGMGНљЩм˜ В– ЯNfRђѓ%y4dМ1ї• ы)ŸmЕVўP‘\O Уwu;ЏзЉ>ЌУФ—ћХa}ЂоьМ™gŠŒјˆvЋ I)"Г’DнэЩиx†А"Нкl€ˆp†W&''ec1ш№ЁC *АжЭ*xzmдѕ…ўІ+@ЕЖкŒk|^ŸWG№ŸѕмЉУ+J†oпІ№kФсБ^†а‹ЏyJLVœЌ9Ѕb”J”2:o6ь„…Hџž‚ЮЗAи( уІђ*gYЖ‚єћ| ‰зыйn^ч˜ў1 МaїеЄы™pQЈпW$—X9to__ч Щы№„bюoЭЫАМFбуЧ%kahЅ›"RxѓжBљœеjRv)Q(јS:Хшšз‹+ с%‘хЅєBЌ)(ŽыqC›@‘§oо г}НOБqѕEMЁY2§яКЦuœчсzЛxЋЬю“ ?"сmяuFBP.Ы)% чSќ•ЌEi+”_xЪцЌЬњЇy;~АɘHЋZ‹ъ“зО9І6Ђ/ѓы(Iп@№Вf јjЖдяJn^“ы?QWСОХПеuXцѕq‰сI}ї’ћ,НE~ K7 Kb"\іпŽtZ—rNyYY3Ў_йZ\Й7 kРзRј’њј–ётмкE?њeЙП­ Аži'4˜<ЁHя[шљJі-dОAr~LВлc&С—уА`#k­\jѕсu ЭИT bJk ’­ъФЋ_l O0HЩd­6ЄИыzмV€ЫйХцЪЇdr?ЅчПїщљ˜тIљп,гќJIa8Кщдњ‘ŠН=ы`9 Шэ9LFШ”„ˆTиPЅЁЩЖНT ”BрИщщ‹ўёыЪ^K‚Чј2nЗркЬ;'п‘BќŽžњ>нCпыкцж‰ПзK–‡ŒТ‘Є›Ѕ–Ќƒх(мГN‘I)РДnРIŒђёѓѓїоwŸByСяеѕВмmИ>іЕўЌЮ№<Ћ1йЧфп!qшрK§эњ|ц[5т{кь8‚жПd…'ZБ[5ВKa Ќ NiЮ‘6VМ4`Z?ВёшзlЕ?YO л „Дьn+@цФ=љ$ћhAюd­хКїъіѕц7HRopиЕj жE)pIаб Cњы­C/йтƒжМ Тыщrџ›лЫuЗрхrpm~vцИ~U­t\ЯзшzЋAЛšЕG%цхъŸЁщ шЪж"†maп3’Аќ›Žx™Зл №2x•ььбџiК~JОCўЧe)Xwx“ТЈѕ蹇iP”Rd'жZ G§њЙоц…QЙЅыe­‚w[‚_Šћ)ТѕПt ыzHз[$ѕ'Ѕ_+џ^]rИЧЩOŒіыЇіиа‡/~VQџ•длюЋ‡њ]лtЕuгХЈIзmw›З9p›З9p›7ƒџЊ1fЎ)/њ"IENDЎB`‚knowthelist-2.3.1/images/forward.png000077500000000000000000000002321342115213400175030ustar00rootroot00000000000000‰PNG  IHDRN‘'оaIDAT(‘вС Р P0.dм„Ц‘кЅі—OО ъ)ЕшvЬЧŠЙWк. @,їxAПœtšKœ(ађ2šРHSИj№Ы…ыоFo1аn†hѕї\ЁŠДмцЕIENDЎB`‚knowthelist-2.3.1/images/icons.qrc000077500000000000000000000012771342115213400171650ustar00rootroot00000000000000 clear_left.png DJ.png database.png settings.png folder.png vinyl.png search.png shuffle.png play.png pause.png slider.png volume.png stop.png backward.png forward.png list.png down.png star-on.png star-off.png knowthelist.png knowthelist-2.3.1/images/knowthelist.png000077500000000000000000000353321342115213400204230ustar00rootroot00000000000000‰PNG  IHDR€€У>aЫ:ЁIDATxкэ]|еѓŸ+щ!$$„zM:в›Š (‘оё' ˆвDŠв"MЄ) TQP@ZЄ§шН‡$в{ЙЛџЬоЮхнf/ЙтёџсР~іrЗэНљN}ѓоjр_zЉIушј—Kџр%Ї№’гПxЩщ…€ЩdrКwяžOttДW>$ЃбшІзы]pгр–œ–––š„Єгщb ,хээяшgўџF/ 8рчщщY!..ЎNrrr ƒСˆ[2н755ULж899щ\]]ЕИFЃŸnDАDЙИИмЦЯ—мннЯ#^Nњјјм(RЄHДЃлі"“CАnнКъХ‹oƒ nž˜˜Xї…щ€[2є,2јЊVЋНŽŒ KIIyъьь‡ 1спžЈ|~xNМT)<О~Ў„€)Œчxвѕёї<юžЗ5ФОjеЊ]st‡Пh”чиИqЃOэкЕ§‘)(СО >OŸ>-‚Ьi*Лс“'OœЂЂЂшааєєєеШмoП§і•мм A A RрЮ;%CBBj!hjс5[рї•pУаІвЅKџXЁB…џtgПˆємрВџў†nnnЭP"ыЃdW‰‰‰ёEivGHЧъ&ND/3Ч€ ЦѓB(WqЛ 9џрСƒЫэлЗј,ЯtщвЅ2Зnнj†ЯвбячŒfdO–ЖnнњGtќ‹BЯ ‹-*оИqуAШДЎ‘‘‘ccc 1ИpсТЄŽ™ љѓчьјЛШ№%И]Чу| Х1eQbЋсО"~ŸŽЇ 5B nЇ№‡№З?Зmл4oоМ„м>чУ‡}:єњŽ}ёЯ&Дыј><<<ŽЁ}нTІL™[Зnmјѕ§ћїK#(ŒE‹]ŽOХ-,'ї@щ‚ƒƒЫмО}ЛFmб|ДB†љ‘9A „рч шјmhбЂХХмЖућяПї~єшбpд8CНММю`ЦНўњыAџIЙ@џў§+5iвф 2Ѕ(Jу dњЇиi;шЗеЋWŽ’?хюнЛ€ЬЙ€њўvрy<0ТчфЩ“аЬtBрuТ{ћ Vє ЙYъ}чДiгbrsэщгЇ{ЃЦљХўЈСv"ЈЦWЌX12oКўХ \C7Ї!C†CщЋ‹ѕK—.]њЪёЖеъzќЎЊyР§7ЏНік8@b^<<‚СяшбЃэаєє!o_іс~%њЋбЬфЪyќју+"  6ЈўС‡x­yёќ/х иAQнOУ;бwD)4сg§тХ‹З (оA†Ф*ThФ AƒжџS AmSукЕk§аѕExЁV  сR 3ПэгЇЯ­м\ѓЃ>тыы;нЧЧg7j—#GŽЬ ;’r €wп}Зxѕъеo`М}ЅфUVЗ3fЬј№†Zaшv:tш1G4Е‚џ ‰‰Ÿ‹"(М\„ŽхТQЃFнЯщѕњѕыWКB… л.Јe:>э1{іlJмDЃ$ДD[№ёуЧO0$kќЭ7пмptƒlzїОЈБЦ іњŸеЗѓЁЁЁ1”н“ы,[ЖЌО|љОC­ђ ‚шGЗыYЩn '\ma№ЙsчfnоМyRнКu‹Дnнњ JVAмšрw'srу]Лvz”EЉ,Œvк §OFы„?ЙрцЄб€їљSёwЪўХЁDЧр–ŒŸcFг“фф”˜ъеЋйэœ]НzЕќБcЧЦ#€ћb”BРиt№рСё7nМgя5–/_о §ŸЭЈM6tэкѕ}ќЪ”Ї\ЪCВ_§ѕЧШшYЈ Ё=ХH`'юлcИ5`чЮЋэЙЦпUA†7C†7svvЊЃгщ‹ыѕ:dЖж26`y0ќ›ЦВ Tм БИ„ћGИПŒ’y™{Ÿэ^•*UcmМaУ†за?јšB=dfмЭ›7' љZloЬš5k†ОЋ№9зїюнЛOоА'яЩ^hбљЛv§њѕKыж­{gрРƒБу–пО}{У/Пќв;Ћƒ‚NTuqqэрфЄošЗ2пUЏw’вКdfДщЙШ‘‰Ўƒр0=FP\ФэДС`<šœœєпРРЪOЌŽ4™œиу”_x{{kб‰нРјрфЩ“ьЙ СдЊUЋNB Э§ф“O>~n\љЩ.`ќKЃ{Ч~џ§ї~~~WАбЗCBBbаTEЩЩTpqєш_…Q=vD;л™оШХХй…ВuZ­dС?Ѓ55.гcдЧqл‡ксЯJ•-Й дKHH˜ўLCŒfBNŸ>=rЩ’%;ьЙ2ўЧJ•*uОpсТМЮќ QЯН‡ВЅбЃG/A/П'zў>шјmLMMэqчЮ.GŽБ8 :YЅЛ2ОyмИб0/v'І›žˆчОБѓ3 я@ОФСєєД­{ъеЋ/™ŠI“&M+XАрDŒfhфrбgŸ}6ПЮrфї6lиYŒЪюкЕЋ-њћкШœі‰Ч8cЈwчоН{Пb МЈdЩ’ч=zєЧО}ћZёзЏ_{Љс(хoИККQйJЛвг ŠK™ž“š^D`0оEŸaЃ 4ЫЫ–)ѓеz3дr›Š/^$::њšМОџ§w–™ФN:5CЇјPlll№œ9sjрѕ"н2{)[tшаЁкЧ3'NœшоМyѓ.и)э8P+22ђъоН{h0цC”І&вХdGŽ˜Œ6? Є[h: сWT$й}rјвБЌž30”Ѕ=„~B,|UйВegдЉSзиЁCћЭхЪ•kƒ пЛwoŸM›6§šељC‡]ЂD‰Б7nмXЙvэкСЯ“IyIйіTЯž=ЧaЧLA•?ЈzѕъыP§пюпПпіЧУпDZ ;ˆЄHR­‚m??%сП5kдєі№є@o__^ЇеjuкЊzОюЫсоM‡&‚qЬрШpm™ ‘ЙцХё&ЫГ(ПS6›ЯЇkв?њm‰вщД“ё™WЬ›Л`zйВeЦbмш јъЋЏlF;oОљІkЕjеЮЁйЋtќјёЦ($I…ч”В@Џ^НіЁ§/юююў2щƒ*UЊ$•/_Ю-11IU⹘э>>оН;txлflОxў"—Ъе+—№pїЈЎwвЃп Џ‡[eDќЁ=‚BцХ•33ж 8Йx4у3šЃI"в$7NcMЦГj$ ФDЧѓятq†tуQW7—!пПЁqљђх—Ѓ­‡3gЮŒ›E:2;џF†‰љцлpљ9œiHŸe­Bщ$­FЇЂ9Ь$jГƒh”Џk"­ъWаяЃэлwDсГ,-\ИАзХ‹g;vœ­vŒ3ц4{0:ъИuыж_ХX{)K4jдЈ†8чQТbŸё˜QЃFUB_рjhhшќ+VŒЩэНђšTЛgнК5њЈЈшSЈіj˜=cƒъЁиН‰(uЏŒ12W5wyIўљЧЋИЃ„LWм<žїѕ]]]L.\2`ћѕ&?>}zЃˆˆЋzˆO?§tObbbCд%а”цzўB^’*/^T!55э<ъ>з,OжhЎєѕЋбЛOŸ4xAщƒ+c+G я‹Клnuˆ" ­†Ђгё'  _A :|ЇgЯžн Еф?P ДB3p ,,Ќѓ?ўјB–‘ЉvХœ9_ЗDлy0Л4vТЎБc?щршFиCќ^ wŸтжSjзs…Ÿфk§ … 4Ы6nм8œ™5k–іСƒЗ0$МВnнКЗнjЄк ГgЭjo0ВѕъбD,7nм‡ŽnDNшїп~ЃAЌщИНњЌзЂабХйB‡СЭ7а,ИСіэл;œ8qb3tшаIЉЉЉ“Ў_П^ CЧpGЗ_IЊјђЫ/Л щ›В;%`ьјёц8К9Ѕo^І)эVz~ќ™шї,ž"љHnnnpљђeˆ‹‹‡шшш`4Џ ъ—fa(]Йћо–-[~ptл•ЄкђЉSПш& лI€!“&M^сшFф–іэл[wTФёЦГ\‡ET№rђd8ЛИPНCCЫˆрАaУN&%%EЎ]ЛіMGЗ9гГЋ}љљфЩ§йжљЁдуѓ)S6;КЯJ{іь…R:щž›ѓхt1$&$ТХK—H0LќёGsмŽая”6F0удЉSХЯž=ћBЭ5TРФ њ#ВэБбэЇN›–ЃВъ•vэкйw”аЉœ›ѓ%S€>Р­[З *:ž>}zbоМyё'уРЫЙЛЛпxќјq'4/д‘*0~э‹X“нЩzюѕ/gЮќнбx^єѓЯ;ќP оЮэ5h(ћТ…  pп.iШ>њшb\\\аŠ+:К"Љр“OЦіЦ( [@ЏгЗš5kіџм+;vl'П`TnЮ%_рЩ“'іbbb.~ѕеWЕёыДБcЧ~•––ію‚ ШяxaFU0fܘЈ6fwВ^Џk9gЮм?нˆМ элЖ}ŒНѓunЮ%рЦ›в9/^шОiгц-~јa ŒЂP§Зп~Лфші1Љі]ЃбэR)шьМО`СТL& M›6jќŸўљТWФdE?§єућЈЪiђ‡SNЮ#<}‘‘‘ёїЌYГъwюмй=00№QxxјјхЫ—/stл˜T0rфˆ7QьЩюTŸц3fЬ8м Aƒ:јEмja‡GUчi6жЄ J еjЕ4AуЗ   ПР<Ѓчџ mнКх]мmРЭ5'чQhјрўHNIAmpЃнКuыіN:ѕš…ˆЙsчvrtЛ,ЯЉіхАЁC[!l.щB)Pl 1јбЃE=*Mб2XKROшїїї‡ЂE‹‚ЗЗЗTЙ#j\ХѓNІЇЇ%''\Иpс 7ˆЄF›7o"†QbЬХžуЉ­ф „†„J@MplцЬ™'Ož< л>§‚RиПщŽn‘*дЬ`4Rћœœ”Зям1%%&jœœ%[Gˆ/_ОƒтўіzШgн)YбњuыhhЖб a˜ Ёaa еi!&:кXЊdЩцСBFEEŸ7o^?GЗ…H}ћі)•––~рM;Ёкђє)мМu‹Š#%ц“*oйВ%ДhбТТXЎЛ%žГЅD рї1ј]яуЧяЪY3ўYZЛfЭLь›OГгTЉL gR-%э§ќ|—ФЦЦљФЦЦVG? šЃлAЄк‚>}оїOMI=^˜l>-ћz§њuѓ иhRџЄђлЖm+‹.YвUЄлJА†СРfПOСЮ}чдЉS{н9YбъяОћŸsHV#‰„l["іѕ Я]t…%$&vиБ}{ЙЫ—/?ЩС-ѓ„д5@Ÿ>^ЈЮ/ ГKв„ b>1ˆ;RѓфшНѓЮ;ІѓYЕSC ДбБє7m >ž'a№^ќ)їЭЮž={Сбd‹ЬŸЏѕєєм‹ЊОM– @g044 RБ<мнО|.^ПqГЪбЃG_EgасцN= 6Lћ$<ќoV[›VћŒˆˆ@b0…xНzѕ’Т;b(3Ÿ˜L Ї%ci‹‹‹“іф+oЙЙЦКіžI>ц2~зA /(}Зz•?Ж)Шh4•ВЉB95 №rхЪI“YЃ/…ZѕѓЎ]ЛMutlBЗk—.;""#;оО}[’|f\їюнЁD‰Г™љ,эd*bbb${G{Япу\€žЭУ{›КъќљѓƒнIYб’%пt@3љ‹ш3q{)<ІЙ…м<žоrвѕеW8ДVа&кПѕжWШќqdПФфFIN{ћЌіIв‰љєтвє™%žеЛЈђЅѓŒdО8Е‹7žД‰ћ7.]КєЋн-z>эЯXZ$ыsЄ™%K—.ЁЌiІbъ# •ŠHs-Еˆђл|уаЁC5ПќrІУV Е €*UЊLBFOхwѓ(P@’~r yЖ Ћ}bИœї–$_œЕ+ЮЪ1Щ3‹Ь|žиЩ@,CšhрЄ.:LЯ:чP9qPќ[э{aкjŸё>eкДi­ јј йЩЂ?@LїёіwwеЩДDЈ- <ф8HгXmо3ЯHѕъеsCл}™[‘˜ERўњыЏKЮЋ~ВыЄШж“ф?Х0‘іbD €Ељююю’OAˆјхOє\Нz57‰Аi…яДŠп4ŠуEF˜„MЋr,mцЯ{RяфTЫdfSбЈЋ‹”0Љ№•@ž’œќіˆ‘P.8…ћф1(T€ŒюŽЛMЄк‰љ$§яОћЎФQњЩС#‰'Щ'аБJцГЉ ЛGc”02Oу6Ћ|і#ш^IВЙсп-i2Q4PЃ{ђчJІѓž7P|ЏиёFХ^ЃrQфч“'OФ~šІєH (дќкнЛwЏю7K–P4ръ ЫS@Ј ZЕjdsщm^’T7nмjзЎIњйюS1™/€Ž%‰/SІ J“6)GNРЁN–ЄЭ ›НuуЦ=йДEdŽNСxЅ`с‹ЂуioОSmqнКu­QП^§ЃјйY|(ъв’Ђ“Ыў із‘iгЇЗžWdД’йт3™р9!аі—ЧIœ+{БЄўЩ™сИŸ$ЅŸ$ŸьПœФБ’|:Žц’щ -Т+sа5щќPщ1 ЭТІалoоМљn6ŒзЊ0^Mе‹чк’:ЃтГи_ЪыІыtZ˜>mњ g—WŒТєyjGl\,DGE[4žlц‚‡?юАaУџѓPГТEЬDy†L7Њ\Й2еЫCŸ‰ЉХ‹‡њѕы[RНФ\’~’x’ў№№pKT ”|Вщuыж_п–ѓЙSЈRRRсў§{вž%ž˜NзЃ{0d вмК*™<ž/2]—геlЛѓAбС|ŒВшшщгІ.wqq,:|,љё ёh*#ibЉњЛwюМГ{ЯZ‹аCОЎј"дU%у•`Ш=ЗуЎ V­ZPЊT)щЁйžГѓGвOі_dМИU­ZU:—І–Ћ­љDЖž€tџў}Х.щ{ЙЈФOcЧК{їю*ГmIМ­ЮВѕијLk)b1bD)д|ЈЉмЈ‚ž§›dwwЗл… z 5хх(*-uCТRГf-Иxё"ьйГЇщ… Ј@ЦlKДЈ дVЕу•РЕ•*UЂ%X(ь*ЦіЙaУ†єъЋ\>€д?5ˆ€ ІњIх“єsќЏ6nB  аыeШ ЯlYгˆРkoAЇ‰T'yг P2™ЇЦ|Еі+?гq”…4Нџ~яЊЅK—~#˜6:О>‡IZЪœяЇН^їлj4Ћ€2…1F Љ$ъјёу4“ш-љ4љU˜gДёьj&H Ъѓэ@ХŠkсюoъTb9mД8Чя Вп”э#ІБf?Ы+ЏМEŠ–ŽЯj&&љiiщєЪ‹ФK&8вw'ЭЙ„лшoдAаQNРCfО^бЂЭVvЂј Ж"њ›VM:thѓB…ќЂZo ВO”aЦ2КOLrщeS&ц(ЄіDЂЩ|ѕеW!((BCBz§АqуF"ХgWn"дЂёjчe €ђхЫїЧ4!„˜IіB‹§цЬ€?ЅѓЧ5фјQ€+~["ааPЩЇрД3Ыз4€MC 4;gёд`энЋ5м–йђш˜ш6­_ЏXяењŸИККМC‡ђт,ёьДђZ„ьQ_И`И+ІЮЬд–єmъЂ@§ы/ЊЊњtХЪ•Г№g^ˆЁŸAоŒ`‘ЈY тљY \ЙrДоXš ЬdŽШ>“§чЌŸ4VPЁByiФЂ#Sœ)^ц{™+k’џѓјёуяёЯ‚`:);Š?ЋIш3АA›8|јАї .2Нz?О/3еМ4ёƒ+ІКy#ЧзM™Q1ц‘’jv#jеЌ П8@эќvйВeєжбXЩ†JлФ-+PГ# ђБщђ– VН]ЖlYz}jW–ИjеЊIЖ\Tэ RџЄ ФEyУHhСeZгЯ>2‡GhпЅ{‰f€яЭfЖ}†)јГЏќќЬ`БЁщŠЮA T›ФQzuŒvТ„ёsммм“Ф‹ЋŒj4:K–’ŸC™юЖhpuve((i2ќ\MусC‡@ЇеўДtй2ŠИ<@=ф,Жб Д/ЌЭчDпˆAЊ+ ЃC^icVЫПSGєђ ”ЌсЬŸВ#јш-7ŒC4оDц‹%J”UД0nмЇ^ТэЄ)Zz’њ€Ѕ^дtb™GGќ=ЕпЕŸU.нX4—ХK””^žMQ€ППџейГgw† u­ ЈAдvЬTЅŠзЪp–A ‘ЯIњШˆLrF(+U‚žrі)dГ`Pьњ›ђ§*Tб~к €htУ?ЖЪђИ…„цтŠд+шt‘УJQt„и6iйВ%љТУŸўŒЯквЄXgЩ™г[к.j@.aKнXфїђ‚bХ‹IЫлŠ І> (VLrЯž= о^^ [~ќёНZBŽЕ™­q%(DS € &љ˜d&+ уцL(BMJ… вгa 5œGyO”@й2e =‡ NЂыR4 f‰$‰є›ln…‡‡ЗЧŸуф' Wѓ’mвДiSwЄЄЄvTzьt?zeјЫ%oМ‰хя ђ™бy5]+2*Cу’рмЙsG2GŽќuђмЙsTLЉ`ЪГлJђ0(D-Р‚&€€_Тх,ѓ:M€С ХŠ+f @eNRђBЋj”`чLд”;(UЊДє9ЇHHˆ”+3h‚:NюшЛ@‰$€mЗЭљт‹)ГSSRЧ‚U/˜%Ÿ™/–ЛqэЇЉYˆ+‘вОЖŸВЇќќ *zўњЏО 1вyє№Ёd >Lхa0њЁYGŒW~V›@ВР`Ѓ *g`"Xв­šр/ €Т9nK€TšˆйбЁфNN˜h bА)"PQжQ–Ж{ш+4ХŸ#хŽэНZЖ/MŸ>Н3оыG“bсSЅЇЯQ1"к’ф _Б –лOчcыеЋk•ЁЯЄ1kзЎїюо•РЯ+:t˜ЎљрюнЛRЭ1Г(|€PnЬX@dиy6:ЙXSHквrГ"EŠxуƒ’(љфЬ VШИЋа)N yzKаyі‡€ І ZєTˆJщbbvњti-~.Е5*І:HвЏ_ПbіГиŽ‚œrр”4@єg˜љ\мJŸYђљ8‘шoœњZ[X4-tЦMšв{•ЄОquq•4€\WёЩƒh! mm йƒQAŠЬќDє;ƒьЈ pсТЈР’G<• ЄŽЁЮ`›ЬŒb€H5p9v3`­P хд№ Œ@ZЩфG)jAЩё?~ќЯЂЗ3оNb’‹PЬ9Ќв9уЩUЮЂф‹fQй?ињѕъ–"9”$РФ#xZЕl‰RH ‘Щдќ‰ŸщšxН“7oоьцœ€2W)I 2hK—ЯР&РD… ЂEš№ьVд V™9ЖsЌE РZ€œЧЂxž19@v4ЉzО']ƒЊi§ќќЄ$‘\qt Uh{ЙЪAЅ“$&‚ЂЧŒнУЩйyЃN^сKlK>—ЖГфsVвVxЫ ё•фC f/TЄЖЁ њF%срС? Qš,Њ‡#§Х^4ЏЃiЛ†—ЁйXb6O­ŽA AКЬмќbN 1иiЖО0J9#нщСщЉѓ9&“2\ЦŽžяІйС9}E‡Jb€:œ*‰Ш ч,KНЎЖЛаIjЁЬƒ'ЂcцйЊUЋУю•ШxЗ‘ЦRƒШm#i™Oэ™/ж4()%еzghжИ.8щЕR9„uб$ФѓѕџњN:'ƒ‚,3ЋёњŸ!ШрeHэВФŠ#YЭCлœ Z Iўž“CЌ%8!d}Q”Д/qї7Bѓ{џ2JЕЙJ РDЧьI‡L сR_ЃЪ*рHШz fu™љѕЃ™гЇєwј Aƒ>Csђ‘4тШgШ…)Db­OlaЇOЩ|‘FЃт’4рюœ5+8Щ”b„2ЅKCЫV--S"ъ’­[ЖТ?§<лЏ§ :ƒTёфfЏ]z‡2иgИнВH† 3РЩ 1jВΘЏЏo_м­сПЩžrEФSИЃ8Р$eвyўЈ9ЄБ}{Э€ 0š}œ(WБ9! BIreЌEцаKђЋt†Zј”ŒQ‰wЧŽwу=|ХЪ­Ь|1Фeџ†UП8ЋIЩxЂЄ Є4аЊf єjE КРђЃ­!!EM›4ДЈU?сэ=<нсПџН ,Т~вШoa1#АkЂv‹“лц*oЅIАіиLым‡Э–„‘еХPтkb'Ђ›Б#HgяpgёЄPЫн3р‹šУЯЕзрсRЪ№šвш2ƒІRQ.‚–]у"RьЬЩШZrеЧЦхФ’*Ђˆ^Нz}шя_pДЕэзfR§,§dŠВžвfоЧ$hЁFuJ€6u’AЏ3РЃH/X~Є%˜ДPЗNMždѕ€є]xјcјzюb’юзt<ЎіУ‡Љ3Ÿчѕm€ЅœCBfƘ4ВŒX]уmКёEмJвпЄYˆѕњ\,J†h"Hr)#˜.ЊлЌ@9ьpВџЂІiжЌ™ДK—.qкйˆРшлiЙ“ВЃ4l“sЯž=~Тч/ijіЭЊeщ<ЪЩвЯПвщcцGХi FЙt˜о7ЪI—Р е &йV вŒP9АœДЎ‚8W@ъ?4ё~!шя`§>xК[~oџў}Zxг28naИј%+ˆf€“BЬ|ЮZ$!гEqvcІfМёSc)с&тpIL‰UЏ4lщИЌ|ѓ ™ЄСЅxKOЮ•єS€ЌaBPњ;у=тAQ~mƒЂкЕkзЉl™2s Vo<Щ™(§œпUПвЁцѓыІУмЁqрхa’ьПyh‘ДЃО;оBЃѓA‰b%VМ7—˜ц•§/A‹’?CЯipўњЎ’–‰m]"цЄd$tФвv%Xе3УйыWKg:J4гВ43\иyЂhA8~& @ЮM/ЯJ аuIвhЦ,]“юёц›oJŒ8wюœД—k Ѓx(8ЛЕzштћѕыЗCГjрАЃЅєgВћИE'hр•ВщАфУxШ‡’›LЬGг—ŽсЄ› ŠUMƒ;Тб п РЫЫKzj'pwгТ›хw@Х"`џi25­^ђWЇ‡„„LтЎŒ$1пCо;ƒmS &ПиоГ&H‚ “`Вю №KƒЙ0д]€Ш0бЈйyњŽbkђвTЄHy=J“ђ\bMBЅѕ†Юœ9h-€Упf ЊІЊрйZ—ЄŠ+•lбЂ­wшn§‚Hѓžp”ž?Їy•ЬOD‡Џ€—V‹‡… —h–|Zя+_!tпАt}4|ПЉ8дЊй%?йb: и$Бqˆ>3=„|Z7ЉrЈЯ -œМŒщbZ:ZИ-IiWД)MЂ3ШрФP2(JлU;НейЎЪвmfŒёx‚j‚xЙrH9чB?ђњI§ГЃEХЄ”HЙzѕ*\ЙrE’Fљ>ЩЈ–ЛPa(ƒ3ŠjпО}я€ЂEЇˆ…)bтŠ=Vџœёуё}ы)^фёЬџO"МQ/ "у2˜_ Œ є…№Си8XН.YъжзZЕ€jеЊCЅё›тХŠбzАkїnЩзy­™3ЌŸт>NZXО `тЗЈжмŒKУТxУKЎr›=хЯ ЅT€GџАv&B'ŽЦлЗfХx[$њ ДQЂ ŠёSh™a:8йYЪќБ!›OЬЇ aВ§4h"8—GёјrGш kЂ &Оїо{KнннZ,cѓ&Й2ЙВє‹•ШmˆŒе@ЗзRaцdtјЬЁФ|ŸRШ|tэ {їЇZѕ•ЦQћ)šЁr№Э›7Уў§ћ-ЧŒфsFф‡“чах3$%›–GE†SŽƒ'Š2“]фvГ#fМv9рЄP dUЦ„ sЦаИ@ -&Ћif:q с\r ^QбGЂМ u8]‡FkжЌ)!а$ђњй'–‘љ%“SАў‰”ŠїЬ‡`>Gaхˆ&;ФpVџєLj1 vcќ&ијEјћ!MЙЈіНЫЁ[ПиО3ХцУєьйSZIm§њѕpєшQЫїЎn8ДЦ*u‚ЖрдeУ2Cji.Ш№X 8CfGP™§@іиДRй6Хж„ЄдО#цѓ\.ц uhXW#{ќВ‰4tLƒN$‰Ф|R“Ф|‘iИнCЦtЦ}*ич§Ч5iмИaЙђхзˆЬ$S`Д.0ЕRџЪмS4JџИОЉ0Ђs*DЦ єу%uЎ&Ј№ХЬ˜ђU|–3dШЉТњЛяО“Р-вА^Аt|~шіq:lнgX A™XQ\шЩQ2 Њ}БB(ЌЋ…8-nЭ3[LsBfQМ]=ЋЦ)@Œ'Щ'0ѓIњ‰йД'П€2Œб1Ф1вНЄі™„бЦШ0šЏPВ'ЉЖџэЗп‰ўЧhбўs ›hџ9яЯ9хєюфђиђe x{бШžй‰,hB‰M‡–"$ ‘}ќёЧ’œ;wЎdџE*UBч~,г–™`ок”/ёбy@HYэЫclў”ѓ!” RљѓЋ–„g эp—эAд@РoїІMэЙ№‚:›$аМО~˜Х$H­ЪcИЬЂ9Љ0{жъЅ†&tщвyО›Ћл›ˆЄ|НIžЅdў‰PЦ§Rи‡ЮоаЮщ0qpDХšЛгйу`‚Ж]bраБ”,†4п€$р;vL2тлзi(рФ&_8ќЗЦЭMў –Jѓѓ+fkЁ х 3>2†|ГœаšmЂH“0оГЃу­€ šкуљuяюёzЄ~гхА8И$ў Fbєш;w^ЇгiЋ‹s yЂŠX№Сcў<УйъBђВ>ОL…šДЎЙ}E* ‡М;z ‰ЮђAШЏ™2хsIуEЧФHхbєfБѓчЯУЖmлЄбъ™љёY\`и”xtrЉ4_Ьr*ч2*gБЧЯЮ;|Љ@lѓ,ЛоDi%{Dуes q(і Dœ+kT–ˆc:ˆLѓэЁTяV­ZmХkцчрu •р!_Й0УъBˆ ЈUХf’cˆчЁ"uЮgЯ‚mКFУ_AЖuЫ-ры9_K’O†Д\љђ$G—„Ь]Ÿ>}сШ‘У0u”'јpK:9Њ3jы{`NјиCb5‡{< hзД,{RѕФМњИЃху=э|0›LU['P™KџХ}wмh5ЭœМЭ+Љb… ЅkдЌљ#žkщHŽяYˆ@^ GЉўi\nTo#Lb„(Yи hрЏSЉаЖg$иыЂpvйвЅвСё(ёД^0j’&рЙ“єyС‚№щјi0ЫŠЅНю|ќегn2ує9h/{ќ$ѕ"ь*ЩВ DђшW:5Іх–l\' П€л1А/ь/WЛvэzeЫ–§оHѕ2q§‘r8ЪbЦs™?ЋІЁmcФв -ВЅPQ Œš‹W'Ј>еPЌZЕRš””,х4*WЎ"еH$цK@мКu+Lœ<ZжЙЫцп?uQН…•Рnз’є2ё\=%РЎђxЛ@„*œŽи9“HuŽe ќmn4u:Л”ЏIeг AƒцEVГˆвНтф5ŒФтVжџ‹Dю‚ъЛŸП1BёЂшQ!єш‚jt&hе= Ю_UзАУ† …їо{Я2ЧСййE*jЁ˜˜Oїцq•€Џч.‡†UЏу=<цЮњ6j)иxБ§bХЃЊ?[”#сУг;w)?P)ЇчfzњЬ  ‡ž„пгˆ$…BЖFМ”ŸХ:РˆfM›Оaзw;œMОЇ”`22МR€KЉ>EŒ?И|=Zєˆ”ТC%‘є/ZДP"“C…,T NЙ dќ2ЕkзТЗ+О‡FUЏ™@ыкћћэqфkй3ЬЭmЮ vcфD*[њ ;ГфL]eEdы'т5)WЪsџE&+`]ЪЊ№IыжЏНэсюБž@R4‘…IЙО11K €xьЦV ОŸRьOCњоž:XП= Wїў›6m cF’^CƒXžžљЕ‘ёњ б˜5kжТіэлр•rwBЯ\вПsїa 1ЯоT1ƒyьŸЮхbаTШKXNжhшm›є~=8ЪжAЬBэџŠзњПfЩШ\уТgхLYf>5<ќ7ошшфЄпЦ №ЧЄžSTџ”@ ZгюэОA <”§ѓіаС„9q0g•zцбnпОънЛw_rќhlƒ>бФP@љ€Э›‚Ѓэ„Š%Ÿюиѓ‡qЌаіlЛRоЋ•‚gђЭ’‡9gЛ*ad mАƒ)Z Q6†ƒќєЎ ЕИQ9:yОю`кШ,ёЪyђьѓчиvэкЕТg9Р FSњYŒ:DpPЄhД}Лhр›Љˆ7 Њю~ŸEУ–=IЊ >|8дХ€JлШДДiгFša-J?'Р~јaќ~№0œћ{7”+e}шD%мђCіЄ№'ƒˆй?Лшy@$šнв7šМQЗБЉЈЛ`^‡№0nWфілkіqЂ#;цѓїioДm[ЭTбdв№кƒ4ъШyq,€ kT @џЎX2C+€ЎЌOеBзQQ№ћqѕьпШ‘#Ёr` мGлORпЅKЩћ‹BIњщ§ [ЖlУGŽТ­ыЧУн]ѕ†ІSпdЅў•ўŽ˜њ“?vKџѓ€ИF @F‚ЬЁšCFk:dŒn‰Г{ФЊM‡7‘щЂI€эл—J3ЮЃЄyQЭA L˜qD$†‚jˆFtяЈеsu’?@w3Хjс]Р‘гъ4p 4шCƒZ%K•‚=zHщoж,§4,|ѕъ5иКe#$'FlŒMЊЪЪћWjAeБ‡ШќЭШyо@ЙbЇј=hё FV 9*чХЋ-”Єœ7oЁ‘ŒtЙuѓжyьјŠД‚g КєСIП‰еLьЊ•QмпЂБv|‡;vЋ!­‰жC—Ђр ѕ…ЫЛuы еЋU—Мџ5kJ€+iOЮM ЃUТNŸ>ћіэ5zКk{Х')'ЌцCЉiDqœŸ7ЋZG@y]qивжjVJR.ёІœрЉЖ†N&jлІЭ^ џорЬ1EЌJ§5$%гHnеЃ:ЧоEYsŽзC?ŒЖPїZЕj5‚д6+VЄЗЏ™;C^pтєщгвђ0ф,\ИœOJtq‘‹­ъўЬZ =ЙРC4ЙfT^“кj—j 3*Џ–шБ‹г‘БИЂшЮнЛ’Дѓ`чИLЄtљЯ_79AнšцHР=С ЦЯƒ?ФЉо“ц0МгБ#шœє@UH}њє‘й ФЩ“'Ѕ7›?Оd&ДZЭ`ЃбtЬ>иvqЯšOœл/xЈŽѓч”1Ž {2|Й& л"Уїбg’zJЩвфŠЃq…S%ХЦš`ЮN№бH=DF›Р-Q6ЇРр‘6я[ИP!ieѕFKГ‚(ћGYA~чемКu‹ЪЬўТлSЖšЄ4}тќf<3џ™^EяHф)uьдЉ@Ltє%“бX„Єž3Єš‰\К&.ђЈ€ј4oЄ‡}[!Л[—Ќ…k'MаjјˆMШЃДFrпО}Ѕъf"RџTF DJGі’—фЁЬŸкъЬxe}ПXнѓЬ‚ђ? Ђ–-[ЎMOKыCˆˆŒ^yЫЉ<ЩE\їOIyxЯWhн\бЈДazшŽ‘РО“іНС†RР<мЬ„ї]їЅ_ЖjњR!ѓ"P9Z);њŸ@ГІM[aGKoAOKOƒЫ—.KяяS{A•­™П (щ-›щсзmЎ’j—4l[—=&Gфъ™№о7qз яG ЅЈШVF3 д—О{>УАмЦ„"WWmн:u"ƒаLр›7oJ5yЄь%J$'›рЋ)Ў0юS'ˆB-Ѕ‡caчёœНь ™OЊПjzI9~b>ƒ-2]ДѓЯdыmбџ4ˆ5jдЙИS+Џ?@UЧ9iJфб~§r7шо=|Œ‚/ЃЃй3ЎоЗo=dйя˜‹ўЦ\0чќ•Ћ}ІЋlyЦxKћђђт/ 5nмx—б`x‹T§ЅЫ—ЅєЏ8б5;’оLyg€YSн`фP'аyi јЂz‹…CЧRГ8з2Е~?2Ÿb~VћjЫН*3›yN/š5kV6555с wямЕЌ dщ;Р`. Ч(}‚CœЁmk=ИИi`гІиєS œ:“Q\„bNuШ‰Ї‹Јі;сЙДЖ!еі‹/2]™џШsz)@дИQЃШщЏWЏ]“bsЅ)АфЄЅ™yTВ„*–зC‰bˆŽ1ТХЫxl€Tk…pяIЬПцbOЕ1Œ”щVmvФME6ŠНМŒІЇ]Л~]њNх%•цŽQƒВfа`P&эHт3‘@КŠчt@мsТGmѕr‡0овNGомTЏ^§оzНvy№У`ЗZBТмR5‡ёЗžДЈ˜Р*щЖшЅQЋ–Эk'%ЅЬПyыVЊзЗЅžЈ uJ>Х‰ЪqŽŠ^JэпН[џХŒ}/_ЙђŸиииjЯщВБЈM&!у9К}івK І.яМуКэчŸ?ІRt0Љф–Ј’љsМЮ GЗ)'єв€ %—Ъз&тжьЏtІbБНИ-EЦvtrеnG?Р‹F„zИ{—^!цтV?сgВщДrХE<ююwсqЗ§ЬЯд^G?Р NИб{(yC^<х†‚y жџ§ €—œўРKNџр%Ї№’гџРЌчШХ IENDЎB`‚knowthelist-2.3.1/images/licenses.txt000077500000000000000000000027341342115213400177100ustar00rootroot00000000000000headset.icns + headset.ico + knowthelist.png --------------------------------------- Icon Author: Iconshock - Icon Sets HomePage: http://www.iconshock.com License: Commercial usage: Not allowed clear_left.png + database.png + settings.png + volume.png + slider.png ------------------------------------------ Artist: Oxygen Team Iconset: Oxygen Icons License: GNU Lesser General Public License folder.png ------------------------------------------ License: Free for commercial use By: Media Design - http://mediadesign.deviantart.com Icon set: Hydro Pro vinyl.png ------------------------------------------ Artist: Nando Design Studio Iconset: Be the DJ Icons License: Free for personal desktop use only. Commercial usage: Not allowe DJ.png ------------------------------------------ Artist: TurboMilk Iconset: Gadgets Icons License: Free for non-commercial use. Commercial usage: Not allowed search.png ------------------------------------------ Icon Pack:Batch Designer:adamwhitcroft.com License:Freeware shuffle.png ------------------------------------------ Icon Pack:The Clean Desk Designer:Alfred Pereira License:Freeware list.png ------------------------------------------ Symbolpaket:Human-O2 Designer:schollidesign Lizenz:GNU/GPL play.png + pause.png + backward.png + forward.png + stop.png ------------------------------------------ Designer:mstephan Lizenz:GNU/GPL down.png ------------------------------------------ Designer:Qing Li Lizenz:Creative Commons http://ijungle.net/knowthelist-2.3.1/images/list.png000077500000000000000000000100601342115213400170120ustar00rootroot00000000000000‰PNG  IHDR€€У>aЫsBIT|dˆчIDATxœэ]MмЖ~$Ž&›lм8и…“Cє”‹ј–KџљE{ьшЁ@{Яri’SrЈы @.м>ФNƒс†бэdЏПgЅ%еƒШJCI$_JдићіЮHќ’ž—/пJœуч8Ч9^R$Фњѓ–vLэі•ЊЮ˜}…ЈуZ/ph(o…™oE‰ЫоžЯч—ƒZ 6I’цБ2њїfyэћFй–~кЪк 4,Ывp~ЃlГ\K=§{[yЋ2gggЧeYўрЪеЋWџђСМ-„@šІIšІPŸcЋ‚išђ;В,[уœCжй('?' ЗkЊУ9‡*Ї>7ы5Ыъh–гњ0е)@БбNл9SŸЊŒbCАд=Uх8ч%c,љўћяŸ~јс‡П7ul ’ЄiњЦеЋWїўћя3гE5бUF‘еr#лѓAГo]јГЕI•mЖбьЋэ|__EQрщгЇ3—qЊ`iš–.\Ј‘бFbaœsdYf-ЊМMлTшdи‚"ЗЋNл9]0Le–ЫЅѕ8К`?{0 •ќОК}m I~Г§а}ЕЕЇп‹Ж2Гй,Q I’t6Ѓ*З›:6љІ~lћT$dрЧзmѓХeDгj\.ёшchі##ЃЄŽЉ6y§яƒЋЫеЌkЁДёЧ}ЧжзŽ/b/r эMєEў\аUО|WPTtѕюв†–ˆЖ$I’0/рНїо#tГ§ИyѓцъsШхBNО{ 8G/ЂКTzЉкP– j$ @9G;ДPнРФ&tыж­кwuЖ6%cf+œЖyљОrCЙƒІўcH’$Ћo$rУ`KРаY:b]CСc!дН‰m’‚ОЙџаэїе щЎ†Ў/ЧЯ H’$KхuС5Ѓ8ж‚ЁЁ‚МНБAASB“ј6AшгS2xг4ЕJШuЖAР$йŸI#€!’ '"ЦBШ4Е6с\…sŸrљ}љ"/т пЩќт9I’ФГв4e1ŒР‰Ў<ЃCкб"]cM >ћђCіЁ#Д№Цд *;prB№2iщœЛ}0ЭPгБmЙъ@}6p^@ѓ!аЎrTLP@Ђ†‚[#}7ліFњ’цC”ЉŽkџT!sЉ/Ÿ Ш@XFбSпєеW_к_HЯ)Њ ™ Jє‚ЭьŸТЕ6wЫIЧ H’$Бн:=ePЧ?t,Єk|išЦ QS†ЉЁьP9 кVn`sG0ЬЎ ОВЖи&ї0j(xшMЁ6Г0„хоWЗ‹ќ^‚Їж‰їl`ЕФя‚BоИPBZpЦ@L#ŒБU§ЁT$•›њ]хBЭўїЧф•P5Љ2Еs ў 4‹ўZзїЎv†& 9ћћЦ —сhn`:†кtЩД…вD}э„^b|я#5OоаWЦзЋ=S]ђ‡OЄŽfдЎ~р 5~nƒ6kќЖАOМdm  ЎЩзzJLудЯљЌїЁfП­ЁкФююЎš„гахњт!HЎГЪ‡№Жў|7$ЄOT Ш№Rh'Pnц˜ЯтЙі9Fє0ЊшвyH-0ЖјЮ|›ђОя жЪХsc$7PGплЕлЪЗ}5&_ђЧЪP0ђа|=К”БМяlА-oљГi—"`6o я:я2 fеѓљqv ѕP€ktЈgѕaЙd}ЗЗ !Š–NšП ЂЃФО œъМ‹tЕ;v‚‡:ћ]!ѓ1q4@–eЕЋh#сђхЫЧ^&˜іCДСжјS ІфЗђйРmGЈйŸІ)fГYў1EІ"Жc §јz1гСJ§д0ДИє1\„JОЭЎ"ъ2LўЭ J}“‘gЛЬwпŸ/\…nhђхЂm1vLНPWƒiШЅСЇэ1ШзЦ5а™ Д™mš@ѕa J  ­ јn‡ЇєOѕШ/‰ъ:Џˆ}їнw)н ŽЎ +Жкиkkзd‡Й€jxџ4ћ‹‚ГоЅNГLL @ъxл*ЕэRЇnјVЉлфШяјyбgxЁ‰w­Ї+\ŽU46š `• И{ї.šЛжWwш ЃCМ3ШЅ^uзпeђвГИЦ(q§>!ЃюшjЏo\О ‘ЯZ ИPн>—О€n!щХ Ѓдп ŸGћЩ˜ЦиЅзлўP}N|‚“…=Ш~ch‚f C„„C ™ы1‘ПўО:ЯlћнњБ…@oЋ‰Бw…hЛ“|&їX~Љ€ŽЁЎBL1†>ђС•Ш•ФЖКђ!кйVИк Vфѓъ„€ѓ…"PїL№‚mŸkА&љ\TќK—7Š˜vjл74К‚р{­6ф pQ‘ЏfЬ !Ц—CД „я:П ›BZ$P]_§ЇNЂF>ФКLСsЄd€"Е%@Ё0jhJ‚"@!_0‚j}кР—ШБЗ‚ѕRп•|Ю9чH!PˆР*фG0ЦzŸН$˜к ЖувOЈЖЈфs.Р"k€`Зsѕwо!tГ§И{їЎ1—яJ>љЙ€9ЦѕVo пFk}Lє‘ЯГ"Ÿkфs^ыпŠˆ"ЬїЅ /+кШч2МЧ9З&ŸБ ѓyuGаЌЙ d\џECљЕш^ќЂЊc џЕзv1Ÿ3ђ@€Й)d‚ћїяo”Г”mЈ6-и$ešШчеё:љ„р5ђїїпФЃGШc&Й”glН€)И}}шZў|ШW*‚еŒЂч\’Пƒ§§7›ї8ŠHЋAuчB ‚^жЖќшГyš[ИиЪf[Ѕsљ:Ў|С…‘ќьяязњ.Šˆ$6€ ЖvЋ§0Ж0јюмc`Е8П'љЏэрRƒќхr‰хr)0%Р!ќѓ:bНYЄЖgЈљљmфƒq чUpЗeц7ЩWэžžrФзŸ[еЧpKЙОЦѓцЙvђyЮ!P€щљЫ2ьЬwpщв&љŒ1œžžтСƒЯ+дѕph^м§Ь‰ќЪ&ф‹Mђ3Iўоž™|ШѓПќђЫcЪЈЩЁ`јЈњ)€ &ТmЩчШзфѓч€TћYЖƒљ<Уоо>šЏжяУѓчЯqxxјБ’Aђ5eќH Бц) f[ЃхГŠюЩUМŽЩˆoŽ"W„7ЩЯŒф›њ~іьŽŽŽЫ l†‚ЉыuЈчљ‡мe\яЇхsƒ|0V}fђyQPфя`oяЭ^ђр№№'''їЩœ™о{"НЛ яь%_ёЮ„"Ÿч(xŽœ+ђ,л›g’ќyяЕHѕ'Ožќ Б’AЦƒnўд П>ђ+ƒPNzpСWфsE~‘ƒK•ЕЯц.Y’ЧЧЧxќјБpБ4@[ (єLžŠбt| `œЩpN%МкН+;\ЦѓEБNчЊ5џтХ5љ6Т||Œ;wю<а%ь3(6@я(CeЇтtХѕ•кo'ПкХГ"Ÿ1dщšќW_Е'pћіэлђы<Шˆn Ы>‡2ЬЦˆU7*ДЋтњЋЄNљ…$•ЮeHг Œ­Щw 5sќјуX,_ЫCЇОзEY˜ЫsiCэУ а yshзD~ЎХѕЭфяэЙ“?џќ3‹EYХ5yh|€‡9жšв€4mфPюљz\_›љ{ПСыЏПъ1ŽызЏукЕk_x&Gб™oн)w&и’/ф.žчЦЄPŸљ>феьџщЇŸФbБј›vxщеFжMLYœШ2™›чB€ѓMђUчтEП™_uЭёљчŸуњѕыњь/œx^&-Ј~T‰К1qj‚аG>чJхУH~СЋфŽв,УNЖ# >ђг4ХgŸ}†ƒƒБX,ўЎZРг-!„˜† ј_ф9И(ЮkфПђЪ+`lN&ŸsŽ>њп}їјјуџˆњь?іНV€аНŸwћЖ6Щяw&Ÿѓ*–/уњ‚чPюЏШЯ2\иu'?Ы2E7nр‹/ОРУ‡O?љф“?апkЛ€і|˜‚ЛЁДТXТрB>\ЮvОšљъ$чВ,Ћ‘џЦнфЋЌ*c Ыхп|ѓ nмИ{їю!IqэкЕўuВџ рˆzн$Шѓмшr…ŽуЗoЗцНeњамМЉ7Hйz}ч<ЏŒОœ чрx^ GЮQˆ%Šх)8Я1ŸяBА wїёж[ЛЊЭ…мє‘ч9ђ<ЧЩЩ qtt„ХbууcџілooнЙsчœѓ/C~рРCЏ n€džœœ$Ÿ~њ)€ЕъBЌўщп*C‰зŽе4‡eYлl–г?ыWЉяgggЋ~є=ŒЭqщ§щhЖЋkwcЌ\.—Ї‹Хџ~§ѕзћЧЧЧџ.ЫђыFбчžx„@Ф+јЇгєOWЎ\љГ$K!Jѕ7I’RQЂВNеg!„PŸ@”ен[•-ЫRCY–М”ы;.TНœ<!зњђГ^GЭw.ЯЋўTjў7?ЋК\яSžS} \Џ'ЫѓВ,ЯА&ё1€ЇЈтї ЅќЮŸЪ:zй  М^фЗ^Чк1§э:gSfŠѕѕ)oгЧ9ЮqŽsLџdE—З*іЌЂIENDЎB`‚knowthelist-2.3.1/images/pause.png000077500000000000000000000001411342115213400171530ustar00rootroot00000000000000‰PNG  IHDR'€е†(IDAT(‘cќЯ@`"Rё Y` UЈn3bчSпъQ…#G!#еS8Yђ'sр 5}jфkIDATxкф[яg›Q>Y e”|a„B #М”T ЅŒ}наO!CйЇђ'ЬшЇQ:›эуІ“Ъl2Q6ЃеЋЬfейdЖsѕМdЁЙчў|oю }sяЙЯ{яЙчž{šЛ(!ШYF.!ЋШEњћфљ љљљŒОЯ-–‘лШфMŠпvЈ­ЙС:Вg0шЫиЃЖƒE йw0№iіЉЏ`Їi:і0јIv'|HfэЅчOr@6d‚:r”срSŽhwёŠ&ђ<€СЇ<Зэ s’7џTc§}A>Ё§§5ђ7}Іt>4˜‚bћ"–XЅТD@ѓYёэьвŒб™eЛŠ}}EV\z{‡зЗД6Хэu@ЖZG—i€илњo+lЕ]Aޘ9]FkЂэяЬ—`5XкgОъaЊR_2{іmЊЮQмgœОЮœ‘Оо~ќЃэcд|N5G/ЧШl3:XЩP€†}“ŽANжKG&'=™КI$ ;ЕNŒ›Ў”uйLнTm№ #ї( dЖ,ы jž$€Ь–ŠŽ%Щ3У€йЂхd1w!  ŒЌ‘2dž5y‰­?u–@LXарLђЬе€(ГхLG€SЩ3з@fЫЉŽЧЖЗЧ9‚YјЈ#Р[Щ3€Ш†.иH™-Џt­DtвіW1‡MяžсМ§;&Ь{Jl n9е­ пbиѕи–‡хЄХ›п^ZмкђфмЭ9͘œк8#mvЪН9ž MрeXдT.G[ŽжМJв;dбі™{ `€№аu §жwтEюњ›ф}Эˆ1Ёпš–Яh‰0ЋDfŒj‰Œ8]>€‹В˜Y%2‚7-ЗEЩэЊЮЉ№2ˆлйŠЄ2Y „Q&—ЉeEЧЅ‹ [dД"ЄŽЬGБє9B!u.Ъхїрпb‡bШ"м |Т'CЗfi‰Г,F™тјSKSoѓ˜RзЂмѕ.Ъ]˜ћv‘"Х’}жуп~9Ь“зўwz q—›ЗaЮa*ТD!шŠ№"‚Ž;TEXƒСсD фЬКLэЄЉОФ[”wЄП(7y&ўхюЏ—Їs‚юєIENDЎB`‚knowthelist-2.3.1/images/settings.png000077500000000000000000000043201342115213400177010ustar00rootroot00000000000000‰PNG  IHDR szzє pHYs7\7\ЫЧЄЙbKGDџџџ НЇ“BIDATxк­W PSg>Й№‰]|*ЖbХЮ” О_]– (ˆ”—<“@! СЊДЂШcDP­UPlнюjЋЃюКЛк*-абZIю§їм48LwfEх›љfюLю§Я9пџџќЁ‚4I QбЙbуЖТŠ•<гOVГœо[рщѕ‘›Ћ›‹U№І@№ и -€UЋWРaѓ–P5zŒ9 L™SS[§№Bлі\ЫYцdѓ‰kыЊ‹ ЖчЯзхBIщ.?б1qбрюБ!FŠ% GПНњ A~ћэ9лйѕћїЫ_:@2дЪC§я vюњ„ ‘бс”я†u н$hlnЛиіЌeющљ…нURbp]ИXŸЅб2о>ыШЅП^"?ќp­/((ˆGQ 6 цЭ›џ|WўЫЌћ˜ЇX§fъїЄfаh3їЩSedŽѓУФ‰[жоСžs7ƒо5Аz@љщ Џ|в”Љ ƒЦВeKa™‡;,X8œfЯ‚И„Ћ‡€~ŽщŠ+[cЗ>ŸЏwžыЬN›>qœщШццmыЋ:|0рпЗoЪObё’…АnНјњЎƒAСЬŒ?џ м>‰—ЁNЃГЕ* zЫВюˆЈВjѕ*§ЪU+‰ы>|јtŸмЉТqGгѓЛШ™ШШщH‡ЩLњC"уc‘cЃ‘#$AПL Ќ|7ь;АnўѓѕSзЊ`{eii dІ‘fІ-L‹ Є…‰ц*ЄMЄ^Е-џYо№Tї#є["zTXtSoftwarexк+//зЫЬЫ.NN,HеЫ/J6иXSЪ\IENDЎB`‚knowthelist-2.3.1/images/shuffle.png000077500000000000000000000030611342115213400174760ustar00rootroot00000000000000‰PNG  IHDR((ŒўИmјIDATX…э˜mhSWЧџчцЕIЋiвjI_МНЋежЖГ чЌ/ѓУ(V7)њqШpƒСPtlLІьƒ0\‡cћ2*(*юƒA'лŠ„mYЈUKзViЂl‘є%Бо{s“{“м{ЯОДЁnЌin~шЮ—sžч<Пћp8џЫ!”RМШbўo€\ZЬW‹€љjь іЇЩ}ю€uuufЋењОС`8Яqмъ…ц?w@I’\•••кккZWЌXqЌЂЂЂx!љЦ\Ч§р­ПMЧќL)§* іЮ^XНzuY&“љ@;ЩdbA@ss3œNчюŽŽŽUЋVМ{їn|>€d.ЋcYіЅ–––{GŽЬФ*Š‚ўў~\Кt УУУ‡dY>‡eŽуZNчх={і`гІMpЙ\UU‘JЅ`4qњєщЈЯчћXUеГ~bb"r/\N@Z8ў @гєœ!‹­лG)Нэp8ŠkkkЗ•——#™L"“Щ ЇЇ>ŸяЗёёёJщTyyљЁЩЩЩ­~П‹ŸNLD~Ё”ЊyRJuSг@!’$…$Iъv:жъъъ№ЦЁ( вщ4Ђб(РА Ч$Iђ—””˜’Щф+WЎlХb_OLDЮHЯ.'рП@S2™eйУлЗo‡ЭfC"‘! uFЃQ?ЅT!„Є†љ6•J]!@™Яй›бS; ЫВoА,ћAcc#A@:F$СѕызЧ‰Ф%)№xПхЉEР|Е˜Џѓе јшчdЄrѓIENDЎB`‚knowthelist-2.3.1/images/slider.png000077500000000000000000000116661342115213400173360ustar00rootroot00000000000000‰PNG  IHDR@@Њiqо}IDATxкх[ipG~џЯ{BТ IАP!А‘Iшvз‹u_ „ ImUjїKжё—$ћЩЕыdзЉд~ l’Њи  н:уФ{{Y№sHH #ФiК‘о›ќџ=г3н=ѓВЗRћ!Ѓющ™щщџЏџwїгрџљЁ§Й№ч>,^џЋя­|nўќuЁЁѓ4ЧšІ+ёє˜uБн8ЭКFЯiђ},­>Ь:?§Ї:‚КЮGbдu]NКі ЅбюŸё›з~?ЬњfafЯйY˜™Пп/ѕѓєщЬcя АЏчэ }29UљooпПzѕ_ФyРыѕZЅ—кМXїx•’žХћ^єn@F<СшІСHФа@§aXЇв$„JЕ._ырѓљ`l|˜5кЈŸёЬ“Љ)8їЧѓП›šžоЇЅlЯјёЖ­i?žš†бБ1›54Эž%qщR˜U2ЛD$ћ'–B_2'˜§‰mТЕ]78E39‡П'•ж3ŒУрэлŒ ЬnLгјЫЂ"! Яп~|І^KNпq&4,єлє’$Т <œ0aцЈюQ  ЛoМЫ8Сэ>—эт;ЗћЖhнЙsoСъ•Нz5|ђiшZ„y§№тЗЖBџЗрЦЭ{АtщR˜ššж6$mяFzЪA №!Я3(<уD€wц„дЇЂ[ˆхoєАйѓњ xgLLL@sЫq[ БбАqуF8sц є#‹#–t~ўo€рmžЏ ФЪєч7PЙ=ecYyќ~ј§> ˜žžF™ Ce P ЮNу_н0›Цgр$4€є˜!ExЬЈm!‚шсtмНw>њгќncmьйpeoАZpм‰tŸm:<‚тTїЁМ““_hГ/ В•“у#h7ŸŠкfPЊƒйmкdгDƒчЮNгцшW1yъ7Р`kb{rxО&ѕА0| „/ZФL# $$$§јюW!22RЖЗšфZl7nМfcЖsчSЈŠ7•–'SаwНІА$G†сЖQhVEОСЋXœMŠВџ‹AˆŽY]]нK—&цТ_w?ŸwћgEiі9 ЭЎˆЖ}e?;—ƒzыж кѕ;Ь#t=Ьv}.эfлђхЫссЃaј№П —;M"#–&ьй] ^п+xVђl?EŸzbbЂ"ЃьћтlЋЅMГ=ЛѕОY Оќ’йv>=Mў€сњŽЂƒс rhh(~k9,\АК{ЏA]c tJМВ іЊ\šgKK#ьфчТѓЯ?ЏИЄˆ— љсд'  ОѓтHNоB LЂRzєиВчЂHЙ bzімИwя$nоыcуЄ{K–,Є‘—8ЁЛч*p:ЛvћJ„™И/”НЯ:KOлЪNЇмѓk›PUЌAсŸЊЊЃ02:ы_ˆ… \ЦЧ',™u›eUœD>ќ№$Г 11kq|лX+hфѓ/РYч§щющ…њ&€W^о ћ_+‘g^р„вВУЌž–ši€”k)‘`§!эMajuЭ1$x ж­]‰‰),„Ug9СjУщг'1вЗCВ<?/$DŠ8 ююЋаамЊP\Џ›h.”•f_JKM3PЬЂhDЂЉ>=‹2OЁЉЯoШucS=ŒŒŒРъеб8cлe}с жц …tIЄ&''`-КcG bgaМMИ q@Cs› РЫРЋЛ%т9[гuyљіхдт€tg*ТIЉf[Tft‡™њ†:ІTiЦЖІoŸ›ХьЉzяфЉ@\\<ф0т-[ ƒФ@cs;t^(оU( 80хЅьЃЉШЉЉщЖвXŸrЈˆрY$œ9ŠУњњњ ­э8>3УИb9Zъ‡…~ШK™шЈ„Л*ƒЁ™љ$рd Š(тЫЩЮ3‰цў.q•`S rР• їq”йЇГтhы"5%е'šNнЄšѓчrГяctvВЃPћ?їмspѓцMду,c†‘Z||<3W…EL4dЎ‚Љ4O:Nг$lмА23ГeТЭ?œ €цуэ2Л€НЏиn­рєаy”Р†”-iŒ (Uх3 'ЂUз•sгhж:клс7Пў#”„є-ˆxєD!66.\Шњ{уР_BttДSй8ЈЯжжfДА!n§щъ *СцжшиY”Џ!Kљ ,NT”ИЕv2У“ЫНУ,РйГ€Šђr&я4ЛФц>d p€Ш;‹ˆˆА?xѓ-—,= 0ш0oо<p45з: 6о@ЗqˆТ•ю^hi=]н"…@ЩЫ,bу‰ёŽ‘ ЌЎЉ2H†ЄЄ-БrАТK@OO7МѕЗoВA.ТрƒfxжTŠwХŠжЗШ њћј!АЦцtM$йц ъƒњІЃ ­Ъ„ @FF–еŸ* :у€^8оFєкцСо=ХЦCfvеўИ†ZЛЦ‰Of8#.Гє.%$щТй~яНџ„ѓчџ‡Щ=qБ<0"„€!‘ [ўЏpW 5ƒeo<ФˆE/0ѓЅ,‡щЭсœљ–Ж“  €ьЌ и]\hГАb ššъX}гІDt7“Ьи]\'0ž%№|>П$д~љђ%ЈЉЎfšŸЮЬ”Ў[ƒТ\втЄќ9DЏБ9РЁћА[rpDжhlЌc9РиИ8Ш@D‚u{њ@zrВєUѓЧaCc-k'тIи‹š$ЂиїŒgЩ :}њјєќyXМx1€ˆ'Жђф ›}rŽ~њю?Уš51рkЂvЗ@ рьo—6$ћ­эЇdШЭЩ ˆDЭ/СE 11‰)BU8ыb)Ц =DЧЊ”NЪoѕЊhЫŒ’уДgЯдсџлВРEFЗэ;ja-щ€—^Ъ”иŸ?ЫKвўmЇ˜5АШЫЭ‚@Œџ…ЏЎОš #х?))YЩиФЪ\рL”№6r…‰нcзЧкžУс1гdRŠ/ъ‘(ЖАркпQъhџ{ЁэФ)Œ ШЯЫ†НЛ‹%тEkjБёёЩЩ).щ*gн8Ј ц€cзЧYZћYI5бAзѕФд‰РСАж .а™д~т€xЕЄи‘ тЎЉЉdONJБpІЫЎQr„ Q__cpimюЙ= NГипу(R‚™жl‹цЕu|Рb €‚ќ\УамхњXu%@ђ–и",ё)F†rЬPWWmА,ѓмВ%"$РœЉ.Aг“ˆŽ€Š"Ѕ*C@kћI–Б(,ШeЎ0(ЌЯыUЧ*иЫ[’S!у;\Vs†nр,Ћk|@<••#яœiСЅuoмЈE@ט '˜‘хДџX—;ЏРqr„8iТ(+ЋЪйЫD|jJšыlŽUWФoРш-з9йж_M™y {_щЈёБQT‚ #3Ы•pЮЙТнН ЏПКЧ1ѓ•v0DY!еYтцSms‹ЈЈB‘Ђ$ц†ј›“\ˆ—ƒ:ŽеT™"Yйж~71ИtЙЫ C€Б2у ‡5Ц2м,9Dd§ r@%Šдиш‹пssђ]А)w'осK Гџ§?ўy“ЎYЧ&‹ЛХ‹—@NN,Р8„€џ/uva8м!А xc_‰ƒБФЅlЉЉfFHsбЊQ-ƒр-­,G0ШЫ-p@—ыjIЗД4Уйsч`ЦbГI!w;нbJˆюпbbb,‹pёr'4o‡žоkr>рзJ\‰72BG€чгyRT д#БП HцJтЈQ„› ?ЏР}ўN%ўЃ>‚кк‹­oпОЭb ОЅg§њѕЬн&Wћo~№&rEŒ%/uБŒPЯU€§ћі:XŸŸeхGывьЇ)^є„т)–U”1@ф Њ_ін%т)Їп}:Œн‰иЁЁ!IђяFEEСВeЫЌќТлoП kbжZ ётЅNhlV(оYШD@Z‹ЇцuYйa6H’џєєms 0ЅeGlNи ……E2б\{ юЋ‘_ш’’=,Ќцљ"œN1ПАrхJKщ‘˜М‹СUЬкЃќsС€]…&ићx8ћ[•Š #щФюKчрhsr5––Ж(*кЉЬКЎдэ­sзЏ_‡ŸќфŸКaўќљR~їOђO3ЯЃЬїa:€sР…‹—йК@яеЯœx„]]єŸdˆBXJm=eKг#ЈpАЕћ%(cДьєЮ;џhю)дdйWИ‰їm№>ŒŽŽТІЭ‰АЋh—5cъў@ˆгžfЉ6:ˆxИцЪЪ+$РhBЎ)рkƒц€Яќс œЯ/ё<Пp№р!С ш№)рj>Пў9:>pїю]Цbдб§ћї-q й#т yњ@ii™!ƒ*ˆ\В8ABИ‹€ ћ К€Е з7nм@6fpВћ+VЌ4RlГ3 ŒяяћFЦ€ЂŠђГЁЌД>ўјwVўŽ>FГ,ny]ЕjЛGбааh)!1“,™F%aBKm ,(В р3Ёhl аЏ@W+юZKЯ &”њ  ХбЋ*$&ФС;?ў#˜XŠчщйVY“@R0”Хс‰SrЛ пФўШЊиk§JFа5!тЌг&hъoлжэlЇ˜kBT†h‡Ш5€р!™Є57$Т•Rф‹!œ+ПšBДŒG „фч3hl!Ў,ZžДyќ№яоВ27/ФlБпёкїЉ4~w$џЖHє-ш№ѓп YПВDыŠVнчъюэж;>mŸї›П=Ђ-:ƒƒЗйw/wuятЗs<мb}іѓў)Э§GSжVyeЫМ[&IЕ2ч8-‹ѓyuœђюsѓvОИеBoФГxЎ †ГМKz,pЪЬЭ}VВЬЎm2Ёрв/Iљ}тАБё Ъ"_ДhбnKєт6o]7зщ~ѓчjД+[ AЅ=w.‹ђ‚†.JПCа…Х2^“Z…{RrUфЁ”–щФй78Фf^hш]фЪž?ўў~7нc‹—DiЦoіќДЏaЉ!@єЛFљѓ @ц5;5Nѓћ|МMЈы v]Wъ~Џ7DGBшƒьšN$Pї†„јщгtэЁћtbЛЧуЅћ0ќшЫ€ЋmЖ!"hŒA{ЉФЩІm–^~=‡2иЩ‰ї€ ˆœ8]Јћ…6Ÿвц›CщCњЄv]7~x ЬЋœ! ‘Ъ0M!кЈgємьžŸu{WuцмˆјКœ ‚­Š„Шђf_=ƒЮИ ъћЎlьPeY$*X›ЊмJ=HщvњŸб&ієј_|‘дiЅhФIENDЎB`‚knowthelist-2.3.1/images/star-off.png000077500000000000000000000007661342115213400175740ustar00rootroot00000000000000‰PNG  IHDRѓџaНIDAT8RA‹RQўЮёщ3#СZЙˆC˜\ˆЫQЁЁEЕuSћжmjQ-c щOєr!ЖАж’‹†РеHЃжC=_‹о…Їѓ„.ч;ч|ч~ї! Q’†-k4{ащtОoчœyсЩИЄяћ'$Р§]BЦіЂ^ЏWвщєжыuЕнnЋг]ЬОяП $™LОмUЇ "™(иl6‰ШУ0’ŽЧJ(—ЫWsЙмлD"ёKUk$o‹Шuз ™?ŒHŽVЋеЗЩdr*ЅRщZ>ŸŸŠœЋўSцЩ–Чwt8^Ьчѓз>ИIfЖЋЩсŸgГйнбh4•pЎ‹E+ Eф(:yлH~Z.—їzНо~Ѓ[ЄJЅr+›ЭžЙыЧI‚`ЏпяŸ9|c‘TѕмЬЈЊНrд‹Хy4ои3л')f3лаю0UнПDРp”чy‡‘ІЉ™’|gfS‡g2™У( RЉдЩ?$пA№f0L Z­Ођ}џ9€'.ˆˆGrЅЊПI>ыvЛ'бЂшi­Vћ!"76…$Z­жЭИ?џџ 6ы1ёиBIENDЎB`‚knowthelist-2.3.1/images/star-on.png000077500000000000000000000012551342115213400174300ustar00rootroot00000000000000‰PNG  IHDRѓџasBIT|dˆ pHYs № №BЌ4˜tEXtSoftwareAdobe Fireworks CS4Вг 'IDAT8’?LaЦН^яk{зЛŠ-`$Х‚ „C&T7eqraТЄ qrs#N˜˜f#dСХбЅiMt†"ZJŠ–†Dл†;*НЯ?C›шГНyўМoОчƒШЄS—3щTO#кˆІ€pЋž@iА= ™У‘H4™IЇ†џ) “Nyщц–Ђб(РT&2Югzў2і­РжжKс aЄt)•Ъ|поžž•фркI@&Jя€˜Ўј4–FйЏ:H)б4 ЧЉRмйСukиЖ №ИЇ $sљќЦt(ЂѓZ'mmmgп@J‰mлЈЊ—іЋэtuї`š&йеьыфрG/Рвв›ї7ћћbBˆЊЊт86RrPЋр86Пйўі•хх•ЗЃcу#pЊЦ•ееІeХ…&nћƒ~ЊUG$ЕZ UѕQ)я‘Яo|ШхжяŸћˆ3Џ^Цуё+љDG‚JЅ‚Ђxp]‰”.†"їeЭЭ­иШшижЙ5655%‚њa[^Џ‚‚@ €ЊЊы:Vиъ8э9 „ш1t!ƒхђП~–BЧяbZ&BгњN{Ю|eUѕuы†AЁP`ЇPШ9ŽѓLJ*ХbёIssKзХHŸOыЏ Ѕ{§ѓкЇќююю‹ЩЩЇ3+йlщˆš[˜Ÿ}‰D+ŠвK=ЬЯЭŽз%АИИ№hhшnјxіШуТџ—ЕЦhD{ИКIENDЎB`‚knowthelist-2.3.1/images/stop.png000077500000000000000000000001361342115213400170270ustar00rootroot00000000000000‰PNG  IHDRN‘'о%IDAT(‘cќЯ@`PЊxдпfd````"вРQ…C_!#БЉ ŽМGCIENDЎB`‚knowthelist-2.3.1/images/vinyl.png000077500000000000000000000225411342115213400172070ustar00rootroot00000000000000‰PNG  IHDR€€i7Љ@bKGDџ‡ЬП pHYsHHFЩk> vpAg€€0с1š$ŽIDATxкхнyАmй]іЯЯpЯо{§Ке­nбB’$$Рq('‘\@!S!ƒI\PЙ(LQЁ*” •TRЦ‰\ЦqЅьŠc+Ў$P6žЭPN%ВБ@HВ@šZъVoИУ™ЯйCўиkŸщžћоkЅe”dКїžaпГїяЛ~ѓњ­пцџч#њВ;g§хt1/§yЂŸѕћ-бЕzыеџˆТяѕ#‹Ф[04Єзj•J­ZНў’CёЅ Z‹Х‰Ф‰Ч|ЅЏ№276ј`цм]Яњ”ЯљМЅRЉ\Сa‹3ОьhIo‰NuМе7њOz(юgIчRљЦП” KѓzQ•E}сyПч7Нп'ŠЦ6O|й­HOerџ–?цmбЫ{љQtЭБО\&• д†Вe‚‘‘sFеbфS~е?№1‹EѕRѓТK Р&щпэћ|]џр!ЛсPW" WпЊXЄVЊVќоŽJaъТ]ЗUЫ;~н_ї ‹ nјВ !О!§ыНЫ<ъ1зuХjdєtuƒJЈƒxWˆ‚ў[ZZ˜™˜+ТЅ•ЦюxЮэzљœŸїsn›Џxс%сЅ %>зѕ=ўLђк—ХЏpSЕŽ#]ЉЅЅ‰…Ѕ2№BЋлšGО$•‰,MLˆTЦ^№Ї ПсПє!sЫ—„џЇlџљбюcЏ№„‘JзБC™™‰‰B,зг“ыH –Ас‚RanfnnІ@ІЏ#Б44В‰,нѕŒчЋъwќчў…™…re#ў@hd>зѓv?нХ+=ю@%vтHbъТRъРЁЙT$ „ЗŒп@а>Џ‚"œ›ЉхrKFсИsŸѓ|U§ яђY3Ы ўЕ‰$2]ЏђWђ7Н&zRЯRъš3ч–r'ri ЛRY*”ОNsѕЉH*v“ввТФ…‘RW_jт,ш†sŸukщќXPхЫ_,-ујЩш^™ПЮ@)v"12ЛцPgЅщч&*‰Ў\W.(мyа‰\GW†ТмдаPфHjю\!RЛэ3Fwќ„_4Ејbљр‹ ‘ћLЯыНїњ“_ыдŽdЮMЄŽѕ%bБвиDхРЁžŽ…RЌоАfeИŒ‘вмФФBЌЇ+)Ьœ+ єMœ+Х–žіљКњпolІјbєС‹ a§ŽОwХя~CўzЙROЯШXъH"’`l,qфHІ2S‰ЅК2‘,x ЅZЅОNXŒЙ‰њФJ…БsЅC™‘БZьЬg oљ~џмt%Y_BЕз5№оЃo}ГЧTsC‘C" C…™ЙЙDOOНTі§"\wЃЂР ЕLlah*s$QZšЙP;ФЙЅивSž+НЧclўbEсХаА~зЋ§нЧ‹ZGjЄp ЃYКP81А4“:аUš˜kL[У ;a_c f–"ЉŽивTЅ#64”8ЋTЦЦr]S№‚ЇПъ?62SМ€‰LплЂП§њСзШХz s‰ОZЄrЎpЌcbЎяHad)wЈ/ /ЄbЕˆ•мќдb)*ssЉžдЬL"3q.5o-KcZ/|Ёєоo|Е=ˆЎ$?’јіќo~s4P‹ Ц-ˆ‚;лФv…DпLЁgaЉЋp!еS›ЉѕФЦ–ШeђgЫВ…ЪвBBЭж^ф CKЉ2‰ШXЧвRj–;qEы–ЛЗНйЉ‰b?W‰@Йоє‹_г}h5ћэjV (ЅшXJхІН Ч–Žфцj…3чJ]‡:ву ѓF,бб“bfЄЩЬњR#Грѕ,-uLEXH!YЇX›QЋuЭњХы§“Ћ§Т§4žп‘П§иЋ_Љ Ky›2лX№ЉЅLj*—ZшЈMtє-‚“zЃюŠT!ђ+,–+KU­,AGdlМЁЇ6а&˜ЩЭ‚ˆ6вУЛЋЌ‘ŽёЋыOњ§Ћ4AДїНHюаїtўЪ7„ДV*–>иFФJ]‘R78РKKЙYHg0зD€ѓDЋЅ‘ж*ŸхСЎ7W;Бд“˜JD†ш‡Ибў‘ZС*ЕВ™ils gюœ{“лћХ й @ЊчšџэUнЃ€cЋЈЂепцЇ’Šr5r3™ŽЙTlЈp ЋPK,\*х єєuuttuCТ$U››š!U+e2Г`№К SЅBЊТ[cКІn§М’™w‹Ч§Šх>HіЫњ 'o|Йкц’~ИF[к ’Љ%Rs=ЙЅмвTЎЋDj—C]йЪчЋТЊgЉ9ЂDІ#™™)Ѕj…\l,–šЪдfЕBмп5ЙѕыgЉЩWљЇnяѓ /‹@,5№Кшз^—D’Ръi№нврХЕFQLЁ#Vы˜(u*‘IHfP„4aoЙ5_Q8S" P˜YJХЦj3‰ТR„ЄXЉбэ4ћZšѓœ}Ф;œšэ:EЛ‰uњыз_q=,Dl^цzо›CI‚‡X„|`j.;Q› ' Йп‰aXЋ6,K –цІa1Ќ–Ш,‚Ѕ_ЪTцв A–!Љ­Ќџі2л6дR“‡ыњl8ѕ=8 –xKќ^uW{ВšЭG~G2•<0…LЊ˜›PЈ-ŒЭ! Ю$o"э"щТвre­bЙDЅ™XЎ)VfЏ!ОМ4пЛЏкМ#†Ÿё­юšnѓР64^Ш‘џўјхGAcЌЕ@kmYы…Ц4вI,%RЕЬ\ЌЋ)CО:вег哇`Њ-!’ыЪф’Р K ‰Z-З\[„(t›h[lЊТ–7гkѕ<ЕЫбЮќЇ}]єЫ/ѓ9^s@7Л8ЄБmšГе…XЄФФ\Ѕ–†x}iьЬЉ3‹pк\Я‰cG•ЅЙ™:Јж Х*‰Вмšћ]Щgз#l}„ уzЛЛлz нšџHІчЯѕуtЅ>*)ЂРœq@4YБOVѕЂ`5—‹еjГАвФ#Ÿѓћю‚ЎC№мmOƒOxд@WЪщBВq”ж‹Љ›ŽЯі;lkz&oЈ_ыƒл<mxЬo=вщ{пЬllРšвР6ШW–B€X‚š:0яЉ{ЪLп[ќШWxH'\мЬmOљ_ї>ЇxТ+NЈмбŒwVіKўіыjФ™љ?іƒNЭжlы8іЃљ?В’я(ЈxC 6ЯгKЖ‚Є­ќICnП]іŽŒ}кSf^яЛ}›ЧwєnНКЪчќ’їzžє*щЪ`6)Сђзї}ь.К4ЬOМбѓЦkŸ0队Dз‘П08юlЈЙжn+Сі§V$жЧЇ+у–N8ѕ{.МЦOzЗ7ы(‚pЕбZщ-z‹?с­žђЏ<ыРAPЃы5„нЧЎљл~w;8ŠЭГњ >жwˆ%њ^Ны8ŠW­}ОнКЄ}UŒ YqјтFPžїyЉяѕŸymXя[књюЦИЭ^ч{Шћ<%rМšЭЋ!ИќIЕ*Х#~~3Gд*С(,Ч}_%AбФ!OЋBЗЫ\k+Л­~’ "Я9їЈ№ѕFF! tПQс‡}Ѓ?уC&ОrEрšЌ]ђЏђvЯL_ы$ЄЩЖ8 рЇЧЙMoЗЂЕ§нЬік/ЈW_г&=3/˜zмŸѓ„‘6м~АV+3љNŸєA…kWЬш6є—СЙьF–I§yкu €TЯубФЛОбюѓuќЕ+ek}Aь–Б—љГ:!rПќИЗ[шx‡ћ :Т&ћРицФэcкQ)ћ~бМ Mж"Ш}[šІЋƒ[ЕЗ)Ћ‘6‰е ЩЅЫiNzС…Ч§!zлŸ&hŽоЇзa.ёпњ ™›ЋРч*Йпeіi„7шJƒ„ЏЈkјЗг№еЛn#пЈЋf=fЙzЬCЁуBщд3К~PwхэЙD~› йд*лЧ1зѕЏіYУpХkяўЦАољжЦDG^Ђђ‚ |]zЅэ3Ѓи3 Л2~yђvџ'GўHXжм –8r=Й‚ш]НКЖE М0ЗU^O›јv_kМУ~ыyпLˆ\ц‚mвFошGЬ=Лс]„lcpН VЬ7…ЂХh-БдзЦi|Izь…cлv+(œ{жcОЫhыRзd_ѕЈЗŽиdш?№Е^0])NŸnТК п6‡4Пc^вРmйлзФжiъѕЯ>ЬwеVBУ3цОWgЕZГЫрїb[Lšч…ŽЦ {tРf>№~z ЭЛ& K“+HtН>й8ь2l^мeЙn!И№œзzЋё)—Щ_k€rkж7^Л>пьNЭЏPЪе•dя{/ъxХ&4œx<КђKZ™ZsР>ЧЃTЙeцэВoq[б=ˆькœм;qОC№~ђ]ёГт…ШWЕEЫщ €Ўof7Gуl{еЗ6RКхР[MЗ.І џбx‰›—ѕЬ&kвІоцФЉk—8 КщляmаѓЊPЄЕ: qУ roхзК?WЧо soђpџjƒЪKГ]ЎЌ@Й#ћђ=K7НЩТТЖыД<ˆ€WH7u@,q(пєВЖПj[ю&#ЋеЩЇј†`Ў6ООDќ.уЗя•Ёpvѓ“ц\‘7ReЛЂr/™п РУл"@Ќ/]ящЉТЯІ[МЩBе*ьнMќЕЋЕшzѕUШхФ—`-ћьЭц;…WcърJ’=€уя ю@$в‹Ђ #WфЏ!ЈУzNыН7љ›ш3=‡5Јі;ж1bЛЖД СіХяЊЯ–б3_}цОьW†єZOАU‚‘\дтГЉєжЛ;.MXšЃn8 LМ†`\й$>щ‹Œ/й”эЬУzчаБл{чіБ§ОpyгЏ ttЖ ’с™ЛЌПћљ6” ‡!oЈ6ц?Vя№?)МSrщђїC8є\ЈЛІе—`ЙlVŸцэ…Џ9Р:мН ‚z/?д6“е‚х.љбЦ‘ާ/~яrv%loЏЫwXљ2бЂ V3mЏ ]Л AН1УыЭnбЮчѕ†RlcВ&-bcі79 –ЏLPjЦ.g 69`;Е< љu{yіАжWБ§і{ычЅXdfjТ[­И }нќзџЉ 3?цж^љнх€HaЖ•DНь'{—ќM›œqЕ мЯэq‰ЁЅTНЁЗk жП'nљI|ЮXФЅЫОМАБ0 +N/žќV†ŒСМ%*]M}YзU‡—БЕЋ[яyvљUГ`–ЙpЎЏк ?V_ љ9 ВmЭб~*‰saЩх2WЅЫЖэРj*‹VšвееЯдїу€ЋxЁ…Ђ’;їМ—[ЎШm™VQТејZ bЯ›:TйNt\іvСЈЖо“іХšІŠz•ŽюСлDoBQЩ№Io ЇŽЖТŸ}иИЌ]5Ж AьSšЕЧЋдрњѕ.;фsœ‰№}ЕкШЂюЌи7ябJInОЛ E‚zg Оe§{‘П У~h‹)?ЬЊ:`ћxaђоэ5/ž燛ѓyиўЄ1…‰Йђј2џћј оBь–щJVЛdяЭ—9`k<нnЏ‹љЅ3gћ|Њ§х—‹PкчЮ|@О'Мw*ф~Чf>hюXЊюНFМ™0йC>Ÿi=ъuЩўЉgіЅvsoћ“LmxRЩё,іPnќ-яёYЕчs–оЇуP–цы=гБ/cИУњ-Л}Ђ­mэ^iю›,ш–—+s6ёnAˆu|иo†вј]Ышѓq?ŽШ§ŽgТќ,T#DvYўrbн~>пnWMW,}Д…gSђїy‚—Е@Ћ3j‘sЫзkрVlњћЦЖКкЖхsП"—ЉWБesью>}:`Я8]7dйр#С‹UЋ72ЭЩтWћри<Выw§Cя4о@tђeнВrхР/;г—„LУІ2.УRџ~;pХјЬКRГuЌ*K#ЇnйMzVї }ћuЅoсєЏ1л О‡ И*™YЋt}Ъd2 MYn;џЫеќ­+HЖ_1~3t Бж•ТТЧЗ/iŸUиT<›кx{ерРиЯ:“ьUjћЄ—э@Ѓ,SCП*s “­T`S—”mд+Х[„пsгhэџДhЋ„’Р—Эў ыўАћŽнr AЖ7G"ђ‚Ї|Ы†нОwОy7§бъšGe—’клXGфw§МЁ/S…воІрvЙЪ-Ж7ымєfО9кš ёзќжО2ЙЖЬГуК7н{ц7Ѓїэ0v3Tn `ГѕМіŒџУЧФЎHW<В>ySj;єПр—Cч˜Т\ГY{‰…xe$79­СhƒќЖєagЬќ”;F­lц›ЪДЉ_№'№^ДХГэпѕ'M~Ї)_ЊЬ•ЁЋи臧Ž›ОкПс щ­ЄЕ2qЧч|дЧ\8vі5е{MX=  6УM­iВšѓr59qшKдйЖe5a|РаtГ^|ЗXњФЃ~Ю7z qɘ2Yйфf#U’c=ЙвЬФB)rшD›™;3TKTЙXіŒ5Џ3БдBЕjЌжКKхjїyi3ж\^ЋmКЕяї~/lKoІХk…™БПь­І7“уMБ”h! тА“pfЎЋчШ‘ZanюЎ6~Œ$в•HдцЁER&гSˆеЁgШRД"ПйО_lшќrc*т Žhз&KѕЇ§žЩііЙ­u•…Бпї1Џ0h™>к€ м"­ЭўсЪФDЎЋкhЌыN›CMџ˜Й*ЬќЬ\ЧPН*‹hv/ЄцAДвоШ~) )сЈ7ЖщќеЫ}†vыb[№œw<Ј1ЄUFqpFЪаV!ЕP„šёŽ<АымииФ$”еЭMCбѓаЇК"‰в…дРB„ЉTb. :Ќ]|ЉЕыŽы]mmdкОW)Ÿін5ВИššФШШяјшНЂЫфG+Я=™Щеj}KK}ѓ7§QїTW7lЛЈ-œJ<$1б3U`.7еnаZ„Кƒ†й“№-еŽ 4*д_ ЛіюБiЊй6wшІ7љїlЎАУ6•DN‹ЭЅr•\djњCЦСOkTXЙвDiЈ.of ІR7ѕ•:2c‰ыЁЗШЙLl&ГP‹CћœЭXaГUSнЩЇќ‡ОpПmsыwžєЊћ“о"и˜НJ)Gіњv$ЁbehЌ-ЄoКЏЖ{†ЛК2‰Ѕ™ ЇJз]зdf.t›ШdЮuХц:ц„эГыН,kАMс4юѓЈЎпэS›рUаnНщ OџAиП­Г*хJ…\bЉЃQYƒ 2KгрэuB4пŒвBinЉ’8|бГ4дѕˆRi 2sliЎvO‚>ио;кІHЪ w.L~н{vwЫмеа4іљ–ћ @Ќ 2›)dЁЅIOЅ6*tУжЗžkŽCБЁ‘‘БЉBЌчиu‡R•Dbю–Т GЦ=g зЬ”њFваГ`ЙZ}hAhНбіgщlф‡=Bря8НDQ“;їНУзмOъа@#VшXH˜9›KнДtЎ20ъ)гq(кРО\Э_у:Ям1бїШF‡Њsзѕыщ8зS›шYШB‡ВbЅз;о<у=nИ3іїЈУџџ–яКЪ-nKšСR$Г Г{ 3ч"з ,ЙPˆemЂЭђз –[HBЙ3•C•Бއє н1–8а“„-ЅЖ‚А^ѕа‚ѓк‚ћц 둆дЩмBЄ/7ё‚Ѕ›NŒL\гwKсaЙJfhщP*ЮcC/ ыђ Зœ?X_йЫћД\sгЗ{wыwDцj=™Ъ…Т‘ž™к‘ЎБSЛ.5з㕆]‹ыЩfіЋа/"–ыHLœщЛ)uзд‰CЇFrЄ–ZЌТфiјІsЗŸїЃ>Ш ЮТ €С‰›Оо"VЉЎ……м@г њ\щšA0RЧ"Cч =ЧЅ"ѓАяИДЮ&4t3‘ЪьCffІІІffцсfuѕKCќK @ B\єцfэ#з‘{Ь“^юfИ!сfЭЬЙS/јœЇН`rfM/юЖЈ`нX№%Мр—~ДЕjmяеtЅцлG{ТэНsЅr#RZ†,щR{џuEоK|Б_šБо9Йй“Г§Yпxr @{ч•"ќ]7™њ’ўЅ`ѓћзЗнn;rЗ%НmЅдКРcЛŸвv юџ и=ЯНЗк™ы/!сэјП&‚Ѕ Jчz”%tEXtdate:create2010-02-10T04:44:17-06:00 пЉТ%tEXtdate:modify2005-06-28T02:35:12-05:00DфjIENDЎB`‚knowthelist-2.3.1/images/volume.png000077500000000000000000000104451342115213400173550ustar00rootroot00000000000000‰PNG  IHDR@@ЊiqоьIDATxкэ[pUз]ѕ‚$„zA ‚(!ݘI”аТ$ИыLь€‰“Щ8ёxR&žxpФe\bgт'˜ё p0ˆn ВщB’P/HЈзœГџ_љ!Ж>"ВБЏgч}Оо}џюйнГ{ї>;Щ7|8 ѕ†zмH T—о€счжнФB\œлs#0ўZ&пŒ…x88ЗcаprrrЦХ тq…№п$šnH'ЌЗЗЗы:р ЧHАќš€вžИ@Б\ƒХFFОO;ќ‘H3ЄRƒ9•ИV9;;7vc\@ІУ@'`сœагг3з8(ыюю>Сгг3жУУ#Ÿ‡ЛККzКИИИмжгйбббдоо^пжжV Щ…оy˜{s !ЅИЇѕk”Їт$$(zГЏЏяДсУ‡іђђrФЭЭM€zˆЁЁ;;; HKK‹444дcd755эХпрyЧqюыјJХнЁ8Щf:”Lѓїї_8bФˆ aУ† Јєѓt>шъъRZ[[ŠKccЃ„ЮЪЪЪ“.\x@Р§Ÿтw*ПRРŠУБИщXмB(О&00p4,яŽЊЊ*ЉЉЉ(ЃVІХщѓ$88XЂЃЃ%$$DAА ЕЕЕZЯŸ?Ÿ‰я3№{{ё[љџ/~И*XL”Ÿw_ VBo???лЋтTК  @ЏT”пб#<<=дшўˆimБYŠ”I“&ЩŒ3дCч———їž;w.џў;~њП˜^г9d@љ(№]ИіЁЁЁ‹рђЮUžж;|јАZyфШ‘.aсaя/O/qO2ў™zёяЛxёЂT”WHEE•еЇЄЄШ‚ ЄЙЙYПƒШйГg+ЪЪЪоФoПВО$~bKЛ=ЦЫ€Х3ЕЅCљ{УТТѓNTž>qт„”––JxDИ$Ф'ؘи1j}*qЁў‚Zš–ЅЅ{z{4ісA ŸСПСх%??_Ю=ЇрЌYГFфsKJJфєщг5уUЌažsј Т!я ~,а DДdv,Л Ъ;3†In}є‘о“8.Qн˜ŠгЊTк(Hnш ЧУ€мааи ]]Pe˜Я0Z[NЗšžž.ЩЩЩ‚0аяZe№Š?СяˆМЋ(ёБ`ŽŒюK`5‡›юˆˆˆјQ@@€D•пЗoŸzнvьиБR]S-uuu‚ћ$4$T‚C‚%!@м=м5ўM $@ѕuѕRЫзежЉЛЗЕЗIЬЈiim‘OВ>Q˜3gŽЬœ9SЮœ9Ѓ’››{ Dљ"жГ `V_A‰;хJњў#ˆhPPаc НPZž бђ^о^2kж,‰‰‰Ё‹*йХЧХЫЈ˜QЁ1O‹Sa*ЮЯМіXр EgЮJ%И€ж&Аƒ”SЇNЩтХ‹%>>^ЃААА7''g#<ш €ЩЂъ2:,‡9ЈmXœ›=юЋІбђЦ<йћІ97IllЌВ~Td”ФЦХJтјqšѓЉ4…J[Хx CЄЌ„WЄЎЎёящх){їю•‚ќyрє~@/hPЯbо?№Ќг—Q‚§€$qŒOZ= r,ђфMхЩдййй2}њt™:mЊ.(**JЧIBb‚*Ч7єсJPШ Є /ŸJj!WькЕKZš[фС”ЂЂ"шфЩ“{@ВЯИ­xnЛЃю~Йa`C!нллћч`!гIaё’š–ЊESм””)jySнЬЕПpЌ`ˆВБЁQђsѓ”тт%€8p@Й€\УяPРXЙoуYgЏŒЁлQЅ§ёяOыГ@aŒІЅЅЉuJKJ5 ’РўœE…™ТЌ \Щ ЌƒŠрgL•Ш$t}‚)™;2ѕЗз­[ЇW‚Oм‚д ˜Л“›ЌС  y822ђ>*OиППDEGЩЂE‹дЧ')SSd8R7Ъ›ЋQў"kзЎеB‰ MОƒп{ы=4˜А›s/ЌџАП‡I}TbщвЅњУsчЮ“ЄЩI}›+М>џЬsвжб&AСA‘‘A#%pd цчыЇТъюpжa„CМФХЧѕy€€R")ћdЖ‚HЅwfю”eЫ–щ=Ьg/ВНр А L[j ƒэЙ|‹>„єі(”wbќГъ›8qЂм<їfM},NЦ ŽЉ,їєFqЪ!0Кнe5ЄWў›UbtTДњJN~ŽlлЖMŽ~rT/]вguї эmэš;:;ФХйEЖlйЂ•'ŸУu€l”дObЭХжjуИ 2йAа:`\ёЇр~V~”нЛwЫlИмt— ћ*mȘ† “ХбцŒЭЊ|RR’V†ГШПЧšп[Ÿ‘утј^@ЯІР ?w˜в—@I/qЌдЃtMMMUЗІѕž]џŒnyеђАК†]ШшaЁaтыу+ххВoџ>йЗgŸxzxipС •щ$бъU•UPЖPЋЭŒЭт?Т_ІM›І (Iі L&xN?щ%)vn'м№АіŸП`О"мХЅЂ 'х­<§дzqvuю‹}џІ”fAХxЏЊЎв"‡<@ЗГРV3ЏnјОЎІN ДЃpўдЉSus„L@Г№czБƒф€I 俘ГфЮlвфIj‘єХ‹”˜ЌЪ›ЯЏПњ›œЊД*Ю,рoЫ“юЎn’ю}"юЄ!BЈ<7VМ—\P[U#eхeъM›2Д…6aТ%QPŒ џ„\Д+С,6]#С, ­p?oHprђdсtсiYЖbЙЦ5F5v Ќк>FЪ"xєe~ЛђtmggщьшTX$ХNp<ъЦМ€їВецюц.хeeJ†nюnВeѓь;•X€\<‡1џoH›ƒVПd€HШ§HƒC 7‚Р\L—^ЖЮЭЩ•ХKKдЈшОжЖUИЁyљХ—Фнг]"T„Э*F‹’єОњ%KWэ&ёoђ=ЯУнЉ‘ЗoпŽ—6ŠѓJсY­Lo`Зт;>м юыыK2єшл[`ќѓїB‚‚ЕAТ'‰—ю?~ќxн ™n1 AїgЈvPп+ ЙŒћ №€уиєыџtЯъ*xСЂ4ёЛ’тРАЁеЬ€љ;я7лdCРИіЎЈ**+$vLЌdffЊG­XБBї$фдЛёї §aXLqа.щ ђteмђxСTуde’+CжяфƒЩи# nPЂГ’!…Š€ўa`рГh}’^ŠvšШ;, Xp7HО!?|‘лРЏcїї6ж—u%ЖЫР‹ 3>їŽЛЋЗЂX‡Иї#Aq!<ЃЕцЮ›ЋѕAaAЁD€ФqcЕгCХЌ@а„ мNЛЙК)Їx*ЯJХSжЁ,9vь˜vžGЅgієЗЯ$ѓo’ЯЪпўx:@gј 4Ит]`п幂@в:zєЈюаиЌŒFЈO‰ [н=ŸƒуД>Я нэћў*j+Р‰#ЮNЮ’••ЅgІьЅы_1>П†5Н Йвщая9РЖЫЈАAВœч‚Plp2 ?~\ћї“'Mжі-O h]жюˆЬЮ^…­Sl#ОNћб…e.у`Вк;zфЈntxрBТ5ЧцpџFФџ_Б–›}WyПˆф—"Ž‘рс+)БУВ,}7šd^„`ьВCDЂ#KŸ0^Я з\4… š"ЈЗЇWHi}r умлЫ[7O$Tђ ?ѓœ‘€№Йќ7ЌпpоРяс9лЁ|“ƒўТq%xЪB>XХoCЊJ‚eh] -Щ KZ.ƒ*ЩзcВ^сqˆжЖV­+˜циdх!C‡Х=ЩЄP€и„ћxШ|ЯјЎН^Ъ_ 6&BR‘ВОfByыЋ0dщ2V}ˆuc2Яймаbg‡475Ћrђc9žЯр\&–Џ†lТМmbЋїkЎЇђ_€ёžНЯƒЕSСоiрƒ#TJПсОd~“іШ ‚F`tЫŒ @^А%”яFхy зїё[{  ЎЗђ_3B!3(P&…RЎžІ—gККІеmкнцxм\ЭлbІ›zZ9d/\~П]ё“2H{§С€ƒ)’oŠБъJ3Сcсњ|/аЩtxЭnЯФ?‡96ЗМ.з‰˜?слŸт–Ѓv)ћkь_EЬрq4па‰ƒВ‰ƒ8HМСžря\њљЋЋЋƒ/KBjЁ|1ЎЙјS!$’9/Žopи|Xlлњ Же_К–WeНХV3p'nџЬц Kj/Р˜{ ?пe ›5Ш#œл|#№;ШЏœћєG” ќšрЋ6%7 oъ ѕј€Ё^РPoъ ѕјЦ№?жЬ Щ_КэIENDЎB`‚knowthelist-2.3.1/knowthelist.pro000077500000000000000000000000711342115213400171620ustar00rootroot00000000000000TEMPLATE = subdirs win32:SUBDIRS += gst SUBDIRS += src knowthelist-2.3.1/locale/000077500000000000000000000000001342115213400153235ustar00rootroot00000000000000knowthelist-2.3.1/locale/knowthelist_cs.ts000077500000000000000000001413041342115213400207410ustar00rootroot00000000000000 CollectionSetupModel Select folders for music collection Vyberte sloХОky pro hudebnУ­ sbУ­rku CollectionTree Artist UmФ›lec Add to PlayList&1 PХ™idat do seznamu skladeb &1 Add to PlayList&2 PХ™idat do seznamu skladeb &2 Re-scan collection Obnovit hudebnУ­ sbУ­rku Title NУЁzev Album Album Genre ХНУЁnr Year Rok Location UmУ­stФ›nУ­ Meta Information PopisnУЉ informace CollectionTreeItem All celek CollectionWidget yy rr Random Tracks NУЁhodnУЉ skladby Enter space-separated terms to filter collection Zadejte mezerou oddФ›lenУЁ hledanУЁ slova pro filtrovУЁnУ­ sbУ­rky Core::Internal::FancyTabWidget Large sidebar VelkУН postrannУ­ panel Small sidebar MalУН postrannУ­ panel Plain sidebar ProstУН postrannУ­ panel Tabs on top Karty nahoХ™e Icons on top Ikony nahoХ™e DjBrowser Add a new AutoDj PХ™idat novУЉho automatickУЉho diskХОokeje Add a new record case for current AutoDj PХ™idat novУН kufr s deskami pro nynФ›jХЁУ­ho automatickУЉho diskХОokeje DjFilterWidget Form FormulУЁХ™ 1 1 Record Case Kufr s deskami Remove this record case Odstranit tento kufr s deskami x x <html><head/><body><p><a href="#"><span style=" text-decoration: underline; color:#e1e1e1;">Path</span></a></p></body></html> <html><head/><body><p><a href="#"><span style=" text-decoration: underline; color:#e1e1e1;">AdresУЁХ™</span></a></p></body></html> 0 0 Activate this record case PouХОУ­t tento kufr s deskami set set Alt+J Alt+J Count PoФet <html><head/><body><p>Confirm the remove</p></body></html> <html><head/><body><p>Potvrdit odstranФ›nУ­</p></body></html> Delete Smazat how many records per turn Kolik nahrУЁvak pХ™ehrУЁt v jednom kole Path AdresУЁХ™ Genre ХНУЁnr Artist UmФ›lec <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">count of records which fit to this filter(s)</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt; text-decoration: underline;"></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">PoФet zУЁznamХЏ odpovУ­dajУ­cУ­ch filtru (filtrХЏm)</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt; text-decoration: underline;"></p></body></html> ? ? select directory Vybrat adresУЁХ™ ^ ^ of z DjSettings Form FormulУЁХ™ 0 0 DjWidget Form FormulУЁХ™ AutoDJ DiskХОokej <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="#"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">DJ Main</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="#"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">DJ Main</span></a></p></body></html> Start a session of this DJ ZahУЁjenУ­ zasedУЁnУ­ tohoto diskХОokeje Remove this DJ Odstranit tohoto diskХОokeje x x <html><head/><body><p>Confirm the remove</p></body></html> <html><head/><body><p>Potvrdit odstranФ›nУ­</p></body></html> Delete Smazat <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="fdadfaf"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">DJ Main</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="fdadfaf"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">DJ Main</span></a></p></body></html> TextLabel no need to translate TextovУН ХЁtУ­tek tracks skladeb hours hodin cases kufrХЏ This Dj plays: Tento diskХОokej hraje: case kufr Knowthelist Knowthelist Knowthelist Fader ProlУ­naФ AutoD&J Auto&DJ Alt+J Alt+J Set Nastav FadeNo&w ProlУ­nat nynУ­ Alt+W Alt+W Gain ZesУ­lenУ­ AGC AGC Low Basy Mid StХ™edy High VУНХЁky MonitorPlayer SledovУЁnУ­ pХ™ehrУЁvУЁnУ­ 0:00.0 0:00.0 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="settings"><span style=" font-size:8pt; color:#df0000;">No 2nd soundcard selected!</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="settings"><span style=" font-size:8pt; color:#df0000;">NenУ­ vybrУЁna ХОУЁdnУЁ druhУЁ zvukovУЁ karta!</span></a></p></body></html> -0:00.0 -0:00.0 Settings NastavenУ­ Collection SbУ­rka AutoDJ DiskХОokej Folder SloХОka Lists Seznamy ModeSelector Frame no need to translate View: Artist > Album Pohled: UmФ›lec >Alba View: Year > Artist > Album Pohled: Rok > UmФ›lec >Alba Y R View: Genre > Artist > Album Pohled: ХНУЁnr > UmФ›lec >Alba G ХН PlayerWidget Form FormulУЁХ™ texttexttextt Text TextLabel TextovУН ХЁtУ­tek 00:00 00:00 <html><head/><body><p><span style=" color:#ffffff;">Time remain</span></p></body></html> <html><head/><body><p><span style=" color:#ffffff;">ZbУНvajУ­cУ­ Фas</span></p></body></html> <html><head/><body><p><span style=" color:#ffffff;">Seconds of silence at the end </span></p></body></html> <html><head/><body><p><span style=" color:#ffffff;">Ticho na konci vyjУЁdХ™eno poФtem sekund </span></p></body></html> -00 -00 Jump to the point where the music starts mainly Jump to start position SkoФit na zaФУЁteФnУ­ polohu texttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttext texttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttext -00:00 -00:00 .00 .00 textLabel1 TextovУН ХЁtУ­tek 1 Cue ZNAФŒKA Tracks skladeb Track skladba Hours hodin No track ХНУЁdnУЁ skladba Playlist Trackname NУЁzev skladby No ФŒУ­s Artist UmФ›lec Title NУЁzev Url Adresa Played HrУЁno Album Alba Year Rok Rate HodnocenУ­ Comment PoznУЁmka Genre ХНУЁnr Track Skladba Directory AdresУЁХ™ Length DУЉlka Bitrate DatovУН tok Add to PlayList&1 PХ™idat do seznamu skladeb &1 Add to PlayList&2 PХ™idat do seznamu skladeb &2 &Load &NahrУЁt Load as &Next NahrУЁt jako &dalХЁУ­ &Prelisten Track &SlyХЁet skladbu pХ™edem &View Tag Information... &Zobrazit informace o skladbФ›... &Search for: '%1' &Hledat: '%1' &Remove Selected &Odstranit vybranУЉ &Open File Location OtevХ™У­t souborovУЉ umУ­stФ›nУ­ &View Tag Information &Zobrazit informace o skladbФ› Location UmУ­stФ›nУ­ Meta Information PopisnУЉ informace PlaylistBrowser Add a new list and store current tracks PХ™idat novУН seznam a uloХОit nynФ›jХЁУ­ skladby Top Tracks NejlepХЁУ­ skladby Most played tracks NejhranФ›jХЁУ­ skladby Last Tracks PoslednУ­ skladby Recently played tracks NedУЁvno pХ™ehrУЁvanУЉ skladby Favorites Tracks OblУ­benУЉ skladby High rated tracks Vysoce hodnocenУЉ skladby tracks skladeb hours hodin Save Play List UloХОit seznam skladeb Enter a name for the new list Zadejte nУЁzev pro novУН seznam PlaylistWidget Frame RУЁmeФek Click here to show the content of this list KlepnФ›te sem pro ukУЁzУЁnУ­ obsahu tohoto seznamu <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="charts"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">Most Played</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="charts"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">NejhranФ›jХЁУ­</span></a></p></body></html> TextLabel TextovУН ХЁtУ­tek Load all tracks of this list directly into player playlists NahrУЁt vХЁechny skladby tohoto seznamu pХ™У­mo do seznamХЏ skladeb pХ™ehrУЁvaФe Remove this list Odstranit tento seznam x x <html><head/><body><p>Confirm the remove</p></body></html> <html><head/><body><p>Potvrdit odstranФ›nУ­</p></body></html> Delete Smazat QObject Unable to load database Nelze nahrУЁt databУЁzi This application needs the QT5 SQLITE driver (libqt5-sql-sqlite) Tento program potХ™ebuje ovladaФ QT4 SQLITE (libqt4-sql-sqlite) {5 ?} {5-?} This application needs the QT4 SQLITE driver (libqt4-sql-sqlite) Tento program potХ™ebuje ovladaФ QT4 SQLITE (libqt4-sql-sqlite) Select folders for music collection Vyberte sloХОky pro hudebnУ­ sbУ­rku Unknown NeznУЁmУН Title NУЁzev Artist UmФ›lec Album Album Genre ХНУЁnr Year Rok Location UmУ­stФ›nУ­ SettingsDialog Settings NastavenУ­ New Row NovУН Х™УЁdek Neue Zeile NovУН Х™УЁdek New Column NovУН sloupec Fader ProlУ­naФ Collection SbУ­rka Audio devices ZvukovУЁ zaХ™У­zenУ­ AutoDJ DiskХОokej Playlists Seznamy skladeb File browser ProhlУ­ХОeФ souborХЏ Common ObecnУЉ Fader settings NastavenУ­ prolУ­nУЁnУ­ Start fading before song end ZaФУ­t s prolУ­nУЁnУ­m pХ™ed koncem pУ­snФ› 12s 12 s Fader Time ФŒas prolУ­nУЁnУ­ Skip silent at start (AutoCue) PХ™eskoФit ticho na zaФУЁtku Skip silent at the end PХ™eskoФit ticho na konci Scan for new files and update the music collection Hledat novУЉ soubory a aktualizovat sbУ­rku Watch folders for changes Sledovat zmФ›ny ve sloХОkУЁch Scan Now Prohledat nynУ­ Scan folders for songs Hledat pУ­snФ› ve sloХОkУЁch Play Counter Statistics Statistika poФУ­tadla pХ™ehrУЁvУЁnУ­ Reset Vynulovat Monitor Player PХ™ehrУЁvУЁnУ­ Device Settings NastavenУ­ zaХ™У­zenУ­ AutoDJ settings NastavenУ­ automatickУЉho diskХОokeje Minimum tracks within each playlist NejmenХЁУ­ poФet skladeb v kaХОdУЉm seznamu skladeb File Browser Settings NastavenУ­ prohlУ­ХОeФe souborХЏ Language Jazyk Common Settings ObecnУЁ nastavenУ­ Change the language of the application (needs restart) ZmФ›nit jazyk aplikace (vyХОaduje opФ›tovnУЉ spuХЁtФ›nУ­ programu) About Program Minimum Tracks NejmenХЁУ­ poФet skladeb DJ Count PoФet diskХОokejХЏ DJ Names JmУЉna diskХОokejХЏ Filter Count PoФet filtrХЏ Increment play counter for AutoDj selected tracks ФŒУ­taФ pХ™ehrУЁvanУНch skladeb vybranУНch automatickУНm diskХОokejem Auto Remove Played Tracks Odstranit pХ™ehranУЉ skladby automaticky Playlist Settings NastavenУ­ seznamu skladeb Browser Root VУНchozУ­ cesta ... ... About Knowthelist O programu Knowthelist knowthelist-2.3.1/locale/knowthelist_de.ts000077500000000000000000001412661342115213400207330ustar00rootroot00000000000000 CollectionSetupModel Select folders for music collection WУЄhlen Sie Ordner fУМr Ihre Musik Sammlung CollectionTree Artist Interpret Add to PlayList&1 Zur Abspiellist&1 hinzufУМgen Add to PlayList&2 Zur Abspiellist&2 hinzufУМgen Re-scan collection Musiksammlung erneuern Title Title Album Album Genre Genre Year Jahr Location Adresse Meta Information Meta Informationen CollectionTreeItem All Alle CollectionWidget yy rr Random Tracks Zufallstitel Enter space-separated terms to filter collection Geben Sie SuchwУЖrter mit Leerzeichen getrennt ein, um in der Musiksammlung zu suchen Core::Internal::FancyTabWidget Large sidebar GroУŸes Panel Small sidebar Kleines Panel Plain sidebar Flaches Panel Tabs on top Tabs oben Icons on top Icons oben DjBrowser Add a new AutoDj neuen AutoDJ hinzufУМgen Add a new record case for current AutoDj neuen Plattenkoffer fУМr den aktuellen AutoDJ hinzufУМgen DjFilterWidget Form Form 1 1 Record Case Plattenkoffer Remove this record case Plattenkoffer entfernen x Do not translate <html><head/><body><p><a href="#"><span style=" text-decoration: underline; color:#e1e1e1;">Path</span></a></p></body></html> <html><head/><body><p><a href="#"><span style=" text-decoration: underline; color:#e1e1e1;">Verzeichnis</span></a></p></body></html> 0 0 Activate this record case Diesen Plattenkoffer nutzen set aktiv Alt+J Alt+J Count Anzahl <html><head/><body><p>Confirm the remove</p></body></html> <html><head/><body><p>Entfernen bestУЄtigen</p></body></html> Delete LУЖschen how many records per turn Wieviele Titel pro Runde abspielen Path Verzeichnis Genre Genre Artist Interpret <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">count of records which fit to this filter(s)</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt; text-decoration: underline;"></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">Anzahl der Titel, die auf diesen Filter passen</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt; text-decoration: underline;"></p></body></html> ? ? select directory Verzeichnis wУЄhlen ^ ^ of von DjSettings Form Form 0 0 DjWidget Form Form AutoDJ AutoDJ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="#"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">DJ Main</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="#"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">DJ Eins</span></a></p></body></html> Start a session of this DJ Session dieses DJ starten Remove this DJ DJ entfernen x do not translate <html><head/><body><p>Confirm the remove</p></body></html> <html><head/><body><p>Entfernen bestУЄtigen</p></body></html> Delete LУЖschen <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="fdadfaf"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">DJ Main</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="fdadfaf"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">DJ Main</span></a></p></body></html> TextLabel TextLabel tracks Songs hours Stunden cases Plattenkoffer This Dj plays: Dieser DJ spielt: case Plattenkoffer Knowthelist Knowthelist Knowthelist Fader Blenden AutoD&J AutoD&J Alt+J Alt+J Set Eins. FadeNo&w Blende jetzt Alt+W Alt+W Gain Verst. AGC AGC Low Tiefen Mid Mitten High HУЖhen MonitorPlayer Monitor Player 0:00.0 0:00.0 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="settings"><span style=" font-size:8pt; color:#df0000;">No 2nd soundcard selected!</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="settings"><span style=" font-size:8pt; color:#df0000;">Kein zweites AudiogerУЄt gewУЄhlt!</span></a></p></body></html> -0:00.0 -0:00.0 Settings Einstellungen Collection Sammlung AutoDJ AutoDJ Folder Ordner Lists Listen ModeSelector Frame No need to translate View: Artist > Album Ansicht: Artist > Album View: Year > Artist > Album Ansicht: Jahr > Artist > Album Y J View: Genre > Artist > Album Ansicht: Genre > Artist > Album G G PlayerWidget Form Form texttexttextt TextLabel TextLabel 00:00 00:00 <html><head/><body><p><span style=" color:#ffffff;">Time remain</span></p></body></html> <html><head/><body><p><span style=" color:#ffffff;">Verbleibende Zeit</span></p></body></html> <html><head/><body><p><span style=" color:#ffffff;">Seconds of silence at the end </span></p></body></html> <html><head/><body><p><span style=" color:#ffffff;">Sekunden Stille am Ende </span></p></body></html> -00 -00 Jump to the point where the music starts mainly Jump to start position Zur Startposition springen -00:00 -00:00 .00 .00 textLabel1 TextovУН ХЁtУ­tek 1 Cue CUE Tracks Titel Track Titel Hours Stunden No track Kein Titel Playlist Trackname Trackname No NТА Artist Interpret Title Name Url Adresse Played Gespielt Album Album Year Jahr Rate Wertung Comment Kommentar Genre Genre Track Track Directory Verzeichnis Length Dauer Bitrate Datenrate Add to PlayList&1 Zur Abspielliste&1 hinzufУМgen Add to PlayList&2 Zur Abspielliste&2 hinzufУМgen &Load &Laden Load as &Next Als &NУЄchstes laden &Prelisten Track Titel vorhУЖren &View Tag Information... Zeige Titel Info &Search for: '%1' &Suche: '%1' &Remove Selected &Entferne markierte &Open File Location &View Tag Information Location Adresse Meta Information Meta Informationen PlaylistBrowser Save loaded player lists into a file Speichern der Spieler Abspielliste in eine Datei Add a new list and store current tracks Neue Liste anlegen und aktuelle Titel darin speichern Top Tracks Beliebte Lieder Most played tracks Oft gespielte Lieder Last Tracks Zuletzte gespielte Lieder Recently played tracks Zuletzt gespielte Titel Favorites Tracks Favoriten Titel High rated tracks Hoch bewertete Titel tracks Titel hours Stunden Save Play List Playlist speichern Enter a name for the new list Geben Sie einen Namen fУМr die neue Liste an Playlists (*.xspf);;All Files (*) Playlisten (*.xspf);;Alle Dateien (*) PlaylistWidget Frame No need to translate Click here to show the content of this list Hier klicken, um den Inhalt der Liste an zuzeigen <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="charts"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">Most Played</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="charts"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">Oft gespielt</span></a></p></body></html> TextLabel TextLabel Load all tracks of this list directly into player playlists Alle Titel dieser Liste direkt in die Abspiellisten laden Remove this list Liste entfernen Remove this playlist Liste entfernen x <html><head/><body><p>Confirm the remove</p></body></html> <html><head/><body><p>Entfernen bestУЄtigen</p></body></html> Delete LУЖschen QObject Unable to load database Datenbank Ladefehler This application needs the QT5 SQLITE driver (libqt5-sql-sqlite) Diese Applikation benУЖtigt QT5 SQLITE (libqt5sql5-sqlite) This application needs the QT4 SQLITE driver (libqt4-sql-sqlite) Diese Applikation benУЖtigt QT4 SQLITE (libqt4-sql-sqlite) Select folders for music collection WУЄhlen Sie die Ordner fУМr Ihre Musik Sammlung Unknown Unbekannt Title Titel Artist Interpret Album Album Genre Genre Year Jahr Location Adresse SettingsDialog Settings Einstellungen Fader Уœberblender Collection Musiksammlung Audio devices AudiogerУЄte AutoDJ AutoDJ Playlists Abspiellisten File browser Dateiverzeichnis Common Allgemein Fader settings Уœberblender Einstellungen Start fading before song end Starte Blende vor Ende 12s 12 s Fader Time Уœberblenddauer Skip silent at start (AutoCue) Stille am Anfang УМberspringen (AutoCue) Skip silent at the end Stille am Ende ignorieren Scan for new files and update the music collection Nach neuen Dateien suchen und zur Sammlung hinzufУМgen Watch folders for changes VerУЄnderungen УМberwachen Scan Now Jetzt durchsuchen Scan folders for songs Verzeichnisse nach Liedern durchsuchen Play Counter Statistics ZУЄhler fУМr gespielte Titel zurУМcksetzen Reset ZurУМcksetzen Monitor Player Monitor Player Device Settings GerУЄte Einstellungen AutoDJ settings AutoDJ Einstellungen Minimum tracks within each playlist Mindestanzahl Songs pro Plalist File Browser Settings Datei Suche Einstellungen Language Sprache Common Settings Allgemeine Einstellungen Change the language of the application (needs restart) У„ndern der Programm-Sprache (nach Neustart) About Уœber Minimum Tracks Mindestanzahl Titel DJ Count Anzahl DJs DJ Names DJ Namen Filter Count Anzahl Filter Increment play counter for AutoDj selected tracks ZУЄhler fУМr gespielte Titel auch fУМr vom AutoDj gewУЄhlte Titel erhУЖhen Auto Remove Played Tracks Gespielte Titel automatisch entfernen Playlist Settings Einstellungen Abspielliste Playlist Folder Abspiellisten Ordner Browser Root Verzeichnis Start ... ... About Knowthelist Уœber Knowthelist knowthelist-2.3.1/locale/knowthelist_es.ts000077500000000000000000001211731342115213400207450ustar00rootroot00000000000000 CollectionSetupModel Select folders for music collection CollectionTree Artist Genre Year Add to PlayList&1 Add to PlayList&2 Re-scan collection Title Album Location Meta Information CollectionTreeItem All CollectionWidget Random Tracks Enter space-separated terms to filter collection Core::Internal::FancyTabWidget Large sidebar Small sidebar Plain sidebar Tabs on top Icons on top DjBrowser Add a new AutoDj Add a new record case for current AutoDj DjFilterWidget Form Record Case <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">count of records which fit to this filter(s)</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt; text-decoration: underline;"></p></body></html> 0 1 how many records per turn Activate this record case set Alt+J Count Remove this record case x <html><head/><body><p><a href="#"><span style=" text-decoration: underline; color:#e1e1e1;">Path</span></a></p></body></html> Genre Artist <html><head/><body><p>Confirm the remove</p></body></html> Delete of DjSettings Form 0 DjWidget Form AutoDJ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="#"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">DJ Main</span></a></p></body></html> Start a session of this DJ Remove this DJ x TextLabel <html><head/><body><p>Confirm the remove</p></body></html> Delete This Dj plays: cases case tracks hours Knowthelist Knowthelist Fader AutoD&J Alt+J Set FadeNo&w Alt+W Gain AGC Low Mid High 0:00.0 -0:00.0 MonitorPlayer <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="settings"><span style=" font-size:8pt; color:#df0000;">No 2nd soundcard selected!</span></a></p></body></html> Settings Collection AutoDJ Folder Lists ModeSelector Frame View: Artist > Album View: Year > Artist > Album Y View: Genre > Artist > Album G PlayerWidget Form texttexttextt TextLabel 00:00 .00 <html><head/><body><p><span style=" color:#ffffff;">Time remain</span></p></body></html> -00:00 <html><head/><body><p><span style=" color:#ffffff;">Seconds of silence at the end </span></p></body></html> -00 Jump to the point where the music starts mainly Tracks Track Hours No track Playlist Url No Played Artist Title Album Year Genre Track Length Rate Add to PlayList&1 Add to PlayList&2 &Load Load as &Next &Prelisten Track &Search for: '%1' &Remove Selected &Open File Location &View Tag Information Location Meta Information PlaylistBrowser Add a new list and store current tracks Top Tracks Most played tracks Last Tracks Recently played tracks Favorites Tracks High rated tracks tracks hours Save Play List Enter a name for the new list PlaylistWidget Frame Click here to show the content of this list <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="charts"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">Most Played</span></a></p></body></html> TextLabel Load all tracks of this list directly into player playlists Remove this list x <html><head/><body><p>Confirm the remove</p></body></html> Delete QObject Unable to load database This application needs the QT5 SQLITE driver (libqt5-sql-sqlite) This application needs the QT4 SQLITE driver (libqt4-sql-sqlite) Unknown Title Artist Album Genre Year Location SettingsDialog Settings Fader Collection Audio devices AutoDJ Playlists File browser Common Fader settings Start fading before song end 12s Fader Time Skip silent at start (AutoCue) Skip silent at the end Scan for new files and update the music collection Watch folders for changes Scan Now Scan folders for songs Play Counter Statistics Reset Monitor Player Device Settings AutoDJ settings Minimum tracks within each playlist DJ Count DJ Names Filter Count Increment play counter for AutoDj selected tracks Auto Remove Played Tracks Playlist Settings ... Browser Root File Browser Settings Language Common Settings Change the language of the application (needs restart) About About Knowthelist knowthelist-2.3.1/locale/knowthelist_fr.ts000077500000000000000000001362441342115213400207520ustar00rootroot00000000000000 CollectionSetupModel Select folders for music collection SУЉlectionner les dossiers de votre bibliothУЈque de musique CollectionTree Artist Artiste Genre Genre Year AnnУЉe Add to PlayList&1 Ajouter У  la liste de lecture&1 Add to PlayList&2 Ajouter У  la liste de lecture&2 Re-scan collection RУЉanalyser la bibliothУЈque Title Titre Album Album Location Emplacement Meta Information MУЉta Information CollectionTreeItem All Tous CollectionWidget Random Tracks Pistes alУЉatoires Enter space-separated terms to filter collection Entrer des termes sУЉparУЉs par des espaces pour filtrer la bibliothУЈque Core::Internal::FancyTabWidget Large sidebar Grande barre latУЉrale Small sidebar Petite barre latУЉrale Plain sidebar Barre latУЉrale Tabs on top Onglets du haut Icons on top IcУДnes du haut DjBrowser Add a new AutoDj Ajouter un nouveau AutoDj Add a new record case for current AutoDj Ajouter un nouvel enregistrement У  l'AutoDJ courant DjFilterWidget Form Formulaire Record Case Enregistrement <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">count of records which fit to this filter(s)</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt; text-decoration: underline;"></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">nombre d'enregistrements qui correspondent У  ce(s) filtre(s)</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt; text-decoration: underline;"></p></body></html> 0 0 1 1 how many records per turn combien d'enregistrements par tour Activate this record case Activer cet enregistrement set set Alt+J Alt+J Count Nombre Remove this record case Supprimer cet enregistrement x x <html><head/><body><p><a href="#"><span style=" text-decoration: underline; color:#e1e1e1;">Path</span></a></p></body></html> <html><head/><body><p><a href="#"><span style=" text-decoration: underline; color:#e1e1e1;">Emplacement</span></a></p></body></html> Genre Genre Artist Artiste <html><head/><body><p>Confirm the remove</p></body></html> <html><head/><body><p>Confirmer la suppression</p></body></html> Delete Supprimer of sur DjSettings Form Formulaire 0 0 DjWidget Form Formulaire AutoDJ AutoDj <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="#"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">DJ Main</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="#"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">DJ Principal</span></a></p></body></html> Start a session of this DJ DУЉmarrer une session pour ce DJ Remove this DJ Supprimer ce DJ x x TextLabel Texte de l'УЉtiquette <html><head/><body><p>Confirm the remove</p></body></html> <html><head/><body><p>Confirmer la suppression</p></body></html> Delete Supprimer This Dj plays: Ce Dj joue: cases УЉvУЉnements case УЉvУЉnement tracks pistes hours heures Knowthelist Knowthelist Knowthelist Fader Fondu AutoD&J AutoD&J Alt+J Alt+J Set Set FadeNo&w Fondr&e (Fader) Alt+W Alt+W Gain Volume AGC AGC Low Graves Mid MУЉdiums High Aigus 0:00.0 0:00.0 -0:00.0 -0:00.0 MonitorPlayer Lecteur Audio <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="settings"><span style=" font-size:8pt; color:#df0000;">No 2nd soundcard selected!</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="settings"><span style=" font-size:8pt; color:#df0000;">Pas de seconde carte son sУЉlectionnУЉe!</span></a></p></body></html> Settings RУЉglages Collection BibliothУЈque AutoDJ AutoDJ Folder Dossier Lists Listes ModeSelector Frame Image View: Artist > Album Vue: Artiste > Album View: Year > Artist > Album Vue: AnnУЉe > Artiste Album Y A View: Genre > Artist > Album Vue: Genre > Artiste > Album G G PlayerWidget Form Formulaire texttexttextt textetextetexte TextLabel Texte de l'УЉtiquette Tempo of the song Tempo de la chanson 0 0 Beats Per Minute Battements Par Minute BPM BPM 00:00 00:00 .00 .00 <html><head/><body><p><span style=" color:#ffffff;">Time remain</span></p></body></html> <html><head/><body><p><span style=" color:#ffffff;">DurУЉe restante</span></p></body></html> -00:00 -00:00 <html><head/><body><p><span style=" color:#ffffff;">Seconds of silence at the end </span></p></body></html> <html><head/><body><p><span style=" color:#ffffff;">Secondes de silence У  la fin</span></p></body></html> -00 -00 Jump to the point where the music starts mainly Sauter le blanc du dУЉbut de la musique Jump to start position Aller У  la position de dУЉpart Cue CUE Tracks Pistes Track Piste Hours Heures No track Aucune piste Playlist Url Url No NТА Played JouУЉ Artist Artiste Title Titre Album Album Year AnnУЉe Genre Genre Track Piste Length DurУЉe Rate Note Add to PlayList&1 Ajouter У  la liste de lecture&1 Add to PlayList&2 Ajouter У  la liste de lecture&2 &Load &Charger Load as &Next Chargement &Suivant &Prelisten Track &PrУЉ-УЉcouter la piste &Search for: '%1' &Rechercher:'%1' &Remove Selected &Supprimer la sУЉlection &Open File Location &Ouvrir l'emplacement du fichier &View Tag Information &Afficher les informations du Tag Location Emplacement Meta Information MУЉta information PlaylistBrowser Save loaded player lists into a file Sauvegarder dans un fichier les listes de lecture chargУЉes Add a new list and store current tracks Ajouter une nouvelle liste et stocker les pistes en cours Top Tracks Top titres Most played tracks Titres les plus jouУЉs Last Tracks Derniers titres Recently played tracks Titres rУЉcemment jouУЉs Favorites Tracks Titres favoris High rated tracks Titres les mieux notУЉs tracks pistes hours heures Save Play List Sauvegarder la liste de lecture Enter a name for the new list Entrer un nom pour la nouvelle liste Playlists (*.xspf);;All Files (*) Listes de lecture (*.xspf);;Tous les fichiers (*) PlaylistWidget Frame Image Click here to show the content of this list Cliquez ici pour afficher le contenu de cette liste <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="charts"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">Most Played</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="charts"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">Les plus jouУЉes</span></a></p></body></html> TextLabel Texte de l'УЉtiquette Load all tracks of this list directly into player playlists Charger tous les titres directement dans les listes de lecture Remove this list Supprimer cette liste Remove this playlist Supprimer cette liste de lecture x x <html><head/><body><p>Confirm the remove</p></body></html> <html><head/><body><p>Confirmer la suppression</p></body></html> Delete Supprimer QObject Unable to load database Impossible de charger la base de donnУЉes This application needs the QT5 SQLITE driver (libqt5-sql-sqlite) Cette application requiert le pilote QT5 SQLite (qt5-database-plugin-sqlite) This application needs the QT4 SQLITE driver (libqt4-sql-sqlite) Cette application requiert le pilote QT4 SQLite (qt4-database-plugin-sqlite) Unknown Inconnu Title Titre Artist Artiste Album Album Genre Genre Year AnnУЉe Location Emplacement SettingsDialog Settings RУЉglages New Row Nouvelle Ligne Neue Zeile Nouvelle Ligne New Column Nouvelle Colonne Fader Fondu (Fader) Collection BibliothУЈque Audio devices PУЉriphУЉriques Audio AutoDJ AutoDJ Playlists Listes de lecture File browser Explorateur de fichiers Common GУЉnУЉral Fader settings RУЉglages du fondu (Fader) Start fading before song end Commencer le fondu avant la fin du morceau 12s 12s Fader Time DurУЉe du fondu Skip silent at start (AutoCue) Supprimer le silence au dУЉmarrage (AutoCue) Skip silent at the end supprimer le silence У  la fin Scan for new files and update the music collection Analyser les nouveaux fichiers et mettre У  jour la bibliothУЈque de musique Watch folders for changes Surveiller les changements des dossiers Scan Now Analyser Scan folders for songs Analyser les dossiers pour les chansons Play Counter Statistics Statistiques du nombre de lectures Reset RУЉinitialiser Monitor Player Carte(s) Son Device Settings RУЉglages des pУЉriphУЉriques AutoDJ settings RУЉglages de l'AutoDJ Minimum tracks within each playlist Nombre minimum de pistes dans chaque liste de lecture DJ Count Nombre de DJs DJ Names Noms des DJs Filter Count Nombre de filtres Increment play counter for AutoDj selected tracks IncrУЉmenter le compteur de lecture pour les pistes AutoDj sУЉlectionnУЉes Auto Remove Played Tracks Supprimer automatiquement les pistes jouУЉes Playlist Settings RУЉglages des listes de lecture Playlist Folder Dossier de la liste de lecture ... ... Browser Root Navigateur File Browser Settings RУЉglages des explorateurs de fichiers Language Langue Common Settings RУЉglages GУЉnУЉral Change the language of the application (needs restart) Changer la langue de l'application (nУЉcessite un redУЉmarrage) About У€ Propos About Knowthelist У€ Propos de Knowthelist <h3>Knowthelist</h3><br />Copyright (C) 2005-2014 Mario Stephan <br /><a href='mailto:mstephan@shared-files.de'>mstephan@shared-files.de</a><br /><br /><a href='http://knowthelist.github.io/knowthelist'>http://knowthelist.github.io/knowthelist</a> <h3>Knowthelist</h3><br />Copyright (C) 2005-2014 Mario Stephan <br /><a href='mailto:mstephan@shared-files.de'>mstephan@shared-files.de</a><br /><br /><a href='http://knowthelist.github.io/knowthelist'>http://knowthelist.github.io/knowthelist</a> knowthelist-2.3.1/locale/knowthelist_hu.ts000077500000000000000000001360341342115213400207540ustar00rootroot00000000000000 CollectionSetupModel Select folders for music collection VУЁlassz mappУЁkat a gyУМjtemУЉnyhez CollectionTree Artist ElХ‘adУГ Genre MХБfaj Year У‰v Add to PlayList&1 &1-es lejУЁtszУГlistУЁhoz Add to PlayList&2 &2-es lejУЁtszУГlistУЁhoz Re-scan collection GyУМjtemУЉny frissУ­tУЉse Title CУ­m Album Album Location Hely Meta Information Meta adatok CollectionTreeItem All minden CollectionWidget yy У‰v Random Tracks VУЉletlenszerХБ lejУЁtszУЁs Enter space-separated terms to filter collection SzУГkУЖzzel elvУЁlasztott kifejezУЉsek a gyУМjtemУЉny szХБrУЉsУЉhez Core::Internal::FancyTabWidget Large sidebar Nagy oldalsУЁv Small sidebar Kis oldalsУЁv Plain sidebar EgyszerХБ oldalsУЁv Tabs on top Lapok felУМl Icons on top Ikonok felУМl DjBrowser Add a new AutoDj Add a new record case for current AutoDj DjFilterWidget Form Form 1 1 Record Case LemezborУ­tУГ Remove this record case x <html><head/><body><p><a href="#"><span style=" text-decoration: underline; color:#e1e1e1;">Path</span></a></p></body></html> <html><head/><body><p><a href="#"><span style=" text-decoration: underline; color:#e1e1e1;">Уštvonal</span></a></p></body></html> 0 0 Activate this record case LemezborУ­tУГ aktivУЁlУЁsa set beУЁllУ­tУЁsok is over long set Alt+J Alt+J Count SzУЁm <html><head/><body><p>Confirm the remove</p></body></html> Delete tУЖrУЖl how many records per turn HУЁny felvУЉtel fordulУГnkУЉnt Path Уštvonal Genre MХБfaj Artist ElХ‘adУГ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">count of records which fit to this filter(s)</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt; text-decoration: underline;"></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">szХБrХ‘nek megfelelХ‘ felvУЉtelek szУЁma</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt; text-decoration: underline;"></p></body></html> ? ? select directory VУЁlassz mappУЁt ^ ^ of a DjSettings Form Form 0 0 DjWidget Form Form AutoDJ AutoDJ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="#"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">DJ Main</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="#"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">DJ Main</span></a></p></body></html> Start a session of this DJ Remove this DJ x <html><head/><body><p>Confirm the remove</p></body></html> Delete tУЖrУЖl <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="fdadfaf"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">DJ Main</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="fdadfaf"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">DJ Main</span></a></p></body></html> TextLabel SzУЖvegcimke tracks SУЁv hours У“ra cases Eset This Dj plays: case Eset Knowthelist Knowthelist Knowthelist Fader Fader AutoD&J AutoD&J Alt+J Alt+J Set BeУЁllУ­tУЁsok over long Set FadeNo&w Fade mos&t Alt+W Alt+T Gain HangerХ‘ AGC AGC Low MУЉly Mid KУЖzepes High Magas MonitorPlayer LejУЁtszУГeszkУЖz 0:00.0 0:00.0 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="settings"><span style=" font-size:8pt; color:#df0000;">No 2nd soundcard selected!</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="settings"><span style=" font-size:8pt; color:#df0000;">Nincs mУЁsodik hangkУЁrtya</span></a></p></body></html> -0:00.0 -0:00.0 Settings BeУЁllУ­tУЁsok Collection GyУМjtemУЉny AutoDJ AutoDJ Folder Mappa Lists ModeSelector Frame no need to translate View: Artist > Album lУЁtvУЁny: ElХ‘adУГ > Album View: Year > Artist > Album lУЁtvУЁny: У‰v > ElХ‘adУГ > Album Y У‰ View: Genre > Artist > Album lУЁtvУЁny: MХБfaj > ElХ‘adУГ > Album G M PlayerWidget Form Form texttexttextt TextLabel SzУЖvegcimke 00:00 00:00 <html><head/><body><p><span style=" color:#ffffff;">Time remain</span></p></body></html> Jump to the point where the music starts mainly Cueval Cueval .00 .00 texttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttext texttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttext -00:00 -00:00 <html><head/><body><p><span style=" color:#ffffff;">Seconds of silence at the end </span></p></body></html> -00 -00 Cue Jel Tracks SУЁv Track SУЁv Hours УГra No track Nincs sУЁv Playlist Trackname SУЁv No No Artist ElХ‘adУГ Title CУ­m Url Played Album Album Year У‰v Rate Comment MegjegyzУЉs Genre MХБfaj Track SУЁv Directory KУЖnyvtУЁr Length Hossz Bitrate BitrУЁta Add to PlayList&1 &1-es lejУЁtszУГlistУЁhoz Add to PlayList&2 &2-es lejУЁtszУГlistУЁhoz &Load BetУЖ&ltУЉs Load as &Next BetУЖltУЉs kУЖvetkezХ‘&nek &Prelisten Track &SzУЁm elХ‘nУЉzet &View Tag Information... &Tag informУЁciУГk... &Search for: '%1' &KeresУЉs erre:'%1' &Remove Selected &KivУЁlasztott tУЖrlУЉse &Open File Location &View Tag Information Location Hely Meta Information Meta adatok PlaylistBrowser Add a new list and store current tracks Top Tracks Most played tracks Last Tracks Recently played tracks Favorites Tracks High rated tracks tracks SУЁv hours У“ra Save Play List Enter a name for the new list PlaylistWidget Frame Click here to show the content of this list <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="charts"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">Most Played</span></a></p></body></html> TextLabel SzУЖvegcimke Load all tracks of this list directly into player playlists Remove this list x <html><head/><body><p>Confirm the remove</p></body></html> Delete tУЖrУЖl QObject Unable to load database AdatbУЁzis nem tУЖlthetХ‘ be This application needs the QT5 SQLITE driver (libqt5-sql-sqlite) Ehhez az alkalmazУЁshoz szУМksУЉges a QT4 SQLITE driver (libqt4-sql-sqlite) {5 ?} {5-?} This application needs the QT4 SQLITE driver (libqt4-sql-sqlite) Ehhez az alkalmazУЁshoz szУМksУЉges a QT4 SQLITE driver (libqt4-sql-sqlite) Unknown Title CУ­m Artist ElХ‘adУГ Album Album Genre MХБfaj Year У‰v Location Hely SettingsDialog Settings BeУЁllУ­tУЁsok New Row Уšj sor Neue Zeile Neue Zeile New Column Уšj oszlop Fader Fader Collection GyУМjtemУЉny Audio devices Audio eszkУЖzУЖk AutoDJ AutoDJ Playlists LejУЁtszУГlistУЁk File browser FУЁjlbУЖngУЉszХ‘ Common Fader settings Fader beУЁllУ­tУЁsok Start fading before song end HalkУ­tУЁs indУ­tУЁsa a szУЁm vУЉge elХ‘tt 12s 12s Fader Time LehalkУ­tУЁs hossza Skip silent at start (AutoCue) Csend kihagyУЁsa kezdУЉsnУЉl (AutoCue) Skip silent at the end Csend kihagyУЁsa a szУЁm vУЉgУЉnУЉl Scan for new files and update the music collection Уšj fУЁjlok keresУЉse УЉs a gyУМjtemУЉny frissУ­tУЉse Watch folders for changes MappУЁk vУЁltozУЁsУЁnak figyelУЉse Scan Now KeresУЉs most Scan folders for songs Play Counter Statistics Reset Monitor Player LejУЁtszУГeszkУЖz Device Settings AutoDJ settings AutoDJ beУЁllУ­tУЁsok Minimum tracks within each playlist Minimum sУЁv File Browser Settings Language Common Settings Change the language of the application (needs restart) About Minimum Tracks Minimum sУЁv DJ Count DJ szУЁmlУЁlУГ DJ Names DJ nУЉv Filter Count szХБrХ‘ szУЁmlУЁlУГ Increment play counter for AutoDj selected tracks Auto Remove Played Tracks LejУЁtszott sУЁvok automatikus eltУЁvolУ­tУЁsa Playlist Settings LejУЁtszУГlista beУЁllУ­tУЁsok Browser Root Root mappa ... ... About Knowthelist knowthelist-2.3.1/locale/knowthelist_it.ts000077500000000000000000001211731342115213400207520ustar00rootroot00000000000000 CollectionSetupModel Select folders for music collection CollectionTree Artist Genre Year Add to PlayList&1 Add to PlayList&2 Re-scan collection Title Album Location Meta Information CollectionTreeItem All CollectionWidget Random Tracks Enter space-separated terms to filter collection Core::Internal::FancyTabWidget Large sidebar Small sidebar Plain sidebar Tabs on top Icons on top DjBrowser Add a new AutoDj Add a new record case for current AutoDj DjFilterWidget Form Record Case <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">count of records which fit to this filter(s)</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt; text-decoration: underline;"></p></body></html> 0 1 how many records per turn Activate this record case set Alt+J Count Remove this record case x <html><head/><body><p><a href="#"><span style=" text-decoration: underline; color:#e1e1e1;">Path</span></a></p></body></html> Genre Artist <html><head/><body><p>Confirm the remove</p></body></html> Delete of DjSettings Form 0 DjWidget Form AutoDJ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="#"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">DJ Main</span></a></p></body></html> Start a session of this DJ Remove this DJ x TextLabel <html><head/><body><p>Confirm the remove</p></body></html> Delete This Dj plays: cases case tracks hours Knowthelist Knowthelist Fader AutoD&J Alt+J Set FadeNo&w Alt+W Gain AGC Low Mid High 0:00.0 -0:00.0 MonitorPlayer <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="settings"><span style=" font-size:8pt; color:#df0000;">No 2nd soundcard selected!</span></a></p></body></html> Settings Collection AutoDJ Folder Lists ModeSelector Frame View: Artist > Album View: Year > Artist > Album Y View: Genre > Artist > Album G PlayerWidget Form texttexttextt TextLabel 00:00 .00 <html><head/><body><p><span style=" color:#ffffff;">Time remain</span></p></body></html> -00:00 <html><head/><body><p><span style=" color:#ffffff;">Seconds of silence at the end </span></p></body></html> -00 Jump to the point where the music starts mainly Tracks Track Hours No track Playlist Url No Played Artist Title Album Year Genre Track Length Rate Add to PlayList&1 Add to PlayList&2 &Load Load as &Next &Prelisten Track &Search for: '%1' &Remove Selected &Open File Location &View Tag Information Location Meta Information PlaylistBrowser Add a new list and store current tracks Top Tracks Most played tracks Last Tracks Recently played tracks Favorites Tracks High rated tracks tracks hours Save Play List Enter a name for the new list PlaylistWidget Frame Click here to show the content of this list <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="charts"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">Most Played</span></a></p></body></html> TextLabel Load all tracks of this list directly into player playlists Remove this list x <html><head/><body><p>Confirm the remove</p></body></html> Delete QObject Unable to load database This application needs the QT5 SQLITE driver (libqt5-sql-sqlite) This application needs the QT4 SQLITE driver (libqt4-sql-sqlite) Unknown Title Artist Album Genre Year Location SettingsDialog Settings Fader Collection Audio devices AutoDJ Playlists File browser Common Fader settings Start fading before song end 12s Fader Time Skip silent at start (AutoCue) Skip silent at the end Scan for new files and update the music collection Watch folders for changes Scan Now Scan folders for songs Play Counter Statistics Reset Monitor Player Device Settings AutoDJ settings Minimum tracks within each playlist DJ Count DJ Names Filter Count Increment play counter for AutoDj selected tracks Auto Remove Played Tracks Playlist Settings ... Browser Root File Browser Settings Language Common Settings Change the language of the application (needs restart) About About Knowthelist knowthelist-2.3.1/locale/knowthelist_nl.ts000077500000000000000000001211731342115213400207470ustar00rootroot00000000000000 CollectionSetupModel Select folders for music collection CollectionTree Artist Genre Year Add to PlayList&1 Add to PlayList&2 Re-scan collection Title Album Location Meta Information CollectionTreeItem All CollectionWidget Random Tracks Enter space-separated terms to filter collection Core::Internal::FancyTabWidget Large sidebar Small sidebar Plain sidebar Tabs on top Icons on top DjBrowser Add a new AutoDj Add a new record case for current AutoDj DjFilterWidget Form Record Case <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">count of records which fit to this filter(s)</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt; text-decoration: underline;"></p></body></html> 0 1 how many records per turn Activate this record case set Alt+J Count Remove this record case x <html><head/><body><p><a href="#"><span style=" text-decoration: underline; color:#e1e1e1;">Path</span></a></p></body></html> Genre Artist <html><head/><body><p>Confirm the remove</p></body></html> Delete of DjSettings Form 0 DjWidget Form AutoDJ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="#"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">DJ Main</span></a></p></body></html> Start a session of this DJ Remove this DJ x TextLabel <html><head/><body><p>Confirm the remove</p></body></html> Delete This Dj plays: cases case tracks hours Knowthelist Knowthelist Fader AutoD&J Alt+J Set FadeNo&w Alt+W Gain AGC Low Mid High 0:00.0 -0:00.0 MonitorPlayer <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="settings"><span style=" font-size:8pt; color:#df0000;">No 2nd soundcard selected!</span></a></p></body></html> Settings Collection AutoDJ Folder Lists ModeSelector Frame View: Artist > Album View: Year > Artist > Album Y View: Genre > Artist > Album G PlayerWidget Form texttexttextt TextLabel 00:00 .00 <html><head/><body><p><span style=" color:#ffffff;">Time remain</span></p></body></html> -00:00 <html><head/><body><p><span style=" color:#ffffff;">Seconds of silence at the end </span></p></body></html> -00 Jump to the point where the music starts mainly Tracks Track Hours No track Playlist Url No Played Artist Title Album Year Genre Track Length Rate Add to PlayList&1 Add to PlayList&2 &Load Load as &Next &Prelisten Track &Search for: '%1' &Remove Selected &Open File Location &View Tag Information Location Meta Information PlaylistBrowser Add a new list and store current tracks Top Tracks Most played tracks Last Tracks Recently played tracks Favorites Tracks High rated tracks tracks hours Save Play List Enter a name for the new list PlaylistWidget Frame Click here to show the content of this list <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="charts"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">Most Played</span></a></p></body></html> TextLabel Load all tracks of this list directly into player playlists Remove this list x <html><head/><body><p>Confirm the remove</p></body></html> Delete QObject Unable to load database This application needs the QT5 SQLITE driver (libqt5-sql-sqlite) This application needs the QT4 SQLITE driver (libqt4-sql-sqlite) Unknown Title Artist Album Genre Year Location SettingsDialog Settings Fader Collection Audio devices AutoDJ Playlists File browser Common Fader settings Start fading before song end 12s Fader Time Skip silent at start (AutoCue) Skip silent at the end Scan for new files and update the music collection Watch folders for changes Scan Now Scan folders for songs Play Counter Statistics Reset Monitor Player Device Settings AutoDJ settings Minimum tracks within each playlist DJ Count DJ Names Filter Count Increment play counter for AutoDj selected tracks Auto Remove Played Tracks Playlist Settings ... Browser Root File Browser Settings Language Common Settings Change the language of the application (needs restart) About About Knowthelist knowthelist-2.3.1/locale/knowthelist_ru.ts000077500000000000000000001211731342115213400207640ustar00rootroot00000000000000 CollectionSetupModel Select folders for music collection CollectionTree Artist Genre Year Add to PlayList&1 Add to PlayList&2 Re-scan collection Title Album Location Meta Information CollectionTreeItem All CollectionWidget Random Tracks Enter space-separated terms to filter collection Core::Internal::FancyTabWidget Large sidebar Small sidebar Plain sidebar Tabs on top Icons on top DjBrowser Add a new AutoDj Add a new record case for current AutoDj DjFilterWidget Form Record Case <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">count of records which fit to this filter(s)</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt; text-decoration: underline;"></p></body></html> 0 1 how many records per turn Activate this record case set Alt+J Count Remove this record case x <html><head/><body><p><a href="#"><span style=" text-decoration: underline; color:#e1e1e1;">Path</span></a></p></body></html> Genre Artist <html><head/><body><p>Confirm the remove</p></body></html> Delete of DjSettings Form 0 DjWidget Form AutoDJ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="#"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">DJ Main</span></a></p></body></html> Start a session of this DJ Remove this DJ x TextLabel <html><head/><body><p>Confirm the remove</p></body></html> Delete This Dj plays: cases case tracks hours Knowthelist Knowthelist Fader AutoD&J Alt+J Set FadeNo&w Alt+W Gain AGC Low Mid High 0:00.0 -0:00.0 MonitorPlayer <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="settings"><span style=" font-size:8pt; color:#df0000;">No 2nd soundcard selected!</span></a></p></body></html> Settings Collection AutoDJ Folder Lists ModeSelector Frame View: Artist > Album View: Year > Artist > Album Y View: Genre > Artist > Album G PlayerWidget Form texttexttextt TextLabel 00:00 .00 <html><head/><body><p><span style=" color:#ffffff;">Time remain</span></p></body></html> -00:00 <html><head/><body><p><span style=" color:#ffffff;">Seconds of silence at the end </span></p></body></html> -00 Jump to the point where the music starts mainly Tracks Track Hours No track Playlist Url No Played Artist Title Album Year Genre Track Length Rate Add to PlayList&1 Add to PlayList&2 &Load Load as &Next &Prelisten Track &Search for: '%1' &Remove Selected &Open File Location &View Tag Information Location Meta Information PlaylistBrowser Add a new list and store current tracks Top Tracks Most played tracks Last Tracks Recently played tracks Favorites Tracks High rated tracks tracks hours Save Play List Enter a name for the new list PlaylistWidget Frame Click here to show the content of this list <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="charts"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">Most Played</span></a></p></body></html> TextLabel Load all tracks of this list directly into player playlists Remove this list x <html><head/><body><p>Confirm the remove</p></body></html> Delete QObject Unable to load database This application needs the QT5 SQLITE driver (libqt5-sql-sqlite) This application needs the QT4 SQLITE driver (libqt4-sql-sqlite) Unknown Title Artist Album Genre Year Location SettingsDialog Settings Fader Collection Audio devices AutoDJ Playlists File browser Common Fader settings Start fading before song end 12s Fader Time Skip silent at start (AutoCue) Skip silent at the end Scan for new files and update the music collection Watch folders for changes Scan Now Scan folders for songs Play Counter Statistics Reset Monitor Player Device Settings AutoDJ settings Minimum tracks within each playlist DJ Count DJ Names Filter Count Increment play counter for AutoDj selected tracks Auto Remove Played Tracks Playlist Settings ... Browser Root File Browser Settings Language Common Settings Change the language of the application (needs restart) About About Knowthelist knowthelist-2.3.1/locale/knowthelist_tr.ts000077500000000000000000001211731342115213400207630ustar00rootroot00000000000000 CollectionSetupModel Select folders for music collection CollectionTree Artist Genre Year Add to PlayList&1 Add to PlayList&2 Re-scan collection Title Album Location Meta Information CollectionTreeItem All CollectionWidget Random Tracks Enter space-separated terms to filter collection Core::Internal::FancyTabWidget Large sidebar Small sidebar Plain sidebar Tabs on top Icons on top DjBrowser Add a new AutoDj Add a new record case for current AutoDj DjFilterWidget Form Record Case <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">count of records which fit to this filter(s)</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt; text-decoration: underline;"></p></body></html> 0 1 how many records per turn Activate this record case set Alt+J Count Remove this record case x <html><head/><body><p><a href="#"><span style=" text-decoration: underline; color:#e1e1e1;">Path</span></a></p></body></html> Genre Artist <html><head/><body><p>Confirm the remove</p></body></html> Delete of DjSettings Form 0 DjWidget Form AutoDJ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="#"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">DJ Main</span></a></p></body></html> Start a session of this DJ Remove this DJ x TextLabel <html><head/><body><p>Confirm the remove</p></body></html> Delete This Dj plays: cases case tracks hours Knowthelist Knowthelist Fader AutoD&J Alt+J Set FadeNo&w Alt+W Gain AGC Low Mid High 0:00.0 -0:00.0 MonitorPlayer <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="settings"><span style=" font-size:8pt; color:#df0000;">No 2nd soundcard selected!</span></a></p></body></html> Settings Collection AutoDJ Folder Lists ModeSelector Frame View: Artist > Album View: Year > Artist > Album Y View: Genre > Artist > Album G PlayerWidget Form texttexttextt TextLabel 00:00 .00 <html><head/><body><p><span style=" color:#ffffff;">Time remain</span></p></body></html> -00:00 <html><head/><body><p><span style=" color:#ffffff;">Seconds of silence at the end </span></p></body></html> -00 Jump to the point where the music starts mainly Tracks Track Hours No track Playlist Url No Played Artist Title Album Year Genre Track Length Rate Add to PlayList&1 Add to PlayList&2 &Load Load as &Next &Prelisten Track &Search for: '%1' &Remove Selected &Open File Location &View Tag Information Location Meta Information PlaylistBrowser Add a new list and store current tracks Top Tracks Most played tracks Last Tracks Recently played tracks Favorites Tracks High rated tracks tracks hours Save Play List Enter a name for the new list PlaylistWidget Frame Click here to show the content of this list <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="charts"><span style=" font-size:8pt; text-decoration: underline; color:#d0fff8;">Most Played</span></a></p></body></html> TextLabel Load all tracks of this list directly into player playlists Remove this list x <html><head/><body><p>Confirm the remove</p></body></html> Delete QObject Unable to load database This application needs the QT5 SQLITE driver (libqt5-sql-sqlite) This application needs the QT4 SQLITE driver (libqt4-sql-sqlite) Unknown Title Artist Album Genre Year Location SettingsDialog Settings Fader Collection Audio devices AutoDJ Playlists File browser Common Fader settings Start fading before song end 12s Fader Time Skip silent at start (AutoCue) Skip silent at the end Scan for new files and update the music collection Watch folders for changes Scan Now Scan folders for songs Play Counter Statistics Reset Monitor Player Device Settings AutoDJ settings Minimum tracks within each playlist DJ Count DJ Names Filter Count Increment play counter for AutoDj selected tracks Auto Remove Played Tracks Playlist Settings ... Browser Root File Browser Settings Language Common Settings Change the language of the application (needs restart) About About Knowthelist knowthelist-2.3.1/locale/locale.qrc000077500000000000000000000006301342115213400172730ustar00rootroot00000000000000 knowthelist_cs.qm knowthelist_de.qm knowthelist_hu.qm knowthelist_tr.qm knowthelist_ru.qm knowthelist_nl.qm knowthelist_fr.qm knowthelist_es.qm knowthelist_it.qm knowthelist-2.3.1/src/000077500000000000000000000000001342115213400146535ustar00rootroot00000000000000knowthelist-2.3.1/src/collectiondb.cpp000077500000000000000000000570031342115213400200300ustar00rootroot00000000000000/* Copyright (c) 2004 Mark Kretschmann Copyright (c) 2004 Christian Muehlhaeuser Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "collectiondb.h" #include #include #include #include struct CollectionDbPrivate { public: uint genreCount; QString lastPath; QString lastArtist; QString lastGenre; QString lastFilterString; QString filterString; ulong resultCount; ulong resultLength; QString sqlQuickFilter; QString sqlFromString; QString sqlFromStringPL; QSqlDatabase* db; QSqlQuery* query; QMutex mutex; QString selectionFilter(QString year = "", QString genre = "", QString artist = "", QString album = "") { QString ret = ""; if (!year.isEmpty()) ret += "AND year.name = '" + year.replace("'", "''") + "' "; if (!genre.isEmpty()) ret += "AND genre.name = '" + genre.replace("'", "''") + "' "; if (!artist.isEmpty()) ret += "AND artist.name = '" + artist.replace("'", "''") + "' "; if (!album.isEmpty()) ret += "AND album.name = '" + album.replace("'", "''") + "' "; return ret; } QString selectionFilterForRandom(QString path = "", QString genre = "", QString artist = "") { QString ret = ""; if (!path.isEmpty()) ret += "AND lower(tags.url) like lower('%" + path.replace("'", "''") + "%') "; if (!genre.isEmpty()) ret += "AND lower(genre.name) like lower('%" + genre.replace("'", "''") + "%') "; if (!artist.isEmpty()) ret += "AND lower(artist.name) like lower('%" + artist.replace("'", "''") + "%') "; return ret; } QString selectionFilterForRandom(QStringList paths, QStringList genres, QStringList artists) { QString ret = ""; if (!paths.isEmpty()) { ret += "AND ( "; foreach (QString path, paths) ret += " lower(tags.url) like lower('%" + path.replace("'", "''") + "%') OR "; ret += " 1=2) "; } if (!genres.isEmpty()) { ret += "AND ( "; foreach (QString genre, genres) ret += " lower(genre.name) like lower('%" + genre.replace("'", "''") + "%') OR "; ret += " 1=2) "; } if (!artists.isEmpty()) { ret += "AND ( "; foreach (QString artist, artists) ret += " lower(artist.name) like lower('%" + artist.replace("'", "''") + "%') OR "; ret += " 1=2) "; } return ret; } }; CollectionDB::CollectionDB() { p = new CollectionDbPrivate; db = QSqlDatabase::database(); p->db = &db; p->query = new QSqlQuery(*(p->db)); p->genreCount = 0; p->resultCount = 0; p->sqlQuickFilter = QString(""); p->sqlFromString = "FROM tags " " INNER JOIN artist ON tags.artist = artist.id " " INNER JOIN album ON tags.album = album.id " " INNER JOIN year ON tags.year = year.id " " INNER JOIN genre ON tags.genre = genre.id " " LEFT OUTER JOIN statistics ON tags.url = statistics.url " " LEFT OUTER JOIN favorites ON tags.url = favorites.url WHERE 1=1 "; p->sqlFromStringPL = "FROM tags " " INNER JOIN artist ON tags.artist = artist.id " " INNER JOIN album ON tags.album = album.id " " INNER JOIN year ON tags.year = year.id " " INNER JOIN genre ON tags.genre = genre.id " " INNER JOIN playlists ON tags.url = playlists.url " " LEFT OUTER JOIN statistics ON tags.url = statistics.url " " LEFT OUTER JOIN favorites ON tags.url = favorites.url WHERE 1=1 "; } CollectionDB::~CollectionDB() { db.close(); delete p; p = nullptr; } QString CollectionDB::escapeString(QString string) { string.replace("'", "''"); return string; } void CollectionDB::setFilterString(QString string) { string = escapeString(string); p->filterString = string; p->sqlQuickFilter = ""; foreach (QString token, string.split(" ")) { p->sqlQuickFilter += QString(" AND ( lower(artist.name) LIKE lower('%%1%') OR " "lower(album.name) LIKE lower('%%1%') OR " "lower(tags.title) LIKE lower('%%1%') OR " "lower(genre.name) LIKE lower('%%1%') OR " "lower(year.name) LIKE lower('%%1%') OR " "lower(tags.url) LIKE lower('%%1%') )") .arg(token); } } bool CollectionDB::isDbValid() { if ((!executeSql("SELECT COUNT( url ) FROM tags;")) || (!executeSql("SELECT COUNT( url ) FROM statistics;")) || (!executeSql("SELECT COUNT( url ) FROM favorites;")) || (!executeSql("SELECT COUNT( url ) FROM playlists;"))) return false; else return true; } bool CollectionDB::isEmpty() { return (selectSqlNumber("SELECT COUNT( url ) FROM tags;") < 1); } void CollectionDB::incSongCounter(const QString url) { QList entries; entries = selectSql(QString("SELECT playcounter, createdate FROM statistics WHERE url = '%1';") .arg(escapeString(url))); if (!entries.isEmpty()) { // entry exists, increment playcounter and update accesstime executeSql(QString("REPLACE INTO statistics ( url, createdate, accessdate, playcounter ) VALUES ( '%1', '%2', strftime('%s', 'now'), %3 );") .arg(escapeString(url)) .arg(entries.at(0)[1]) .arg(entries.at(0)[0] + " + 1")); } else { // entry didnt exist yet, create a new one executeSql(QString("INSERT INTO statistics ( url, createdate, accessdate, playcounter ) VALUES ( '%1', strftime('%s', 'now'), strftime('%s', 'now'), 1 );") .arg(escapeString(url))); } } void CollectionDB::setSongRate(const QString url, int rate) { // insert or update increment favorites executeSql(QString("INSERT OR REPLACE INTO favorites ( url, changedate, rate ) VALUES ( '%1', strftime('%s', 'now'), %2 );") .arg(escapeString(url)) .arg(rate)); } void CollectionDB::resetSongCounter() { executeSql(QString("DELETE FROM statistics;")); //executeSql( QString( "VACUUM;")); } void CollectionDB::updateDirStats(QString path, const long datetime) { if (path.endsWith("/")) path = path.left(path.length() - 1); executeSql(QString("REPLACE INTO directories ( dir, changedate ) VALUES ( '%1', %2 );") .arg(escapeString(path)) .arg(datetime)); } void CollectionDB::removeSongsInDir(QString path) { if (path.endsWith("/")) path = path.left(path.length() - 1); executeSql(QString("DELETE FROM tags WHERE dir = '%1';") .arg(escapeString(path))); } bool CollectionDB::isDirInCollection(QString path) { if (path.endsWith("/")) path = path.left(path.length() - 1); QList entries = selectSql(QString("SELECT changedate FROM directories WHERE dir = '%1';") .arg(escapeString(path))); return !entries.isEmpty(); } void CollectionDB::removeDirFromCollection(QString path) { if (path.endsWith("/")) path = path.left(path.length() - 1); executeSql(QString("DELETE FROM directories WHERE dir = '%1';") .arg(escapeString(path))); } void CollectionDB::removePlaylist(QString name) { executeSql(QString("DELETE FROM playlists WHERE name = '%1';") .arg(escapeString(name))); } long CollectionDB::selectSqlNumber(const QString& statement) { p->mutex.lock(); if (p->query->exec(statement)) { while (p->query->next()) { p->mutex.unlock(); return p->query->value(0).toInt(); } } else qDebug() << p->query->lastError(); p->mutex.unlock(); return -1; } bool CollectionDB::executeSql(const QString& statement) { p->mutex.lock(); if (p->query->exec(statement)) { p->mutex.unlock(); return true; } else { qDebug() << p->query->lastError(); qDebug() << "Statement: " << statement; p->mutex.unlock(); return false; } } QList CollectionDB::selectSql(const QString& statement) { QList tags; p->mutex.lock(); tags.clear(); int count; if (p->query->exec(statement)) { while (p->query->next()) { QStringList tag; count = p->query->record().count(); for (int i = 0; i < count; i++) { tag << p->query->value(i).toString(); } tags << tag; } } else { qDebug() << p->db->lastError() << "\n" << p->query->lastError(); qDebug() << "SQL-query: " << statement; } p->mutex.unlock(); return tags; } void CollectionDB::createTables(bool temporary) { qDebug() << Q_FUNC_INFO; //create tag table executeSql(QString("CREATE %1 TABLE tags%2 (" "%3" "url VARCHAR(120)," "dir VARCHAR(100)," "artist INTEGER," "title VARCHAR(100)," "album INTEGER," "genre INTEGER," "year INTEGER," "length INTEGER," "track NUMBER(4) );") .arg(temporary ? "TEMPORARY" : "") .arg(temporary ? "_temp" : "") .arg(temporary ? "id INTEGER," : "id INTEGER PRIMARY KEY,")); //create album table executeSql(QString("CREATE %1 TABLE album%2 (" "id INTEGER PRIMARY KEY," "name VARCHAR(100) );") .arg(temporary ? "TEMPORARY" : "") .arg(temporary ? "_temp" : "")); //create artist table executeSql(QString("CREATE %1 TABLE artist%2 (" "id INTEGER PRIMARY KEY," "name VARCHAR(100) );") .arg(temporary ? "TEMPORARY" : "") .arg(temporary ? "_temp" : "")); //create genre table executeSql(QString("CREATE %1 TABLE genre%2 (" "id INTEGER PRIMARY KEY," "name VARCHAR(100) );") .arg(temporary ? "TEMPORARY" : "") .arg(temporary ? "_temp" : "")); //create year table executeSql(QString("CREATE %1 TABLE year%2 (" "id INTEGER PRIMARY KEY," "name VARCHAR(100) );") .arg(temporary ? "TEMPORARY" : "") .arg(temporary ? "_temp" : "")); //create indexes executeSql(QString("CREATE INDEX album_idx%1 ON album%2( name );") .arg(temporary ? "_temp" : "") .arg(temporary ? "_temp" : "")); executeSql(QString("CREATE INDEX artist_idx%1 ON artist%2( name );") .arg(temporary ? "_temp" : "") .arg(temporary ? "_temp" : "")); executeSql(QString("CREATE INDEX genre_idx%1 ON genre%2( name );") .arg(temporary ? "_temp" : "") .arg(temporary ? "_temp" : "")); executeSql(QString("CREATE INDEX year_idx%1 ON year%2( name );") .arg(temporary ? "_temp" : "") .arg(temporary ? "_temp" : "")); executeSql(QString("CREATE INDEX url_idx%1 ON tags%2( url );") .arg(temporary ? "_temp" : "") .arg(temporary ? "_temp" : "")); if (!temporary) { executeSql("CREATE INDEX album_tag ON tags( album );"); executeSql("CREATE INDEX artist_tag ON tags( artist );"); executeSql("CREATE INDEX genre_tag ON tags( genre );"); executeSql("CREATE INDEX year_tag ON tags( year );"); executeSql("CREATE INDEX url_tag ON tags( url );"); // create directory statistics database executeSql(QString("CREATE TABLE IF NOT EXISTS directories (" "dir VARCHAR(100) UNIQUE," "changedate INTEGER );")); } } void CollectionDB::dropTables(bool temporary) { qDebug() << Q_FUNC_INFO; executeSql(QString("DROP TABLE tags%1;").arg(temporary ? "_temp" : "")); executeSql(QString("DROP TABLE album%1;").arg(temporary ? "_temp" : "")); executeSql(QString("DROP TABLE artist%1;").arg(temporary ? "_temp" : "")); executeSql(QString("DROP TABLE genre%1;").arg(temporary ? "_temp" : "")); executeSql(QString("DROP TABLE year%1;").arg(temporary ? "_temp" : "")); // force to re-read over all count for random entry p->resultCount = 0; } void CollectionDB::moveTempTables() { executeSql("INSERT INTO tags SELECT * FROM tags_temp;"); executeSql("INSERT INTO album SELECT * FROM album_temp;"); executeSql("INSERT INTO artist SELECT * FROM artist_temp;"); executeSql("INSERT INTO genre SELECT * FROM genre_temp;"); executeSql("INSERT INTO year SELECT * FROM year_temp;"); // Re-create index to be fast as possible executeSql(QString("REINDEX album_idx;")); executeSql(QString("REINDEX artist_idx;")); executeSql(QString("REINDEX genre_idx;")); executeSql(QString("REINDEX year_idx;")); executeSql(QString("REINDEX url_idx;")); executeSql(QString("REINDEX album_tag;")); executeSql(QString("REINDEX artist_tag;")); executeSql(QString("REINDEX genre_tag;")); executeSql(QString("REINDEX year_tag;")); executeSql(QString("REINDEX url_tag;")); } void CollectionDB::createStatsTable() { qDebug() << Q_FUNC_INFO; // create music statistics database executeSql(QString("CREATE TABLE statistics (" "url VARCHAR(120) UNIQUE," "createdate INTEGER," "accessdate INTEGER," "playcounter INTEGER );")); // create music favorites database executeSql(QString("CREATE TABLE favorites (" "url VARCHAR(120) UNIQUE," "changedate INTEGER," "rate INTEGER );")); // create playlist database executeSql(QString("CREATE TABLE playlists (" "url VARCHAR(120)," "name VARCHAR(60)," "length INTEGER," "changedate INTEGER," "flags INTEGER," "norder INTEGER," "UNIQUE(url, name) ON CONFLICT REPLACE);")); } void CollectionDB::dropStatsTable() { qDebug() << Q_FUNC_INFO; executeSql("DROP TABLE statistics;"); executeSql("DROP TABLE favorites;"); executeSql("DROP TABLE playlists;"); } void CollectionDB::purgeDirCache() { executeSql(QString("DELETE FROM directories;")); } ulong CollectionDB::getValueID(QString name, QString value, bool autocreate, bool useTempTables) { if (useTempTables) name.append("_temp"); QString command = QString("SELECT id FROM %1 WHERE name LIKE '%2';") .arg(name) .arg(escapeString(value)); long id = selectSqlNumber(command); //check if item exists. if not, should we autocreate it? if (id < 0 && autocreate) { command = QString("INSERT INTO %1 ( name ) VALUES ( '%2' );") .arg(name) .arg(escapeString(value)); executeSql(command); return p->query->lastInsertId().toInt(); } return id; } QStringList CollectionDB::getRandomEntry(QString path, QString genre, QString artist) { // retrieve Max_Count if (genre != p->lastGenre || artist != p->lastArtist || path != p->lastPath || p->resultCount == 0) { //new filter > get new count p->lastGenre = genre; p->lastArtist = artist; p->lastPath = path; p->resultCount = getCount(path, genre, artist); } if (p->resultCount > 0) { long randomID = (qrand() % p->resultCount); //qebug() << QString::number(randomID); QList entries = selectRandomEntry(QString::number(randomID), path, genre, artist); if (!entries.isEmpty()) return entries.at(0); else return QStringList(); } else { qDebug() << Q_FUNC_INFO << " No Track found matching filter"; return QStringList(); } } QStringList CollectionDB::getRandomEntry() { double randMax; randMax = RAND_MAX; if (p->filterString != p->lastFilterString || p->resultCount == 0) { //new genre > get new count p->lastFilterString = p->filterString; p->resultCount = getCount(); } long randomID = (qrand() / randMax) * p->resultCount; //qDebug() << QString::number(randomID); QList entries = selectRandomEntry(QString::number(randomID)); if (!entries.isEmpty()) return entries.at(0); else return QStringList(); } ulong CollectionDB::getCount() { QString command = "SELECT count(distinct tags.url) " + p->sqlFromString + p->sqlQuickFilter; return selectSqlNumber(command); } QPair CollectionDB::getCount(QStringList paths, QStringList genres, QStringList artists) { QString command = "SELECT count(distinct tags.url), sum(tags.length) FROM tags, artist, genre " " WHERE tags.artist = artist.id " " AND tags.artist = artist.id " " AND tags.genre = genre.id " + p->selectionFilterForRandom(paths, genres, artists) + ";"; QStringList result = selectSql(command).at(0); QPair pair; pair.first = result[0].toInt(); pair.second = result[1].toInt(); return pair; } uint CollectionDB::getCount(QString path, QString genre, QString artist) { QString command = "SELECT count(distinct tags.url), sum(tags.length) FROM tags, artist, genre " " WHERE tags.artist = artist.id " " AND tags.artist = artist.id " " AND tags.genre = genre.id " + p->selectionFilterForRandom(path, genre, artist) + ";"; QStringList result = selectSql(command).at(0); p->resultLength = result[1].toLong(); return result[0].toLong(); } long CollectionDB::lastLengthSum() { return p->resultLength; } uint CollectionDB::lastMaxCount() { return p->resultCount; } QList CollectionDB::selectRandomEntry(QString rownum, QString path, QString genre, QString artist) { QString command = "SELECT tags.url, artist.name, tags.title, album.name, year.name, genre.name, tags.track, tags.length, statistics.playcounter, favorites.rate " + p->sqlFromString + p->sqlQuickFilter + p->selectionFilterForRandom(path, genre, artist) + " LIMIT 1 OFFSET " + rownum + ";"; return selectSql(command); } QList CollectionDB::selectYears() { QString command = "SELECT DISTINCT year.name " + p->sqlFromString + p->sqlQuickFilter + "AND year.name <> '' " "ORDER BY year.name DESC;"; return selectSql(command); } QList CollectionDB::selectGenres() { QString command = "SELECT DISTINCT genre.name " + p->sqlFromString + p->sqlQuickFilter + "AND genre.name <> '' " "ORDER BY genre.name;"; return selectSql(command); } QList CollectionDB::selectArtists(QString year, QString genre) { QString command = "SELECT DISTINCT artist.name " + p->sqlFromString + p->sqlQuickFilter + p->selectionFilter(year, genre) + "AND artist.name <> '' " "ORDER BY artist.name;"; return selectSql(command); } QList CollectionDB::selectAlbums(QString year, QString genre, QString artist) { QString command = "SELECT DISTINCT album.name " + p->sqlFromString + p->sqlQuickFilter + p->selectionFilter(year, genre, artist) + "AND album.name <> '' " "ORDER BY album.name;"; return selectSql(command); } QList CollectionDB::selectTracks(QString year, QString genre, QString artist, QString album) { QString command = "SELECT DISTINCT tags.url, artist.name, tags.title, album.name, year.name, genre.name, tags.track, tags.length, statistics.playcounter, favorites.rate " + p->sqlFromString + p->sqlQuickFilter + p->selectionFilter(year, genre, artist, album) + "ORDER BY artist.name DESC, album.name DESC, tags.track;"; return selectSql(command); } QList CollectionDB::selectHotTracks() { QString command = "SELECT DISTINCT tags.url, artist.name, tags.title, album.name, year.name, genre.name, tags.track, tags.length, statistics.playcounter, favorites.rate " + p->sqlFromString + "AND statistics.playcounter>0 " "ORDER BY statistics.playcounter DESC " "LIMIT 20 OFFSET 0;"; return selectSql(command); } QList CollectionDB::selectLastTracks() { QString command = "SELECT DISTINCT tags.url, artist.name, tags.title, album.name, year.name, genre.name, tags.track, tags.length, statistics.playcounter, favorites.rate " + p->sqlFromString + "AND statistics.playcounter>0 " "ORDER BY statistics.accessdate DESC " "LIMIT 20 OFFSET 0;"; return selectSql(command); } QList CollectionDB::selectFavoritesTracks() { QString command = "SELECT DISTINCT tags.url, artist.name, tags.title, album.name, year.name, genre.name, tags.track, tags.length, statistics.playcounter, favorites.rate " + p->sqlFromString + "AND favorites.rate>0 " "ORDER BY favorites.rate DESC "; return selectSql(command); } QList CollectionDB::selectPlaylistData() { QString command = "SELECT name, COUNT(name), SUM(length), changedate " "from playlists " "WHERE name <> 'defaultKnowthelist' " "GROUP BY name, changedate " "ORDER BY changedate DESC;"; return selectSql(command); } QList CollectionDB::selectPlaylistTracks(QString name) { QString command = "SELECT tags.url, artist.name, tags.title, album.name, year.name, genre.name, tags.track, tags.length, statistics.playcounter, favorites.rate, playlists.flags " + p->sqlFromStringPL + "AND playlists.name ='" + escapeString(name) + "' " "ORDER BY playlists.norder"; return selectSql(command); } knowthelist-2.3.1/src/collectiondb.h000077500000000000000000000064461342115213400175020ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #ifndef COLLECTIONDB_H #define COLLECTIONDB_H #include "progressbar.h" #include #include #include #include //class sqlite; class CollectionDB : public QObject { Q_OBJECT public: CollectionDB(); ~CollectionDB(); bool isDbValid(); bool isEmpty(); void incSongCounter(const QString url); void setSongRate(const QString url, int rate); void updateDirStats(QString path, const long datetime); void removeSongsInDir(QString path); bool isDirInCollection(QString path); void removeDirFromCollection(QString path); void removePlaylist(QString name); void setFilterString(QString string); bool executeSql(const QString& statement); QList selectSql(const QString& statement); long selectSqlNumber(const QString& statement); int sqlInsertID(); QString escapeString(QString string); ulong getValueID(QString name, QString value, bool autocreate = true, bool useTempTables = false); ulong getCount(); uint getCount(QString path, QString genre, QString artist); QPair getCount(QStringList paths, QStringList genres, QStringList artists); long lastLengthSum(); uint lastMaxCount(); QList selectRandomEntry(QString rownum, QString path = "", QString genre = "", QString artist = ""); QStringList getRandomEntry(); QStringList getRandomEntry(QString path, QString genre, QString artist); void createTables(const bool temporary = false); void dropTables(const bool temporary = false); void moveTempTables(); void createStatsTable(); void dropStatsTable(); void resetSongCounter(); void purgeDirCache(); void scanModifiedDirs(bool recursively); void scan(const QStringList& folders, bool recursively); QList selectTracks(QString year, QString genre, QString artist, QString album); QList selectAlbums(QString year, QString genre, QString artist); QList selectArtists(QString year = "", QString genre = ""); QList selectYears(); QList selectGenres(); QList selectHotTracks(); QList selectLastTracks(); QList selectFavoritesTracks(); QList selectPlaylistData(); QList selectPlaylistTracks(QString name); signals: void scanDone(bool changed); private slots: private: struct CollectionDbPrivate* p; QSqlDatabase db; ProgressBar* m_progress; bool m_monitor; int m_lastInsertId; }; #endif /* COLLECTIONDB_H */ knowthelist-2.3.1/src/collectionsetupmodel.cpp000077500000000000000000000075501342115213400216260ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "collectionsetupmodel.h" #include #include CollectionSetupModel::CollectionSetupModel() { } Qt::ItemFlags CollectionSetupModel::flags(const QModelIndex& index) const { Qt::ItemFlags f = QDirModel::flags(index); if (index.column() == 0) // make the first column checkable f |= Qt::ItemIsUserCheckable; return f; } QVariant CollectionSetupModel::data(const QModelIndex& index, int role) const { if (index.isValid() && index.column() == 0 && role == Qt::CheckStateRole) { // the item is checked only if we have stored its path if (checkedPartially.contains(filePath(index))) { return Qt::PartiallyChecked; } else return (checked.contains(filePath(index)) ? Qt::Checked : Qt::Unchecked); } return QDirModel::data(index, role); } bool CollectionSetupModel::setData(const QModelIndex& index, const QVariant& value, int role) { if (index.isValid() && index.column() == 0 && role == Qt::CheckStateRole) { // store checked paths, remove unchecked paths QModelIndex idx = parent(index); if (value.toInt() == Qt::Checked) { checked.insert(filePath(index)); // make parents always partially checked while (idx.isValid()) { checkedPartially.insert(filePath(idx)); checked.remove(filePath(idx)); idx = idx.parent(); } } else { checked.remove(filePath(index)); // make parent unchecked if index was his only child while (idx.isValid()) { bool hasChildren = false; foreach (const QString& value, checked) if (value.contains(filePath(idx))) hasChildren = true; if (!hasChildren) { checkedPartially.remove(filePath(idx)); checked.insert(filePath(idx)); } idx = idx.parent(); } } emit dataChanged(parent(index), index); return true; } return QDirModel::setData(index, value, role); } QVariant CollectionSetupModel::headerData(int section, Qt::Orientation orientation, int role) const { if (orientation == Qt::Horizontal) { if (role != Qt::DisplayRole) return QVariant(); switch (section) { case 0: return QString(tr("Select folders for music collection")); default: return QVariant(); } } return QAbstractItemModel::headerData(section, orientation, role); } QStringList CollectionSetupModel::dirsChecked() { QStringList list; foreach (const QString& value, checked) list << value; return list; } void CollectionSetupModel::setDirsChecked(QStringList list) { checked.clear(); checkedPartially.clear(); foreach (const QString& value, list) { /* index parents Qt::PartiallyChecked */ QModelIndex idx = parent(index(value)); while (idx.isValid()) { checkedPartially.insert(filePath(idx)); idx = idx.parent(); } checked.insert(value); } } knowthelist-2.3.1/src/collectionsetupmodel.h000077500000000000000000000026631342115213400212730ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #ifndef COLLECTIONSETUPMODEL_H #define COLLECTIONSETUPMODEL_H #include #include class CollectionSetupModel : public QDirModel { Q_OBJECT public: CollectionSetupModel(); QStringList dirsChecked(); void setDirsChecked(QStringList list); private: QSet checked; QSet checkedPartially; virtual Qt::ItemFlags flags(const QModelIndex& index) const; virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const; bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole); }; #endif // COLLECTIONSETUPMODEL_H knowthelist-2.3.1/src/collectiontree.cpp000077500000000000000000000244261342115213400204050ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "collectiontree.h" #include "collectiontreeitem.h" #include #include #include #include #include #include #if QT_VERSION >= 0x050000 #include #else #include #endif struct CollectionTreePrivate { CollectionDB* database; QList tracks; QString filterString; QMutex mutex; }; CollectionTree::CollectionTree(QWidget* parent) : QTreeWidget(parent) , p(new CollectionTreePrivate) { p->database = new CollectionDB(); p->database->executeSql("PRAGMA synchronous = OFF;"); setSelectionMode(QAbstractItemView::ExtendedSelection); setDragEnabled(true); setRootIsDecorated(false); setAcceptDrops(false); setRootIsDecorated(true); setAttribute(Qt::WA_MacShowFocusRect, false); QStringList headers; headers << tr("Artist"); QTreeWidgetItem* headeritem = new QTreeWidgetItem(headers); headeritem->setTextAlignment(0, Qt::AlignLeft); setHeaderItem(headeritem); setHeaderLabels(headers); header()->resizeSection(0, this->width() - 50); header()->setMinimumHeight(18); connect(this, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(on_currentItemChanged(QTreeWidgetItem*))); connect(this, SIGNAL(itemExpanded(QTreeWidgetItem*)), this, SLOT(on_itemExpanded(QTreeWidgetItem*))); } CollectionTree::~CollectionTree() { p->mutex.tryLock(2000); delete p; } void CollectionTree::createTrunk() { //qDebug() << Q_FUNC_INFO; CollectionTreeItem* item = nullptr; clear(); //add "ALL" node and select it int countAll = p->database->getCount(); if (countAll < 1000 && countAll > 0) { item = new CollectionTreeItem(this); setCurrentItem(item); } QList tags; //Retrieve root nodes from database switch (treeMode) { case MODEGENRE: tags = p->database->selectGenres(); if (item) item->setGenre(QString::null); foreach (QStringList tag, tags) { item = new CollectionTreeItem(this); item->setGenre(tag[0]); } headerItem()->setText(0, QString(" %1 (%2)").arg(tr("Genre")).arg(tags.count())); break; break; case MODEYEAR: tags = p->database->selectYears(); if (item) item->setYear(QString::null); foreach (QStringList tag, tags) { item = new CollectionTreeItem(this); item->setYear(tag[0]); } headerItem()->setText(0, QString(" %1 (%2)").arg(tr("Year")).arg(tags.count())); break; break; default: tags = p->database->selectArtists(); if (item) item->setArtist(QString::null); foreach (QStringList tag, tags) { item = new CollectionTreeItem(this); item->setArtist(tag[0]); } headerItem()->setText(0, QString(" %1 (%2)").arg(tr("Artist")).arg(tags.count())); break; } } void CollectionTree::on_itemExpanded(QTreeWidgetItem* item) { qDebug() << Q_FUNC_INFO << endl; if (!item) return; if (item->childCount() == 0) { QList tags; CollectionTreeItem* collItem = static_cast(item); QTreeWidgetItem::ChildIndicatorPolicy policy = QTreeWidgetItem::ShowIndicator; //Retrieve children from database if (collItem->artist() != QString::null) { tags = p->database->selectAlbums(collItem->year(), collItem->genre(), collItem->artist()); policy = QTreeWidgetItem::DontShowIndicator; } else { tags = p->database->selectArtists(collItem->year(), collItem->genre()); } foreach (QStringList tag, tags) { CollectionTreeItem* child = new CollectionTreeItem(item); child->setYear(collItem->year()); child->setGenre(collItem->genre()); child->setArtist(collItem->artist()); if (collItem->artist() == QString::null) child->setArtist(tag[0]); else child->setAlbum(tag[0]); child->setChildIndicatorPolicy(policy); item->addChild(child); } } } void CollectionTree::triggerRandomSelection() { QFuture future = QtConcurrent::run(this, &CollectionTree::asynchronTriggerRandomSelection); } void CollectionTree::asynchronTriggerRandomSelection() { QMutexLocker locker(&p->mutex); p->tracks.clear(); // init qrand QTime time = QTime::currentTime(); qsrand((uint)time.msec()); for (int i = 0; i < 15; i++) { Track* track; int r = 0; do { QStringList tag = p->database->getRandomEntry(); track = new Track(tag); r++; } while (track->prettyLength() == "?" && r < 3); p->tracks.append(track); } qDebug() << Q_FUNC_INFO << p->tracks.count(); emit selectionChanged(p->tracks); } void CollectionTree::on_currentItemChanged(QTreeWidgetItem* item) { QFuture future = QtConcurrent::run(this, &CollectionTree::asynchronCurrentItemChanged, item); } void CollectionTree::asynchronCurrentItemChanged(QTreeWidgetItem* item) { QMutexLocker locker(&p->mutex); if (!item) return; QList tags; CollectionTreeItem* collItem = static_cast(item); qDebug() << Q_FUNC_INFO << "Artist: " << collItem->artist() << " Album: " << collItem->album() << endl; //Retrieve songs from database tags = p->database->selectTracks(collItem->year(), collItem->genre(), collItem->artist(), collItem->album()); //Show songs in parent's tracklist p->tracks.clear(); qDebug() << Q_FUNC_INFO << "Song count: " << tags.count(); //add tags to this track list foreach (QStringList tag, tags) { //qDebug() << Q_FUNC_INFO <<": is playlistitem; tags:"<tracks.append(new Track(tag)); } emit selectionChanged(p->tracks); //qDebug() << Q_FUNC_INFO << "[End]" << endl; } QString CollectionTree::filter() { //ToDo: do we need this private variable return p->filterString; } void CollectionTree::setFilter(QString filter) { p->filterString = filter; p->database->setFilterString(filter); } void CollectionTree::mousePressEvent(QMouseEvent* e) { if (e->button() == Qt::LeftButton) startPos = e->pos(); QTreeWidget::mousePressEvent(e); if (e->button() == Qt::RightButton) showContextMenu(currentItem(), currentColumn()); } void CollectionTree::mouseMoveEvent(QMouseEvent* event) { if (event->buttons() & Qt::LeftButton) { int distance = (event->pos() - startPos).manhattanLength(); if (distance >= QApplication::startDragDistance()) { performDrag(); } } } void CollectionTree::performDrag() { QByteArray itemData; QDataStream dataStream(&itemData, QIODevice::WriteOnly); QVector tags; QPixmap cover; int i = 0; //iterate selected items QListIterator it(p->tracks); while (it.hasNext()) { Track* track = dynamic_cast(it.next()); if (track->isValid()) { qDebug() << Q_FUNC_INFO << ": send Data:" << track->url(); QStringList tag = track->tagList(); tags << tag; if (i == 0) cover = QPixmap::fromImage(track->coverImage()); i++; } } dataStream << tags; QMimeData* mimeData = new QMimeData; mimeData->setData("text/playlistitem", itemData); QDrag* drag = new QDrag(this); drag->setMimeData(mimeData); if (!cover.isNull()) drag->setPixmap(cover.scaled(50, 50)); if (drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::CopyAction) == Qt::MoveAction) { } } void CollectionTree::showContextMenu(QTreeWidgetItem* item, int col) { Q_UNUSED(col); //ToDo: create popup before first use enum Id { LOAD1, LOAD2 }; if (item == NULL) return; QMenu popup(this); popup.setTitle(item->text(0)); popup.addAction(style()->standardPixmap(QStyle::SP_MediaPlay), tr("Add to PlayList&1"), this, SLOT(onLoad1Triggered()), Qt::Key_1); //, LOAD1 popup.addAction(style()->standardPixmap(QStyle::SP_MediaPlay), tr("Add to PlayList&2"), this, SLOT(onLoad2Triggered()), Qt::Key_2); //, LOAD2 popup.addSeparator(); popup.addAction(style()->standardPixmap(QStyle::SP_BrowserReload), tr("Re-scan collection"), this, SLOT(onRescanTriggered()), Qt::Key_R); popup.exec(QCursor::pos()); } void CollectionTree::onLoad1Triggered() { Q_EMIT wantLoad(p->tracks, "Left"); } void CollectionTree::onLoad2Triggered() { Q_EMIT wantLoad(p->tracks, "Right"); } void CollectionTree::onRescanTriggered() { Q_EMIT rescan(); } void CollectionTree::showTrackInfo(Track* mb) { const QString body = "%1%2"; QString str = " width=\"100%\" border=\"1\">"; str += body.arg(tr("Title"), mb->title()); str += body.arg(tr("Artist"), mb->artist()); str += body.arg(tr("Album"), mb->album()); str += body.arg(tr("Genre"), mb->genre()); str += body.arg(tr("Year"), mb->year()); str += body.arg(tr("Location"), mb->url().toString()); str += "
"; QMessageBox::information(0, tr("Meta Information"), str); } void CollectionTree::resizeEvent(QResizeEvent*) { //QRect rec = p->collectiontree->geometry(); header()->resizeSection(0, this->width() - 100); } knowthelist-2.3.1/src/collectiontree.h000077500000000000000000000040171342115213400200440ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #ifndef COLLVIEW_H #define COLLVIEW_H #include #include "collectiondb.h" #include "collectiontreeitem.h" #include "track.h" class QMouseEvent; class CollectionTree : public QTreeWidget { Q_OBJECT public: explicit CollectionTree(QWidget *parent = 0); ~CollectionTree(); QString filter(); enum modeType { MODENONE, MODEYEAR, MODEGENRE }; modeType treeMode; Q_SIGNALS: void selectionChanged(QList); void wantLoad(QList, QString); void rescan(); public slots: void on_currentItemChanged( QTreeWidgetItem* item ); void on_itemExpanded( QTreeWidgetItem* item ); void showContextMenu(QTreeWidgetItem *, int ); void triggerRandomSelection(); void asynchronTriggerRandomSelection(); void setFilter( QString filter ); void createTrunk(); void onRescanTriggered(); void onLoad1Triggered(); void onLoad2Triggered(); private: class CollectionTreePrivate * p; void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void resizeEvent(QResizeEvent *); void performDrag(); QPoint startPos; bool openContext; bool m_dragLocked; void showTrackInfo( Track* mb ); void asynchronCurrentItemChanged( QTreeWidgetItem* item ); }; #endif // COLLVIEW_H knowthelist-2.3.1/src/collectiontreeitem.cpp000077500000000000000000000050651342115213400212620ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "collectiontreeitem.h" struct CollectionTreeItemPrivate { QString artist; QString album; QString year; QString genre; }; CollectionTreeItem::CollectionTreeItem(QTreeWidget* parent, int type) : QTreeWidgetItem(parent, type) , p(new CollectionTreeItemPrivate) { setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator); } CollectionTreeItem::CollectionTreeItem(QTreeWidgetItem* parent, int type) : QTreeWidgetItem(parent, type) , p(new CollectionTreeItemPrivate) { } CollectionTreeItem::~CollectionTreeItem() { delete p; } QString CollectionTreeItem::artist() { return p->artist; } QString CollectionTreeItem::album() { return p->album; } QString CollectionTreeItem::year() { return p->year; } QString CollectionTreeItem::genre() { return p->genre; } void CollectionTreeItem::setArtist(QString value) { p->artist = value; setTextString(value); QTreeWidgetItem::setIcon(0, QIcon(style()->standardIcon(QStyle::SP_DirHomeIcon).pixmap(12))); } void CollectionTreeItem::setAlbum(QString value) { p->album = value; setTextString(value); QTreeWidgetItem::setIcon(0, QIcon(style()->standardIcon(QStyle::SP_DriveCDIcon).pixmap(12))); } void CollectionTreeItem::setYear(QString value) { p->year = value; setTextString(value); QTreeWidgetItem::setIcon(0, QIcon(style()->standardIcon(QStyle::SP_FileIcon).pixmap(12))); } void CollectionTreeItem::setGenre(QString value) { p->genre = value; setTextString(value); QTreeWidgetItem::setIcon(0, QIcon(style()->standardIcon(QStyle::SP_DirIcon).pixmap(12))); } void CollectionTreeItem::setTextString(QString value) { if (value == QString::null) { setText(0, QString("( %1 )").arg(tr("All"))); setChildIndicatorPolicy(QTreeWidgetItem::DontShowIndicator); } else setText(0, value); } knowthelist-2.3.1/src/collectiontreeitem.h000077500000000000000000000027661342115213400207340ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #ifndef COLLECTIONTREEITEM_H #define COLLECTIONTREEITEM_H #include class CollectionTreeItem : public QWidget, public QTreeWidgetItem { Q_OBJECT public: explicit CollectionTreeItem(QObject* parent = 0, int type = Type); CollectionTreeItem(QTreeWidget* parent = 0, int type = Type); CollectionTreeItem(QTreeWidgetItem* parent = 0, int type = Type); ~CollectionTreeItem(); QString artist(); QString album(); QString year(); QString genre(); void setArtist(QString value); void setAlbum(QString value); void setYear(QString value); void setGenre(QString value); void setTextString(QString value); signals: public slots: private: struct CollectionTreeItemPrivate* p; }; #endif // COLLECTIONTREEITEM_H knowthelist-2.3.1/src/collectionupdater.cpp000077500000000000000000000201631342115213400211040ustar00rootroot00000000000000/* Copyright (C) 2004 Max Howell Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "collectionupdater.h" #include "collectiondb.h" #if QT_VERSION >= 0x050000 #include #else #include #endif class CollectionUpdaterPrivate { public: bool doMonitor; QStringList dirs; bool isStoped; QPoint startPos; bool openContext; bool dragLocked; QTimer* timer; bool incremental; CollectionDB* collectionDB; QMutex mutex; }; CollectionUpdater::CollectionUpdater() { p = new CollectionUpdaterPrivate; QSettings settings; p->doMonitor = settings.value("Monitor").toBool(); p->dirs = settings.value("Dirs").toStringList(); p->collectionDB = new CollectionDB(); if (!p->collectionDB) qWarning() << Q_FUNC_INFO << "Could not open SQLite database\n"; //optimization for speeding up SQLite p->collectionDB->executeSql("PRAGMA synchronous = OFF;"); if (!p->collectionDB->isDbValid()) { qDebug() << "Rebuilding database!" << endl; p->collectionDB->dropTables(); p->collectionDB->createTables(); p->collectionDB->dropStatsTable(); p->collectionDB->createStatsTable(); scan(); } p->timer = new QTimer(this); p->timer->setInterval(600000); //1000 * 60 * 10 = 10min connect(p->timer, SIGNAL(timeout()), this, SLOT(monitor())); if (p->doMonitor) { monitor(); p->timer->start(); } } CollectionUpdater::~CollectionUpdater() { delete p; } void CollectionUpdater::setDoMonitor(bool value) { p->doMonitor = value; if (p->doMonitor) p->timer->start(); else p->timer->stop(); } void CollectionUpdater::stop() { p->isStoped = true; } void CollectionUpdater::setDirectoryList(QStringList dirs, bool force) { if (p->dirs != dirs || force) { p->dirs = dirs; scan(); } } void CollectionUpdater::monitor() { qDebug() << Q_FUNC_INFO; p->incremental = true; p->isStoped = false; QStringList folders; QList entries = p->collectionDB->selectSql("SELECT dir, changedate FROM directories;"); foreach (QStringList entry, entries) { QString dir(entry[0]); QString changedate(entry[1]); QFileInfo fi(dir); if (fi.exists()) { if (QString::number(fi.lastModified().toTime_t()) != changedate) { folders << dir; qDebug() << "Collection dir changed: " << dir; } } else { // this folder has been removed folders << dir; qDebug() << "Collection dir removed: " << dir; } } if (!folders.isEmpty()) QFuture future = QtConcurrent::run(this, &CollectionUpdater::asynchronScan, folders); } void CollectionUpdater::scan() { p->incremental = false; p->isStoped = false; QFuture future = QtConcurrent::run(this, &CollectionUpdater::asynchronScan, p->dirs); } void CollectionUpdater::asynchronScan(QStringList dirs) { qDebug() << Q_FUNC_INFO << dirs.count() << "dirs" << endl; // avoid multiple runs QMutexLocker locker(&p->mutex); Q_EMIT progressChanged(1); if (!p->incremental) p->collectionDB->purgeDirCache(); QStringList entries; int dirCount = dirs.count(); //iterate over all folders for (int i = 0; i < dirCount; i++) { Q_EMIT progressChanged(((i + 1) * 10) / dirCount); readDir(dirs[i], entries); } if (!entries.empty()) { Q_EMIT progressChanged(10); readTags(entries); } Q_EMIT progressChanged(100); if (!entries.empty()) Q_EMIT changesDone(); } void CollectionUpdater::readDir(const QString& dir, QStringList& entries) { //update dir statistics for rescanning purposes QFileInfo fi(dir); if (fi.exists()) p->collectionDB->updateDirStats(dir, (long)fi.lastModified().toTime_t()); else { if (p->incremental) { p->collectionDB->removeSongsInDir(dir); p->collectionDB->removeDirFromCollection(dir); } return; } QDir rDir(dir); rDir.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotDot | QDir::NoDot | QDir::NoSymLinks | QDir::Readable); QFileInfoList list = rDir.entryInfoList(); Q_FOREACH (const QFileInfo fi, list) { if (fi.isDir()) { if (!p->incremental || !p->collectionDB->isDirInCollection(fi.absoluteFilePath())) readDir(fi.absoluteFilePath(), entries); } else if (fi.isFile()) entries << fi.absoluteFilePath(); } } void CollectionUpdater::readTags(const QStringList& entries) { qDebug() << Q_FUNC_INFO << " Start"; QUrl url; p->collectionDB->createTables(true); int entriesCount = entries.count(); for (int i = 0; i < entriesCount; i++) { if (!(i % 20)) Q_EMIT progressChanged(((i * 90) / entriesCount) + 10); url = QUrl::fromLocalFile(entries[i]); Track track(url); if (track.isValid()) { QString command = QString("INSERT INTO tags_temp " "( url, dir, artist, title, album, genre, year, length, track ) " "VALUES('%1','%2',%3,'%4',%5,%6,%7,%8,%9);") .arg(p->collectionDB->escapeString(track.url().toLocalFile())) .arg(p->collectionDB->escapeString(track.dirPath())) .arg(p->collectionDB->escapeString(QString::number(p->collectionDB->getValueID("artist", track.artist(), true, !p->incremental)))) .arg(p->collectionDB->escapeString(track.title())) .arg(p->collectionDB->escapeString(QString::number(p->collectionDB->getValueID("album", track.album(), true, !p->incremental)))) .arg(p->collectionDB->escapeString(QString::number(p->collectionDB->getValueID("genre", track.genre(), true, !p->incremental)))) .arg(p->collectionDB->escapeString(QString::number(p->collectionDB->getValueID("year", track.year(), true, !p->incremental)))) .arg(p->collectionDB->escapeString(QString::number(track.length()))) .arg(p->collectionDB->escapeString(track.tracknumber())); p->collectionDB->executeSql(command); //stop the process? if (p->isStoped) i = entries.count(); } } qDebug() << Q_FUNC_INFO << " Insert finish"; //update database only if not stoped if (!p->isStoped) { // let's lock the database (will block other threads) p->collectionDB->executeSql("BEGIN TRANSACTION;"); // remove tables and recreate them (quicker than DELETE FROM) if (!p->incremental) { p->collectionDB->dropTables(); p->collectionDB->createTables(); } else { // remove old entries from database, only for (int i = 0; i < p->dirs.count(); i++) p->collectionDB->removeSongsInDir(p->dirs[i]); } // rename tables p->collectionDB->moveTempTables(); // remove temp tables and unlock database p->collectionDB->dropTables(true); p->collectionDB->executeSql("END TRANSACTION;"); } else { qDebug() << Q_FUNC_INFO << " Stop"; } qDebug() << Q_FUNC_INFO << " End"; } knowthelist-2.3.1/src/collectionupdater.h000077500000000000000000000031271342115213400205520ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #ifndef COLLECTIONUPDATER_H #define COLLECTIONUPDATER_H #include "collectionwidget.h" #include "collectionupdater.h" #include #include "collectiondb.h" class CollectionUpdater : public QObject { Q_OBJECT public: CollectionUpdater(); ~CollectionUpdater(); void setDoMonitor(bool); void setDirectoryList(QStringList dirs, bool force=false); QStringList getRandomEntry(QString); public slots: void scan(); void monitor(); void stop(); signals: void changesDone(); void progressChanged(int percent); private: void readDir( const QString& dir, QStringList& entries ); void readTags( const QStringList& entries ); void asynchronScan(QStringList dirs); class CollectionUpdaterPrivate *p; }; #endif // COLLECTIONUPDATER_H knowthelist-2.3.1/src/collectionwidget.cpp000077500000000000000000000216151342115213400207260ustar00rootroot00000000000000/* Copyright (C) 2005-2019 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "collectionwidget.h" #include "collectiontree.h" #include "collectionupdater.h" #include "modeselector.h" #include "progressbar.h" #include "track.h" #include #include #include #include #include #include #include #include class CollectionWidgetPrivate { public: QMenu* actionsMenu; QAction* actionScan; CollectionTree* collectiontree; ProgressBar* progress; CollectionUpdater* updater; QTimer* timer; QToolButton* button; SearchEdit* searchEdit; ModeSelector* modeSelect; }; CollectionWidget::CollectionWidget(QWidget* parent) : QWidget(parent) { p = new CollectionWidgetPrivate; QPushButton* pushRandom = new QPushButton(); QPixmap pixmap2(":shuffle.png"); pushRandom->setIcon(QIcon(pixmap2)); pushRandom->setIconSize(QSize(27, 27)); pushRandom->setMaximumWidth(40); pushRandom->setStyleSheet( "QPushButton { border: none; padding: 0px; margin-left: 5px;max-height: " "20px; margin-right: 5px;}"); pushRandom->setToolTip(tr("Random Tracks")); p->searchEdit = new SearchEdit(); p->searchEdit->setToolTip( tr("Enter space-separated terms to filter collection")); QVBoxLayout* mainLayout = new QVBoxLayout; QWidget* headWidget = new QWidget(this); headWidget->setMaximumHeight(38); QHBoxLayout* headWidgetLayout = new QHBoxLayout; headWidgetLayout->setMargin(0); headWidgetLayout->setSpacing(1); headWidgetLayout->addSpacerItem( new QSpacerItem(10, 0, QSizePolicy::Fixed, QSizePolicy::Expanding)); headWidgetLayout->addWidget(p->searchEdit); headWidgetLayout->addWidget(pushRandom); headWidget->setLayout(headWidgetLayout); p->updater = new CollectionUpdater(); p->timer = new QTimer(this); p->timer->setInterval(300); p->timer->setSingleShot(true); p->collectiontree = new CollectionTree(this); p->modeSelect = new ModeSelector(p->collectiontree); headWidget->raise(); mainLayout->addWidget(headWidget); mainLayout->setMargin(0); mainLayout->setSpacing(0); connect(pushRandom, SIGNAL(clicked()), p->collectiontree, SLOT(triggerRandomSelection())); connect(p->modeSelect, SIGNAL(modeChanged(ModeSelector::modeType)), this, SLOT(onModeSelected(ModeSelector::modeType))); connect(p->searchEdit, SIGNAL(textChanged(const QString&)), this, SLOT(onSetFilterTimeout())); connect(p->searchEdit, SIGNAL(trackDropped(QString)), this, SIGNAL(trackDropped(QString))); connect(p->collectiontree, SIGNAL(selectionChanged(QList)), this, SIGNAL(selectionChanged(QList))); connect(p->collectiontree, SIGNAL(wantLoad(QList, QString)), this, SIGNAL(wantLoad(QList, QString))); connect(p->updater, SIGNAL(changesDone()), p->collectiontree, SLOT(createTrunk())); connect(p->collectiontree, SIGNAL(rescan()), p->updater, SLOT(scan())); connect(p->timer, SIGNAL(timeout()), SLOT(onSetFilter())); setFocusProxy(p->collectiontree); // default object to get focus setMaximumWidth(400); // Pogressbar for re-read collection p->progress = new ProgressBar(this); p->progress->setValue(0); p->progress->setStyleSheet("* { margin-bottom: 3px; }"); mainLayout->addWidget(p->collectiontree); // Read config values QSettings settings; p->modeSelect->setMode(static_cast( settings.value("TreeMode", ModeSelector::MODENONE).toUInt())); p->collectiontree->createTrunk(); setLayout(mainLayout); connect(p->updater, SIGNAL(progressChanged(int)), p->progress, SLOT(setValue(int))); connect(p->progress, SIGNAL(stopped()), p->updater, SLOT(stop())); p->modeSelect->show(); } CollectionWidget::~CollectionWidget() { QSettings settings; settings.setValue("TreeMode", p->collectiontree->treeMode); delete p; } void CollectionWidget::scan() { if (p->progress->isHidden()) { QSettings settings; p->updater->setDirectoryList(settings.value("Dirs").toStringList(), true); } } void CollectionWidget::onModeSelected(ModeSelector::modeType value) { p->collectiontree->treeMode = static_cast(value); p->collectiontree->createTrunk(); } void CollectionWidget::onSetFilterTimeout() { if (p->timer->isActive()) p->timer->stop(); p->timer->start(); } void CollectionWidget::onSetFilter() { p->collectiontree->setFilter(p->searchEdit->text()); p->collectiontree->createTrunk(); } void CollectionWidget::onSetClicked() { p->actionsMenu->popup(QCursor::pos(), nullptr); } bool CollectionWidget::hasItems() { return (p->collectiontree->topLevelItemCount() > 0); } void CollectionWidget::loadSettings() { QSettings settings; p->updater->setDoMonitor(settings.value("Monitor").toBool()); p->updater->setDirectoryList(settings.value("Dirs").toStringList()); } void CollectionWidget::setFilterText(QString strFilter) { p->searchEdit->setText(strFilter); onSetFilter(); } QString CollectionWidget::filterText() { return p->searchEdit->text(); } void CollectionWidget::resizeEvent(QResizeEvent*) { QRect rec = p->collectiontree->geometry(); #if defined(Q_OS_DARWIN) int y = 39; #else int y = 41; #endif p->progress->setGeometry(0, y, rec.width() - 20, 20); p->modeSelect->setGeometry(rec.width() - p->modeSelect->width(), 0, p->modeSelect->width(), 20); } SearchEdit::SearchEdit(QWidget* parent) : QLineEdit(parent) { QPixmap searchIcon(":search.png"); QLabel* lbl = new QLabel(this); lbl->setScaledContents(true); lbl->setPixmap(searchIcon); lbl->setFixedSize(QSize(23, 23)); lbl->setStyleSheet("QLabel { border: none; padding: 0px; margin-left: 9px; " "margin-top: 11px; margin-right: 3px}"); clearButton = new QToolButton(this); QPixmap pixmap(":clear_left.png"); clearButton->setIcon(QIcon(pixmap)); clearButton->setIconSize(QSize(18, 18)); clearButton->setCursor(Qt::ArrowCursor); clearButton->setStyleSheet("QToolButton { border: none; padding: 0px; " "margin-right: 2px; margin-top: 3px;}"); clearButton->hide(); setAttribute(Qt::WA_MacShowFocusRect, false); connect(clearButton, SIGNAL(clicked()), this, SLOT(clear())); connect(this, SIGNAL(textChanged(const QString&)), this, SLOT(updateCloseButton(const QString&))); int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); // setStyleSheet(QString("QLineEdit { padding-right: %1px; } // ").arg(clearButton->sizeHint().width() + frameWidth + 1)); QSize msz = minimumSizeHint(); setMinimumSize( qMax(msz.width(), clearButton->sizeHint().height() + frameWidth * 2 + 2), qMax(msz.height(), clearButton->sizeHint().height() + frameWidth * 2 + 2)); } SearchEdit::~SearchEdit() {} void SearchEdit::dragEnterEvent(QDragEnterEvent* event) { if (event->mimeData()->hasFormat("text/playlistitem")) event->accept(); } void SearchEdit::dropEvent(QDropEvent* event) { if (event->mimeData()->hasFormat("text/playlistitem")) { // decode playlistitem QByteArray itemData = event->mimeData()->data("text/playlistitem"); QDataStream stream(&itemData, QIODevice::ReadOnly); QVector tags; stream >> tags; event->setDropAction(Qt::CopyAction); event->accept(); if (tags.count() > 0) { Track* track = new Track(tags[0]); this->setText(track->artist()); } } else event->ignore(); } void SearchEdit::resizeEvent(QResizeEvent*) { QSize sz = clearButton->sizeHint(); int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); clearButton->move(rect().right() - frameWidth - sz.width(), (rect().bottom() + 2 - sz.height()) / 2); } // esc key for clean up void SearchEdit::keyPressEvent(QKeyEvent* e) { if (e->key() == Qt::Key_Escape) this->setText(""); else QLineEdit::keyPressEvent(e); } void SearchEdit::updateCloseButton(const QString& text) { clearButton->setVisible(!text.isEmpty()); } knowthelist-2.3.1/src/collectionwidget.h000077500000000000000000000051061342115213400203700ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #ifndef COLLECTIONWIDGET_H #define COLLECTIONWIDGET_H #include "collectiondb.h" #include "collectiontree.h" #include "modeselector.h" #include "playlist.h" #include "progressbar.h" #include #include #include #include #include //class CollectionUpdater; class QCustomEvent; class QPixmap; class QPoint; class QPushButton; class SearchEdit: public QLineEdit{ Q_OBJECT public: SearchEdit( QWidget* parent=0); ~SearchEdit(); void dropEvent(QDropEvent* event); void dragEnterEvent(QDragEnterEvent*); signals: void trackDropped(QString); protected: void resizeEvent(QResizeEvent *); void keyPressEvent (QKeyEvent* e); private slots: void updateCloseButton(const QString &text); private: QToolButton *clearButton; }; class CollectionWidget: public QWidget { Q_OBJECT public: CollectionWidget( QWidget* parent ); ~CollectionWidget(); Track* getRandomSong(QString genre); QString filterText(); bool hasItems(); void setTracklist(Playlist* pl); public slots: void setFilterText( QString strFilter ); void loadSettings(); void scan(); signals: void trackDropped(QString); void randomClicked(); void selectionChanged(QList); void wantLoad (QList,QString); void filterChanged(QString); void setupDirs(); private slots: void onSetFilterTimeout(); void onSetClicked(); void onSetFilter(); void onModeSelected(ModeSelector::modeType value); private: void resizeEvent(QResizeEvent *); class CollectionWidgetPrivate *p; }; #endif /* COLLECTIONWIDGET_H */ knowthelist-2.3.1/src/customdial.cpp000066400000000000000000000057721342115213400175360ustar00rootroot00000000000000/* Copyright (C) 2019 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "customdial.h" #include #include #include CustomDial::CustomDial(QWidget* parent) : QDial(parent) { qDebug() << Q_FUNC_INFO << "START"; // Defaults QDial::setRange(0, 360); } void CustomDial::paintEvent(QPaintEvent*) { static const double degree270 = 1.5 * M_PI; static const double degree225 = 1.25 * M_PI; static const int scaleDiameter = static_cast(round((this->height() * 0.8) / 2) * 2); static const int scaleOffset = static_cast((this->height() - scaleDiameter) / 2); static const int dialDiameter = static_cast(round((this->height() * 0.65) / 2) * 2); static const int dialOffset = static_cast((this->height() - dialDiameter) / 2); QPainter painter(this); // Smooth out the circle painter.setRenderHint(QPainter::Antialiasing); // Gradient for dial QRadialGradient radialGrad(QPointF(dialOffset, dialOffset), dialDiameter); radialGrad.setColorAt(0.1, "#999"); radialGrad.setColorAt(0.5, "#777"); radialGrad.setColorAt(1, "#222"); QBrush brush(radialGrad); painter.setBrush(brush); QPen pen; pen.setStyle(Qt::NoPen); painter.setPen(pen); // Draw dial painter.drawEllipse(dialOffset, dialOffset, dialDiameter, dialDiameter); // Draw black border of dial painter.setBrush(Qt::NoBrush); painter.setPen(QPen(QColor("#333"), 3)); painter.drawEllipse(dialOffset, dialOffset, dialDiameter, dialDiameter); // Draw scale arc int startAngle = 225 * 16; int spanAngle = -270 * 16; QRectF rectScale(scaleOffset, scaleOffset, scaleDiameter, scaleDiameter); painter.setPen(QPen(QColor("#444"), 6)); painter.drawArc(rectScale, startAngle, spanAngle); painter.setPen(QPen(QColor("#777"), 2)); painter.drawArc(rectScale, startAngle, spanAngle); // Calc notch position double ratio = static_cast(QDial::value()) / QDial::maximum(); double angle = ratio * degree270 - degree225; double r = dialDiameter / 2.0; double y = sin(angle) * (r - dialOffset / 2) + r + dialOffset; double x = cos(angle) * (r - dialOffset / 2) + r + dialOffset; double c = r + dialOffset; // Draw the notch painter.setPen(QPen(QColor("#ccc"), 2)); painter.drawLine(QPointF(x, y), QPointF(c, c)); } knowthelist-2.3.1/src/customdial.h000066400000000000000000000004171342115213400171720ustar00rootroot00000000000000#ifndef CUSTOMDIAL_H #define CUSTOMDIAL_H #include #include class CustomDial : public QDial { Q_OBJECT public: CustomDial(QWidget * parent = nullptr); private: virtual void paintEvent(QPaintEvent*) override; }; #endif // CUSTOMDIAL_H knowthelist-2.3.1/src/dj.cpp000077500000000000000000000111361342115213400157610ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "dj.h" #include "filter.h" #include #include #include struct DjPrivate { int rotation; QList filters; Filter* filter; long countTracks; long lengthTracks; QString description; }; Dj::Dj() : p(new DjPrivate) { p->rotation = 0; p->filter = nullptr; p->description = QString::null; p->countTracks = 0; p->lengthTracks = 0; } Dj::~Dj() { delete p; } void Dj::addFilter(Filter* filter) { //qDebug() << Q_FUNC_INFO; p->filters.append(filter); connect(filter, SIGNAL(activated()), this, SLOT(on_filter_activated())); connect(filter, SIGNAL(filterChanged()), this, SLOT(on_filter_filterChanged())); connect(filter, SIGNAL(maxUsageChanged()), this, SLOT(on_filter_maxUsageChanged())); } void Dj::removeFilter(Filter* filter) { p->filters.removeOne(filter); } QList Dj::filters() { return p->filters; } void Dj::setActiveFilterIdx(int idx) { p->rotation = idx; if (p->rotation >= p->filters.count()) p->rotation = 0; p->filters[p->rotation]->setActive(true); } int Dj::activeFilterIdx() { return p->rotation; } void Dj::on_filter_filterChanged() { qDebug() << Q_FUNC_INFO; Filter* f = qobject_cast(QObject::sender()); Q_EMIT filterChanged(f); } void Dj::on_filter_countChanged() { //qDebug() << Q_FUNC_INFO ; //Filter* f = qobject_cast(QObject::sender()); //Q_EMIT countChanged(); } void Dj::on_filter_activated() { Filter* f = qobject_cast(QObject::sender()); QList::iterator i; for (i = p->filters.begin(); i != p->filters.end(); ++i) { if ((*i) != f) (*i)->setActive(false); else { p->rotation = p->filters.indexOf((*i)); } } //p->wc.wakeAll(); } void Dj::on_filter_maxUsageChanged() { Filter* f = qobject_cast(QObject::sender()); if (p->filter == f) checkSequence(); } void Dj::checkSequence() { qDebug() << Q_FUNC_INFO << "rotation=" << p->rotation << "/" << p->filters.count() << " repeat=" << p->filter->usage() << "/" << p->filter->maxUsage(); if (p->filter->usage() >= p->filter->maxUsage()) { int i = p->filters.count(); do { p->rotation++; i--; if (p->rotation >= p->filters.count()) p->rotation = 0; } while (p->filters.at(p->rotation)->maxUsage() == 0 && i > 0); p->filters.at(p->rotation)->setActive(true); // setActive goes twice through SIGNAL/SLOT and back here, // therefore a waitcondition is necessary to avoid race condition /*p->mutex.lock(); p->wc.wait(&p->mutex); p->mutex.unlock();*/ } } //ToDo: - Switch LED before add the Track // - Allow 0 filter (skip) // - DJwidget: Playbutton fУМr start Filter* Dj::requestFilter() { if (p->filters.isEmpty()) return nullptr; p->filter = p->filters.at(p->rotation); p->filter->setUsage(p->filter->usage() + 1); checkSequence(); qDebug() << Q_FUNC_INFO << "rotation=" << p->rotation << "/" << p->filters.count() << " repeat=" << p->filter->usage() << "/" << p->filter->maxUsage(); qDebug() << Q_FUNC_INFO << "return filter=" << p->filters.at(p->rotation)->path() << "/" << p->filters.at(p->rotation)->genre() << "/" << p->filters.at(p->rotation)->artist(); return p->filter; } QString Dj::description() { return p->description; } void Dj::setDescription(QString value) { p->description = value; } long Dj::countTracks() { return p->countTracks; } void Dj::setCountTracks(int value) { p->countTracks = value; Q_EMIT countChanged(); } long Dj::lengthTracks() { return p->lengthTracks; } void Dj::setLengthTracks(int value) { p->lengthTracks = value; } knowthelist-2.3.1/src/dj.h000077500000000000000000000030431342115213400154240ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #ifndef DJ_H #define DJ_H #include "filter.h" class Dj : public QObject { Q_OBJECT public: Dj(); ~Dj(); QList filters(); Filter* requestFilter(); QString name; QString description(); void setDescription(QString); long countTracks(); void setCountTracks(int); long lengthTracks(); void setLengthTracks(int); void addFilter(Filter* filter); void removeFilter(Filter* filter); void setActiveFilterIdx(int idx); int activeFilterIdx(); Q_SIGNALS: void filterChanged(Filter*); void countChanged(); private Q_SLOTS: void on_filter_activated(); void on_filter_filterChanged(); void on_filter_countChanged(); void on_filter_maxUsageChanged(); void checkSequence(); protected: private: struct DjPrivate* p; }; #endif // DJ_H knowthelist-2.3.1/src/djbrowser.cpp000077500000000000000000000307201342115213400173650ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "djbrowser.h" #include "collectiondb.h" #include "dj.h" #include "djfilterwidget.h" #include "djwidget.h" #include #include #include #include class DjBrowserPrivate { public: QSplitter* splitter; QListWidget* listDjs; QListWidget* listDjFilters; Dj* currentDj; DjWidget* currentDjw; QStringList allGenres; QStringList allArtists; CollectionDB* database; }; DjBrowser::DjBrowser(QWidget* parent) : QWidget(parent) { p = new DjBrowserPrivate; p->database = new CollectionDB(); QList tags = p->database->selectArtists(); p->allArtists.append(QString::null); foreach (QStringList tag, tags) p->allArtists.append(tag[0]); tags = p->database->selectGenres(); p->allGenres.append(QString::null); foreach (QStringList tag, tags) p->allGenres.append(tag[0]); QPushButton* pushAddDj = new QPushButton(); pushAddDj->setGeometry(QRect(1, 1, 60, 25)); pushAddDj->setMaximumWidth(60); pushAddDj->setMinimumWidth(60); pushAddDj->setText("+"); QFont pushFont = pushAddDj->font(); pushFont.setBold(true); pushFont.setPointSize(pushFont.pointSize() + 4); pushAddDj->setFont(pushFont); pushAddDj->setStyleSheet("QPushButton { border: none; padding-top: -3px; margin-left:8px;max-height: 20px; margin-right: 28px;}"); pushAddDj->setToolTip(tr("Add a new AutoDj")); connect(pushAddDj, SIGNAL(clicked()), this, SLOT(addDj())); QPushButton* pushAddFilter = new QPushButton(); pushAddFilter->setGeometry(QRect(1, 1, 60, 25)); pushAddFilter->setMaximumWidth(60); pushAddFilter->setMinimumWidth(60); pushAddFilter->setText("+"); pushAddFilter->setFont(pushFont); pushAddFilter->setStyleSheet("QPushButton { border: none; padding-top: -3px; margin-left: 8px;max-height: 20px; margin-right: 28px;}"); pushAddFilter->setToolTip(tr("Add a new record case for current AutoDj")); connect(pushAddFilter, SIGNAL(clicked()), this, SLOT(addFilter())); QPushButton* pushSave = new QPushButton(); pushSave->setGeometry(QRect(1, 1, 60, 25)); pushSave->setMaximumWidth(60); pushSave->setMinimumWidth(60); pushSave->setText(QString::fromUtf8("\U0001f4be")); pushSave->setFont(pushFont); pushSave->setStyleSheet("QPushButton { border: none; padding-top: -3px; margin-left: 8px;max-height: 20px; margin-right: 28px;}"); pushSave->setToolTip(tr("Save all settings")); connect(pushSave, SIGNAL(clicked()), this, SLOT(saveSettings())); p->listDjFilters = new QListWidget(); p->listDjs = new QListWidget(); p->listDjFilters->setAttribute(Qt::WA_MacShowFocusRect, false); p->listDjs->setAttribute(Qt::WA_MacShowFocusRect, false); p->listDjs->setItemSelected(p->listDjs->currentItem(), false); QVBoxLayout* mainLayout = new QVBoxLayout; QVBoxLayout* headWidgetLeftLayout = new QVBoxLayout; headWidgetLeftLayout->setMargin(0); headWidgetLeftLayout->setSpacing(1); headWidgetLeftLayout->setAlignment(Qt::AlignRight); headWidgetLeftLayout->addWidget(pushAddDj); QWidget* headWidgetLeft = new QWidget(this); headWidgetLeft->setMaximumHeight(20); headWidgetLeft->setMinimumHeight(20); headWidgetLeft->setLayout(headWidgetLeftLayout); QHBoxLayout* headWidgetRightLayout = new QHBoxLayout; headWidgetRightLayout->setMargin(0); headWidgetRightLayout->setSpacing(1); headWidgetRightLayout->setAlignment(Qt::AlignRight); headWidgetRightLayout->addWidget(pushAddFilter); headWidgetRightLayout->addWidget(pushSave); QWidget* headWidgetRight = new QWidget(this); headWidgetRight->setMaximumHeight(20); headWidgetRight->setMinimumHeight(20); headWidgetRight->setLayout(headWidgetRightLayout); QVBoxLayout* widgetLeftLayout = new QVBoxLayout; widgetLeftLayout->setMargin(0); widgetLeftLayout->setSpacing(1); widgetLeftLayout->setAlignment(Qt::AlignRight); widgetLeftLayout->addWidget(headWidgetLeft); widgetLeftLayout->addWidget(p->listDjs); QVBoxLayout* widgetRightLayout = new QVBoxLayout; widgetRightLayout->setMargin(0); widgetRightLayout->setSpacing(1); widgetRightLayout->setAlignment(Qt::AlignRight); widgetRightLayout->addWidget(headWidgetRight); widgetRightLayout->addWidget(p->listDjFilters); QWidget* widgetLeft = new QWidget(this); widgetLeft->setLayout(widgetLeftLayout); QWidget* widgetRight = new QWidget(this); widgetRight->setLayout(widgetRightLayout); p->splitter = new QSplitter(); p->splitter->addWidget(widgetLeft); p->splitter->addWidget(widgetRight); mainLayout->addWidget(p->splitter); mainLayout->setMargin(0); mainLayout->setSpacing(0); setLayout(mainLayout); QSettings settings; p->splitter->setStretchFactor(0, 5); p->splitter->setStretchFactor(1, 9); p->splitter->restoreState(settings.value("SplitterDjBrowser").toByteArray()); } DjBrowser::~DjBrowser() { saveSettings(); delete p; } void DjBrowser::saveSettings() { QSettings settings; settings.setValue("SplitterDjBrowser", p->splitter->saveState()); settings.setValue("countDJ", p->listDjs->count()); settings.remove("AutoDJ"); settings.beginGroup("AutoDJ"); for (int d = 0; d < p->listDjs->count(); d++) { settings.beginGroup(QString::number(d)); Dj* dj = ((DjWidget*)p->listDjs->itemWidget(p->listDjs->item(d)))->dj(); if (dj != nullptr) { settings.setValue("Name", dj->name); settings.setValue("FilterCount", dj->filters().count()); QList f = dj->filters(); settings.beginGroup("Filter"); for (int i = 0; i < f.count(); i++) { settings.beginGroup(QString::number(i)); settings.setValue("Path", f.at(i)->path()); settings.setValue("Genre", f.at(i)->genre()); settings.setValue("Artist", f.at(i)->artist()); settings.setValue("Value", QString::number(f.at(i)->maxUsage())); settings.endGroup(); } settings.endGroup(); settings.endGroup(); } } settings.endGroup(); } void DjBrowser::updateList() { QSettings settings; //Dj Widget List p->listDjs->clear(); p->listDjs->setSelectionMode(QAbstractItemView::ExtendedSelection); DjWidget* djw; QListWidgetItem* itm; Dj* dj; int maxDj = settings.value("countDJ", "3").toInt(); if (maxDj == 0) maxDj = 1; settings.beginGroup("AutoDJ"); // DJs for (int d = 0; d < maxDj; d++) { settings.beginGroup(QString::number(d)); dj = new Dj(); QString djID = QString("Dj%1").arg(d + 1); dj->name = settings.value("Name", djID).toString(); djw = new DjWidget(p->listDjs); connect(djw, SIGNAL(activated()), this, SLOT(loadDj())); connect(djw, SIGNAL(deleted()), this, SLOT(removeDj())); connect(djw, SIGNAL(started()), this, SLOT(startDj())); itm = new QListWidgetItem(p->listDjs); itm->setSizeHint(QSize(0, 75)); p->listDjs->addItem(itm); p->listDjs->setItemWidget(itm, djw); // Filters int countFilter = settings.value("FilterCount", "2").toInt(); if (countFilter == 0) countFilter = 1; settings.beginGroup("Filter"); for (int i = 0; i < countFilter; i++) { settings.beginGroup(QString::number(i)); Filter* f = new Filter(); dj->addFilter(f); f->setPath(settings.value("Path", "").toString()); f->setGenre(settings.value("Genre", "").toString()); f->setArtist(settings.value("Artist", "").toString()); f->setMaxUsage(settings.value("Value", "4").toInt()); settings.endGroup(); f->setUsage(0); } djw->setDj(dj); // force sum update djw->clicked(); settings.endGroup(); dj->setActiveFilterIdx(settings.value("currentDjActiveFilter", "0").toInt()); settings.endGroup(); } settings.endGroup(); p->listDjs->setCurrentRow(0); DjWidget* djWidget = static_cast(p->listDjs->itemWidget(p->listDjs->currentItem())); djWidget->activateDJ(); djWidget->clicked(); p->listDjs->setItemSelected(p->listDjs->currentItem(), false); p->listDjs->setSelectionMode(QAbstractItemView::NoSelection); } void DjBrowser::addDj() { saveSettings(); QSettings settings; settings.setValue("countDJ", p->listDjs->count() + 1); updateList(); } void DjBrowser::removeDj() { if (DjWidget* djWidget = qobject_cast(QObject::sender())) { // search the Dj which to remove for (int d = 0; d < p->listDjs->count(); d++) { if ((DjWidget*)p->listDjs->itemWidget(p->listDjs->item(d)) == djWidget) { p->listDjs->removeItemWidget(p->listDjs->item(d)); delete p->listDjs->item(d); //delete djWidget; } } saveSettings(); updateList(); Dj* dj = ((DjWidget*)p->listDjs->itemWidget(p->listDjs->item(0)))->dj(); Q_EMIT selectionChanged(dj); } } void DjBrowser::startDj() { qDebug() << Q_FUNC_INFO; loadDj(); Q_EMIT selectionStarted(); } void DjBrowser::loadDj() { //Fill Filter Widget List qDebug() << Q_FUNC_INFO; p->listDjFilters->clear(); DjFilterWidget* djfw; QListWidgetItem* itm; int maxFilters = 0; // deactivate all Djs for (int d = 0; d < p->listDjs->count(); d++) static_cast(p->listDjs->itemWidget(p->listDjs->item(d)))->deactivateDJ(); // Activate current selected DJ if (DjWidget* djWidget = qobject_cast(QObject::sender())) { djWidget->activateDJ(); Dj* dj = djWidget->dj(); // Filters if (dj->filters().count() == 0) { //last filter has been removed Filter* f = new Filter(); f->setMaxUsage(4); dj->addFilter(f); } Q_EMIT selectionChanged(dj); qDebug() << Q_FUNC_INFO << "name=" << dj->name << "filters=" << dj->filters().count(); maxFilters = dj->filters().count(); for (int i = 0; i < maxFilters; i++) { // djfw = new DjFilterWidget(p->listDjFilters); djfw->setID(QString::number(i + 1)); djfw->setAllGenres(p->allGenres); djfw->setAllArtists(p->allArtists); djfw->setFilter(dj->filters().at(i)); itm = new QListWidgetItem(p->listDjFilters); itm->setSizeHint(QSize(0, 75)); p->listDjFilters->addItem(itm); p->listDjFilters->setItemWidget(itm, djfw); connect(djfw, SIGNAL(deleted()), this, SLOT(removeFilter())); } dj->setActiveFilterIdx(0); p->currentDj = dj; p->currentDjw = djWidget; } for (int i = 0; i < maxFilters; i++) { p->currentDj->filters().at(i)->update(); } // give a chance to update the labels qApp->processEvents(); } void DjBrowser::addFilter() { Filter* f = new Filter(); f->setMaxUsage(4); p->currentDj->addFilter(f); saveSettings(); p->currentDjw->clicked(); } void DjBrowser::removeFilter() { if (DjFilterWidget* fw = qobject_cast(QObject::sender())) { // search the Filter which to remove for (int d = 0; d < p->listDjFilters->count(); d++) { if ((DjFilterWidget*)p->listDjFilters->itemWidget(p->listDjFilters->item(d)) == fw) { p->currentDj->removeFilter(fw->filter()); p->listDjFilters->removeItemWidget(p->listDjFilters->item(d)); delete p->listDjFilters->item(d); } } saveSettings(); p->currentDjw->clicked(); } } knowthelist-2.3.1/src/djbrowser.h000077500000000000000000000024131342115213400170300ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #ifndef DJBROWSER_H #define DJBROWSER_H #include "dj.h" #include #include class DjBrowser : public QWidget { Q_OBJECT public: explicit DjBrowser(QWidget* parent = nullptr); ~DjBrowser(); void updateList(); void saveSettings(); signals: void selectionChanged(Dj*); void selectionStarted(); public slots: void addDj(); void loadDj(); void removeDj(); void startDj(); void addFilter(); void removeFilter(); private: class DjBrowserPrivate* p; }; #endif // DJBROWSER_H knowthelist-2.3.1/src/djfilterwidget.cpp000077500000000000000000000150451342115213400203760ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "djfilterwidget.h" #include "ui_djfilterwidget.h" #include #include #include #include struct DjFilterWidgetPrivate { Filter* filter; QTimer* timerSlide; int targetWidth; bool ready; }; DjFilterWidget::DjFilterWidget(QWidget* parent) : QWidget(parent) , ui(new Ui::DjFilterWidget) , p(new DjFilterWidgetPrivate) { setFocusPolicy(Qt::ClickFocus); ui->setupUi(this); ui->ledActive->setLook(QLed::Flat); ui->ledActive->setShape(QLed::Rectangular); ui->ledActive->setColor(QColor(35, 119, 246)); ui->ledActive->off(); ui->txtPath->setAttribute(Qt::WA_MacShowFocusRect, false); ui->cmbGenres->setAttribute(Qt::WA_MacShowFocusRect, false); ui->cmbArtists->setAttribute(Qt::WA_MacShowFocusRect, false); ui->lblFilterValue->setText(QString::null); ui->stackDisplay->setCount(0); ui->stackDisplay->setBarColor(QColor(196, 196, 210)); ui->widgetClose->setMinimumWidth(0); ui->widgetClose->setMaximumWidth(0); timer = new QTimer(this); timer->stop(); timer->setInterval(300); timer->setSingleShot(true); connect(timer, SIGNAL(timeout()), this, SLOT(slotSetFilter())); p->timerSlide = new QTimer(this); p->timerSlide->setInterval(10); connect(p->timerSlide, SIGNAL(timeout()), SLOT(timerSlide_timeOut())); ui->sliFilterValue->setRange(0, 10); } DjFilterWidget::~DjFilterWidget() { delete ui; delete p; } void DjFilterWidget::changeEvent(QEvent* e) { QWidget::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } void DjFilterWidget::mousePressEvent(QMouseEvent* event) { if (ui->widgetClose->geometry().contains(event->pos())) { Q_EMIT deleted(); } else { slideCloseWidget(false); } } void DjFilterWidget::slotSetFilter() { qDebug() << Q_FUNC_INFO; timer->stop(); p->filter->setPath(ui->txtPath->text()); p->filter->setGenre(ui->cmbGenres->currentText()); p->filter->setArtist(ui->cmbArtists->currentText()); p->filter->update(); } void DjFilterWidget::setAllArtists(QStringList values) { ui->cmbArtists->addItems(values); } void DjFilterWidget::setAllGenres(QStringList& values) { ui->cmbGenres->addItems(values); } void DjFilterWidget::setID(QString value) { ui->lblNumber->setText(value); } void DjFilterWidget::setFilter(Filter* filter) { qDebug() << Q_FUNC_INFO << "START"; timer->stop(); p->ready = false; p->filter = filter; onFilterCountChanged(); onFilterMaxUsageChanged(); ui->txtPath->setText(p->filter->path()); ui->cmbGenres->setEditText(p->filter->genre()); ui->cmbArtists->setEditText(p->filter->artist()); connect(p->filter, SIGNAL(statusChanged(bool)), this, SLOT(onFilterStatusChanged(bool))); connect(p->filter, SIGNAL(countChanged()), this, SLOT(onFilterCountChanged())); connect(p->filter, SIGNAL(usageChanged()), this, SLOT(onFilterUsageChanged())); connect(p->filter, SIGNAL(maxUsageChanged()), this, SLOT(onFilterMaxUsageChanged())); p->ready = true; qDebug() << Q_FUNC_INFO << "END"; } Filter* DjFilterWidget::filter() { return p->filter; } void DjFilterWidget::on_sliFilterValue_valueChanged(int value) { ui->lblFilterValue->setText(QString("%1 %2").arg(value).arg(QString(tr("of")))); p->filter->setMaxUsage(ui->sliFilterValue->value()); } void DjFilterWidget::on_txtPath_textChanged(QString) { if (p->ready) { if (timer->isActive()) timer->stop(); timer->start(); } } void DjFilterWidget::on_cmbGenres_editTextChanged(QString) { if (p->ready) { if (timer->isActive()) timer->stop(); timer->start(); } } void DjFilterWidget::on_cmbArtists_editTextChanged(QString) { if (p->ready) { if (timer->isActive()) timer->stop(); timer->start(); } } void DjFilterWidget::on_pushActivate_clicked() { p->filter->setActive(true); } void DjFilterWidget::onFilterStatusChanged(bool b) { if (b) ui->ledActive->on(); else { ui->ledActive->off(); ui->stackDisplay->setSelected(-1); } } void DjFilterWidget::onFilterCountChanged() { ui->lblCount->setText(QString("%1").arg(p->filter->count())); } void DjFilterWidget::onFilterMaxUsageChanged() { ui->lblFilterValue->setText(QString("%1 %2").arg(p->filter->maxUsage()).arg(tr("of"))); ui->sliFilterValue->setValue(p->filter->maxUsage()); ui->stackDisplay->setCount(p->filter->maxUsage()); } void DjFilterWidget::onFilterUsageChanged() { ui->stackDisplay->setCount(p->filter->maxUsage()); ui->stackDisplay->setSelected(p->filter->usage()); } void DjFilterWidget::on_lbl1_linkActivated(const QString& link) { QFileDialog dialog(this); dialog.setFileMode(QFileDialog::DirectoryOnly); if (dialog.exec()) ui->txtPath->setText(dialog.selectedFiles().first()); } // esc key for exit close void DjFilterWidget::keyPressEvent(QKeyEvent* e) { if (e->key() == Qt::Key_Escape) slideCloseWidget(false); else QWidget::keyPressEvent(e); } void DjFilterWidget::on_pushClose_clicked() { slideCloseWidget((ui->widgetClose->minimumWidth() < 50)); } void DjFilterWidget::slideCloseWidget(bool open) { p->targetWidth = (open) ? 70 : 0; p->timerSlide->start(); } void DjFilterWidget::timerSlide_timeOut() { int mWidth = ui->widgetClose->minimumWidth(); if (p->targetWidth > mWidth) { ui->widgetClose->setMinimumWidth(mWidth + 5); ui->widgetClose->setMaximumWidth(mWidth + 5); } else if (p->targetWidth < mWidth) { ui->widgetClose->setMinimumWidth(mWidth - 5); ui->widgetClose->setMaximumWidth(mWidth - 5); } else { p->timerSlide->stop(); } } knowthelist-2.3.1/src/djfilterwidget.h000077500000000000000000000040131342115213400200340ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #ifndef DJFILTERWIDGET_H #define DJFILTERWIDGET_H #include "filter.h" #include #include namespace Ui { class DjFilterWidget; } class DjFilterWidget : public QWidget { Q_OBJECT public: DjFilterWidget(QWidget* parent = nullptr); ~DjFilterWidget(); void setFilter(Filter* filter); Filter* filter(); void setID(QString value); void slideCloseWidget(bool open); void setAllGenres(QStringList& values); void setAllArtists(QStringList values); protected: void changeEvent(QEvent* event); void mousePressEvent(QMouseEvent* event); void keyPressEvent(QKeyEvent* e); Q_SIGNALS: void deleted(); private: Ui::DjFilterWidget* ui; QTimer* timer; struct DjFilterWidgetPrivate* p; private slots: void on_pushActivate_clicked(); void on_txtPath_textChanged(QString); void on_cmbGenres_editTextChanged(QString); void on_cmbArtists_editTextChanged(QString); void on_sliFilterValue_valueChanged(int value); void slotSetFilter(); void onFilterStatusChanged(bool b); void onFilterCountChanged(); void onFilterUsageChanged(); void onFilterMaxUsageChanged(); void on_lbl1_linkActivated(const QString& link); void timerSlide_timeOut(); void on_pushClose_clicked(); }; #endif // DJFILTERWIDGET_H knowthelist-2.3.1/src/djfilterwidget.ui000077500000000000000000002614511342115213400202350ustar00rootroot00000000000000 DjFilterWidget 0 0 754 85 16777215 300 Form QFrame#frame{ background: qlineargradient( x1:0, y1:0, x2:0, y2:1, stop: 0.01 #202020, stop:0.11 #505050, stop:1 #505050 ); } QLineEdit { background:#606060; color: #c4c4c4; selection-color: white; border: 1px groove gray; border-radius: 0px; margin: 0 0 0 0; font-size: 10px; } QFrame#fraDisplay>QLabel { color: #dddddd; } QLineEdit:focus { background: #a0a0a0; color: #101010; selection-color: white; border: 1px groove black; border-radius: 10px; } QLineEdit:edit-focus { color: rgb(0, 63, 123); background: #a0a0a0; selection-color: white; border: 1px groove black; border-radius: 10px; padding: 2px 4px; } QFrame#fraDisplay{ border: 1px solid #a2a2a2; border-radius: 3px; background: qradialgradient( cx: 0.5, cy: -1.8, fx: 0.5, fy: 0, radius: 2, stop: 0 #9aa9be, stop: 1 #182238); } QComboBox { background:#606060; color: #a4a4a4; selection-color: white; border: 1px groove gray; border-radius: 0px; font-size: 10px; } QComboBox QAbstractItemView{ background-color: #4f4f4f; color: #999999; selection-background-color: #999999; selection-color: #4f4f4f; } QComboBox::drop-down { subcontrol-origin: padding; subcontrol-position: top right; width: 15px; border-left-width: 1px; border-left-color: gray; border-left-style: solid; border-top-right-radius: 3px; border-bottom-right-radius: 3px; } QComboBox::down-arrow { image: url(:down.png); } QComboBox:on { padding-top: 3px; padding-left: 4px; } 0 0 0 0 0 0 0 16777215 16777215 QFrame::NoFrame QFrame::Plain 0 0 0 0 3 0 0 42 0 Qt::LeftToRight QFrame::NoFrame QFrame::Raised 9 34 32 32 0 0 0 0 32 32 9 Record Case QFrame::NoFrame :/vinyl.png true 0 -1 0 0 290 0 290 16777215 Qt::LeftToRight QFrame::NoFrame QFrame::Raised 5 12 156 58 0 0 156 0 156 16777215 QFrame::StyledPanel QFrame::Raised 14 39 51 22 0 0 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">count of records which fit to this filter(s)</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt; text-decoration: underline;"></p></body></html> 0 Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 13 6 31 24 14 75 true 1 44 10 105 41 0 0 14 32 51 16 7 0 166 12 85 58 0 0 85 0 85 16777215 QFrame::NoFrame QFrame::Raised 63 24 13 8 7 7 35 119 246 135 52 34 33 19 0 0 0 0 33 16777215 255 255 255 153 153 153 80 80 80 0 0 0 255 255 255 221 221 221 93 93 93 124 124 124 255 255 255 255 255 255 255 255 255 153 153 153 80 80 80 0 0 0 153 153 153 80 80 80 0 0 0 0 0 0 0 0 128 255 255 255 0 0 0 0 0 0 255 255 255 153 153 153 80 80 80 0 0 0 255 255 255 215 215 215 93 93 93 124 124 124 255 255 255 255 255 255 255 255 255 153 153 153 80 80 80 0 0 0 153 153 153 80 80 80 0 0 0 0 0 0 0 0 128 255 255 255 0 0 0 0 0 0 255 255 255 153 153 153 80 80 80 0 0 0 255 255 255 215 215 215 93 93 93 124 124 124 255 255 255 255 255 255 255 255 255 153 153 153 80 80 80 0 0 0 153 153 153 80 80 80 0 0 0 0 0 0 0 0 128 255 255 255 0 0 0 0 0 0 7 Activate this record case set Alt+J true false 2 5 52 15 7 Count 9 23 32 32 60 60 how many records per turn true 276 30 30 20 30 20 Remove this record case x 0 0 0 82 16777215 92 QFrame::NoFrame QFrame::Raised 0 13 13 13 3 0 0 60 11 0 0 0 255 87 193 168 193 255 118 154 243 34 57 116 45 76 155 0 0 0 255 255 255 0 0 0 255 87 193 255 87 193 0 0 0 161 185 243 255 255 220 0 0 0 0 0 0 255 87 193 168 193 255 118 154 243 34 57 116 45 76 155 0 0 0 255 255 255 0 0 0 255 87 193 255 87 193 0 0 0 161 185 243 255 255 220 0 0 0 34 57 116 255 87 193 168 193 255 118 154 243 34 57 116 45 76 155 34 57 116 255 255 255 34 57 116 255 87 193 255 87 193 0 0 0 68 115 232 255 255 220 0 0 0 7 true false PointingHandCursor QFrame::Sunken <html><head/><body><p><a href="#"><span style=" text-decoration: underline; color:#e1e1e1;">Path</span></a></p></body></html> Qt::AlignCenter 0 0 0 17 true 0 17 0 0 0 60 11 0 0 0 255 87 193 168 193 255 118 154 243 34 57 116 45 76 155 0 0 0 255 255 255 0 0 0 255 87 193 255 87 193 0 0 0 161 185 243 255 255 220 0 0 0 0 0 0 255 87 193 168 193 255 118 154 243 34 57 116 45 76 155 0 0 0 255 255 255 0 0 0 255 87 193 255 87 193 0 0 0 161 185 243 255 255 220 0 0 0 34 57 116 255 87 193 168 193 255 118 154 243 34 57 116 45 76 155 34 57 116 255 255 255 34 57 116 255 87 193 255 87 193 0 0 0 68 115 232 255 255 220 0 0 0 7 false false ArrowCursor QFrame::Sunken Genre Qt::AlignCenter 0 0 60 11 0 0 0 255 87 193 168 193 255 118 154 243 34 57 116 45 76 155 0 0 0 255 255 255 0 0 0 255 87 193 255 87 193 0 0 0 161 185 243 255 255 220 0 0 0 0 0 0 255 87 193 168 193 255 118 154 243 34 57 116 45 76 155 0 0 0 255 255 255 0 0 0 255 87 193 255 87 193 0 0 0 161 185 243 255 255 220 0 0 0 34 57 116 255 87 193 168 193 255 118 154 243 34 57 116 45 76 155 34 57 116 255 255 255 34 57 116 255 87 193 255 87 193 0 0 0 68 115 232 255 255 220 0 0 0 7 false false ArrowCursor QFrame::Sunken Artist Qt::AlignCenter 0 0 0 17 true 0 0 18 16777215 <html><head/><body><p>Confirm the remove</p></body></html> background-color: rgb(255, 65, 87); 9 Delete QLed QWidget
qled.h
1
CustomDial QWidget
customdial.h
1
StackDisplay QWidget
stackdisplay.h
1
knowthelist-2.3.1/src/djsession.cpp000077500000000000000000000303061342115213400173650ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "djsession.h" #include "dj.h" #include "track.h" #if QT_VERSION >= 0x050000 #include #else #include #endif #include struct DjSessionPrivate { QMutex mutex1; Dj* currentDj; int minCount; CollectionDB* database; QList playList1_Tracks; QList playList2_Tracks; QPair playList1_Info; QPair playList2_Info; QStringList seenUrls; bool isEnabledAutoDJCount; }; DjSession::DjSession() : p(new DjSessionPrivate) { p->database = new CollectionDB(); p->minCount = 10; p->currentDj = nullptr; p->isEnabledAutoDJCount = false; } DjSession::~DjSession() { delete p; } void DjSession::setCurrentDj(Dj* dj) { // retire current Auto-DJ if (p->currentDj) disconnect(p->currentDj, SIGNAL(filterChanged(Filter*)), this, SLOT(on_dj_filterChanged(Filter*))); // hire new DJ p->currentDj = dj; connect(p->currentDj, SIGNAL(filterChanged(Filter*)), this, SLOT(on_dj_filterChanged(Filter*))); } Dj* DjSession::currentDj() { return p->currentDj; } void DjSession::searchTracks() { // init qrand QTime time = QTime::currentTime(); qsrand((uint)time.msec()); // how many tracks are needed p->mutex1.lock(); int diffCount1 = p->minCount - p->playList1_Tracks.count(); int diffCount2 = p->minCount - p->playList2_Tracks.count(); int needed = (diffCount1 > 0) ? diffCount1 : 0; needed = (diffCount2 > 0) ? needed + diffCount2 : needed; qDebug() << Q_FUNC_INFO << " need " << diffCount1 << " tracks left and " << diffCount2 << " tracks right "; qDebug() << Q_FUNC_INFO << " needed together: " << needed; // retrieve new random tracks for both playlists QList tracks1; QList tracks2; for (int i = 0; i < needed; i++) { if (i % 2 == 0) { if (diffCount1 > 0) { tracks1.append(getRandomTrack()); diffCount1--; } else tracks2.append(getRandomTrack()); } else { if (diffCount2 > 0) { tracks2.append(getRandomTrack()); diffCount2--; } else tracks1.append(getRandomTrack()); } } // new tracks available, trigger fill up of playlists qDebug() << Q_FUNC_INFO << " provide " << tracks1.count() << " tracks left and " << tracks2.count() << " tracks right "; // emit if needed if (tracks1.count() > 0) emit foundTracks_Playlist1(tracks1); if (tracks2.count() > 0) emit foundTracks_Playlist2(tracks2); p->mutex1.unlock(); } /*ToDo: - Genre: Combobox with distinct all genres */ Track* DjSession::getRandomTrack() { if (p->currentDj == nullptr) return nullptr; Track* track = nullptr; int i = 0; Filter* f = p->currentDj->requestFilter(); int maxCount = 0; do { track = new Track(p->database->getRandomEntry(f->path(), f->genre(), f->artist())); if (maxCount == 0) maxCount = p->database->lastMaxCount(); i++; } while ((track->prettyLength() == "?" || track->containIn(p->playList1_Tracks) || track->containIn(p->playList2_Tracks) || p->seenUrls.contains(track->url().toString())) && i < maxCount * 3); if (i >= maxCount * 3) qDebug() << Q_FUNC_INFO << " no new track found."; else qDebug() << Q_FUNC_INFO << i << " iterations to found a new track " << i; f->setCount(maxCount); f->setLength(p->database->lastLengthSum()); p->seenUrls.append(track->url().toString()); p->seenUrls.removeDuplicates(); track->setFlags(track->flags() | Track::isAutoDjSelection); return track; } void DjSession::updatePlaylists() { QFuture future = QtConcurrent::run(this, &DjSession::searchTracks); } void DjSession::forceTracks(QList tracks) { int count1 = p->playList1_Tracks.count(); int count2 = p->playList2_Tracks.count(); qDebug() << Q_FUNC_INFO << count1 << " tracks left and " << count2 << " tracks right "; // distribute tracks to both playlists QList tracks1; QList tracks2; for (int i = 0; i < tracks.count(); i++) { if (tracks.at(i)->flags().testFlag(Track::isOnFirstPlayer)) { tracks1.append(tracks.at(i)); count1++; } else if (tracks.at(i)->flags().testFlag(Track::isOnSecondPlayer)) { tracks2.append(tracks.at(i)); count2++; } else if (count1 < count2) { tracks1.append(tracks.at(i)); count1++; } else { tracks2.append(tracks.at(i)); count2++; } } // new tracks available, trigger fill up of playlists qDebug() << Q_FUNC_INFO << " provide " << tracks1.count() << " tracks left and " << tracks2.count() << " tracks right "; // emit if needed if (tracks1.count() > 0) emit foundTracks_Playlist1(tracks1); if (tracks2.count() > 0) emit foundTracks_Playlist2(tracks2); } void DjSession::playDefaultList() { qDebug() << Q_FUNC_INFO; QList selectedTags; //Retrieve songs from database selectedTags = p->database->selectPlaylistTracks("defaultKnowthelist"); QList tracks; tracks.clear(); qDebug() << Q_FUNC_INFO << "Song count: " << selectedTags.count(); //add tags to this track list foreach (QStringList tag, selectedTags) { tracks.append(new Track(tag)); } forceTracks(tracks); } void DjSession::on_dj_filterChanged(Filter* f) { qDebug() << Q_FUNC_INFO; int cnt = p->database->getCount(f->path(), f->genre(), f->artist()); f->setLength(p->database->lastLengthSum()); f->setCount(cnt); summariseCount(); } void DjSession::onResetStats() { p->database->resetSongCounter(); } void DjSession::onTrackFinished(Track* track) { if (track && (p->isEnabledAutoDJCount || !track->flags().testFlag(Track::isAutoDjSelection))) { p->database->incSongCounter(track->url().toLocalFile()); } } void DjSession::onTrackPropertyChanged(Track* track) { if (track) { p->database->setSongRate(track->url().toLocalFile(), track->rate()); } } void DjSession::onTracksChanged_Playlist1(QList tracks) { p->playList1_Info.second = 0; p->playList1_Tracks = tracks; foreach (Track* track, p->playList1_Tracks) { Track::Options flags = track->flags(); flags |= Track::isOnFirstPlayer; flags &= ~Track::isOnSecondPlayer; track->setFlags(flags); p->playList1_Info.second += track->length(); } p->playList1_Info.first = p->playList1_Tracks.count(); Q_EMIT changed_Playlist1(p->playList1_Info); } void DjSession::onTracksChanged_Playlist2(QList tracks) { p->playList2_Info.second = 0; p->playList2_Tracks = tracks; foreach (Track* track, p->playList2_Tracks) { Track::Options flags = track->flags(); flags &= ~Track::isOnFirstPlayer; flags |= Track::isOnSecondPlayer; track->setFlags(flags); p->playList2_Info.second += track->length(); } p->playList2_Info.first = p->playList2_Tracks.count(); Q_EMIT changed_Playlist2(p->playList2_Info); } void DjSession::storePlaylists(const QString& name, bool replace) { qDebug() << Q_FUNC_INFO << " Start"; QList listToStore; listToStore.append(p->playList1_Tracks); listToStore.append(p->playList2_Tracks); if (replace) p->database->executeSql(QString("DELETE FROM playlists WHERE name ='%1';") .arg(p->database->escapeString(name))); int n = 0; QList::Iterator i = listToStore.begin(); while (i != listToStore.end()) { QString command = QString("INSERT OR REPLACE INTO playlists " "( url, name, length, flags, norder, changedate ) " "VALUES('%1','%2', %3, %4, %5, strftime('%s', 'now'));") .arg(p->database->escapeString((*i)->url().toLocalFile())) .arg(p->database->escapeString(name)) .arg((*i)->length()) .arg((*i)->flags()) .arg(n); p->database->executeSql(command); i++; n++; } Q_EMIT savedPlaylists(); qDebug() << Q_FUNC_INFO << " Insert finish"; } void DjSession::summariseCount() { QString res; int count = 0; int length = 0; QStringList artists; int filterCount = p->currentDj->filters().count(); for (int i = 0; i < filterCount; i++) { Filter* f = p->currentDj->filters().at(i); res += f->description(); count += f->count(); length += f->length(); } p->currentDj->setLengthTracks(length); p->currentDj->setDescription(res); p->currentDj->setCountTracks(count); } bool DjSession::isEnabledAutoDJCount() { return p->isEnabledAutoDJCount; } void DjSession::setIsEnabledAutoDJCount(bool value) { p->isEnabledAutoDJCount = value; } int DjSession::minCount() { return p->minCount; } void DjSession::setMinCount(int value) { p->minCount = value; } // obsolate: keep this just in case we need an export function later void DjSession::savePlaylists(const QString& filename) { qDebug() << Q_FUNC_INFO << "BEGIN "; QFile file(filename); if (!file.open(QFile::WriteOnly)) return; QList listToSave; listToSave.append(p->playList1_Tracks); listToSave.append(p->playList2_Tracks); QDomDocument newdoc; QDomElement playlistElem = newdoc.createElement("playlist"); playlistElem.setAttribute("version", "1"); playlistElem.setAttribute("xmlns", "http://xspf.org/ns/0/"); newdoc.appendChild(playlistElem); QDomElement elem = newdoc.createElement("creator"); QDomText t = newdoc.createTextNode("Knowthelist"); elem.appendChild(t); playlistElem.appendChild(elem); QDomElement listElem = newdoc.createElement("trackList"); QList::Iterator i = listToSave.begin(); while (i != listToSave.end()) { QDomElement trackElem = newdoc.createElement("track"); QDomElement extElem = newdoc.createElement("extension"); if ((*i)->flags().testFlag(Track::isAutoDjSelection)) extElem.setAttribute("isAutoDjSelection", "1"); if ((*i)->flags().testFlag(Track::isOnFirstPlayer)) extElem.setAttribute("isOnFirstPlayer", "1"); if ((*i)->flags().testFlag(Track::isOnSecondPlayer)) extElem.setAttribute("isOnSecondPlayer", "1"); extElem.setAttribute("Rating", (*i)->rate()); QStringList tag = (*i)->tagList(); for (int x = 0; x < tag.count(); ++x) { if (x == 4 || x == 5) { extElem.setAttribute(Track::tagNameList.at(x), tag.at(x)); } else { QDomElement elem = newdoc.createElement(Track::tagNameList.at(x)); QDomText t = newdoc.createTextNode(tag.at(x)); elem.appendChild(t); trackElem.appendChild(elem); } } trackElem.appendChild(extElem); listElem.appendChild(trackElem); i++; } playlistElem.appendChild(listElem); QTextStream stream(&file); stream.setCodec("UTF-8"); stream << "\n"; stream << newdoc.toString(); file.close(); Q_EMIT savedPlaylists(); qDebug() << Q_FUNC_INFO << "END "; } knowthelist-2.3.1/src/djsession.h000077500000000000000000000037531342115213400170400ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #ifndef DJSESSION_H #define DJSESSION_H #include "dj.h" #include "collectiondb.h" #include class Track; class DjSession : public QObject { Q_OBJECT public: DjSession(); ~DjSession(); Dj mainDJ; int minCount(); void setMinCount(int value); void setIsEnabledAutoDJCount(bool value); bool isEnabledAutoDJCount(); Track* getRandomTrack(); Dj* currentDj(); Q_SIGNALS: void foundTracks_Playlist1(QList); void foundTracks_Playlist2(QList); void changed_Playlist1(QPair); void changed_Playlist2(QPair); void savedPlaylists(); public slots: void updatePlaylists(); void playDefaultList(); void onTracksChanged_Playlist1(QList tracks); void onTracksChanged_Playlist2(QList tracks); void onTrackFinished(Track *track); void forceTracks(QList tracks); void on_dj_filterChanged(Filter* f); void onResetStats(); void onTrackPropertyChanged(Track* track); void savePlaylists( const QString &filename ); void storePlaylists(const QString &name , bool replace=false); void setCurrentDj(Dj*); private: struct DjSessionPrivate *p; void searchTracks(); void summariseCount(); }; #endif // DJSESSION_H knowthelist-2.3.1/src/djsettings.cpp000077500000000000000000000024701342115213400175430ustar00rootroot00000000000000/* Copyright (C) 2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "djsettings.h" #include "ui_djsettings.h" DjSettings::DjSettings(QWidget *parent) : QWidget(parent), ui(new Ui::DjSettings) { ui->setupUi(this); } DjSettings::~DjSettings() { delete ui; } void DjSettings::setID(int value) { ui->label->setText(QString::number(value)); } void DjSettings::setFilterCount(int value) { ui->spinBox->setValue(value); } void DjSettings::setName(QString value) { ui->lineEdit->setText(value); } int DjSettings::filterCount() { return ui->spinBox->value(); } QString DjSettings::name() { return ui->lineEdit->text(); } knowthelist-2.3.1/src/djsettings.h000077500000000000000000000022221342115213400172030ustar00rootroot00000000000000#ifndef DJSETTINGS_H #define DJSETTINGS_H /* Copyright (C) 2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include namespace Ui { class DjSettings; } class DjSettings : public QWidget { Q_OBJECT public: explicit DjSettings(QWidget *parent = 0); ~DjSettings(); void setID(int value); void setFilterCount(int value); void setName(QString value); int filterCount(); QString name(); private: Ui::DjSettings *ui; }; #endif // DJSETTINGS_H knowthelist-2.3.1/src/djsettings.ui000077500000000000000000000027641342115213400174040ustar00rootroot00000000000000 DjSettings 0 0 294 45 0 0 0 45 Form 9 32 9 20 0 0 1 10 knowthelist-2.3.1/src/djwidget.cpp000077500000000000000000000130411342115213400171620ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "djwidget.h" #include "ui_djwidget.h" #include #include #include #include struct DjWidgetPrivate { Dj* dj; bool isActive; QTimer* timerSlide; int targetWidth; }; DjWidget::DjWidget(QWidget* parent) : QWidget(parent) , ui(new Ui::DjWidget) , p(new DjWidgetPrivate) { setFocusPolicy(Qt::ClickFocus); ui->setupUi(this); ui->lblDesciption->setText(QString::null); ui->widgetClose->setMinimumWidth(0); ui->widgetClose->setMaximumWidth(0); QFont font = ui->lblDesciption->font(); #if defined(Q_OS_DARWIN) int newSize = font.pointSize() - 4; #else int newSize = font.pointSize() - 1; #endif font.setPointSize(newSize); ui->lblDesciption->setFont(font); p->timerSlide = new QTimer(this); p->timerSlide->setInterval(10); connect(p->timerSlide, SIGNAL(timeout()), SLOT(timerSlide_timeOut())); } DjWidget::~DjWidget() { delete ui; delete p; } void DjWidget::changeEvent(QEvent* event) { QWidget::changeEvent(event); switch (event->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } void DjWidget::mousePressEvent(QMouseEvent* event) { if (ui->widgetClose->geometry().contains(event->pos())) { Q_EMIT deleted(); } else { slideCloseWidget(false); Q_EMIT activated(); } } void DjWidget::setDj(Dj* dj) { qDebug() << Q_FUNC_INFO; p->dj = dj; connect(p->dj, SIGNAL(countChanged()), this, SLOT(updateView())); deactivateDJ(); } Dj* DjWidget::dj() { return p->dj; } // auto connect slot void DjWidget::on_lblName_linkActivated(const QString& link) { Q_UNUSED(link); Q_EMIT activated(); } void DjWidget::clicked() { Q_EMIT activated(); } void DjWidget::activateDJ() { p->isActive = true; updateView(); } void DjWidget::deactivateDJ() { p->isActive = false; updateView(); } void DjWidget::updateView() { // Filter description and count update // update Labels setToolTip(tr("This Dj plays: ") + p->dj->description()); QString strCase = (p->dj->filters().count() > 1) ? tr("cases") : tr("case"); ui->lblDesciption->setText(QString::number(p->dj->filters().count()) + " " + strCase + " " + QString::number(p->dj->countTracks()) + " " + tr("tracks") + " " + Track::prettyTime(p->dj->lengthTracks(), true) + " " + tr("hours")); // active/passive look differentiation QString activeStyle; if (p->isActive) { activeStyle = "color:#ff6464;'>"; this->setStyleSheet("#frameDj{ background: qlineargradient(" "x1:0, y1:0, x2:0, y2:1," "stop: 0.01 #202020," "stop:0.11 #505050," "stop:1 #505050" ");}"); } else { activeStyle = "color:#eeeeee;'>"; this->setStyleSheet("#frameDj{ background: qlineargradient(" "x1:0, y1:0, x2:0, y2:1," "stop: 0.01 #202020," "stop:0.11 #404040," "stop:1 #404040" ");}"); } ui->lblName->setText("" "

" " false Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop false 0 0 45 0 QFrame::NoFrame QFrame::Raised 32 0 0 6 0 0 35 0 16777215 16777215 Start a session of this DJ :/play.png:/play.png Remove this DJ x 0 0 0 0 32000 60 TextLabel false true 0 0 18 16777215 <html><head/><body><p>Confirm the remove</p></body></html> background-color: rgb(255, 65, 87); Delete knowthelist-2.3.1/src/fancytabwidget.cpp000077500000000000000000000521501342115213400203600ustar00rootroot00000000000000/************************************************************************** ** ** This file is part of Qt Creator ** ** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** Commercial Usage ** ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at http://qt.nokia.com/contact. ** **************************************************************************/ #include "fancytabwidget.h" #include "stylehelper.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace Core; using namespace Internal; const int FancyTabBar::m_rounding = 22; const int FancyTabBar::m_textPadding = 4; void FancyTabProxyStyle::drawControl( ControlElement element, const QStyleOption* option, QPainter* p, const QWidget* widget) const { const QStyleOptionTabV3* v_opt = qstyleoption_cast(option); if (element != CE_TabBarTab || !v_opt) { QProxyStyle::drawControl(element, option, p, widget); return; } const QRect rect = v_opt->rect; const bool selected = v_opt->state & State_Selected; const bool vertical_tabs = v_opt->shape == QTabBar::RoundedWest; const QString text = v_opt->text; if (selected) { //background p->save(); QLinearGradient grad(rect.topLeft(), rect.topRight()); grad.setColorAt(0, QColor(255, 255, 255, 140)); grad.setColorAt(1, QColor(255, 255, 255, 210)); p->fillRect(rect.adjusted(0, 0, 0, -1), grad); p->restore(); //shadows p->setPen(QColor(0, 0, 0, 110)); p->drawLine(rect.topLeft() + QPoint(1,-1), rect.topRight() - QPoint(0,1)); p->drawLine(rect.bottomLeft(), rect.bottomRight()); p->setPen(QColor(0, 0, 0, 40)); p->drawLine(rect.topLeft(), rect.bottomLeft()); //highlights p->setPen(QColor(255, 255, 255, 50)); p->drawLine(rect.topLeft() + QPoint(0, -2), rect.topRight() - QPoint(0,2)); p->drawLine(rect.bottomLeft() + QPoint(0, 1), rect.bottomRight() + QPoint(0,1)); p->setPen(QColor(255, 255, 255, 40)); p->drawLine(rect.topLeft() + QPoint(0, 0), rect.topRight()); p->drawLine(rect.topRight() + QPoint(0, 1), rect.bottomRight() - QPoint(0, 1)); p->drawLine(rect.bottomLeft() + QPoint(0,-1), rect.bottomRight()-QPoint(0,1)); } QTransform m; if (vertical_tabs) { m = QTransform::fromTranslate(rect.left(), rect.bottom()); m.rotate(-90); } else { m = QTransform::fromTranslate(rect.left(), rect.top()); } const QRect draw_rect(QPoint(0, 0), m.mapRect(rect).size()); p->save(); p->setTransform(m); QRect icon_rect(QPoint(8, 0), v_opt->iconSize); QRect text_rect(icon_rect.topRight() + QPoint(4, 0), draw_rect.size()); text_rect.setRight(draw_rect.width()); icon_rect.translate(0, (draw_rect.height() - icon_rect.height()) / 2); QFont boldFont(p->font()); boldFont.setPointSizeF(Utils::StyleHelper::sidebarFontSize()); boldFont.setBold(true); p->setFont(boldFont); p->setPen(selected ? QColor(255, 255, 255, 160) : QColor(0, 0, 0, 110)); int textFlags = Qt::AlignHCenter | Qt::AlignVCenter; p->drawText(text_rect, textFlags, text); p->setPen(selected ? QColor(60, 60, 60) : Utils::StyleHelper::panelTextColor()); #ifndef Q_WS_MAC if (widget) { const QString fader_key = "tab_" + text + "_fader"; const QString animation_key = "tab_" + text + "_animation"; const QString tab_hover = widget->property("tab_hover").toString(); int fader = widget->property(fader_key.toUtf8().constData()).toInt(); QPropertyAnimation* animation = widget->property(animation_key.toUtf8().constData()).value(); if (!animation) { QWidget* mut_widget = const_cast(widget); fader = 0; mut_widget->setProperty(fader_key.toUtf8().constData(), fader); animation = new QPropertyAnimation(mut_widget, fader_key.toUtf8(), mut_widget); connect(animation, SIGNAL(valueChanged(QVariant)), mut_widget, SLOT(update())); mut_widget->setProperty(animation_key.toUtf8().constData(), QVariant::fromValue(animation)); } if (text == tab_hover) { if (animation->state() != QAbstractAnimation::Running && fader != 40) { animation->stop(); animation->setDuration(80); animation->setEndValue(40); animation->start(); } } else { if (animation->state() != QAbstractAnimation::Running && fader != 0) { animation->stop(); animation->setDuration(160); animation->setEndValue(0); animation->start(); } } if (!selected) { p->save(); QLinearGradient grad(draw_rect.topLeft(), vertical_tabs ? draw_rect.bottomLeft() : draw_rect.topRight()); grad.setColorAt(0, Qt::transparent); grad.setColorAt(0.5, QColor(255, 255, 255, fader)); grad.setColorAt(1, Qt::transparent); p->fillRect(draw_rect, grad); p->setPen(QPen(grad, 1.0)); p->drawLine(draw_rect.topLeft(), vertical_tabs ? draw_rect.bottomLeft() : draw_rect.topRight()); p->drawLine(draw_rect.bottomRight(), vertical_tabs ? draw_rect.topRight() : draw_rect.bottomLeft()); p->restore(); } } #endif Utils::StyleHelper::drawIconWithShadow(v_opt->icon, icon_rect, p, QIcon::Normal); p->drawText(text_rect.translated(0, -1), textFlags, text); p->restore(); } void FancyTabProxyStyle::polish(QWidget* widget) { if (QString(widget->metaObject()->className()) == "QTabBar") { widget->setMouseTracking(true); widget->installEventFilter(this); } QProxyStyle::polish(widget); } void FancyTabProxyStyle::polish(QApplication* app) { QProxyStyle::polish(app); } void FancyTabProxyStyle::polish(QPalette& palette) { QProxyStyle::polish(palette); } bool FancyTabProxyStyle::eventFilter(QObject* o, QEvent* e) { QTabBar* bar = qobject_cast(o); if (bar && (e->type() == QEvent::MouseMove || e->type() == QEvent::Leave)) { QMouseEvent* event = static_cast(e); const QString old_hovered_tab = bar->property("tab_hover").toString(); const QString hovered_tab = e->type() == QEvent::Leave ? QString() : bar->tabText(bar->tabAt(event->pos())); bar->setProperty("tab_hover", hovered_tab); if (old_hovered_tab != hovered_tab) bar->update(); } return false; } FancyTab::FancyTab(QWidget* tabbar) : QWidget(tabbar), tabbar(tabbar), m_fader(0) { animator.setPropertyName("fader"); animator.setTargetObject(this); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); } void FancyTab::fadeIn() { animator.stop(); animator.setDuration(80); animator.setEndValue(40); animator.start(); } void FancyTab::fadeOut() { animator.stop(); animator.setDuration(160); animator.setEndValue(0); animator.start(); } void FancyTab::setFader(float value) { m_fader = value; tabbar->update(); } FancyTabBar::FancyTabBar(QWidget *parent) : QWidget(parent) { setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); setStyle(new QCommonStyle); setMinimumWidth(qMax(2 * m_rounding, 40)); setAttribute(Qt::WA_Hover, true); setFocusPolicy(Qt::NoFocus); setMouseTracking(true); // Needed for hover events m_triggerTimer.setSingleShot(true); QVBoxLayout* layout = new QVBoxLayout; layout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding)); layout->setSpacing(0); layout->setContentsMargins(0, 0, 0, 0); setLayout(layout); // We use a zerotimer to keep the sidebar responsive connect(&m_triggerTimer, SIGNAL(timeout()), this, SLOT(emitCurrentIndex())); } FancyTabBar::~FancyTabBar() { delete style(); } QSize FancyTab::sizeHint() const { QFont boldFont(font()); boldFont.setPointSizeF(Utils::StyleHelper::sidebarFontSize()); boldFont.setBold(true); QFontMetrics fm(boldFont); int spacing = 8; int width = 60 + spacing + 2; int iconHeight = 32; QSize ret(width, iconHeight + spacing + fm.height()); return ret; } QSize FancyTabBar::tabSizeHint(bool minimum) const { QFont boldFont(font()); boldFont.setPointSizeF(Utils::StyleHelper::sidebarFontSize()); boldFont.setBold(true); QFontMetrics fm(boldFont); int spacing = 8; int width = 60 + spacing + 2; int iconHeight = minimum ? 0 : 32; return QSize(width, iconHeight + spacing + fm.height()); } void FancyTabBar::paintEvent(QPaintEvent *event) { Q_UNUSED(event) QPainter p(this); for (int i = 0; i < count(); ++i) if (i != currentIndex()) paintTab(&p, i); // paint active tab last, since it overlaps the neighbors if (currentIndex() != -1) paintTab(&p, currentIndex()); } void FancyTab::enterEvent(QEvent*) { fadeIn(); } void FancyTab::leaveEvent(QEvent*) { fadeOut(); } QSize FancyTabBar::sizeHint() const { QSize sh = tabSizeHint(); return QSize(sh.width(), sh.height() * m_tabs.count()); } QSize FancyTabBar::minimumSizeHint() const { QSize sh = tabSizeHint(true); return QSize(sh.width(), sh.height() * m_tabs.count()); } QRect FancyTabBar::tabRect(int index) const { return m_tabs[index]->geometry(); } QString FancyTabBar::tabToolTip(int index) const { return m_tabs[index]->toolTip(); } void FancyTabBar::setTabToolTip(int index, const QString& toolTip) { m_tabs[index]->setToolTip(toolTip); } // This keeps the sidebar responsive since // we get a repaint before loading the // mode itself void FancyTabBar::emitCurrentIndex() { emit currentChanged(m_currentIndex); } void FancyTabBar::mousePressEvent(QMouseEvent *e) { e->accept(); for (int index = 0; index < m_tabs.count(); ++index) { if (tabRect(index).contains(e->pos())) { m_currentIndex = index; update(); m_triggerTimer.start(0); break; } } } void FancyTabBar::addTab(const QIcon& icon, const QString& label) { FancyTab *tab = new FancyTab(this); tab->icon = icon; tab->text = label; m_tabs.append(tab); qobject_cast(layout())->insertWidget(layout()->count()-1, tab); } void FancyTabBar::addSpacer(int size) { qobject_cast(layout())->insertSpacerItem(layout()->count()-1, new QSpacerItem(0, size, QSizePolicy::Fixed, QSizePolicy::Maximum)); } void FancyTabBar::paintTab(QPainter *painter, int tabIndex) const { if (!validIndex(tabIndex)) { qWarning("invalid index"); return; } painter->save(); QRect rect = tabRect(tabIndex); bool selected = (tabIndex == m_currentIndex); if (selected) { //background painter->save(); QLinearGradient grad(rect.topLeft(), rect.topRight()); grad.setColorAt(0, QColor(255, 255, 255, 140)); grad.setColorAt(1, QColor(255, 255, 255, 210)); painter->fillRect(rect.adjusted(0, 0, 0, -1), grad); painter->restore(); //shadows painter->setPen(QColor(0, 0, 0, 110)); painter->drawLine(rect.topLeft() + QPoint(1,-1), rect.topRight() - QPoint(0,1)); painter->drawLine(rect.bottomLeft(), rect.bottomRight()); painter->setPen(QColor(0, 0, 0, 40)); painter->drawLine(rect.topLeft(), rect.bottomLeft()); //highlights painter->setPen(QColor(255, 255, 255, 50)); painter->drawLine(rect.topLeft() + QPoint(0, -2), rect.topRight() - QPoint(0,2)); painter->drawLine(rect.bottomLeft() + QPoint(0, 1), rect.bottomRight() + QPoint(0,1)); painter->setPen(QColor(255, 255, 255, 40)); painter->drawLine(rect.topLeft() + QPoint(0, 0), rect.topRight()); painter->drawLine(rect.topRight() + QPoint(0, 1), rect.bottomRight() - QPoint(0, 1)); painter->drawLine(rect.bottomLeft() + QPoint(0,-1), rect.bottomRight()-QPoint(0,1)); } QString tabText(painter->fontMetrics().elidedText(this->tabText(tabIndex), Qt::ElideRight, width())); QRect tabTextRect(tabRect(tabIndex)); QRect tabIconRect(tabTextRect); tabIconRect.adjust(+4, +4, -4, -4); tabTextRect.translate(0, -2); QFont boldFont(painter->font()); boldFont.setPointSizeF(Utils::StyleHelper::sidebarFontSize()); boldFont.setBold(true); painter->setFont(boldFont); painter->setPen(selected ? QColor(255, 255, 255, 160) : QColor(0, 0, 0, 110)); int textFlags = Qt::AlignCenter | Qt::AlignBottom; painter->drawText(tabTextRect, textFlags, tabText); painter->setPen(selected ? QColor(60, 60, 60) : Utils::StyleHelper::panelTextColor()); #ifndef Q_WS_MAC if (!selected) { painter->save(); int fader = int(m_tabs[tabIndex]->fader()); QLinearGradient grad(rect.topLeft(), rect.topRight()); grad.setColorAt(0, Qt::transparent); grad.setColorAt(0.5, QColor(255, 255, 255, fader)); grad.setColorAt(1, Qt::transparent); painter->fillRect(rect, grad); painter->setPen(QPen(grad, 1.0)); painter->drawLine(rect.topLeft(), rect.topRight()); painter->drawLine(rect.bottomLeft(), rect.bottomRight()); painter->restore(); } #endif const int textHeight = painter->fontMetrics().height(); tabIconRect.adjust(0, 4, 0, -textHeight); Utils::StyleHelper::drawIconWithShadow(tabIcon(tabIndex), tabIconRect, painter, QIcon::Normal); painter->translate(0, -1); painter->drawText(tabTextRect, textFlags, tabText); painter->restore(); } void FancyTabBar::setCurrentIndex(int index) { m_currentIndex = index; update(); emit currentChanged(m_currentIndex); } ////// // FancyColorButton ////// class FancyColorButton : public QWidget { public: FancyColorButton(QWidget *parent) : m_parent(parent) { setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); } void mousePressEvent(QMouseEvent *ev) { if (ev->modifiers() & Qt::ShiftModifier) Utils::StyleHelper::setBaseColor(QColorDialog::getColor(Utils::StyleHelper::requestedBaseColor(), m_parent)); } private: QWidget *m_parent; }; ////// // FancyTabWidget ////// FancyTabWidget::FancyTabWidget(QWidget* parent) : QWidget(parent), mode_(Mode_None), tab_bar_(NULL), stack_(new QStackedLayout), side_widget_(new QWidget), side_layout_(new QVBoxLayout), top_layout_(new QVBoxLayout), use_background_(false), menu_(NULL), proxy_style_(new FancyTabProxyStyle) { side_layout_->setSpacing(0); side_layout_->setMargin(0); side_layout_->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding)); side_widget_->setLayout(side_layout_); side_widget_->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); top_layout_->setMargin(0); top_layout_->setSpacing(0); top_layout_->addLayout(stack_); QHBoxLayout* main_layout = new QHBoxLayout; main_layout->setMargin(0); main_layout->setSpacing(1); main_layout->addWidget(side_widget_); main_layout->addLayout(top_layout_); setLayout(main_layout); } void FancyTabWidget::AddTab(QWidget* tab, const QIcon& icon, const QString& label) { stack_->addWidget(tab); items_ << Item(icon, label); } void FancyTabWidget::AddSpacer(int size) { items_ << Item(size); } void FancyTabWidget::SetBackgroundPixmap(const QPixmap& pixmap) { background_pixmap_ = pixmap; update(); } void FancyTabWidget::paintEvent(QPaintEvent*) { if (!use_background_) return; QPainter painter(this); QRect rect = side_widget_->rect().adjusted(0, 0, 1, 0); rect = style()->visualRect(layoutDirection(), geometry(), rect); Utils::StyleHelper::verticalGradient(&painter, rect, rect); if (!background_pixmap_.isNull()) { QRect pixmap_rect(background_pixmap_.rect()); pixmap_rect.moveTo(rect.topLeft()); while (pixmap_rect.top() < rect.bottom()) { QRect source_rect(pixmap_rect.intersected(rect)); source_rect.moveTo(0, 0); painter.drawPixmap(pixmap_rect.topLeft(), background_pixmap_, source_rect); pixmap_rect.moveTop(pixmap_rect.bottom() - 10); } } painter.setPen(Utils::StyleHelper::borderColor()); painter.drawLine(rect.topRight(), rect.bottomRight()); QColor light = Utils::StyleHelper::sidebarHighlight(); painter.setPen(light); painter.drawLine(rect.bottomLeft(), rect.bottomRight()); } int FancyTabWidget::current_index() const { return stack_->currentIndex(); } void FancyTabWidget::SetCurrentIndex(int index) { if (FancyTabBar* bar = qobject_cast(tab_bar_)) { bar->setCurrentIndex(index); } else if (QTabBar* bar = qobject_cast(tab_bar_)) { bar->setCurrentIndex(index); } else { stack_->setCurrentIndex(index); } } void FancyTabWidget::ShowWidget(int index) { stack_->setCurrentIndex(index); emit CurrentChanged(index); } void FancyTabWidget::AddBottomWidget(QWidget* widget) { top_layout_->addWidget(widget); } void FancyTabWidget::SetMode(Mode mode) { // Remove previous tab bar delete tab_bar_; tab_bar_ = NULL; use_background_ = false; // Create new tab bar switch (mode) { case Mode_None: default: qDebug() << "Unknown fancy tab mode" << mode; // fallthrough case Mode_LargeSidebar: { FancyTabBar* bar = new FancyTabBar(this); side_layout_->insertWidget(0, bar); tab_bar_ = bar; foreach (const Item& item, items_) { if (item.type_ == Item::Type_Spacer) bar->addSpacer(item.spacer_size_); else bar->addTab(item.tab_icon_, item.tab_label_); } bar->setCurrentIndex(stack_->currentIndex()); connect(bar, SIGNAL(currentChanged(int)), SLOT(ShowWidget(int))); use_background_ = true; break; } case Mode_Tabs: MakeTabBar(QTabBar::RoundedNorth, true, false, false); break; case Mode_IconOnlyTabs: MakeTabBar(QTabBar::RoundedNorth, false, true, false); break; case Mode_SmallSidebar: MakeTabBar(QTabBar::RoundedWest, true, true, true); use_background_ = true; break; case Mode_PlainSidebar: MakeTabBar(QTabBar::RoundedWest, true, true, false); break; } tab_bar_->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); mode_ = mode; emit ModeChanged(mode); update(); } void FancyTabWidget::contextMenuEvent(QContextMenuEvent* e) { if (!menu_) { menu_ = new QMenu(this); QSignalMapper* mapper = new QSignalMapper(this); QActionGroup* group = new QActionGroup(this); AddMenuItem(mapper, group, tr("Large sidebar"), Mode_LargeSidebar); AddMenuItem(mapper, group, tr("Small sidebar"), Mode_SmallSidebar); AddMenuItem(mapper, group, tr("Plain sidebar"), Mode_PlainSidebar); AddMenuItem(mapper, group, tr("Tabs on top"), Mode_Tabs); AddMenuItem(mapper, group, tr("Icons on top"), Mode_IconOnlyTabs); menu_->addActions(group->actions()); connect(mapper, SIGNAL(mapped(int)), SLOT(SetMode(int))); } menu_->popup(e->globalPos()); } void FancyTabWidget::AddMenuItem(QSignalMapper* mapper, QActionGroup* group, const QString& text, Mode mode) { QAction* action = group->addAction(text); action->setCheckable(true); mapper->setMapping(action, mode); connect(action, SIGNAL(triggered()), mapper, SLOT(map())); if (mode == mode_) action->setChecked(true); } void FancyTabWidget::MakeTabBar(QTabBar::Shape shape, bool text, bool icons, bool fancy) { QTabBar* bar = new QTabBar(this); bar->setShape(shape); bar->setDocumentMode(true); bar->setUsesScrollButtons(true); if (shape == QTabBar::RoundedWest) { bar->setIconSize(QSize(22, 22)); } if (fancy) { bar->setStyle(proxy_style_.data()); } if (shape == QTabBar::RoundedNorth) top_layout_->insertWidget(0, bar); else side_layout_->insertWidget(0, bar); foreach (const Item& item, items_) { if (item.type_ != Item::Type_Tab) continue; QString label = item.tab_label_; if (shape == QTabBar::RoundedWest) { label = QFontMetrics(font()).elidedText(label, Qt::ElideMiddle, 100); } int tab_id = -1; if (icons && text) tab_id = bar->addTab(item.tab_icon_, label); else if (icons) tab_id = bar->addTab(item.tab_icon_, QString()); else if (text) tab_id = bar->addTab(label); bar->setTabToolTip(tab_id, item.tab_label_); } bar->setCurrentIndex(stack_->currentIndex()); connect(bar, SIGNAL(currentChanged(int)), SLOT(ShowWidget(int))); tab_bar_ = bar; } knowthelist-2.3.1/src/fancytabwidget.h000077500000000000000000000133251342115213400200260ustar00rootroot00000000000000/************************************************************************** ** ** This file is part of Qt Creator ** ** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** Commercial Usage ** ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at http://qt.nokia.com/contact. ** **************************************************************************/ #ifndef FANCYTABWIDGET_H #define FANCYTABWIDGET_H #include #include #include #include #include #include //#include class QActionGroup; class QMenu; class QPainter; class QSignalMapper; class QStackedLayout; class QStatusBar; class QVBoxLayout; namespace Core { namespace Internal { class FancyTabProxyStyle : public QProxyStyle { Q_OBJECT public: void drawControl(ControlElement element, const QStyleOption* option, QPainter* painter, const QWidget* widget) const; void polish(QWidget* widget); void polish(QApplication* app); void polish(QPalette& palette); protected: bool eventFilter(QObject* o, QEvent* e); }; class FancyTab : public QWidget{ Q_OBJECT Q_PROPERTY(float fader READ fader WRITE setFader) public: FancyTab(QWidget *tabbar); float fader() { return m_fader; } void setFader(float value); QSize sizeHint() const; void fadeIn(); void fadeOut(); QIcon icon; QString text; protected: void enterEvent(QEvent *); void leaveEvent(QEvent *); private: QPropertyAnimation animator; QWidget *tabbar; float m_fader; }; class FancyTabBar : public QWidget { Q_OBJECT public: FancyTabBar(QWidget *parent = 0); ~FancyTabBar(); void paintEvent(QPaintEvent *event); void paintTab(QPainter *painter, int tabIndex) const; void mousePressEvent(QMouseEvent *); bool validIndex(int index) const { return index >= 0 && index < m_tabs.count(); } QSize sizeHint() const; QSize minimumSizeHint() const; void addTab(const QIcon &icon, const QString &label); void addSpacer(int size = 40); void removeTab(int index) { FancyTab *tab = m_tabs.takeAt(index); delete tab; } void setCurrentIndex(int index); int currentIndex() const { return m_currentIndex; } void setTabToolTip(int index, const QString& toolTip); QString tabToolTip(int index) const; QIcon tabIcon(int index) const {return m_tabs.at(index)->icon; } QString tabText(int index) const { return m_tabs.at(index)->text; } int count() const {return m_tabs.count(); } QRect tabRect(int index) const; signals: void currentChanged(int); public slots: void emitCurrentIndex(); private: static const int m_rounding; static const int m_textPadding; int m_currentIndex; QList m_tabs; QTimer m_triggerTimer; QSize tabSizeHint(bool minimum = false) const; }; class FancyTabWidget : public QWidget { Q_OBJECT public: FancyTabWidget(QWidget* parent = 0); // Values are persisted - only add to the end enum Mode { Mode_None = 0, Mode_LargeSidebar = 1, Mode_SmallSidebar = 2, Mode_Tabs = 3, Mode_IconOnlyTabs = 4, Mode_PlainSidebar = 5, }; struct Item { Item(const QIcon& icon, const QString& label) : type_(Type_Tab), tab_label_(label), tab_icon_(icon), spacer_size_(0) {} Item(int size) : type_(Type_Spacer), spacer_size_(size) {} enum Type { Type_Tab, Type_Spacer, }; Type type_; QString tab_label_; QIcon tab_icon_; int spacer_size_; }; void AddTab(QWidget *tab, const QIcon &icon, const QString &label); void AddSpacer(int size = 40); void SetBackgroundPixmap(const QPixmap& pixmap); void AddBottomWidget(QWidget* widget); int current_index() const; Mode mode() const { return mode_; } public slots: void SetCurrentIndex(int index); void SetMode(Mode mode); void SetMode(int mode) { SetMode(Mode(mode)); } signals: void CurrentChanged(int index); void ModeChanged(FancyTabWidget::Mode mode); protected: void paintEvent(QPaintEvent *event); void contextMenuEvent(QContextMenuEvent* e); private slots: void ShowWidget(int index); private: void MakeTabBar(QTabBar::Shape shape, bool text, bool icons, bool fancy); void AddMenuItem(QSignalMapper* mapper, QActionGroup* group, const QString& text, Mode mode); Mode mode_; QList items_; QWidget* tab_bar_; QStackedLayout* stack_; QPixmap background_pixmap_; QWidget* side_widget_; QVBoxLayout* side_layout_; QVBoxLayout* top_layout_; bool use_background_; QMenu* menu_; //boost::scoped_ptr proxy_style_; QScopedPointer proxy_style_; }; } // namespace Internal } // namespace Core Q_DECLARE_METATYPE(QPropertyAnimation*); using Core::Internal::FancyTab; using Core::Internal::FancyTabBar; using Core::Internal::FancyTabWidget; #endif // FANCYTABWIDGET_H knowthelist-2.3.1/src/filebrowser.cpp000077500000000000000000000043701342115213400177110ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "filebrowser.h" #include #include #include #include #include #if QT_VERSION >= 0x050000 #include #else #include #endif struct FileBrowserPrivate { QVBoxLayout *layout; QTreeView *filetree; QFileSystemModel *model; }; FileBrowser::FileBrowser(QWidget *parent) : QWidget(parent) , p( new FileBrowserPrivate ) { p->layout = new QVBoxLayout; // ToDo: maybe we add some buttons and links here p->model = new QFileSystemModel; p->model->setRootPath(QDir::currentPath()); p->filetree = new QTreeView(this); p->filetree->setModel(p->model); p->filetree->setDragEnabled(true); p->filetree->setSelectionMode(QAbstractItemView::ContiguousSelection); p->filetree->header()->resizeSection(0,400); #if QT_VERSION >= 0x050000 p->filetree->setRootIndex(p->model->index(QStandardPaths::standardLocations(QStandardPaths::MusicLocation).at(0))); #else p->filetree->setRootIndex(p->model->index(QDesktopServices::storageLocation(QDesktopServices::MusicLocation))); #endif p->filetree->setAttribute(Qt::WA_MacShowFocusRect, false); p->layout->addWidget(p->filetree); setLayout(p->layout); setAttribute(Qt::WA_MacShowFocusRect, false); } void FileBrowser::setRootPath(QString path){ p->filetree->setRootIndex(p->model->setRootPath(path)); } knowthelist-2.3.1/src/filebrowser.h000077500000000000000000000021131342115213400173470ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #ifndef FILEBROWSER_H #define FILEBROWSER_H #include class FileBrowser : public QWidget { Q_OBJECT public: explicit FileBrowser(QWidget *parent = 0); void setRootPath(QString); signals: public slots: protected: private: struct FileBrowserPrivate* p; }; #endif // FILEBROWSER_H knowthelist-2.3.1/src/filter.cpp000077500000000000000000000055461342115213400166610ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "filter.h" #include struct Filter::Private { int maxUsage; int usage; bool isActive; QString path; QString genre; QString artist; int count; long length; }; /* * *ToDo: - replace path with a string from Tag (if we have a good tagger tool inside) **/ Filter::Filter() :p(new Private) { p->usage = 0; p->maxUsage = 0; p->count = 0; p->length = 0; p->path = "", p->genre = ""; p->artist = ""; p->isActive = false; } Filter::Filter(QString genre, int maxUsage) :p(new Private) { p->maxUsage = maxUsage; p->genre = genre; } Filter::~Filter() { delete p; } int Filter::maxUsage() { return p->maxUsage; } void Filter::setMaxUsage(int value) { p->maxUsage = value; emit maxUsageChanged(); } bool Filter::active() { return p->isActive; } void Filter::setActive(bool b) { p->isActive = b; Q_EMIT statusChanged(b); if ( b == true ) { setUsage(0); Q_EMIT activated(); } } void Filter::update() { //qDebug() << Q_FUNC_INFO ; Q_EMIT filterChanged(); } QString Filter::path() { return p->path; } void Filter::setPath(QString path) { p->path = path; } QString Filter::genre() { return p->genre; } void Filter::setGenre(QString genre) { p->genre = genre; } QString Filter::artist() { return p->artist; } void Filter::setArtist(QString artist) { p->artist = artist; } int Filter::usage() { return p->usage; } void Filter::setUsage(int value) { p->usage = value; emit usageChanged(); } int Filter::count() { return p->count; } void Filter::setCount(int value) { p->count = value; emit countChanged(); } long Filter::length() { return p->length; } void Filter::setLength(long value) { p->length = value; } QString Filter::description() { QString ret; if ( !p->artist.isEmpty()) ret+=p->artist +" "; if ( !p->genre.isEmpty()) ret+=p->genre +" "; if ( !p->path.isEmpty()) { QStringList token = p->path.split("/"); ret+=token.last() +" "; } return ret; } knowthelist-2.3.1/src/filter.h000077500000000000000000000031211342115213400163110ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #ifndef FILTER_H #define FILTER_H #include class Filter: public QObject { Q_OBJECT public: explicit Filter(); explicit Filter(QString genre, int grade); ~Filter(); int maxUsage(); void setMaxUsage(int); int usage(); void setUsage(int); QString genre(); QString path(); QString artist(); QString description(); int count(); long length(); void setPath(QString); void setGenre(QString); void setArtist(QString); void setCount(int); void setLength(long); bool active(); void setActive(bool); void update(); Q_SIGNALS: void statusChanged(bool status); void countChanged(); void usageChanged(); void maxUsageChanged(); void activated(); void filterChanged(); public slots: private: struct Private; Private * p; }; #endif // FILTER_H knowthelist-2.3.1/src/knowthelist.cpp000077500000000000000000000771011342115213400177430ustar00rootroot00000000000000/* Copyright (C) 2005-2019 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "knowthelist.h" #include "dj.h" #include "djfilterwidget.h" #include "djwidget.h" #include "playerwidget.h" #include "playlistbrowser.h" #include "qled.h" #include "ui_knowthelist.h" #include #include #if QT_VERSION >= 0x050000 #include #else #include #endif #include Knowthelist::Knowthelist(QWidget* parent) : QMainWindow(parent) , ui(new Ui::Knowthelist) { ui->setupUi(this); //create the UI createUI(); } Knowthelist::~Knowthelist() { qDebug() << Q_FUNC_INFO << "START closing application"; player1->stop(); delete player1; player1 = nullptr; delete playList1; player2->stop(); delete player2; player2 = nullptr; delete playList2; delete vuMeter1; delete vuMeter2; delete monitorMeter; delete monitorPlayer; monitorPlayer = nullptr; delete djSession; djSession = nullptr; delete trackList; trackList = nullptr; delete collectionBrowser; delete djBrowser; delete filetree; delete playlistBrowser; delete trackList2; delete splitterPlaylist; delete ui; qDebug() << Q_FUNC_INFO << "END closing application"; } void Knowthelist::createUI() { //hide place holders ui->phVU1->setVisible(false); ui->phVU2->setVisible(false); ui->slider1->setMinimum(0.0); ui->slider2->setMinimum(0.0); ui->slider1->setMaximum(100.0); ui->slider2->setMaximum(100.0); connect(ui->slider1, SIGNAL(valueChanged(int)), this, SLOT(slider1_valueChanged(int))); connect(ui->slider2, SIGNAL(valueChanged(int)), this, SLOT(slider2_valueChanged(int))); connect(ui->sliFader, SIGNAL(valueChanged(int)), this, SLOT(sliFader_valueChanged(int))); //Add player player1 = ui->player_L; player2 = ui->player_R; monitorPlayer = new MonitorPlayer(this); timerAutoFader = new QTimer(this); connect(timerAutoFader, SIGNAL(timeout()), SLOT(timerAutoFader_timerOut())); vuMeter2 = new VUMeter(ui->frameMixer); vuMeter2->setLinesPerSegment(2); vuMeter2->setSpacesBetweenSegments(1); vuMeter2->setSegmentsPerPeak(1); vuMeter2->setMargin(2); vuMeter2->LevelColorOff.setRgb(20, 20, 20); vuMeter1 = new VUMeter(ui->frameMixer); vuMeter1->setLinesPerSegment(2); vuMeter1->setSpacesBetweenSegments(1); vuMeter1->setSegmentsPerPeak(1); vuMeter1->setMargin(2); vuMeter1->LevelColorOff.setRgb(20, 20, 20); monitorMeter = new VUMeter(ui->fraMonitorTop); monitorMeter->setSpacesBetweenSegments(1); monitorMeter->setLinesPerSegment(2); monitorMeter->setSegmentsPerPeak(2); monitorMeter->setMargin(2); monitorMeter->LevelColorOff.setRgb(20, 20, 20); vuMeter1->setGeometry(ui->phVU1->geometry()); vuMeter2->setGeometry(ui->phVU2->geometry()); monitorMeter->setGeometry(ui->phVUMeter->geometry()); ui->potGain_1->setRange(10, 180); ui->potGain_1->setValue(100); ui->potGain_2->setRange(10, 180); ui->potGain_2->setValue(100); timerMonitor = new QTimer(this); timerMonitor->setInterval(50); connect(timerMonitor, SIGNAL(timeout()), SLOT(timerMonitor_timeOut())); timerGain1 = new QTimer(this); timerGain2 = new QTimer(this); timerGain1->setInterval(100); timerGain2->setInterval(100); connect(timerGain1, SIGNAL(timeout()), SLOT(timerGain1_timeOut())); connect(timerGain2, SIGNAL(timeout()), SLOT(timerGain2_timeOut())); qRegisterMetaType>("QList"); //Add DJ djSession = new DjSession(); playList1 = ui->playlist_L; playList1->setIsCurrentList(true); playList2 = ui->playlist_R; playList2->setIsCurrentList(false); connect(playList1, SIGNAL(currentTrackChanged(Track*)), player1, SLOT(loadTrack(Track*))); connect(playList2, SIGNAL(currentTrackChanged(Track*)), player2, SLOT(loadTrack(Track*))); connect(player1, SIGNAL(forwardPressed()), playList1, SLOT(skipForward())); connect(player2, SIGNAL(forwardPressed()), playList2, SLOT(skipForward())); connect(player1, SIGNAL(rewindPressed()), playList1, SLOT(skipRewind())); connect(player2, SIGNAL(rewindPressed()), playList2, SLOT(skipRewind())); connect(player1, SIGNAL(aboutFinished()), SLOT(player_aboutTrackFinished())); connect(player2, SIGNAL(aboutFinished()), SLOT(player_aboutTrackFinished())); connect(player1, SIGNAL(gainChanged(double)), SLOT(player1_gainChanged(double))); connect(player2, SIGNAL(gainChanged(double)), SLOT(player2_gainChanged(double))); connect(player1, SIGNAL(levelChanged(double, double)), SLOT(player1_levelChanged(double, double))); connect(player2, SIGNAL(levelChanged(double, double)), SLOT(player2_levelChanged(double, double))); connect(player1, SIGNAL(statusChanged(bool)), playList1, SLOT(setPlaying(bool))); connect(player2, SIGNAL(statusChanged(bool)), playList2, SLOT(setPlaying(bool))); connect(player1, SIGNAL(trackFinished()), SLOT(player1_trackFinished())); connect(player2, SIGNAL(trackFinished()), SLOT(player2_trackFinished())); connect(player1, SIGNAL(trackPlayed(Track*)), djSession, SLOT(onTrackFinished(Track*))); connect(player2, SIGNAL(trackPlayed(Track*)), djSession, SLOT(onTrackFinished(Track*))); connect(player1, SIGNAL(trackDropped(Track*)), playList1, SLOT(addCurrentTrack(Track*))); connect(player2, SIGNAL(trackDropped(Track*)), playList2, SLOT(addCurrentTrack(Track*))); //alternateMax connect(playList1, SIGNAL(countChanged(int)), playList2, SLOT(setAlternateMax(int))); connect(playList2, SIGNAL(countChanged(int)), playList1, SLOT(setAlternateMax(int))); connect(playList1, SIGNAL(countChanged(QList)), djSession, SLOT(onTracksChanged_Playlist1(QList))); connect(playList2, SIGNAL(countChanged(QList)), djSession, SLOT(onTracksChanged_Playlist2(QList))); connect(djSession, SIGNAL(foundTracks_Playlist1(QList)), playList1, SLOT(appendTracks(QList))); connect(djSession, SIGNAL(foundTracks_Playlist2(QList)), playList2, SLOT(appendTracks(QList))); connect(djSession, SIGNAL(changed_Playlist1(QPair)), player1, SLOT(setInfo(QPair))); connect(djSession, SIGNAL(changed_Playlist2(QPair)), player2, SLOT(setInfo(QPair))); //Add Tracklist for Collection trackList = new Playlist(); trackList->setObjectName("tracklist"); trackList->setAcceptDrops(false); trackList->setPlaylistMode(Playlist::Tracklist); collectionBrowser = new CollectionWidget(this); splitter = new QSplitter(); splitter->addWidget(this->collectionBrowser); splitter->addWidget(trackList); QPixmap pixmap1(":database.png"); ui->sideTab->AddTab(splitter, QIcon(pixmap1), tr("Collection")); connect(collectionBrowser, SIGNAL(selectionChanged(QList)), trackList, SLOT(changeTracks(QList))); connect(collectionBrowser, SIGNAL(setupDirs()), this, SLOT(showCollectionSetup())); connect(collectionBrowser, SIGNAL(wantLoad(QList, QString)), this, SLOT(onWantLoad(QList, QString))); connect(trackList, SIGNAL(wantSearch(QString)), collectionBrowser, SLOT(setFilterText(QString))); connect(playList1, SIGNAL(wantSearch(QString)), collectionBrowser, SLOT(setFilterText(QString))); connect(playList2, SIGNAL(wantSearch(QString)), collectionBrowser, SLOT(setFilterText(QString))); connect(trackList, SIGNAL(trackDoubleClicked(Track*)), SLOT(Track_doubleClicked(Track*))); connect(trackList, SIGNAL(wantLoad(Track*, QString)), SLOT(trackList_wantLoad(Track*, QString))); connect(trackList, SIGNAL(trackSelected(Track*)), SLOT(Track_selectionChanged(Track*))); connect(trackList, SIGNAL(trackPropertyChanged(Track*)), djSession, SLOT(onTrackPropertyChanged(Track*))); connect(playList1, SIGNAL(trackDoubleClicked(Track*)), SLOT(Track_doubleClicked(Track*))); connect(playList2, SIGNAL(trackDoubleClicked(Track*)), SLOT(Track_doubleClicked(Track*))); connect(playList1, SIGNAL(trackSelected(Track*)), SLOT(Track_selectionChanged(Track*))); connect(playList2, SIGNAL(trackSelected(Track*)), SLOT(Track_selectionChanged(Track*))); //AutoFade ui->ledFade->setLook(QLed::Flat); ui->ledFadeRight->setLook(QLed::Flat); ui->ledFadeLeft->setLook(QLed::Flat); ui->ledDJ->setLook(QLed::Flat); ui->ledAGC->setLook(QLed::Flat); ui->ledFadeRight->setShape(QLed::Rectangular); ui->ledFadeLeft->setShape(QLed::Rectangular); ui->ledFade->setShape(QLed::Rectangular); ui->ledDJ->setShape(QLed::Rectangular); ui->ledAGC->setShape(QLed::Rectangular); ui->ledFadeRight->setColor(QColor(35, 119, 246)); ui->ledFadeLeft->setColor(QColor(35, 119, 246)); ui->ledFade->setColor(QColor(35, 119, 246)); ui->ledDJ->setColor(QColor(35, 119, 246)); ui->ledAGC->setColor(QColor(35, 119, 246)); ui->ledFade->off(); ui->ledFadeRight->off(); ui->ledFadeLeft->off(); ui->ledAGC->off(); ui->ledDJ->off(); //MonitorPlayer initMonitorPlayer(); //change slider style for linux #if defined(Q_OS_LINUX) QString sliderStyle = QString( "QSlider::sub-page:vertical { background: qlineargradient(x1: 0, y1: 0, x2:1, y2: 0," " stop: 0.4 #666, stop: 0 #111111 ); border: 1px solid #444; border-radius: 2px;}" "QSlider::add-page:vertical {background: qlineargradient(x1: 0, y1: 0, x2:1, y2: 0," " stop: 0 #111,stop: 0.4 #666); border: 1px solid #333; border-radius: 2px;}" "QSlider::sub-page:horizontal,QSlider::add-page:horizontal {" " background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1," " stop: 0 #111, stop: 0.6 #666 ); border: 1px solid #222; border-radius: 2px;}"); ui->frameMixer->setStyleSheet(sliderStyle); ui->MonitorPlayer->setStyleSheet(sliderStyle); #endif //Add the AutoDJ Browser djBrowser = new DjBrowser(); QPixmap pixmap2(":DJ.png"); ui->sideTab->AddTab(djBrowser, QIcon(pixmap2), tr("AutoDJ")); ui->sideTab->setContextMenuPolicy(Qt::NoContextMenu); connect(djBrowser, SIGNAL(selectionChanged(Dj*)), djSession, SLOT(setCurrentDj(Dj*))); connect(djBrowser, SIGNAL(selectionChanged(Dj*)), this, SLOT(currentDjChanged(Dj*))); connect(djBrowser, SIGNAL(selectionStarted()), this, SLOT(startAutoDj())); //Add the FileBrowser filetree = new FileBrowser(this); QPixmap pixmap3(":folder.png"); ui->sideTab->AddTab(filetree, QIcon(pixmap3), tr("Folder")); //Add PlaylistBrowser playlistBrowser = new PlaylistBrowser(); splitterPlaylist = new QSplitter(); splitterPlaylist->addWidget(playlistBrowser); trackList2 = new Playlist(); trackList2->setObjectName("tracklist2"); trackList2->setAcceptDrops(false); trackList2->setPlaylistMode(Playlist::Tracklist); connect(playlistBrowser, SIGNAL(selectionChanged(QList)), trackList2, SLOT(changeTracks(QList))); connect(playlistBrowser, SIGNAL(selectionStarted(QList)), djSession, SLOT(forceTracks(QList))); //connect(playlistBrowser,SIGNAL(savePlaylists(QString)),djSession, SLOT(savePlaylists(QString))); connect(playlistBrowser, SIGNAL(storePlaylists(QString)), djSession, SLOT(storePlaylists(QString))); connect(djSession, SIGNAL(savedPlaylists()), playlistBrowser, SLOT(updateLists())); connect(trackList2, SIGNAL(trackDoubleClicked(Track*)), SLOT(Track_doubleClicked(Track*))); connect(trackList2, SIGNAL(wantLoad(Track*, QString)), SLOT(trackList_wantLoad(Track*, QString))); connect(trackList2, SIGNAL(trackSelected(Track*)), SLOT(Track_selectionChanged(Track*))); connect(trackList2, SIGNAL(trackPropertyChanged(Track*)), djSession, SLOT(onTrackPropertyChanged(Track*))); splitterPlaylist->addWidget(trackList2); QPixmap pixmap4(":list.png"); ui->sideTab->AddTab(splitterPlaylist, QIcon(pixmap4), tr("Lists")); //Add SettingsDialog preferences = new SettingsDialog(this); connect(preferences, SIGNAL(scanNowPressed()), collectionBrowser, SLOT(scan())); connect(preferences, SIGNAL(resetStatsPressed()), djSession, SLOT(onResetStats())); loadStartSettings(); ui->sideTab->SetCurrentIndex(0); ui->sideTab->SetMode(FancyTabWidget::Mode_LargeSidebar); //Collection ready? if (!collectionBrowser->hasItems()) { this->show(); showCollectionSetup(); } } void Knowthelist::loadStartSettings() { QSettings settings; ui->slider1->setValue(settings.value("Volume1", 80).toInt()); ui->slider2->setValue(settings.value("Volume2", 80).toInt()); ui->sliFader->setValue(70); changeVolumes(); splitter->restoreState(settings.value("Splitter").toByteArray()); splitterPlaylist->restoreState(settings.value("SplitterPlaylist").toByteArray()); restoreGeometry(settings.value("mainWindowGeometry").toByteArray()); restoreState(settings.value("mainWindowState").toByteArray()); // Workaround to force correct geometry hide(); show(); if (settings.value("loadPlaylists", "true") == "true") { djSession->playDefaultList(); } //AutoFade, AGC ... ui->toggleAutoFade->setChecked(settings.value("checkAutoFade", true).toBool()); ui->toggleAGC->setChecked(settings.value("checkAGC", true).toBool()); //EQ values ui->potHigh_1->setValue(settings.value("EQ_gains/High1", 180).toInt()); ui->potMid_1->setValue(settings.value("EQ_gains/Mid1", 180).toInt()); ui->potLow_1->setValue(settings.value("EQ_gains/Low1", 180).toInt()); ui->potHigh_2->setValue(settings.value("EQ_gains/High2", 180).toInt()); ui->potMid_2->setValue(settings.value("EQ_gains/Mid2", 180).toInt()); ui->potLow_2->setValue(settings.value("EQ_gains/Low2", 180).toInt()); loadCurrentSettings(); //now monitorplayer is initialized, restore monitor volume with effect ui->sliMonitorVolume->setValue(settings.value("VolumeMonitor").toDouble()); } void Knowthelist::loadCurrentSettings() { QSettings settings; if (monitorPlayer) { on_cmdMonitorStop_clicked(); monitorPlayer->setOutputDevice(settings.value("MonitorOutputDevice").toString()); QString outDev = monitorPlayer->outputDeviceName(); if (monitorPlayer->outputDeviceID() == monitorPlayer->defaultDeviceID() || outDev.isEmpty()) { ui->lblSoundcard->show(); monitorPlayer->disable(); } else { ui->lblSoundcard->hide(); monitorPlayer->enable(); } } //Auto DJ Settings djSession->setMinCount(settings.value("minTracks", "6").toInt()); djSession->setIsEnabledAutoDJCount(settings.value("isEnabledAutoDJCount", false).toBool()); djBrowser->updateList(); playList1->setAutoClearOn(settings.value("checkAutoRemove", true).toBool()); playList2->setAutoClearOn(settings.value("checkAutoRemove", true).toBool()); playlistBrowser->updateLists(); //Skip Silents Settings player1->setSkipSilentEnd(settings.value("checkSkipSilentEnd", true).toBool()); player1->setSkipSilentBegin(settings.value("checkAutoCue", true).toBool()); player2->setSkipSilentEnd(settings.value("checkSkipSilentEnd", true).toBool()); player2->setSkipSilentBegin(settings.value("checkAutoCue", true).toBool()); //Fader Settings mAutofadeLength = settings.value("faderTimeSlider", "12").toInt(); mAboutFinishTime = settings.value("faderEndSlider", "12").toInt(); setFaderModeToPlayer(); isFading = false; //CollectionFolders Settings collectionBrowser->loadSettings(); //File Browser Settings filetree->setRootPath(settings.value("editBrowerRoot", "").toString()); } void Knowthelist::closeEvent(QCloseEvent* event) { qDebug() << Q_FUNC_INFO << "for Knowthelist"; QSettings settings; settings.setValue("Volume1", QString("%1").arg(ui->slider1->value())); settings.setValue("Volume2", QString("%1").arg(ui->slider2->value())); settings.setValue("VolumeMonitor", QString("%1").arg(ui->sliMonitorVolume->value())); savePlaylists(); //Save splitter settings.setValue("Splitter", splitter->saveState()); settings.setValue("SplitterPlaylist", splitterPlaylist->saveState()); //Save AutoDJ settings.setValue("isEnabledAutoDJCount", djSession->isEnabledAutoDJCount()); Dj* dj = djSession->currentDj(); if (dj != nullptr) { QList f = dj->filters(); settings.setValue("currentDjActiveFilter", QString("%1").arg(djSession->currentDj()->activeFilterIdx())); for (int i = 0; i < f.count(); i++) { settings.setValue(QString("editAutoDJPath%1").arg(i), f.at(i)->path()); settings.setValue(QString("editAutoDJGenre%1").arg(i), f.at(i)->genre()); settings.setValue(QString("editAutoDJArtist%1").arg(i), f.at(i)->artist()); settings.setValue(QString("editAutoDJValue%1").arg(i), QString("%1").arg(f.at(i)->maxUsage())); } } settings.setValue("checkAutoFade", ui->toggleAutoFade->isChecked()); settings.setValue("checkAGC", ui->toggleAGC->isChecked()); settings.setValue("EQ_gains/High1", ui->potHigh_1->value()); settings.setValue("EQ_gains/Mid1", ui->potMid_1->value()); settings.setValue("EQ_gains/Low1", ui->potLow_1->value()); settings.setValue("EQ_gains/High2", ui->potHigh_2->value()); settings.setValue("EQ_gains/Mid2", ui->potMid_2->value()); settings.setValue("EQ_gains/Low2", ui->potLow_2->value()); settings.setValue("mainWindowGeometry", saveGeometry()); settings.setValue("mainWindowState", saveState()); qDebug() << Q_FUNC_INFO << "settings saved"; event->accept(); } void Knowthelist::showCollectionSetup() { preferences->setCurrentTab(SettingsDialog::TabCollection); if (preferences->exec() != QDialog::Rejected) loadCurrentSettings(); } void Knowthelist::player1_levelChanged(double left, double right) { vuMeter1->setValueLeft(left * 3.0); vuMeter1->setValueRight(right * 3.0); } void Knowthelist::player2_levelChanged(double left, double right) { vuMeter2->setValueLeft(left * 3.0); vuMeter2->setValueRight(right * 3.0); } void Knowthelist::player_aboutTrackFinished() { if (ui->toggleAutoFade->isChecked()) fadeNow(); } void Knowthelist::player1_trackFinished() { if (isFading) player1->stop(); playList1->skipForward(); } void Knowthelist::player2_trackFinished() { if (isFading) player2->stop(); playList2->skipForward(); } void Knowthelist::player1_gainChanged(double gainValue) { gain1Target = (int)(gainValue * 100.0); if (ui->toggleAGC->isChecked()) timerGain1->start(); } void Knowthelist::player2_gainChanged(double gainValue) { gain2Target = (int)(gainValue * 100.0); if (ui->toggleAGC->isChecked()) timerGain2->start(); } // Move gain1 dial smoothly void Knowthelist::timerGain1_timeOut() { int gain1 = ui->potGain_1->value(); if (gain1Target > gain1) ui->potGain_1->setValue(gain1 + 1); else if (gain1Target < gain1) ui->potGain_1->setValue(gain1 - 1); else timerGain1->stop(); } // Move gain2 dial smoothly void Knowthelist::timerGain2_timeOut() { int gain2 = ui->potGain_2->value(); if (gain2Target > gain2) ui->potGain_2->setValue(gain2 + 1); else if (gain2Target < gain2) ui->potGain_2->setValue(gain2 - 1); else timerGain2->stop(); } void Knowthelist::fadeNow() { //Fade now! if (!isFading && (playList1->countTrack() > 0 || playList2->countTrack() > 0)) { if (ui->sliFader->value() > 100) { m_xfadeDir = -1; if (!player1->isStarted()) player1->play(); //Fader has 200 steps * 5 = 1000ms timerAutoFader->start(mAutofadeLength * 5); } else { m_xfadeDir = 1; if (!player2->isStarted()) player2->play(); timerAutoFader->start(mAutofadeLength * 5); } isFading = true; //ToDo: search for a right time to save savePlaylists(); } } void Knowthelist::changeVolumes() { float v1 = ui->slider1->value() / 100.0; float v2 = ui->slider2->value() / 100.0; float f1 = 2 - ui->sliFader->value() / 100.0; float f2 = ui->sliFader->value() / 100.0; f1 = (f1 < 1) ? f1 : 1; f2 = (f2 < 1) ? f2 : 1; player1->setVolume(v1 * f1); player2->setVolume(v2 * f2); } void Knowthelist::slider1_valueChanged(int) { changeVolumes(); } void Knowthelist::slider2_valueChanged(int) { changeVolumes(); } void Knowthelist::sliFader_valueChanged(int) { changeVolumes(); if (ui->sliFader->value() == ui->sliFader->minimum()) { playList1->setIsCurrentList(true); playList2->setIsCurrentList(false); } if (ui->sliFader->value() == ui->sliFader->maximum()) { playList2->setIsCurrentList(true); playList1->setIsCurrentList(false); } } void Knowthelist::timerAutoFader_timerOut() { //Auto-Fader moves ui->sliFader->setValue(ui->sliFader->value() + m_xfadeDir); //Blinking if (ui->sliFader->value() % 3 == 0) { if (m_xfadeDir < 0) ui->ledFadeLeft->toggle(); else ui->ledFadeRight->toggle(); } if (ui->sliFader->value() <= ui->sliFader->minimum()) { //Fade from 2 to 1 is done timerAutoFader->stop(); ui->ledFadeLeft->off(); isFading = false; //ToDo:handle AutoDJ from Playlist if (player2->isStarted()) { player2->stop(); playList2->skipForward(); } if (ui->toggleAutoDJ->isChecked()) djSession->updatePlaylists(); } if (ui->sliFader->value() >= ui->sliFader->maximum()) { //Fade from 1 to 2 is done timerAutoFader->stop(); isFading = false; ui->ledFadeRight->off(); //ToDo: handle AutoDJ from Playlist if (player1->isStarted()) { player1->stop(); playList1->skipForward(); } if (ui->toggleAutoDJ->isChecked()) djSession->updatePlaylists(); } changeVolumes(); } void Knowthelist::savePlaylists() { djSession->storePlaylists("defaultKnowthelist", true); // playList1->saveXML( playList1->defaultPlaylistPath() ); // playList2->saveXML( playList2->defaultPlaylistPath() ); } void Knowthelist::Track_selectionChanged(Track* track) { if (track) { m_MonitorTrack = track; ui->lblMonitorArtist->setText(track->prettyArtist(20)); ui->lblMonitorTrack->setText(track->prettyTitle(60)); wantSeek = false; if (monitorPlayer) { on_cmdMonitorStop_clicked(); monitorPlayer->open(track->url()); QPixmap pix = QPixmap::fromImage(track->coverImage()); if (!pix.isNull()) ui->pixMonitorCover->setPixmap(pix); timerMonitor_timeOut(); } } else { ui->lblMonitorTrack->setText(""); ui->pixMonitorCover->setPixmap(QPixmap()); } } void Knowthelist::timerMonitor_loadFinished() { timerMonitor_timeOut(); if (wantSeek) { on_sliMonitor_sliderMoved(100); } } void Knowthelist::Track_doubleClicked(Track* track) { Track_selectionChanged(track); if (monitorPlayer) { wantSeek = true; on_cmdMonitorPlay_clicked(); } } void Knowthelist::trackList_wantLoad(Track* track, QString target) { //ToDo: enable for multiple tracks like drag/drop qDebug() << Q_FUNC_INFO << "target=" << target; if (target == "Right") playList2->appendSong(new Track(track->tagList())); else if (target == "Left") playList1->appendSong(new Track(track->tagList())); } //ToDo: find a better name void Knowthelist::onWantLoad(QList trackList, QString target) { if (target == "Right") playList2->appendTracks(trackList); else if (target == "Left") playList1->appendTracks(trackList); } void Knowthelist::setFaderModeToPlayer() { if (autoFadeOn) { player1->setTrackFinishEmitTime(mAboutFinishTime); player2->setTrackFinishEmitTime(mAboutFinishTime); playList1->setPlaylistMode(Playlist::Playlist_Multi); playList2->setPlaylistMode(Playlist::Playlist_Multi); } else { player1->setTrackFinishEmitTime(0); player2->setTrackFinishEmitTime(0); playList1->setPlaylistMode(Playlist::Playlist_Single); playList2->setPlaylistMode(Playlist::Playlist_Single); } } void Knowthelist::editSettings() { // save DJ settings before change anything djBrowser->saveSettings(); // update hardware infos monitorPlayer->readDevices(); QSettings settings; settings.setValue("MonitorOutputDevices", monitorPlayer->outputDevices()); if (preferences->exec() != QDialog::Rejected) loadCurrentSettings(); } void Knowthelist::on_cmdFade_clicked() { fadeNow(); } bool Knowthelist::initMonitorPlayer() { //ToDo: spend a separate widget for Monitor player qDebug() << Q_FUNC_INFO << "BEGIN "; monitorPlayer = new MonitorPlayer(this); monitorPlayer->prepare(); monitorPlayer->setObjectName("monitorPlayer"); ui->cmdMonitorStop->setIcon(QIcon(":stop.png")); ui->cmdMonitorPlay->setIcon(QIcon(":play.png")); connect(monitorPlayer, SIGNAL(loadFinished()), this, SLOT(timerMonitor_loadFinished())); qDebug() << Q_FUNC_INFO << "END "; return true; } void Knowthelist::currentDjChanged(Dj* dj) { // show Dj Name on panel ui->lblDjName->setText(dj->name); } void Knowthelist::startAutoDj() { if (ui->toggleAutoDJ->isChecked()) ui->toggleAutoDJ->setChecked(false); ui->toggleAutoDJ->setChecked(true); } void Knowthelist::on_cmdMonitorStop_clicked() { monitorPlayer->stop(); timerMonitor->stop(); ui->cmdMonitorPlay->setIcon(QIcon(":play.png")); monitorMeter->setValueRight(0); monitorMeter->setValueLeft(0); } void Knowthelist::on_cmdMonitorPlay_clicked() { if (monitorPlayer->isDisabled()) { return; } if (monitorPlayer->isPlaying()) { ui->cmdMonitorPlay->setIcon(QIcon(":play.png")); monitorPlayer->pause(); timerMonitor->stop(); monitorMeter->setValueRight(0); monitorMeter->setValueLeft(0); } else { ui->cmdMonitorPlay->setIcon(QIcon(":pause.png")); monitorPlayer->play(); timerMonitor->start(); } } void Knowthelist::monitorPlayer_trackTimeChanged(qint64 time, qint64 totalTime) { //ToDo: delete this function: Why? if (ui->sliMonitor->maximum() != totalTime) { if (totalTime == 0) ui->sliMonitor->setMaximum(100); else ui->sliMonitor->setMaximum(totalTime); } ui->sliMonitor->setValue(time); QTime displayTime(0, (time / 60000) % 60, (time / 1000) % 60); QTime displayTotalTime(0, (totalTime / 60000) % 60, (totalTime / 1000) % 60); ui->lblMonitorPosition->setText(displayTime.toString("mm:ss")); ui->lblMonitorLength->setText(displayTotalTime.toString("mm:ss")); } void Knowthelist::timerMonitor_timeOut() { QTime length = monitorPlayer->length(); QTime curpos = monitorPlayer->position(); QTime remain(0, 0); long remainMs; //Some tracks deliver no length in state pause if (length == QTime(0, 0)) length = QTime(0, 0, 0).addSecs(m_MonitorTrack->length()); remainMs = curpos.msecsTo(length); remain = QTime(0, 0).addMSecs(remainMs); ui->lblMonitorPosition->setText(curpos.toString("mm:ss.zzz").left(7)); ui->lblMonitorLength->setText(length.toString("mm:ss")); //update position slider if (length != QTime(0, 0)) ui->sliMonitor->setValue(curpos.msecsTo(QTime(0, 0, 0)) * 1000 / length.msecsTo(QTime(0, 0, 0))); else ui->sliMonitor->setValue(0); monitorMeter->setValueLeft(monitorPlayer->levelLeft() * 1.0); monitorMeter->setValueRight(monitorPlayer->levelRight() * 1.0); } void Knowthelist::on_sliMonitor_sliderMoved(int value) { uint length = -monitorPlayer->length().msecsTo(QTime(0, 0, 0)); //Some tracks deliver no length in state pause if (length == 0) length = m_MonitorTrack->length() * 1000; if (length != 0 && value > 0) { QTime pos = QTime(0, 0, 0); pos = pos.addMSecs(length * (value / 1000.0)); qDebug() << "pos:" << pos; monitorPlayer->setPosition(pos); } } void Knowthelist::on_cmdOptions_clicked() { preferences->setCurrentTab(SettingsDialog::TabFader); editSettings(); } void Knowthelist::on_potGain_1_valueChanged(int value) { player1->setGain(value / 100.0); } void Knowthelist::on_potGain_2_valueChanged(int value) { player2->setGain(value / 100.0); } void Knowthelist::on_toggleAGC_toggled(bool checked) { Q_UNUSED(checked); ui->ledAGC->toggle(); } void Knowthelist::on_toggleAutoDJ_toggled(bool checked) { if (checked) { // AutoDJ on // For an empty list if (playList1->isEmpty()) playList1->addCurrentTrack(djSession->getRandomTrack()); if (playList2->isEmpty()) playList2->addCurrentTrack(djSession->getRandomTrack()); // Fill both playlists djSession->updatePlaylists(); // Start playing if (!player1->isStarted() && !player2->isStarted()) fadeNow(); // Activate Autofade ui->toggleAutoFade->setChecked(true); //ui->fr } else { m_AutoDJGenre = collectionBrowser->filterText(); } ui->ledDJ->toggle(); } void Knowthelist::on_toggleAutoFade_toggled(bool checked) { ui->ledFade->setState(checked ? QLed::On : QLed::Off); autoFadeOn = checked; setFaderModeToPlayer(); } void Knowthelist::on_potHigh_1_valueChanged(int value) { player1->setEqualizer(PlayerWidget::EQ_High, value); } void Knowthelist::on_potMid_1_valueChanged(int value) { player1->setEqualizer(PlayerWidget::EQ_Mid, value); } void Knowthelist::on_potLow_1_valueChanged(int value) { player1->setEqualizer(PlayerWidget::EQ_Low, value); } void Knowthelist::on_potHigh_2_valueChanged(int value) { player2->setEqualizer(PlayerWidget::EQ_High, value); } void Knowthelist::on_potMid_2_valueChanged(int value) { player2->setEqualizer(PlayerWidget::EQ_Mid, value); } void Knowthelist::on_potLow_2_valueChanged(int value) { player2->setEqualizer(PlayerWidget::EQ_Low, value); } void Knowthelist::on_lblSoundcard_linkActivated(const QString& link) { Q_UNUSED(link); preferences->setCurrentTab(SettingsDialog::TabMonitor); editSettings(); } void Knowthelist::on_sliMonitor_actionTriggered(int action) { //a workaround for page moving int posi; switch (action) { case 3: posi = ui->sliMonitor->value() + 100; break; case 4: posi = ui->sliMonitor->value() - 100; if (posi < 100) posi = 1; break; case 1: posi = ui->sliMonitor->value() + 10; break; case 2: posi = ui->sliMonitor->value() - 10; break; default: return; break; } this->on_sliMonitor_sliderMoved(posi); } void Knowthelist::on_sliMonitorVolume_valueChanged(int value) { monitorPlayer->setVolume(value / 100.0); } knowthelist-2.3.1/src/knowthelist.h000077500000000000000000000103731342115213400174060ustar00rootroot00000000000000/* Copyright (C) 2005-2017 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #ifndef KNOWTHELIST_H #define KNOWTHELIST_H #include "collectionwidget.h" #include "djbrowser.h" #include "djsession.h" #include "filebrowser.h" #include "monitorplayer.h" #include "playerwidget.h" #include "playlist.h" #include "playlistbrowser.h" #include "settingsdialog.h" #include "vumeter.h" #include #include namespace Ui { class Knowthelist; } class Knowthelist : public QMainWindow { Q_OBJECT public: explicit Knowthelist(QWidget* parent = 0); ~Knowthelist(); private Q_SLOTS: //Auto connect slots void on_potHigh_1_valueChanged(int value); void on_potMid_1_valueChanged(int value); void on_potLow_1_valueChanged(int value); void on_potHigh_2_valueChanged(int value); void on_potMid_2_valueChanged(int value); void on_potLow_2_valueChanged(int value); void on_toggleAutoFade_toggled(bool checked); void on_toggleAutoDJ_toggled(bool checked); void on_toggleAGC_toggled(bool checked); void on_potGain_2_valueChanged(int value); void on_potGain_1_valueChanged(int value); void on_sliMonitor_sliderMoved(int position); void on_cmdMonitorPlay_clicked(); void on_cmdMonitorStop_clicked(); void on_cmdFade_clicked(); void timerMonitor_timeOut(); void timerAutoFader_timerOut(); void player_aboutTrackFinished(); void player1_gainChanged(double newGain); void player2_gainChanged(double gainValue); void player1_trackFinished(); void player2_trackFinished(); void player1_levelChanged(double left, double right); void player2_levelChanged(double left, double right); void slider1_valueChanged(int); void slider2_valueChanged(int); void sliFader_valueChanged(int); void savePlaylists(); void monitorPlayer_trackTimeChanged(qint64, qint64); void timerMonitor_loadFinished(); void startAutoDj(); void currentDjChanged(Dj*); void timerGain1_timeOut(); void timerGain2_timeOut(); void Track_doubleClicked(Track*); void trackList_wantLoad(Track*, QString target); void Track_selectionChanged(Track*); bool initMonitorPlayer(); void editSettings(); void on_cmdOptions_clicked(); void showCollectionSetup(); void onWantLoad(QList, QString); void on_lblSoundcard_linkActivated(const QString& link); void on_sliMonitor_actionTriggered(int action); void on_sliMonitorVolume_valueChanged(int value); private: Ui::Knowthelist* ui; void createUI(); void fadeNow(); void setFaderModeToPlayer(); QTimer* timerAutoFader; int m_xfadeDir; int gain1Target; int gain2Target; bool isFading; VUMeter* vuMeter1; VUMeter* vuMeter2; VUMeter* monitorMeter; QTimer* timerMeter; QTimer* timerMonitor; QTimer* timerGain1; QTimer* timerGain2; Playlist* playList1; Playlist* playList2; Playlist* trackList; Playlist* trackList2; QSplitter* splitter; QSplitter* splitterPlaylist; CollectionWidget* collectionBrowser; MonitorPlayer* monitorPlayer; DjSession* djSession; DjBrowser* djBrowser; PlayerWidget* player1; PlayerWidget* player2; FileBrowser* filetree; PlaylistBrowser* playlistBrowser; SettingsDialog* preferences; bool autoFadeOn; QString m_AutoDJGenre; int mAutofadeLength; int mAboutFinishTime; int mMinTracks; bool wantSeek; Track* m_MonitorTrack; protected: virtual void closeEvent(QCloseEvent*); void changeVolumes(); void loadStartSettings(); void loadCurrentSettings(); }; #endif // KNOWTHELIST_H knowthelist-2.3.1/src/knowthelist.rc000077500000000000000000000001061342115213400175540ustar00rootroot00000000000000IDI_ICON1 ICON DISCARDABLE "../dist/headset.ico" knowthelist-2.3.1/src/knowthelist.ui000077500000000000000000010727121342115213400176020ustar00rootroot00000000000000 Knowthelist 0 0 1280 695 Knowthelist ../dist/knowthelist.png../dist/knowthelist.png QPushButton { color: white; border: 1.5px solid #333333; border-radius: 4px; padding: 1px; background: qlineargradient( x1:0, y1:0, x2:0, y2:1, stop: 0.1 #999999, stop:0.5 #505050, stop:1 black ); max-height: 16px; min-height: 10px; } QPushButton:pressed { background: qlineargradient( x1:0, y1:0, x2:0, y2:1, stop: 0.1 black, stop:0.5 #505050, stop:1 #999999 ); } QToolButton { color: white; border: 1.5px solid #333333; border-radius: 4px; padding: 1px; background: qlineargradient( x1:0, y1:0, x2:0, y2:1, stop: 0.1 #999999, stop:0.5 #505050, stop:1 black ); max-height: 20px; min-height: 20px; } QToolButton:pressed { background: qlineargradient( x1:0, y1:0, x2:0, y2:1, stop: 0.1 black, stop:0.5 #505050, stop:1 #999999 ); } CustomDial { color: #fff; background-color: #555; } QSplitter { color: black; } QSplitter::handle { background: qlineargradient( x1:0, y1:0, x2:0, y2:1, stop: 0 #555, stop: 0.49 #222, stop:0.5 #aaa, stop:0.51 #222, stop:1 #000 ); } QSlider::handle:horizontal { background: qlineargradient( x1:0, y1:0, x2:1, y2:0, stop: 0 #000, stop: 0.1 #222, stop: 0.38 #444, stop:0.5 #ccc, stop:0.6 #444, stop:0.9 #222, stop:1 #000 ); border: 1px solid #5c5c5c; width: 18px; margin: 1px 0; /* handle is placed by default on the contents rect of the groove. Expand outside the groove */ border-radius: 3px; } QSlider::handle:vertical { background: qlineargradient( x1:0, y1:0, x2:0, y2:1, stop: 0 #000, stop: 0.1 #222, stop: 0.38 #444, stop:0.5 #ccc, stop:0.6 #444, stop:0.9 #222, stop:1 #000 ); border: 1px solid #5c5c5c; width: 12px; height: 18px; max-height:15px; margin: 0 2px; /* handle is placed by default on the contents rect of the groove. Expand outside the groove */ border-radius: 3px; } QFrame#frameMixer, QFrame#phVUMeter { background-color: #444444; } QCheckBox { color: rgb(200, 200, 200); background-color: #444444; } QLabel, QTreeView { color: #e1e1e1; } QDialog { background-color: #444444; } QWidget#centralwidget{ background: qlineargradient( x1:0, y1:0, x2:0, y2:1, stop: 0.1 #999999, stop:0.5 #505050, stop:1 black ); } QLineEdit { margin: 2 2 2 3; border: 2px solid gray; border-radius: 6px; padding: 2px 2px; background: #dddddd; selection-background-color: darkgray; } SearchEdit { padding: 0px 18px; font-size:14px; } QTreeWidget, QTreeView{ selection-background-color: gray; selection-color: white; } QMenu { background-color: #333333; color: #B8C1C6; } QListWidget,QTreeView { background-color: #333333; } QListView { show-decoration-selected: 1; /* make the selection span the entire width of the view */ } QListView::item:alternate { background: #EEEEEE; } QListView::item:selected { border: 1px solid #6a6ea9; background: #EEEEEE; } QListView::item:selected:!active { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ABAFE5, stop: 1 #8588B2); } QListView::item:selected:active { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #6a6ea9, stop: 1 #888dd9); } QListView::item:hover { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #FAFBFE, stop: 1 #DCDEF1); } QScrollBar:horizontal { border: 2px solid grey; background: qlineargradient( x1:0, y1:0, x2:0, y2:1, stop:0.1 #505050, stop:1 gray ); height: 15px; margin: 0px 20px 0 20px; } QScrollBar::handle:horizontal { background: qlineargradient( x1:0, y1:0, x2:0, y2:1, stop:0.1 white, stop:1 gray ); min-width: 20px; } QScrollBar::add-line:horizontal { border: 2px solid grey; background: qlineargradient( x1:0, y1:0, x2:0, y2:1, stop:0.1 #505050, stop:1 black ); width: 20px; subcontrol-position: right; subcontrol-origin: margin; } QScrollBar::sub-line:horizontal { border: 2px solid grey; background: qlineargradient( x1:0, y1:0, x2:0, y2:1, stop:0.1 #505050, stop:1 black ); width: 20px; subcontrol-position: left; subcontrol-origin: margin; } QScrollBar:left-arrow:horizontal, QScrollBar::right-arrow:horizontal { border: 2px solid grey; width: 3px; height: 3px; background: white; } QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { background: none; } DjSettings { border: 1px solid #6a6ea9; background: #EEEEEE; } QScrollBar:vertical { border: 2px solid grey; background: qlineargradient( x1:0, y1:0, x2:1, y2:0, stop:0.1 #505050, stop:1 gray ); width: 15px; } QScrollBar::handle:vertical { background: qlineargradient( x1:0, y1:0, x2:1, y2:0, stop:0.1 white, stop:1 gray ); max-height: 16px; min-height: 16px; margin: 17px 0px 17px 0px; } QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical { border: 2px solid grey; background: white; } QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { background: none; } QListWidget::item:focus { background: transparent; } QListWidget::item:hover { background: transparent; } QHeaderView::section { background-color: qlineargradient( x1:0, y1:0, x2:0, y2:1, stop: 0.01 #202020, stop:0.11 #505050, stop:1 #505050 ); color: white; padding-left: 4px; padding-top: 2px; padding-bottom: 3px; border: 0px solid #6c6c6c; } QPushButton#pushClose { color: #333333; border-style: inset; border: .5px solid #333333; border-radius: 4px; background: #555555; max-height: 22px; min-height: 22px; min-width:10px; max-width:10px; } QPushButton#butPlayWidget { color: white; border-style: inset; border: 1.5px solid #333333; border-radius: 4px; padding: 1px; background: qlineargradient( x1:0, y1:0, x2:0, y2:0.3, stop:0.1 white, stop:1 #666666 ); max-height: 19px; min-height: 19px; } QPushButton#butPlayWidget:pressed { background: qlineargradient( x1:0, y1:0, x2:0, y2:0.3, stop:0.1 white, stop:1 #82df52 ); } RatingWidget { background-color: #333333; } QMessageBox,QInputDialog{ background-color: #bbbbbb; color: #1c1c1c; } QToolTip{ color: #ffffff; background-color: #444444; border: 1px solid #cccccc; border-radius: 12px; } QMainWindow { border: 1px solid white; border-radius: 3px; background: qradialgradient( cx: 0.5, cy: -1.8, fx: 0.5, fy: 0, radius: 2, stop: 0 #9aa9be, stop: 1 #293859); } 6 4 6 6 0 0 0 QLayout::SetMaximumSize QLayout::SetMaximumSize 0 0 0 111 0 1 0 0 0 0 55 1 194 329 0 1 21 0 QFrame::StyledPanel QFrame::Raised 71 135 21 108 QFrame::StyledPanel QFrame::Raised 105 135 21 108 QFrame::StyledPanel QFrame::Raised 35 279 6 26 7 7 46 109 246 200 72 314 51 18 0 16 255 255 255 153 153 153 80 80 80 0 0 0 255 255 255 221 221 221 93 93 93 124 124 124 255 255 255 255 255 255 255 255 255 153 153 153 80 80 80 0 0 0 153 153 153 80 80 80 0 0 0 0 0 0 0 0 128 255 255 255 0 0 0 0 0 0 255 255 255 153 153 153 80 80 80 0 0 0 255 255 255 215 215 215 93 93 93 124 124 124 255 255 255 255 255 255 255 255 255 153 153 153 80 80 80 0 0 0 153 153 153 80 80 80 0 0 0 0 0 0 0 0 128 255 255 255 0 0 0 0 0 0 255 255 255 153 153 153 80 80 80 0 0 0 255 255 255 215 215 215 93 93 93 124 124 124 255 255 255 255 255 255 255 255 255 153 153 153 80 80 80 0 0 0 153 153 153 80 80 80 0 0 0 0 0 0 0 0 128 255 255 255 0 0 0 0 0 0 7 Fader true false false false 49 307 12 7 7 7 35 119 246 200 91 307 12 7 7 7 35 119 246 200 32 314 40 18 0 16 255 255 255 153 153 153 80 80 80 0 0 0 255 255 255 221 221 221 93 93 93 124 124 124 255 255 255 255 255 255 255 255 255 153 153 153 80 80 80 0 0 0 153 153 153 80 80 80 0 0 0 0 0 0 0 0 128 255 255 255 0 0 0 0 0 0 255 255 255 153 153 153 80 80 80 0 0 0 255 255 255 215 215 215 93 93 93 124 124 124 255 255 255 255 255 255 255 255 255 153 153 153 80 80 80 0 0 0 153 153 153 80 80 80 0 0 0 0 0 0 0 0 128 255 255 255 0 0 0 0 0 0 255 255 255 153 153 153 80 80 80 0 0 0 255 255 255 215 215 215 93 93 93 124 124 124 255 255 255 255 255 255 255 255 255 153 153 153 80 80 80 0 0 0 153 153 153 80 80 80 0 0 0 0 0 0 0 0 128 255 255 255 0 0 0 0 0 0 7 AutoD&J Alt+J true false 156 279 6 26 7 7 35 119 246 200 123 314 41 18 41 16 255 255 255 153 153 153 80 80 80 0 0 0 255 255 255 221 221 221 93 93 93 124 124 124 255 255 255 255 255 255 255 255 255 153 153 153 80 80 80 0 0 0 153 153 153 80 80 80 0 0 0 0 0 0 0 0 128 255 255 255 0 0 0 0 0 0 255 255 255 153 153 153 80 80 80 0 0 0 255 255 255 215 215 215 93 93 93 124 124 124 255 255 255 255 255 255 255 255 255 153 153 153 80 80 80 0 0 0 153 153 153 80 80 80 0 0 0 0 0 0 0 0 128 255 255 255 0 0 0 0 0 0 255 255 255 153 153 153 80 80 80 0 0 0 255 255 255 215 215 215 93 93 93 124 124 124 255 255 255 255 255 255 255 255 255 153 153 153 80 80 80 0 0 0 153 153 153 80 80 80 0 0 0 0 0 0 0 0 128 255 255 255 0 0 0 0 0 0 7 Set 29 132 31 110 232 232 232 154 169 190 41 56 89 255 255 255 226 226 226 99 99 99 132 132 132 255 255 255 255 255 255 255 255 255 154 169 190 41 56 89 154 169 190 41 56 89 0 0 0 0 0 128 255 255 255 0 0 0 0 0 0 232 232 232 154 169 190 41 56 89 255 255 255 227 227 227 99 99 99 132 132 132 255 255 255 255 255 255 255 255 255 154 169 190 41 56 89 154 169 190 41 56 89 0 0 0 0 0 128 255 255 255 83 83 120 0 64 0 232 232 232 154 169 190 41 56 89 255 255 255 227 227 227 99 99 99 132 132 132 128 128 128 255 255 255 128 128 128 154 169 190 41 56 89 154 169 190 41 56 89 0 0 0 0 0 128 255 255 255 83 83 120 0 64 0 100 57 Qt::Vertical QSlider::TicksBothSides 34 247 125 30 232 232 232 154 169 190 41 56 89 255 255 255 220 220 220 93 93 93 124 124 124 0 0 0 255 255 255 0 0 0 154 169 190 41 56 89 154 169 190 41 56 89 0 0 0 0 0 128 255 255 255 0 0 0 0 0 0 232 232 232 154 169 190 41 56 89 255 255 255 213 213 213 93 93 93 124 124 124 0 0 0 255 255 255 0 0 0 154 169 190 41 56 89 154 169 190 41 56 89 0 0 0 0 0 128 255 255 255 83 83 120 0 64 0 232 232 232 154 169 190 41 56 89 255 255 255 213 213 213 93 93 93 124 124 124 128 128 128 255 255 255 128 128 128 154 169 190 41 56 89 154 169 190 41 56 89 0 0 0 0 0 128 255 255 255 83 83 120 0 64 0 200 21 Qt::Horizontal QSlider::TicksBothSides 136 132 31 110 232 232 232 154 169 190 41 56 89 255 255 255 222 222 222 94 94 94 126 126 126 0 0 0 255 255 255 0 0 0 154 169 190 41 56 89 154 169 190 41 56 89 0 0 0 0 0 128 255 255 255 0 0 0 0 0 0 232 232 232 154 169 190 41 56 89 255 255 255 217 217 217 94 94 94 126 126 126 0 0 0 255 255 255 0 0 0 154 169 190 41 56 89 154 169 190 41 56 89 0 0 0 0 0 128 255 255 255 83 83 120 0 64 0 232 232 232 154 169 190 41 56 89 255 255 255 217 217 217 94 94 94 126 126 126 128 128 128 255 255 255 128 128 128 154 169 190 41 56 89 154 169 190 41 56 89 0 0 0 0 0 128 255 255 255 83 83 120 0 64 0 100 11 Qt::Vertical QSlider::TicksBothSides 40 279 117 26 117 26 117 26 255 255 255 153 153 153 80 80 80 0 0 0 255 255 255 221 221 221 93 93 93 124 124 124 255 255 255 255 255 255 255 255 255 153 153 153 80 80 80 0 0 0 153 153 153 80 80 80 0 0 0 0 0 0 0 0 128 255 255 255 0 0 0 0 0 0 255 255 255 153 153 153 80 80 80 0 0 0 255 255 255 215 215 215 93 93 93 124 124 124 255 255 255 255 255 255 255 255 255 153 153 153 80 80 80 0 0 0 153 153 153 80 80 80 0 0 0 0 0 0 0 0 128 255 255 255 0 0 0 0 0 0 255 255 255 153 153 153 80 80 80 0 0 0 255 255 255 215 215 215 93 93 93 124 124 124 255 255 255 255 255 255 255 255 255 153 153 153 80 80 80 0 0 0 153 153 153 80 80 80 0 0 0 0 0 0 0 0 128 255 255 255 0 0 0 0 0 0 9 QPushButton { color: white; border: 1.5px solid black; border-radius: 4px; padding: 1px; background: qlineargradient( x1:0, y1:0, x2:0, y2:1, stop:0 #505050, stop: 0.4 #808080, stop: 0.5 #606060 stop:1 black ); max-height: 10px; min-height: 16px; } FadeNo&w Alt+W false 9 109 35 16 7 Gain Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 82 113 31 16 255 255 255 153 153 153 80 80 80 0 0 0 255 255 255 221 221 221 93 93 93 124 124 124 255 255 255 255 255 255 255 255 255 153 153 153 80 80 80 0 0 0 153 153 153 80 80 80 0 0 0 0 0 0 0 0 128 255 255 255 0 0 0 0 0 0 255 255 255 153 153 153 80 80 80 0 0 0 255 255 255 215 215 215 93 93 93 124 124 124 255 255 255 255 255 255 255 255 255 153 153 153 80 80 80 0 0 0 153 153 153 80 80 80 0 0 0 0 0 0 0 0 128 255 255 255 0 0 0 0 0 0 255 255 255 153 153 153 80 80 80 0 0 0 255 255 255 215 215 215 93 93 93 124 124 124 255 255 255 255 255 255 255 255 255 153 153 153 80 80 80 0 0 0 153 153 153 80 80 80 0 0 0 0 0 0 0 0 128 255 255 255 0 0 0 0 0 0 7 AGC Alt+J true false 91 105 12 7 7 7 35 119 246 200 153 109 36 16 7 Gain 9 75 35 16 7 Low Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 153 75 36 16 7 Low 1 43 42 16 7 Mid Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 153 44 42 16 7 Mid 9 10 35 16 7 Qt::LeftToRight High Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 153 9 36 16 7 High 46 4 32 32 60 60 true 46 37 32 32 60 60 true 46 70 32 32 60 60 true 119 4 32 32 60 60 true 119 37 32 32 60 60 true 119 70 32 32 60 60 true 46 103 32 32 60 60 true 119 103 32 32 60 60 true 4 344 191 21 0 0 DejaVu Sans Mono 11 Knowthelist Qt::AlignCenter phVU2 ledFadeLeft toggleAutoFade ledDJ ledFade toggleAutoDJ ledFadeRight cmdOptions slider1 sliFader slider2 cmdFade label toggleAGC ledAGC label_5 label_2 label_3 label_4 label_6 label_7 label_8 potHigh_1 phVU1 potMid_1 potLow_1 potHigh_2 potMid_2 potLow_2 potGain_1 potGain_2 lblDjName QLayout::SetMaximumSize 0 0 0 111 0 1 0 0 0 3 0 0 132 0 132 16777215 0 10 0 0 0 0 0 0 126 16777215 16777215 QFrame::NoFrame QFrame::Raised 40 7 27 75 QFrame::StyledPanel QFrame::Raised 5 7 31 77 232 232 232 154 169 190 41 56 89 255 255 255 222 222 222 94 94 94 126 126 126 0 0 0 255 255 255 0 0 0 154 169 190 41 56 89 154 169 190 41 56 89 0 0 0 0 0 128 255 255 255 0 0 0 0 0 0 232 232 232 154 169 190 41 56 89 255 255 255 217 217 217 94 94 94 126 126 126 0 0 0 255 255 255 0 0 0 154 169 190 41 56 89 154 169 190 41 56 89 0 0 0 0 0 128 255 255 255 83 83 120 0 64 0 232 232 232 154 169 190 41 56 89 255 255 255 217 217 217 94 94 94 126 126 126 128 128 128 255 255 255 128 128 128 154 169 190 41 56 89 154 169 190 41 56 89 0 0 0 0 0 128 255 255 255 83 83 120 0 64 0 100 Qt::Vertical QSlider::TicksBothSides 4 88 61 20 225 225 225 154 169 190 41 56 89 225 225 225 225 225 225 154 169 190 41 56 89 154 169 190 41 56 89 225 225 225 154 169 190 41 56 89 225 225 225 225 225 225 154 169 190 41 56 89 154 169 190 41 56 89 225 225 225 154 169 190 41 56 89 225 225 225 225 225 225 154 169 190 41 56 89 154 169 190 41 56 89 9 0:00.0 77 19 41 26 64 87 51 20 225 225 225 154 169 190 41 56 89 225 225 225 225 225 225 154 169 190 41 56 89 154 169 190 41 56 89 225 225 225 154 169 190 41 56 89 225 225 225 225 225 225 154 169 190 41 56 89 154 169 190 41 56 89 225 225 225 154 169 190 41 56 89 225 225 225 225 225 225 154 169 190 41 56 89 154 169 190 41 56 89 9 -0:00.0 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 4 108 111 16 0 0 18 1000 100 Qt::Horizontal true 77 57 41 26 QFrame::NoFrame QFrame::Raised 0 0 0 0 0 75 true 225 225 225 154 169 190 41 56 89 225 225 225 225 225 225 154 169 190 41 56 89 154 169 190 41 56 89 225 225 225 154 169 190 41 56 89 225 225 225 225 225 225 154 169 190 41 56 89 154 169 190 41 56 89 225 225 225 154 169 190 41 56 89 225 225 225 225 225 225 154 169 190 41 56 89 154 169 190 41 56 89 10 MonitorPlayer Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true 0 120 120 120 120 true 0 0 0 33 16777215 35 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="settings"><span style=" font-size:8pt; color:#df9090;">No 2nd soundcard selected!</span></a></p></body></html> true Settings QLed QWidget

qled.h
1 CustomDial QWidget
customdial.h
1
PlayerWidget QWidget
playerwidget.h
1
Playlist QWidget
playlist.h
1
FancyTabWidget QWidget
fancytabwidget.h
1
toggleAutoFade toggleAutoDJ cmdOptions slider1 sliFader slider2 cmdFade knowthelist-2.3.1/src/main.cpp000077500000000000000000000063351342115213400163150ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "knowthelist.h" #include #include #include #include #include int main(int argc, char* argv[]) { QApplication a(argc, argv); // init rand qsrand(QDateTime::currentMSecsSinceEpoch() / 1000); QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); a.setQuitOnLastWindowClosed(true); QCoreApplication::setOrganizationName("knowthelist-org"); QCoreApplication::setOrganizationDomain(""); QCoreApplication::setApplicationName("knowthelist"); QCoreApplication::setApplicationVersion("2.3.1"); QSettings settings; QStringList languages; languages << "" << "en" << "de" << "cs" << "hu" << "fr"; QString lang = languages[settings.value("language", 0).toInt()]; if (lang.isEmpty()) lang = QLocale::system().name(); QTranslator qtTranslator; qtTranslator.load("qt_" + lang, QLibraryInfo::location(QLibraryInfo::TranslationsPath)); a.installTranslator(&qtTranslator); QTranslator localization; bool result = localization.load(":knowthelist_" + lang + ".qm"); qDebug() << "localization load " << ":knowthelist_" + lang + ".qm result:" << result; a.installTranslator(&localization); if (!QSqlDatabase::drivers().contains("QSQLITE")) { #if QT_VERSION >= 0x050000 QMessageBox::critical(nullptr, QObject::tr("Unable to load database"), QObject::tr("This application needs the QT5 SQLITE " "driver (libqt5-sql-sqlite)")); #else QMessageBox::critical(0, QObject::tr("Unable to load database"), QObject::tr("This application needs the QT4 SQLITE " "driver (libqt4-sql-sqlite)")); #endif return 1; } #if QT_VERSION >= 0x050000 QString pathName = QStandardPaths::standardLocations(QStandardPaths::DataLocation).at(0); #else QString pathName = QDesktopServices::storageLocation(QDesktopServices::DataLocation); #endif QDir path(pathName); if (!path.exists()) path.mkpath(pathName); QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName(path.absolutePath() + "/collection.db"); if (!db.open()) { QMessageBox::critical(nullptr, "fatal database error", db.lastError().text()); return 1; } qDebug() << "load database: " << db.databaseName(); Knowthelist w; w.show(); return a.exec(); } knowthelist-2.3.1/src/modeselector.cpp000077500000000000000000000057041342115213400200550ustar00rootroot00000000000000/* Copyright (C) 2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "modeselector.h" #include "ui_modeselector.h" ModeSelector::ModeSelector(QWidget *parent) : QFrame(parent), ui(new Ui::ModeSelector) { ui->setupUi(this); ui->led1->setLook(QLed::Flat); ui->led1->setShape(QLed::Rectangular); ui->led1->setColor(QColor(35,119,246)); ui->led2->setLook(QLed::Flat); ui->led2->setShape(QLed::Rectangular); ui->led2->setColor(QColor(35,119,246)); ui->led3->setLook(QLed::Flat); ui->led3->setShape(QLed::Rectangular); ui->led3->setColor(QColor(35,119,246)); ui->led2->off(); ui->led3->off(); selMode = ModeSelector::MODENONE; } ModeSelector::~ModeSelector() { delete ui; } void ModeSelector::on_push1_clicked() { //ui->led1->on(); //ui->led2->off(); //ui->led3->off(); selMode = ModeSelector::MODENONE; ui->push1->setStyleSheet("QPushButton { border: 1px solid #3399ff;}"); ui->push2->setStyleSheet("QPushButton { border: 1px solid #aaaaaa;}"); ui->push3->setStyleSheet("QPushButton { border: 1px solid #aaaaaa;}"); Q_EMIT modeChanged(selMode); } void ModeSelector::on_push2_clicked() { //ui->led1->off(); //ui->led2->on(); //ui->led3->off(); selMode = ModeSelector::MODEYEAR; ui->push1->setStyleSheet("QPushButton { border: 1px solid #aaaaaa;}"); ui->push2->setStyleSheet("QPushButton { border: 1px solid #3399ff;}"); ui->push3->setStyleSheet("QPushButton { border: 1px solid #aaaaaa;}"); Q_EMIT modeChanged(selMode); } void ModeSelector::on_push3_clicked() { //ui->led1->off(); //ui->led2->off(); //ui->led3->on(); selMode = ModeSelector::MODEGENRE; ui->push1->setStyleSheet("QPushButton { border: 1px solid #aaaaaa;}"); ui->push2->setStyleSheet("QPushButton { border: 1px solid #aaaaaa;}"); ui->push3->setStyleSheet("QPushButton { border: 1px solid #3399ff;}"); Q_EMIT modeChanged(selMode); } void ModeSelector::setMode(ModeSelector::modeType value) { switch (value) { case MODEGENRE: on_push3_clicked(); break; case MODEYEAR: on_push2_clicked(); break; default: on_push1_clicked(); break; } } ModeSelector::modeType ModeSelector::mode() { return selMode; } knowthelist-2.3.1/src/modeselector.h000077500000000000000000000025331342115213400175170ustar00rootroot00000000000000/* Copyright (C) 2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #ifndef MODESELECTOR_H #define MODESELECTOR_H #include namespace Ui { class ModeSelector; } class ModeSelector : public QFrame { Q_OBJECT public: explicit ModeSelector(QWidget *parent = 0); ~ModeSelector(); enum modeType { MODENONE, MODEYEAR, MODEGENRE }; void setMode(ModeSelector::modeType value); ModeSelector::modeType mode(); Q_SIGNALS: void modeChanged(ModeSelector::modeType value); private slots: void on_push1_clicked(); void on_push2_clicked(); void on_push3_clicked(); private: Ui::ModeSelector *ui; modeType selMode; }; #endif // MODESELECTOR_H knowthelist-2.3.1/src/modeselector.ui000077500000000000000000000067731342115213400177170ustar00rootroot00000000000000 ModeSelector 0 0 76 30 0 0 55 30 16 Frame false QPushButton { color: #ffffff; border-style: inset; border: 1px solid #aaaaaa; border-radius: 4px; background: #555555; max-height: 11px; min-height: 11px; min-width:13px; max-width:13px; } QFrame::NoFrame QFrame::Raised 2 4 15 13 8 View: Artist > Album A 90 15 13 4 20 4 15 13 8 View: Year > Artist > Album Y 100 15 20 20 38 4 15 13 8 View: Genre > Artist > Album G 123 15 13 4 push2 push3 push1 led2 led3 led1 QLed QWidget
qled.h
1
knowthelist-2.3.1/src/monitorplayer.cpp000077500000000000000000000420671342115213400202770ustar00rootroot00000000000000/* Copyright (C) 2005-2019 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include #if QT_VERSION >= 0x050000 #include #else #include #endif #if defined(Q_OS_DARWIN) #include #include #elif defined(Q_OS_WIN32) #include #elif defined(Q_OS_UNIX) #include #endif #include "monitorplayer.h" void MonitorPlayer::sync_set_state(GstElement* element, GstState state) { GstStateChangeReturn res; res = gst_element_set_state(GST_ELEMENT(element), state); if (res == GST_STATE_CHANGE_FAILURE) return; if (res == GST_STATE_CHANGE_ASYNC) { GstState state; res = gst_element_get_state(GST_ELEMENT(element), &state, NULL, 1000000000 /*GST_CLOCK_TIME_NONE*/); if (res == GST_STATE_CHANGE_FAILURE || res == GST_STATE_CHANGE_ASYNC) return; } } void cb_newpad_mp(GstElement* src, GstPad* new_pad, gpointer data) { MonitorPlayer* instance = (MonitorPlayer*)data; instance->newpad(src, new_pad, data); } void MonitorPlayer::newpad(GstElement* src, GstPad* new_pad, gpointer data) { GstCaps* caps; GstStructure* str; GstPad* sink_pad; /* only link once */ GstElement* bin = gst_bin_get_by_name(GST_BIN(pipeline), "convert"); sink_pad = gst_element_get_static_pad(bin, "sink"); gst_object_unref(bin); if (GST_PAD_IS_LINKED(sink_pad)) { g_object_unref(sink_pad); return; } /* check media type */ #ifdef GST_API_VERSION_1 caps = gst_pad_query_caps(new_pad, nullptr); #else caps = gst_pad_get_caps(new_pad); #endif str = gst_caps_get_structure(caps, 0); if (!g_strrstr(gst_structure_get_name(str), "audio")) { gst_caps_unref(caps); gst_object_unref(sink_pad); return; } gst_caps_unref(caps); /* link'n'play */ gst_pad_link(new_pad, sink_pad); } struct MonitorPlayerPrivate { QFutureWatcher watcher; QMutex mutex; bool isStarted; bool isLoaded; bool isDisabled; QString error; QString deviceName; QString deviceID; QMap devices; uint length; uint position; dsDevice dev; double rms_l; double rms_r; }; MonitorPlayer::MonitorPlayer(QWidget* parent) : QWidget(parent) , p(new MonitorPlayerPrivate) , pipeline(nullptr) , bus(nullptr) , Gstart(0) , Glength(0) { p->isStarted = false; p->isLoaded = false; readDevices(); p->deviceID = defaultDeviceID(); connect(&p->watcher, SIGNAL(finished()), this, SLOT(loadThreadFinished())); } MonitorPlayer::~MonitorPlayer() { cleanup(); delete p; p = nullptr; } GstBusSyncReply MonitorPlayer::bus_cb(GstBus* bus, GstMessage* msg, gpointer data) { Q_UNUSED(bus); MonitorPlayer* instance = (MonitorPlayer*)data; instance->messageReceived(msg); return GST_BUS_PASS; } void MonitorPlayer::cleanup() { if (pipeline) sync_set_state(GST_ELEMENT(pipeline), GST_STATE_NULL); if (bus) gst_object_unref(bus); if (pipeline) gst_object_unref(G_OBJECT(pipeline)); } bool MonitorPlayer::prepare() { // Init Gst qDebug() << Q_FUNC_INFO << " " << "START"; QString caps_value; gst_init(nullptr, nullptr); //prepare GstElement *src, *conv, *resample, *sink, *level, *vol; GstCaps* caps; pipeline = gst_pipeline_new("pipeline"); bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline)); src = gst_element_factory_make("uridecodebin", "source"); #ifdef GST_API_VERSION_1 caps_value = "audio/x-raw"; #else caps_value = "audio/x-raw-int"; #endif caps = gst_caps_new_simple(caps_value.toLatin1().data(), "channels", G_TYPE_INT, 2, NULL); g_signal_connect(src, "pad-added", G_CALLBACK(cb_newpad_mp), this); conv = gst_element_factory_make("audioconvert", "convert"); vol = gst_element_factory_make("volume", "volume"); resample = gst_element_factory_make("audioresample", "resample"); level = gst_element_factory_make("level", "level"); #if defined(Q_OS_DARWIN) sink = gst_element_factory_make("osxaudiosink", "sink"); g_object_set(sink, "device", 0, NULL); //g_object_set (sink, "volume", 9.5, NULL); #elif defined(Q_OS_WIN32) sink = gst_element_factory_make("directsoundsink", "sink"); g_object_set(sink, "device", NULL, NULL); //g_object_set (sink, "volume", 99.5, NULL); #elif defined(Q_OS_UNIX) sink = gst_element_factory_make("alsasink", "sink"); g_object_set(sink, "device", "default", NULL); //g_object_set (sink, "volume", 0.5, NULL); #else sink = gst_element_factory_make("fakesink", "sink"); g_object_set(sink, "device", NULL, NULL); #endif gst_bin_add_many(GST_BIN(pipeline), src, conv, resample, level, vol, sink, NULL); gst_element_link(conv, resample); gst_element_link_filtered(resample, level, caps); gst_element_link(level, vol); gst_element_link(vol, sink); gst_element_set_state(src, GST_STATE_NULL); #ifdef GST_API_VERSION_1 gst_bus_set_sync_handler(bus, bus_cb, this, nullptr); #else gst_bus_set_sync_handler(bus, bus_cb, this); #endif qDebug() << Q_FUNC_INFO << " " << "END"; return pipeline; } bool MonitorPlayer::ready() { return pipeline; } void MonitorPlayer::open(QUrl url) { if (p->isDisabled) { return; } // To avoid delays, load track in another thread qDebug() << Q_FUNC_INFO << ":" << parentWidget()->objectName() << " url=" << url; QFuture future = QtConcurrent::run(this, &MonitorPlayer::asyncOpen, url); p->watcher.setFuture(future); } void MonitorPlayer::asyncOpen(QUrl url) { p->mutex.lock(); p->length = 0; p->isLoaded = false; p->error = ""; sync_set_state(GST_ELEMENT(pipeline), GST_STATE_NULL); GstElement* src = gst_bin_get_by_name(GST_BIN(pipeline), "source"); g_object_set(G_OBJECT(src), "uri", (const char*)url.toString().toUtf8(), NULL); sync_set_state(GST_ELEMENT(pipeline), GST_STATE_PAUSED); setPosition(QTime(0, 0)); gst_object_unref(src); p->mutex.unlock(); } void MonitorPlayer::loadThreadFinished() { // async load in MonitorPlayerGst done qDebug() << Q_FUNC_INFO << ":" << parentWidget()->objectName(); p->isLoaded = true; if (p->isStarted) { play(); } emit loadFinished(); } void MonitorPlayer::play() { p->isStarted = true; qDebug() << Q_FUNC_INFO << ":" << parentWidget()->objectName(); if (p->isLoaded) { gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_PLAYING); } } void MonitorPlayer::stop() { p->isStarted = false; gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_READY); } void MonitorPlayer::pause() { if (isPlaying()) { p->isStarted = false; gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_PAUSED); } } bool MonitorPlayer::close() { gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_NULL); return true; } void MonitorPlayer::setPosition(QTime position) { int time_milliseconds = QTime(0, 0).msecsTo(position); gint64 time_nanoseconds = (time_milliseconds * GST_MSECOND); gst_element_seek(pipeline, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, time_nanoseconds, GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE); p->position = time_milliseconds; emit positionChanged(); } QTime MonitorPlayer::position() { if (pipeline) { gint64 value = 0; #ifdef GST_API_VERSION_1 if (gst_element_query_position(pipeline, GST_FORMAT_TIME, &value)) { #else GstFormat fmt = GST_FORMAT_TIME; if (gst_element_query_position(pipeline, &fmt, &value)) { #endif p->position = static_cast((value / GST_MSECOND)); return QTime(0, 0).addMSecs(p->position); // nanosec -> msec } return QTime(0, 0).addMSecs(p->position); // nanosec -> msec } return QTime(0, 0); } QTime MonitorPlayer::length() { gint64 value = 0; if (p->length == 0 && pipeline) { #ifdef GST_API_VERSION_1 if (gst_element_query_duration(pipeline, GST_FORMAT_TIME, &value)) { #else GstFormat fmt = GST_FORMAT_TIME; if (gst_element_query_duration(pipeline, &fmt, &value)) { #endif p->length = static_cast((value / GST_MSECOND)); } } return QTime(0, 0).addMSecs(p->length); // nanosec -> msec } double MonitorPlayer::volume() { gdouble vol = 0; GstElement* volume = gst_bin_get_by_name(GST_BIN(pipeline), "volume"); g_object_get(G_OBJECT(volume), "volume", &vol, NULL); gst_object_unref(volume); return vol; } void MonitorPlayer::setVolume(double v) { gdouble vol = 1.00 * v; GstElement* volume = gst_bin_get_by_name(GST_BIN(pipeline), "volume"); g_object_set(G_OBJECT(volume), "volume", vol, NULL); gst_object_unref(volume); } void MonitorPlayer::disable() { p->isDisabled = true; } void MonitorPlayer::enable() { p->isDisabled = false; } bool MonitorPlayer::isDisabled() { return p->isDisabled; } double MonitorPlayer::levelLeft() { return p->rms_l; } double MonitorPlayer::levelRight() { return p->rms_r; } bool MonitorPlayer::mediaPlayable() { GstState st; gst_element_get_state(GST_ELEMENT(pipeline), &st, 0, 0); //qDebug()< i(p->devices); while (i.hasNext()) { i.next(); outList << i.value(); } return outList; } QString MonitorPlayer::outputDeviceName() { return p->deviceName; } QString MonitorPlayer::outputDeviceID() { return p->deviceID; } void MonitorPlayer::setOutputDevice(QString deviceName) { // for Mac device is DeviceID QMapIterator i(p->devices); while (i.hasNext()) { i.next(); if (i.value() == deviceName) { p->deviceID = i.key(); p->deviceName = i.value(); } } qDebug() << "Monitor setDevice to DeviceID:" << p->deviceID << " DevicenName:" << p->deviceName; GstElement* sink = gst_bin_get_by_name(GST_BIN(pipeline), "sink"); #if defined(Q_OS_WIN32) g_object_set(sink, "device", p->deviceID.toLatin1().data(), NULL); #elif defined(Q_OS_DARWIN) g_object_set(sink, "device", p->deviceID.toInt(), NULL); #elif defined(Q_OS_UNIX) g_object_set(sink, "device", QString("hw:%1").arg(p->deviceID).toLatin1().data(), NULL); #endif gst_object_unref(sink); } #if defined(Q_OS_WIN32) BOOL CALLBACK DSEnumProc(LPGUID lpGUID, const WCHAR* lpszDesc, const WCHAR* lpszDrvName, void* ctx) { if (lpGUID) { QList* l = reinterpret_cast*>(ctx); *l << dsDevice(QString::fromUtf16(reinterpret_cast(lpszDesc)), QUuid(*lpGUID)); } return (true); } #endif QString MonitorPlayer::defaultDeviceID() { #if defined(Q_OS_WIN32) GUID guid; //DSDEVID_DefaultVoicePlayback="{DEF00000-9C6D-47ED-AAF1-4DDA8F2B5C03}" const GUID defaultguid = QUuid("{DEF00000-9C6D-47ED-AAF1-4DDA8F2B5C03}"); if (GetDeviceID(&defaultguid, &guid) == DS_OK) { return QUuid(guid).toString(); } else return QString(); #elif defined(Q_OS_DARWIN) return QString("0"); #elif defined(Q_OS_UNIX) return QString("0"); #endif } void MonitorPlayer::readDevices() { #if defined(Q_OS_WIN32) p->devices.clear(); QList qlOutput; DirectSoundEnumerate(DSEnumProc, reinterpret_cast(&qlOutput)); foreach (dev, qlOutput) { p->devices.insert(dev.second.toString(), dev.first); } #elif defined(Q_OS_DARWIN) UInt32 dataSize = 0; AudioObjectPropertyAddress propertyAddress; propertyAddress.mSelector = kAudioHardwarePropertyDevices; propertyAddress.mScope = kAudioDevicePropertyScopeOutput; propertyAddress.mElement = kAudioObjectPropertyElementMaster; OSStatus status = AudioObjectGetPropertyDataSize(kAudioObjectSystemObject, &propertyAddress, 0, NULL, &dataSize); if (kAudioHardwareNoError != status) { qDebug() << "Unable to get number of audio devices. Error: " << status; } UInt32 deviceCount = dataSize / sizeof(AudioDeviceID); AudioDeviceID* audioDevices = (AudioDeviceID*)malloc(dataSize); status = AudioObjectGetPropertyData(kAudioObjectSystemObject, &propertyAddress, 0, NULL, &dataSize, audioDevices); if (kAudioHardwareNoError != status) { qDebug() << "AudioObjectGetPropertyData failed when getting device IDs. Error:" << status; free(audioDevices), audioDevices = NULL; return; } p->devices.clear(); for (UInt32 i = 0; i < deviceCount; i++) { CFStringRef deviceName = NULL; propertyAddress.mSelector = kAudioDevicePropertyStreamConfiguration; // probe for Inputstream if (AudioObjectGetPropertyData(audioDevices[i], &propertyAddress, 0, NULL, &dataSize, &deviceName) != noErr) { dataSize = sizeof(deviceName); propertyAddress.mSelector = kAudioDevicePropertyDeviceNameCFString; propertyAddress.mScope = kAudioDevicePropertyScopeOutput; status = AudioObjectGetPropertyData(audioDevices[i], &propertyAddress, 0, NULL, &dataSize, &deviceName); QString devName = CFStringGetCStringPtr(deviceName, CFStringGetSystemEncoding()); p->devices.insert(QString::number(audioDevices[i]), devName.trimmed()); } } free(audioDevices); #elif defined(Q_OS_UNIX) int idx = 0; char* name; while (snd_card_get_name(idx, &name) == 0) { p->devices.insert(QString::number(idx), QString(name)); idx++; } #endif } void MonitorPlayer::messageReceived(GstMessage* message) { switch (GST_MESSAGE_TYPE(message)) { case GST_MESSAGE_ERROR: { if (p->error == "") { GError* err; gchar* debug; gst_message_parse_error(message, &err, &debug); p->error = "Error #" + QString::number(err->code) + " in module " + QString::number(err->domain) + "\n" + QString::fromUtf8(err->message); if (err->code == 6 && err->domain == 851) { p->error += "\nMay be you should to install gstreamerX.XX-plugins-ugly or gstreamerX.XX-plugins-bad"; } qDebug() << "Gstreamer error:" << p->error; g_error_free(err); g_free(debug); Q_EMIT error(); } break; } case GST_MESSAGE_EOS: { qDebug() << Q_FUNC_INFO << ":" << parentWidget()->objectName() << " End of track reached"; Q_EMIT finish(); break; } case GST_MESSAGE_STATE_CHANGED: { GstState old_state, new_state; gst_message_parse_state_changed(message, &old_state, &new_state, NULL); switch (new_state) { case GST_STATE_PAUSED: case GST_STATE_NULL: p->rms_l = p->rms_r = 0; default: break; } break; } case GST_MESSAGE_ELEMENT: { const GstStructure* s = gst_message_get_structure(message); const gchar* src_name = GST_MESSAGE_SRC_NAME(message); if (strcmp(src_name, "level") == 0) { gint channels; gdouble peak_dB; gdouble rms; gint i; #ifdef GST_API_VERSION_1 const GValue* array_val; GValueArray* peak_arr; array_val = gst_structure_get_value(s, "peak"); peak_arr = (GValueArray*)g_value_get_boxed(array_val); channels = peak_arr->n_values; for (i = 0; i < channels; ++i) { peak_dB = g_value_get_double(peak_arr->values + i); #else const GValue* list; const GValue* value; list = gst_structure_get_value(s, "peak"); channels = gst_value_list_get_size(list); for (i = 0; i < channels; ++i) { list = gst_structure_get_value(s, "peak"); value = gst_value_list_get_value(list, i); peak_dB = g_value_get_double(value); #endif /* converting from dB to normal gives us a value between 0.0 and 1.0 */ rms = pow(10, peak_dB / 20); if (i == 0) p->rms_l = rms; else p->rms_r = rms; } } } break; default: break; } } knowthelist-2.3.1/src/monitorplayer.h000077500000000000000000000050531342115213400177360ustar00rootroot00000000000000/* Copyright (C) 2005-2019 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #ifndef MONITORPLAYER_H #define MONITORPLAYER_H #include #include #if defined(Q_OS_WIN32) #include #include #endif #define GST_DISABLE_LOADSAVE 1 #define GST_DISABLE_REGISTRY 1 #define GST_DISABLE_DEPRECATED 1 #include typedef QPair dsDevice; class MonitorPlayer: public QWidget { Q_OBJECT public: MonitorPlayer(QWidget *parent = nullptr); ~MonitorPlayer(); bool prepare(); bool ready(); bool canOpen(QString mime); void open(QUrl url); void play(); void stop(); void pause(); bool close(); void setPosition(QTime); QTime position(); double volume(); void setVolume(double); void disable(); void enable(); bool isDisabled(); QTime length(); bool isPlaying(); bool mediaPlayable(); QStringList outputDevices(); QString outputDeviceName(); QString outputDeviceID(); void setOutputDevice(QString deviceName); void readDevices(); QString defaultDeviceID(); double levelLeft(); double levelRight(); void newpad (GstElement *decodebin, GstPad *pad, gpointer data); static GstBusSyncReply bus_cb (GstBus *bus, GstMessage *msg, gpointer data); Q_SIGNALS: void finish(); void error(); void levelChanged(); void positionChanged(); void loadFinished(); private slots: void loadThreadFinished(); void messageReceived(GstMessage* message); private: struct MonitorPlayerPrivate *p; GstElement *pipeline; GstBus *bus; gint64 Gstart; gint64 Glength; void setLink(int, QUrl&); void asyncOpen(QUrl url); void cleanup(); void sync_set_state(GstElement*, GstState); }; #endif // MONITORPLAYER_H knowthelist-2.3.1/src/player.cpp000077500000000000000000000375711342115213400166730ustar00rootroot00000000000000/* Copyright (C) 2005-2019 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "player.h" #include #if QT_VERSION >= 0x050000 #include #else #include #endif void Player::sync_set_state(GstElement* element, GstState state) { GstStateChangeReturn res; res = gst_element_set_state(GST_ELEMENT(element), state); if (res == GST_STATE_CHANGE_FAILURE) return; if (res == GST_STATE_CHANGE_ASYNC) { GstState state; res = gst_element_get_state(GST_ELEMENT(element), &state, NULL, GST_CLOCK_TIME_NONE); if (res == GST_STATE_CHANGE_FAILURE || res == GST_STATE_CHANGE_ASYNC) return; } } void cb_newpad(GstElement* src, GstPad* new_pad, gpointer data) { Player* instance = (Player*)data; instance->newpad(src, new_pad, data); } void Player::newpad(GstElement* src, GstPad* new_pad, gpointer data) { Q_UNUSED(src); Q_UNUSED(data); GstCaps* caps; GstStructure* str; GstPad* sink_pad; /* only link once */ GstElement* bin = gst_bin_get_by_name(GST_BIN(pipeline), "convert"); sink_pad = gst_element_get_static_pad(bin, "sink"); gst_object_unref(bin); if (GST_PAD_IS_LINKED(sink_pad)) { g_object_unref(sink_pad); return; } /* check media type */ #ifdef GST_API_VERSION_1 caps = gst_pad_query_caps(new_pad, nullptr); #else caps = gst_pad_get_caps(new_pad); #endif str = gst_caps_get_structure(caps, 0); if (!g_strrstr(gst_structure_get_name(str), "audio")) { gst_caps_unref(caps); gst_object_unref(sink_pad); return; } gst_caps_unref(caps); /* link'n'play */ gst_pad_link(new_pad, sink_pad); qDebug() << Q_FUNC_INFO << " " << "END"; } struct PlayerPrivate { QFutureWatcher watcher; QMutex mutex; bool isStarted; bool isLoaded; QString error; int length; int position; double volume; double rms_l; double rms_r; double rmsout_l; double rmsout_r; }; Player::Player(QWidget* parent) : QWidget(parent) , p(new PlayerPrivate) , pipeline(nullptr) , bus(nullptr) , Gstart(0) , Glength(0) { p->isStarted = false; p->isLoaded = false; connect(&p->watcher, SIGNAL(finished()), this, SLOT(loadThreadFinished())); } Player::~Player() { cleanup(); delete p; p = nullptr; } GstBusSyncReply Player::bus_cb(GstBus* bus, GstMessage* msg, gpointer data) { Q_UNUSED(bus); Player* instance = (Player*)data; instance->messageReceived(msg); return GST_BUS_PASS; } void Player::cleanup() { if (pipeline) sync_set_state(GST_ELEMENT(pipeline), GST_STATE_NULL); if (bus) gst_object_unref(bus); if (pipeline) gst_object_unref(G_OBJECT(pipeline)); } bool Player::prepare() { // Init Gst qDebug() << Q_FUNC_INFO << " " << "START"; QString caps_value; // On mac we bundle the gstreamer plugins with knowthelist #if defined(Q_OS_DARWIN) QString scanner_path; QString plugin_path; QString registry_filename; QDir pd(QCoreApplication::applicationDirPath() + "/../plugins"); scanner_path = QCoreApplication::applicationDirPath() + "/../plugins/gst-plugin-scanner"; plugin_path = QCoreApplication::applicationDirPath() + "/../plugins/gstreamer"; registry_filename = QStandardPaths::writableLocation(QStandardPaths::DataLocation) + QString("/gst-registry-%1-bin").arg(QCoreApplication::applicationVersion()); if (pd.exists()) setenv("GST_PLUGIN_SCANNER", scanner_path.toLocal8Bit().constData(), 1); if (pd.exists()) { setenv("GST_PLUGIN_PATH", plugin_path.toLocal8Bit().constData(), 1); // Never load plugins from anywhere else. setenv("GST_PLUGIN_SYSTEM_PATH", plugin_path.toLocal8Bit().constData(), 1); } if (!registry_filename.isEmpty()) { setenv("GST_REGISTRY", registry_filename.toLocal8Bit().constData(), 1); } #elif defined(Q_OS_WIN32) QString plugin_path = QCoreApplication::applicationDirPath() + "/plugins"; QDir pluginDir(plugin_path); if (pluginDir.exists()) _putenv_s("GST_PLUGIN_PATH", plugin_path.toLocal8Bit()); #endif //_putenv_s("GST_DEBUG", "*:4"); // win //setenv("GST_DEBUG", "*:4", 1); // unix, mac gst_init(nullptr, nullptr); //prepare GstElement *src, *conv, *resample, *sink, *gain, *vol, *level, *equalizer; GstElement* levelout; GstCaps* caps; pipeline = gst_pipeline_new("pipeline"); bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline)); #ifdef GST_API_VERSION_1 caps_value = "audio/x-raw"; #else caps_value = "audio/x-raw-int"; #endif caps = gst_caps_new_simple(caps_value.toLatin1().data(), "channels", G_TYPE_INT, 2, NULL); src = gst_element_factory_make("uridecodebin", "source"); g_signal_connect(src, "pad-added", G_CALLBACK(cb_newpad), this); conv = gst_element_factory_make("audioconvert", "convert"); resample = gst_element_factory_make("audioresample", "resample"); gain = gst_element_factory_make("audioamplify", "gain"); level = gst_element_factory_make("level", "levelintern"); vol = gst_element_factory_make("volume", "volume"); levelout = gst_element_factory_make("level", "levelout"); equalizer = gst_element_factory_make("equalizer-3bands", "equalizer"); sink = gst_element_factory_make("autoaudiosink", "sink"); g_object_set(level, "message", TRUE, NULL); g_object_set(levelout, "message", TRUE, NULL); g_object_set(level, "peak-ttl", 300000000000, NULL); gst_bin_add_many(GST_BIN(pipeline), src, conv, resample, level, gain, equalizer, levelout, vol, sink, NULL); gst_element_link(conv, resample); gst_element_link_filtered(resample, level, caps); gst_element_link(level, gain); gst_element_link(gain, equalizer); gst_element_link(equalizer, vol); gst_element_link_filtered(vol, levelout, caps); gst_element_link(levelout, sink); #ifdef GST_API_VERSION_1 gst_bus_set_sync_handler(bus, bus_cb, this, nullptr); #else gst_bus_set_sync_handler(bus, bus_cb, this); #endif qDebug() << Q_FUNC_INFO << " " << "END"; return pipeline; } bool Player::ready() { return pipeline; } void Player::setGain(double g) { gdouble gain_value = 1.00 * g; GstElement* gain = gst_bin_get_by_name(GST_BIN(pipeline), "gain"); g_object_set(G_OBJECT(gain), "amplification", gain_value, NULL); gst_object_unref(gain); } void Player::setEqualizer(QString band, double gain) { gdouble gain_value = 1.00 * gain; GstElement* equalizer = gst_bin_get_by_name(GST_BIN(pipeline), "equalizer"); g_object_set(G_OBJECT(equalizer), band.toLatin1().data(), gain_value, NULL); gst_object_unref(equalizer); } void Player::open(QUrl url) { //To avoid delays load track in another thread qDebug() << Q_FUNC_INFO << ":" << parentWidget()->objectName() << " url=" << url; QFuture future = QtConcurrent::run(this, &Player::asyncOpen, url); p->watcher.setFuture(future); } void Player::asyncOpen(QUrl url) { p->mutex.lock(); p->length = 0; p->position = 0; p->isLoaded = false; p->error = ""; lastError = ""; sync_set_state(GST_ELEMENT(pipeline), GST_STATE_NULL); GstElement* src = gst_bin_get_by_name(GST_BIN(pipeline), "source"); g_object_set(G_OBJECT(src), "uri", (const char*)url.toString().toUtf8(), NULL); qDebug() << Q_FUNC_INFO << ":" << parentWidget()->objectName(); sync_set_state(GST_ELEMENT(pipeline), GST_STATE_PAUSED); setPosition(QTime(0, 0)); gst_object_unref(src); p->mutex.unlock(); } void Player::loadThreadFinished() { // async load in player done qDebug() << Q_FUNC_INFO << ":" << parentWidget()->objectName(); p->isLoaded = true; emit loadFinished(); if (p->isStarted) { play(); } } void Player::play() { p->isStarted = true; qDebug() << Q_FUNC_INFO << ":" << parentWidget()->objectName(); if (p->isLoaded) { qDebug() << Q_FUNC_INFO << ":" << parentWidget()->objectName() << " call GST_STATE_PLAYING"; gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_PLAYING); } else { qDebug() << Q_FUNC_INFO << ":" << parentWidget()->objectName() << " is not loaded"; } } void Player::stop() { p->isStarted = false; gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_READY); } void Player::pause() { if (isPlaying()) { p->isStarted = false; gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_PAUSED); } } bool Player::close() { gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_NULL); return true; } void Player::setPosition(QTime position) { int time_milliseconds = QTime(0, 0).msecsTo(position); gint64 time_nanoseconds = (time_milliseconds * GST_MSECOND); gst_element_seek(pipeline, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, time_nanoseconds, GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE); p->position = time_milliseconds; emit positionChanged(); } QTime Player::position() { if (pipeline) { gint64 value = 0; #ifdef GST_API_VERSION_1 if (gst_element_query_position(pipeline, GST_FORMAT_TIME, &value)) { #else GstFormat fmt = GST_FORMAT_TIME; if (gst_element_query_position(pipeline, &fmt, &value)) { #endif p->position = static_cast((value / GST_MSECOND)); return QTime(0, 0).addMSecs(p->position); // nanosec -> msec } return QTime(0, 0).addMSecs(p->position); // nanosec -> msec } return QTime(0, 0); } QTime Player::length() { gint64 value = 0; if (p->length == 0 && pipeline) { #ifdef GST_API_VERSION_1 if (gst_element_query_duration(pipeline, GST_FORMAT_TIME, &value)) { #else GstFormat fmt = GST_FORMAT_TIME; if (gst_element_query_duration(pipeline, &fmt, &value)) { #endif p->length = static_cast((value / GST_MSECOND)); } else qDebug() << Q_FUNC_INFO << ": Can not get duration"; } return QTime(0, 0).addMSecs(p->length); // nanosec -> msec } double Player::volume() { gdouble vol = 0; GstElement* volume = gst_bin_get_by_name(GST_BIN(pipeline), "volume"); g_object_get(G_OBJECT(volume), "volume", &vol, nullptr); gst_object_unref(volume); return static_cast(vol); } void Player::setVolume(double v) { gdouble vol = static_cast(v); if (vol < 0.001) { vol = 0.001; } GstElement* volume = gst_bin_get_by_name(GST_BIN(pipeline), "volume"); g_object_set(G_OBJECT(volume), "volume", vol, nullptr); gst_object_unref(volume); } bool Player::mediaPlayable() { GstState st; gst_element_get_state(GST_ELEMENT(pipeline), &st, nullptr, 0); //qDebug()<rms_l; } double Player::levelRight() { return p->rms_r; } double Player::levelOutLeft() { return p->rmsout_l; } double Player::levelOutRight() { return p->rmsout_r; } void Player::messageReceived(GstMessage* message) { switch (GST_MESSAGE_TYPE(message)) { case GST_STATE_CHANGE_FAILURE: { qDebug() << Q_FUNC_INFO << ": Gstreamer error:" << p->error; } case GST_MESSAGE_ERROR: { if (p->error == "") { GError* err; gchar* debug; gst_message_parse_error(message, &err, &debug); p->error = "Error #" + QString::number(err->code) + " in module " + QString::number(err->domain) + "\n" + QString::fromUtf8(err->message); if (err->domain != GST_STREAM_ERROR && err->code != GST_STREAM_ERROR_FAILED) { p->error += "\nMay be you should install more of gstreamer plugins"; lastError = QString::fromUtf8(err->message); } qDebug() << Q_FUNC_INFO << ": Gstreamer error:" << p->error; g_error_free(err); g_free(debug); Q_EMIT error(); } break; } case GST_MESSAGE_EOS: { qDebug() << Q_FUNC_INFO << ":" << parentWidget()->objectName() << " End of track reached"; Q_EMIT finish(); break; } case GST_MESSAGE_STATE_CHANGED: { GstState old_state, new_state; gst_message_parse_state_changed(message, &old_state, &new_state, nullptr); switch (new_state) { case GST_STATE_PAUSED: case GST_STATE_NULL: p->rms_l = p->rms_r = 0; p->rmsout_l = p->rmsout_r = 0; default: break; } break; } case GST_MESSAGE_ELEMENT: { const GstStructure* s = gst_message_get_structure(message); const gchar* src_name = GST_MESSAGE_SRC_NAME(message); if (strcmp(src_name, "levelintern") == 0) { gint channels; gdouble peak_dB; gdouble rms; gint i; #ifdef GST_API_VERSION_1 const GValue* array_val; GValueArray* peak_arr; array_val = gst_structure_get_value(s, "peak"); peak_arr = (GValueArray*)g_value_get_boxed(array_val); channels = peak_arr->n_values; for (i = 0; i < channels; ++i) { peak_dB = g_value_get_double(peak_arr->values + i); #else const GValue* list; const GValue* value; list = gst_structure_get_value(s, "peak"); channels = gst_value_list_get_size(list); for (i = 0; i < channels; ++i) { list = gst_structure_get_value(s, "peak"); value = gst_value_list_get_value(list, i); peak_dB = g_value_get_double(value); #endif /* converting from dB to normal gives us a value between 0.0 and 1.0 */ rms = pow(10, peak_dB / 20); if (i == 0) p->rms_l = rms; else p->rms_r = rms; } } if (strcmp(src_name, "levelout") == 0) { gint channels; gdouble peak_dB; gdouble rms; gint i; #ifdef GST_API_VERSION_1 const GValue* array_val; GValueArray* peak_arr; array_val = gst_structure_get_value(s, "peak"); peak_arr = (GValueArray*)g_value_get_boxed(array_val); channels = peak_arr->n_values; for (i = 0; i < channels; ++i) { peak_dB = g_value_get_double(peak_arr->values + i); #else const GValue* list; const GValue* value; list = gst_structure_get_value(s, "peak"); channels = gst_value_list_get_size(list); for (i = 0; i < channels; ++i) { list = gst_structure_get_value(s, "peak"); value = gst_value_list_get_value(list, i); peak_dB = g_value_get_double(value); #endif /* converting from dB to normal gives us a value between 0.0 and 1.0 */ rms = pow(10, peak_dB / 20); if (i == 0) p->rmsout_l = rms; else p->rmsout_r = rms; } } } break; default: break; } } knowthelist-2.3.1/src/player.h000077500000000000000000000042161342115213400163260ustar00rootroot00000000000000/* Copyright (C) 2011-2019 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #ifndef PLAYER_H #define PLAYER_H #include #include #define GST_DISABLE_LOADSAVE 1 #define GST_DISABLE_REGISTRY 1 #define GST_DISABLE_DEPRECATED 1 #include class Player : public QWidget { Q_OBJECT public: Player(QWidget* parent = nullptr); ~Player(); bool prepare(); bool ready(); bool canOpen(QString mime); void open(QUrl url); void play(); void stop(); void pause(); bool close(); void setPosition(QTime); QTime position(); double volume(); void setVolume(double); void setGain(double); void setEqualizer(QString, double); QTime length(); bool isPlaying(); bool mediaPlayable(); QString lastError; double levelLeft(); double levelRight(); double levelOutLeft(); double levelOutRight(); void newpad(GstElement* decodebin, GstPad* pad, gpointer data); static GstBusSyncReply bus_cb(GstBus* bus, GstMessage* msg, gpointer data); Q_SIGNALS: void finish(); void error(); void levelChanged(); void positionChanged(); void loadFinished(); private slots: void loadThreadFinished(); void messageReceived(GstMessage* message); private: struct PlayerPrivate* p; GstElement* pipeline; GstBus* bus; gint64 Gstart, Glength; void setLink(int, QUrl&); void asyncOpen(QUrl url); void cleanup(); void sync_set_state(GstElement*, GstState); }; #endif knowthelist-2.3.1/src/playerwidget.cpp000077500000000000000000000332141342115213400200650ustar00rootroot00000000000000/* Copyright (C) 2011 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "playerwidget.h" #include "player.h" #include "trackanalyser.h" #include "ui_playerwidget.h" #include "vumeter.h" #include struct PlayerWidgetPrivate { bool isEndAnnounced; }; PlayerWidget::PlayerWidget(QWidget* parent) : QWidget(parent) , ui(new Ui::PlayerWidget) , songTime(0) , mTrackFinishEmitTime(12000) , m_CurrentTrack(nullptr) , remainCueTime(0) , m_isStarted(false) , m_isHanging(false) , p(new PlayerWidgetPrivate) { ui->setupUi(this); p->isEndAnnounced = false; //create the player player = new Player(this); player->prepare(); ui->butFwd->setIcon(QIcon(":forward.png")); ui->butRew->setIcon(QIcon(":backward.png")); ui->butPlay->setIcon(QIcon(":play.png")); ui->butPlay->setChecked(false); ui->butFwd->setIconSize(QSize(26, 26)); ui->butRew->setIconSize(QSize(26, 26)); ui->butPlay->setIconSize(QSize(26, 26)); ui->butCue->setChecked(false); vuMeter = ui->vuMeter; vuMeter->setOrientation(Qt::Horizontal); vuMeter->LevelColorNormal.setRgb(112, 146, 190); vuMeter->LevelColorHigh.setRgb(218, 59, 9); vuMeter->LevelColorOff.setRgb(31, 45, 65); vuMeter->setLinesPerSegment(2); vuMeter->setSpacesBetweenSegments(1); vuMeter->setSegmentsPerPeak(2); timerLevel = new QTimer(this); connect(timerLevel, SIGNAL(timeout()), SLOT(timerLevel_timeOut())); timerPosition = new QTimer(this); connect(timerPosition, SIGNAL(timeout()), SLOT(timerPosition_timeOut())); connect(player, SIGNAL(finish()), this, SLOT(playerFinished())); connect(player, SIGNAL(error()), this, SLOT(playerError())); connect(player, SIGNAL(loadFinished()), this, SLOT(playerLoaded())); ui->lblTitle->setText(""); ui->lblInfo->setText(""); QFont font = ui->lblInfo->font(); QFont fonttime = ui->lblTime->font(); #if defined(Q_OS_DARWIN) int newSize = font.pointSize() - 4; fonttime.setPointSize(fonttime.pointSize() + 2); #else int newSize = font.pointSize() - 1; #endif font.setPointSize(newSize); ui->lblInfo->setFont(font); ui->lblTime->setFont(fonttime); ui->lblTimeRemain->setFont(fonttime); m_isStarted = false; setAcceptDrops(true); this->stop(); trackanalyser = new TrackAnalyser(this); connect(trackanalyser, SIGNAL(finishGain()), this, SLOT(analyseGainFinished())); } PlayerWidget::~PlayerWidget() { delete player; delete timerPosition; delete timerLevel; delete trackanalyser; trackanalyser = nullptr; delete p; } void PlayerWidget::setVolume(double volume) { player->setVolume(volume); } void PlayerWidget::setGain(double gain) { player->setGain(gain); } void PlayerWidget::setInfo(QPair info) { QString strTrack = (info.first > 1) ? tr("Tracks") : tr("Track"); ui->lblInfo->setText(QString("%1 %2 %3 %4") .arg(info.first) .arg(strTrack) .arg(Track::prettyTime(info.second)) .arg(tr("Hours"))); } void PlayerWidget::setEqualizer(EqBand band, int value) { //ranging from -24.0 to +12.0. player->setEqualizer("band" + QString::number(band), (value - 240) / 10.0); } void PlayerWidget::setPositionMarkers() { if (trackanalyser->finished()) { if (m_skipSilentEnd && trackanalyser->endPosition() > QTime(0, 0)) { qDebug() << Q_FUNC_INFO << "endPosition:" << trackanalyser->endPosition(); qDebug() << Q_FUNC_INFO << "length:" << trackanalyser->length(); remainCueTime = trackanalyser->endPosition().msecsTo(trackanalyser->length()); } else remainCueTime = 0; ui->txtCue->setText("-" + QString::number(remainCueTime / 1000)); } if (!m_isStarted && m_skipSilentBegin && trackanalyser->finished()) { player->setPosition(trackanalyser->startPosition()); ui->butCue->setChecked(true); } } void PlayerWidget::play() { m_isStarted = true; if (m_CurrentTrack) { ui->butPlay->setIcon(QIcon(":pause.png")); ui->butPlay->setChecked(true); player->play(); ui->butCue->setChecked(false); timerLevel->start(50); timerPosition->start(100); Q_EMIT statusChanged(m_isStarted); } else m_isHanging = true; } void PlayerWidget::pause() { ui->butPlay->setIcon(QIcon(":play.png")); ui->butPlay->setChecked(false); m_isStarted = false; player->pause(); timerLevel->stop(); timerPosition->stop(); vuMeter->reset(); Q_EMIT statusChanged(m_isStarted); Q_EMIT levelChanged(0, 0); } void PlayerWidget::stop() { ui->butPlay->setIcon(QIcon(":play.png")); ui->butPlay->setChecked(false); m_isStarted = false; m_isHanging = false; player->stop(); timerLevel->stop(); timerPosition->stop(); vuMeter->reset(); Q_EMIT statusChanged(m_isStarted); Q_EMIT levelChanged(0, 0); } void PlayerWidget::on_butPlay_clicked() { if (m_isStarted) { this->pause(); } else { this->play(); } } void PlayerWidget::analyseGainFinished() { qDebug() << Q_FUNC_INFO << ":" << objectName(); // got gain factor -> emit if (trackanalyser->gainDB() != TrackAnalyser::GAIN_INVALID) { Q_EMIT gainChanged(trackanalyser->gainFactor()); } if (m_CurrentTrack) { setPositionMarkers(); updateTimeAndPositionDisplay(); } } void PlayerWidget::timerLevel_timeOut() { vuMeter->setValueLeft(player->levelLeft()); vuMeter->setValueRight(player->levelRight()); Q_EMIT levelChanged(player->levelOutLeft(), player->levelOutRight()); } void PlayerWidget::timerPosition_timeOut() { updateTimeAndPositionDisplay(); } void PlayerWidget::dragEnterEvent(QDragEnterEvent* event) { //ToDo: remove forein classname tracklist" if (!event->source()) return; event->setDropAction(Qt::CopyAction); QString sourceSite = event->source()->objectName(); QString dropSite = this->objectName(); qDebug() << "PlayerWidget: dragEnterEvent: sourceSite=" << sourceSite << " dropSite=" << dropSite; if (sourceSite.left(4) == dropSite.left(4) || sourceSite.left(9) == "tracklist") { qDebug() << "PlayerWidget: dragEnterEvent: acceptProposedAction"; event->acceptProposedAction(); } } void PlayerWidget::dragMoveEvent(QDragMoveEvent* event) { event->acceptProposedAction(); } void PlayerWidget::dropEvent(QDropEvent* event) { qDebug() << "PlayerWidget: dragEnterEvent: " << event->mimeData(); if (event->mimeData()->hasUrls()) { QList urlList = event->mimeData()->urls(); // returns list of QUrls event->ignore(); if (urlList.size() > 0) // if at least one QUrl is present in list { //load first loadFile(urlList.at(1)); } } else if (event->mimeData()->hasFormat("text/playlistitem")) { //decode playlistitem QByteArray itemData = event->mimeData()->data("text/playlistitem"); QDataStream stream(&itemData, QIODevice::ReadOnly); QVector tags; stream >> tags; event->setDropAction(Qt::MoveAction); event->accept(); //publish dropped Tracks to connected playlist foreach (QStringList tag, tags) { Track* track = new Track(tag); Q_EMIT trackDropped(track); } } else event->ignore(); } void PlayerWidget::loadFile(QUrl file) { qDebug() << Q_FUNC_INFO << "url=" << file; loadTrack(new Track(file)); } void PlayerWidget::loadTrack(Track* track) { if (track) qDebug() << Q_FUNC_INFO << ":" << objectName() << " track=" << track->url(); m_CurrentTrack = track; if (track != nullptr) { drawTitle(); bool doPlay = m_isStarted; player->stop(); QUrl url = track->url(); player->open(url); trackanalyser->setMode(TrackAnalyser::STANDARD); trackanalyser->open(url); if (doPlay) player->play(); } else { if (player->lastError != "") ui->lblTitle->setText(player->lastError); else ui->lblTitle->setText("no track"); ui->lblTime->setText("-:-"); ui->lblTimeMs->setText(".-"); ui->lblTimeRemain->setText("-:-"); ui->lblTimeRemainMs->setText(".-"); stop(); } remainCueTime = 0; ui->sliPosition->setValue(0); ui->txtCue->setText("-"); ui->butCue->setChecked(false); } void PlayerWidget::resizeEvent(QResizeEvent* e) { QWidget::resizeEvent(e); drawTitle(); } void PlayerWidget::drawTitle() { int width = ui->lblTitle->width() - 2; if (width < 300) ui->lblTitle->setStyleSheet("* { font-size: 13pt; }"); else if (width < 400) ui->lblTitle->setStyleSheet("* { font-size: 14pt; }"); else ui->lblTitle->setStyleSheet("* { font-size: 16pt; }"); QFontMetrics metrix(ui->lblTitle->font()); QString clippedText = tr("No track"); if (m_CurrentTrack) clippedText = metrix.elidedText(m_CurrentTrack->prettyTitle(), Qt::ElideRight, width); ui->lblTitle->setText(clippedText); } float PlayerWidget::currentLevelLeft() { return player->levelOutLeft(); } float PlayerWidget::currentLevelRight() { return player->levelOutRight(); } void PlayerWidget::updateTimeAndPositionDisplay(bool isPassive) { QTime length = player->length(); QTime curpos = player->position(); QTime remain(0, 0, 0); long remainMs; //Some tracks deliver no length in state pause if (length == QTime(0, 0) && m_CurrentTrack) length = QTime(0, 0, 0).addSecs(m_CurrentTrack->length()); remainMs = curpos.msecsTo(length); remain = QTime(0, 0, 0).addMSecs(remainMs); //qDebug()<lblTime->setText(curpos.toString("mm:ss")); ui->lblTimeMs->setText("." + curpos.toString("zzz").left(1)); ui->lblTimeRemain->setText("-" + remain.toString("mm:ss")); ui->lblTimeRemainMs->setText("." + remain.toString("zzz").left(1)); //Signal end of track or media error //ToDo: better recognition of media error (play pressed but player is not running) if ((remainMs - remainCueTime - mTrackFinishEmitTime <= 0 && 0 < remainMs) || m_isHanging) { if (!p->isEndAnnounced) { qDebug() << Q_FUNC_INFO << ":" << objectName() << " EMIT aboutFinished"; qDebug() << Q_FUNC_INFO << ": curpos:" << curpos; qDebug() << Q_FUNC_INFO << ": remainMs:" << remainMs; qDebug() << Q_FUNC_INFO << ": remainCueTime:" << remainCueTime; qDebug() << Q_FUNC_INFO << ": mTrackFinishEmitTime:" << mTrackFinishEmitTime; qDebug() << Q_FUNC_INFO << ": m_isHanging:" << m_isHanging; //send signals only once p->isEndAnnounced = true; Q_EMIT aboutFinished(); Q_EMIT trackPlayed(m_CurrentTrack); } } else p->isEndAnnounced = false; //update position slider only if triggerd by timer if (isPassive) { if (length != QTime(0, 0, 0)) ui->sliPosition->setValue(curpos.msecsTo(QTime(0, 0, 0)) * 1000 / length.msecsTo(QTime(0, 0, 0))); else ui->sliPosition->setValue(0); } } void PlayerWidget::playerError() { Q_EMIT trackFinished(); } void PlayerWidget::playerFinished() { Q_EMIT trackFinished(); } void PlayerWidget::playerLoaded() { updateTimeAndPositionDisplay(); } void PlayerWidget::on_butRew_clicked() { if (player->position() < QTime(0, 0, 3)) Q_EMIT rewindPressed(); else player->setPosition(QTime(0, 0, 0)); } void PlayerWidget::on_butFwd_clicked() { Q_EMIT forwardPressed(); } void PlayerWidget::setTrackFinishEmitTime(const int sec) { if (sec >= 0 && sec < 60) mTrackFinishEmitTime = sec * 1000; } void PlayerWidget::on_sliPosition_sliderMoved(int value) { uint length = -player->length().msecsTo(QTime(0, 0, 0)); if (length != 0 && value > 0) { QTime pos = QTime(0, 0, 0); pos = pos.addMSecs(length * (value / 1000.0)); qDebug() << "pos:" << pos; player->setPosition(pos); } updateTimeAndPositionDisplay(false); } void PlayerWidget::on_sliPosition_actionTriggered(int action) { //a workaround for page moving int posi; switch (action) { case 3: posi = ui->sliPosition->value() + 100; break; case 4: posi = ui->sliPosition->value() - 100; if (posi < 100) posi = 1; break; case 1: posi = ui->sliPosition->value() + 10; break; case 2: posi = ui->sliPosition->value() - 10; break; default: return; break; } this->on_sliPosition_sliderMoved(posi); ui->butCue->setChecked(false); } void PlayerWidget::on_butCue_clicked() { //ToDo: Visualize skipped silent at start and at the end (color bar) this->pause(); player->setPosition(trackanalyser->startPosition()); updateTimeAndPositionDisplay(); } knowthelist-2.3.1/src/playerwidget.h000077500000000000000000000071461342115213400175370ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #ifndef PLAYERWIDGET_H #define PLAYERWIDGET_H #include #include #include #include #include #include #include "player.h" #include "vumeter.h" #include "playlistitem.h" #include "trackanalyser.h" namespace Ui { class PlayerWidget; } class PlayerWidget : public QWidget { Q_OBJECT public: explicit PlayerWidget(QWidget* parent = 0); ~PlayerWidget(); enum EqBand { EQ_Low = 0, EQ_Mid = 1, EQ_High = 2 }; float currentLevelLeft(); float currentLevelRight(); void loadFile(QUrl); void play(); void stop(); void pause(); bool isStarted() { return m_isStarted; } void setTrackFinishEmitTime(const int sec); int TrackFinishEmitTime() { return mTrackFinishEmitTime; } void setVolume(double volume); void setGain(double gain); void setSkipSilentEnd(bool checked) { m_skipSilentEnd = checked; setPositionMarkers(); } void setSkipSilentBegin(bool checked) { m_skipSilentBegin = checked; setPositionMarkers(); } public Q_SLOTS: void loadTrack(Track*); void analyseGainFinished(); void setEqualizer(EqBand, int); void setInfo(QPair info); Q_SIGNALS: void trackFinished(); void aboutFinished(); void trackDropped(Track*); void trackPlayed(Track*); void forwardPressed(); void rewindPressed(); void statusChanged(bool); void gainChanged(double); void levelChanged(double, double); private Q_SLOTS: void on_butCue_clicked(); void on_sliPosition_actionTriggered(int action); void updateTimeAndPositionDisplay(bool isPassive = true); void playerFinished(); void playerError(); void playerLoaded(); void timerLevel_timeOut(); void timerPosition_timeOut(); void on_sliPosition_sliderMoved(int); void on_butPlay_clicked(); void on_butRew_clicked(); void on_butFwd_clicked(); protected: VUMeter* vuMeter; long songTime; private: //ToDo: move privates to struct Private Ui::PlayerWidget* ui; QToolButton* initButton(QStyle::StandardPixmap icon, const QString& tip, QObject* dstobj, const char* slot_method, QLayout* layout); void createUI(QBoxLayout* appLayout); void resizeEvent(QResizeEvent* e); void drawTitle(); Player* player; TrackAnalyser* trackanalyser; float m_level; QLabel* m_positionLabel; QLabel* m_volumeLabel; QTimer* timerLevel; QTimer* timerPosition; void dropEvent(QDropEvent*); void dragEnterEvent(QDragEnterEvent*); void dragMoveEvent(QDragMoveEvent*); void setPositionMarkers(); int mTrackFinishEmitTime; Track* m_CurrentTrack; long remainCueTime; bool m_isStarted; bool m_isHanging; bool m_skipSilentEnd; bool m_skipSilentBegin; struct PlayerWidgetPrivate* p; }; #endif // PLAYERWIDGET_H knowthelist-2.3.1/src/playerwidget.ui000077500000000000000000003473271342115213400177350ustar00rootroot00000000000000 PlayerWidget 0 0 699 130 0 0 Form QFrame#frame{ background: qlineargradient( x1:0, y1:0, x2:0, y2:1, stop: 0.03 #666666, stop:0.2 #777777, stop:1 black ); } QPushButton { color: white; border: 1.5px solid #333333; border-radius: 4px; padding: 1px; background: qlineargradient( x1:0, y1:0, x2:0, y2:1, stop:0.1 #505050, stop:1 black ); max-height: 16px; min-height: 10px; } QPushButton#butPlay { color: white; border-style: inset; border: 1.5px solid #333333; border-radius: 4px; padding: 1px; background: qlineargradient( x1:0, y1:0, x2:0, y2:0.3, stop:0.1 white, stop:1 #326f22 ); max-height: 32px; min-height: 32px; } QPushButton#butPlay:checked { background: qlineargradient( x1:0, y1:0, x2:0, y2:0.3, stop:0.1 white, stop:1 #82df52 ); } QPushButton#butCue { color: #333333; border: 1.5px solid #333333; border-radius: 4px; padding: 1px; background: qlineargradient( x1:0, y1:0, x2:0, y2:0.3, stop:0.2 white, stop:1 #9a6242 ); max-height: 29px; min-height: 10px; font-weight: bold; } QPushButton#butCue:checked { background: qlineargradient( x1:0, y1:0, x2:0, y2:0.3, stop:0.2 white, stop:1 #ffa272 ); color: black; } QScrollBar:horizontal { border: 2px solid grey; background: qlineargradient( x1:0, y1:0, x2:0, y2:1, stop:0.1 #505050, stop:1 gray ); height: 15px; margin: 0px 20px 0 20px; } QScrollBar::handle:horizontal { background: qlineargradient( x1:0, y1:0, x2:0, y2:1, stop:0.1 white, stop:1 gray ); min-width: 20px; } QScrollBar::add-line:horizontal { border: 2px solid grey; background: qlineargradient( x1:0, y1:0, x2:0, y2:1, stop:0.1 #505050, stop:1 black ); width: 20px; subcontrol-position: right; subcontrol-origin: margin; } QScrollBar::sub-line:horizontal { border: 2px solid grey; background: qlineargradient( x1:0, y1:0, x2:0, y2:1, stop:0.1 #505050, stop:1 black ); width: 20px; subcontrol-position: left; subcontrol-origin: margin; } QScrollBar:left-arrow:horizontal, QScrollBar::right-arrow:horizontal { border: 2px solid grey; width: 3px; height: 3px; background: white; } QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { background: none; } QFrame#fraDisplay{ border: 1px solid #a2a2a2; border-radius: 3px; background: qradialgradient( cx: 0.5, cy: -1.8, fx: 0.5, fy: 0, radius: 2, stop: 0 #9aa9be, stop: 1 #293859); } QFrame#fraInfo{ } QLabel{ color: #dddddd; } 0 0 0 0 0 0 0 0 0 QFrame::StyledPanel QFrame::Raised 0 0 0 2 2 0 0 0 0 16777215 120 QFrame::NoFrame QFrame::Raised 4 1 7 1 0 4 0 0 18 1000 100 Qt::Horizontal true 0 0 16777215 124 QFrame::NoFrame QFrame::Raised 4 8 2 15 2 0 0 0 25 221 221 221 80 80 80 0 0 0 0 0 0 0 0 0 0 0 0 221 221 221 255 255 255 221 221 221 80 80 80 80 80 80 0 0 0 0 0 0 255 255 220 0 0 0 221 221 221 80 80 80 0 0 0 0 0 0 0 0 0 0 0 0 221 221 221 255 255 255 221 221 221 80 80 80 80 80 80 0 0 0 0 0 0 255 255 220 0 0 0 221 221 221 80 80 80 0 0 0 0 0 0 0 0 0 0 0 0 221 221 221 255 255 255 221 221 221 80 80 80 80 80 80 0 0 0 0 0 0 255 255 220 0 0 0 Sans Serif 16 false texttexttextt false Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true 2 0 0 17 31 400 16777215 QFrame::NoFrame QFrame::Raised 6 5 2 2 0 0 17 17 400 16777215 QFrame::NoFrame QFrame::Raised 0 0 2 10 0 0 0 0 15 16777215 14 DejaVu Sans Mono TextLabel Qt::AlignCenter true 1 0 0 0 0 25 400 16777215 QFrame::NoFrame QFrame::Raised 1 2 1 5 true 0 0 0 18 16777215 16777215 221 221 221 80 80 80 0 0 0 0 0 0 0 0 0 0 0 0 221 221 221 255 255 255 221 221 221 80 80 80 80 80 80 0 0 0 0 0 0 255 255 220 0 0 0 221 221 221 80 80 80 0 0 0 0 0 0 0 0 0 0 0 0 221 221 221 255 255 255 221 221 221 80 80 80 80 80 80 0 0 0 0 0 0 255 255 220 0 0 0 221 221 221 80 80 80 0 0 0 0 0 0 0 0 0 0 0 0 221 221 221 255 255 255 221 221 221 80 80 80 80 80 80 0 0 0 0 0 0 255 255 220 0 0 0 DejaVu Sans Mono 15 50 false false 00:00 false Qt::AlignBottom|Qt::AlignRight|Qt::AlignTrailing -1 0 true 0 0 0 18 16777215 16777215 221 221 221 80 80 80 0 0 0 0 0 0 0 0 0 0 0 0 221 221 221 255 255 255 221 221 221 80 80 80 80 80 80 0 0 0 0 0 0 255 255 220 0 0 0 221 221 221 80 80 80 0 0 0 0 0 0 0 0 0 0 0 0 221 221 221 255 255 255 221 221 221 80 80 80 80 80 80 0 0 0 0 0 0 255 255 220 0 0 0 221 221 221 80 80 80 0 0 0 0 0 0 0 0 0 0 0 0 221 221 221 255 255 255 221 221 221 80 80 80 80 80 80 0 0 0 0 0 0 255 255 220 0 0 0 DejaVu Sans Mono 10 50 false .00 false Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft false 2 0 0 0 0 25 QFrame::NoFrame QFrame::Raised true 0 0 57 18 255 61 42 80 80 80 0 0 0 0 0 0 0 0 0 0 0 0 255 61 42 255 255 255 255 61 42 80 80 80 80 80 80 0 0 0 0 0 0 255 255 220 0 0 0 255 61 42 80 80 80 0 0 0 0 0 0 0 0 0 0 0 0 255 61 42 255 255 255 255 61 42 80 80 80 80 80 80 0 0 0 0 0 0 255 255 220 0 0 0 255 61 42 80 80 80 0 0 0 0 0 0 0 0 0 0 0 0 255 61 42 255 255 255 255 61 42 80 80 80 80 80 80 0 0 0 0 0 0 255 255 220 0 0 0 DejaVu Sans Mono 15 <html><head/><body><p><span style=" color:#ffffff;">Time remain</span></p></body></html> color: rgb(255, 61, 42); -00:00 Qt::AlignBottom|Qt::AlignRight|Qt::AlignTrailing false -2 0 true 0 0 0 18 16777215 16777215 255 61 42 80 80 80 0 0 0 0 0 0 0 0 0 0 0 0 255 61 42 255 255 255 255 61 42 80 80 80 80 80 80 0 0 0 0 0 0 255 255 220 0 0 0 255 61 42 80 80 80 0 0 0 0 0 0 0 0 0 0 0 0 255 61 42 255 255 255 255 61 42 80 80 80 80 80 80 0 0 0 0 0 0 255 255 220 0 0 0 255 61 42 80 80 80 0 0 0 0 0 0 0 0 0 0 0 0 255 61 42 255 255 255 255 61 42 80 80 80 80 80 80 0 0 0 0 0 0 255 255 220 0 0 0 DejaVu Sans Mono 10 color: rgb(255, 61, 42); .00 Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft 2 0 true 33 16 DejaVu Sans Mono 11 50 false <html><head/><body><p><span style=" color:#ffffff;">Seconds of silence at the end </span></p></body></html> color: rgb(255, 61, 42); -00 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 0 0 95 0 16777215 120 QFrame::NoFrame QFrame::Raised QLayout::SetDefaultConstraint 8 0 16 0 0 0 0 54 38 QFrame::NoFrame QFrame::Raised 6 0 0 1 1 60 38 60 38 true 0 0 73 8 QFrame::NoFrame QFrame::Raised 0 0 0 0 0 1 1 30 16 24 22 1 1 30 16 24 22 0 0 0 35 QFrame::NoFrame QFrame::Raised 0 0 59 16 59 35 75 true Jump to the point where the music starts mainly CUE true false VUMeter QWidget
vumeter.h
1
knowthelist-2.3.1/src/playlist.cpp000077500000000000000000001001431342115213400172220ustar00rootroot00000000000000/* Copyright (C) 2005-2019 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "playlist.h" #include "playlistitem.h" #include #include #include #include #include #include #include #include #include #include #include #include Playlist::Playlist(QWidget* parent) : QTreeWidget(parent) , m_alternateMax(0) , m_marker(nullptr) , m_NextTrackColor(QColor(200, 200, 255)) , m_CurrentTrackColor(QColor(255, 100, 100)) , nextPlaylistItem(nullptr) , previousPlaylistItem(nullptr) , newPlaylistItem(nullptr) , currentPlaylistItem(nullptr) , m_PlaylistMode(Playlist::Playlist_Single) , showDropHighlighter(false) , autoClearOn(false) , m_isPlaying(false) , m_isInternDrop(false) , m_dragLocked(false) , isChangeSignalEnabled(true) { setSortingEnabled(false); setAcceptDrops(true); setDragEnabled(true); setAllColumnsShowFocus(false); setDropIndicatorShown(true); setAcceptDrops(true); setDragEnabled(true); setSelectionBehavior(QAbstractItemView::SelectRows); setSelectionMode(QAbstractItemView::ExtendedSelection); setDragDropMode(QAbstractItemView::InternalMove); setAttribute(Qt::WA_MacShowFocusRect, false); setUniformRowHeights(true); QStringList headers; headers << tr("Url") << tr("No") << tr("Played") << tr("Artist") << tr("Title"); headers << tr("Album") << tr("Year") << tr("Genre") << tr("Track"); headers << tr("Length") << tr("Rate"); QTreeWidgetItem* headeritem = new QTreeWidgetItem(headers); setHeaderItem(headeritem); setHeaderLabels(headers); // header()->setResizeMode(QHeaderView::Interactive); header()->hideSection(PlaylistItem::Column_Url); // prevent click event if doubleclicked ignoreNextRelease = false; timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(emitClicked())); timerDragLock = new QTimer(this); timerDragLock->setInterval(300); connect(timerDragLock, SIGNAL(timeout()), this, SLOT(timeoutDragLock())); connect(this, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(slotItemClicked(QTreeWidgetItem*, int))); connect(this, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)), this, SLOT(slotItemDoubleClicked(QTreeWidgetItem*, int))); connect(this, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(slotItemChanged(QTreeWidgetItem*, QTreeWidgetItem*))); } Playlist::~Playlist() { // save width and sort settings QSettings settings; settings.setValue("playlist_" + objectName(), header()->saveState()); } /** Add a song to the playlist */ void Playlist::addTrack(QUrl file, PlaylistItem* after) { Track* track = new Track(file); addTrack(track, after); } void Playlist::addTrack(Track* track, PlaylistItem* after) { if (!track || !track->isValid()) return; // qDebug() << Q_FUNC_INFO <<":"< tracks) { clear(); appendTracks(tracks); } void Playlist::appendTracks(const QList tracks) { // a week attempt to speed up the setItemWidget time issue setUpdatesEnabled(false); bool doSort = isSortingEnabled(); setSortingEnabled(false); hide(); appendTracks(tracks, (PlaylistItem*)lastChild()); setSortingEnabled(doSort); setUpdatesEnabled(true); show(); } void Playlist::appendTracks(QList tracks, PlaylistItem* after) { foreach (Track* track, tracks) { if (track != nullptr) { addTrack(new Track(*track), after); after = this->newTrack(); } } checkCurrentItem(); } void Playlist::setPlaylistMode(Mode newMode) { m_PlaylistMode = newMode; double percent = this->size().width() / 100.0; switch (m_PlaylistMode) { case Playlist::Tracklist: header()->hideSection(PlaylistItem::Column_No); header()->showSection(PlaylistItem::Column_Played); header()->showSection(PlaylistItem::Column_Year); header()->showSection(PlaylistItem::Column_Genre); header()->showSection(PlaylistItem::Column_Tracknumber); header()->showSection(PlaylistItem::Column_Album); header()->showSection(PlaylistItem::Column_Rate); header()->resizeSection(PlaylistItem::Column_Artist, 22 * percent); header()->resizeSection(PlaylistItem::Column_Title, 22 * percent); header()->resizeSection(PlaylistItem::Column_Album, 20 * percent); header()->resizeSection(PlaylistItem::Column_Length, 7 * percent); header()->resizeSection(PlaylistItem::Column_Genre, 10 * percent); header()->resizeSection(PlaylistItem::Column_Year, 8 * percent); header()->resizeSection(PlaylistItem::Column_Tracknumber, 5 * percent); header()->resizeSection(PlaylistItem::Column_Played, 5 * percent); header()->resizeSection(PlaylistItem::Column_Rate, 75); setSortingEnabled(true); sortByColumn(PlaylistItem::Column_Played, Qt::DescendingOrder); m_CurrentTrackColor = Qt::white; m_NextTrackColor = Qt::white; break; default: header()->showSection(PlaylistItem::Column_No); header()->hideSection(PlaylistItem::Column_Played); header()->hideSection(PlaylistItem::Column_Year); header()->hideSection(PlaylistItem::Column_Genre); header()->hideSection(PlaylistItem::Column_Tracknumber); header()->hideSection(PlaylistItem::Column_Album); header()->hideSection(PlaylistItem::Column_Rate); header()->resizeSection(PlaylistItem::Column_No, 6 * percent); header()->resizeSection(PlaylistItem::Column_Artist, 40 * percent); header()->resizeSection(PlaylistItem::Column_Title, 40 * percent); header()->resizeSection(PlaylistItem::Column_Length, 10 * percent); header()->resizeSection(PlaylistItem::Column_Rate, 0); setSortingEnabled(false); m_CurrentTrackColor = QColor(255, 100, 100); m_NextTrackColor = QColor(200, 200, 255); } QSettings settings; if (settings.contains("playlist_" + objectName())) header()->restoreState( settings.value("playlist_" + objectName()).toByteArray()); handleChanges(); } void Playlist::checkCurrentItem() { if (autoClearOn && newPlaylistItem == firstChild()) setCurrentPlaylistItem(newPlaylistItem); if (!currentPlaylistItem) setCurrentPlaylistItem(firstChild()); handleChanges(); } /** handle changes after remove or adding tracks to play list */ void Playlist::handleChanges() { if (m_PlaylistMode == Playlist::Tracklist) return; if (itemBelow(currentPlaylistItem)) { nextPlaylistItem = (PlaylistItem*)itemBelow(currentPlaylistItem); } else { nextPlaylistItem = nullptr; } updatePlaylistItems(); Q_EMIT countChanged(countTrack()); Q_EMIT countChanged(allTracks()); fillNoColumn(); isChangeSignalEnabled = true; } void Playlist::setCurrentPlaylistItem(PlaylistItem* item) { currentPlaylistItem = item; if (autoClearOn) { // Only for the mode, where current item is always on top of the list if (currentPlaylistItem != firstChild()) { // Move nextPlaylistItem at first row QTreeWidgetItem* child = takeTopLevelItem(indexOfTopLevelItem(item)); this->insertTopLevelItem(0, child); currentPlaylistItem = (PlaylistItem*)child; } } if (currentPlaylistItem) Q_EMIT currentTrackChanged(currentPlaylistItem->track()); else Q_EMIT currentTrackChanged(nullptr); } void Playlist::setNextPlaylistItem(PlaylistItem* item) { if (autoClearOn) { // Move nextPlaylistItem to second row // Only for the mode, where current item is always on top of the list QTreeWidgetItem* child = takeTopLevelItem(indexOfTopLevelItem(item)); this->insertTopLevelItem(1, child); handleChanges(); } } void Playlist::updatePlaylistItems() { // Set all items to normal for (PlaylistItem* item = firstChild(); item; item = item->nextSibling()) { if (item) { item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled); item->setForeColor(Qt::white); } } if (currentPlaylistItem) { if (m_isPlaying) currentPlaylistItem->setFlags(Qt::ItemIsEnabled); else currentPlaylistItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled); if (!m_isCurrentList) currentPlaylistItem->setForeColor(m_CurrentTrackColor.darker(130)); else currentPlaylistItem->setForeColor(m_CurrentTrackColor); } if (nextPlaylistItem) { nextPlaylistItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled); if (!m_isCurrentList) nextPlaylistItem->setForeColor(m_NextTrackColor.darker(130)); else nextPlaylistItem->setForeColor(m_NextTrackColor); } } QList Playlist::allTracks() { QList trackList; for (int i = 0; i < this->topLevelItemCount(); i++) { if (PlaylistItem* item = dynamic_cast(this->topLevelItem(i))) { if (item->track()->isValid()) trackList.append(item->track()); } } return trackList; } void Playlist::removePlaylistItem(PlaylistItem* item) { if (item) { qDebug() << Q_FUNC_INFO << ":" << item->track()->url(); // unset if not available any more if (item == currentPlaylistItem) setCurrentPlaylistItem(nullptr); if (item == nextPlaylistItem) setNextPlaylistItem(nullptr); newPlaylistItem = nullptr; takeTopLevelItem(indexOfTopLevelItem(item)); delete item; } } void Playlist::skipForward() { qDebug() << Q_FUNC_INFO << ":" << objectName(); // remove previous item at last due to keep playing if (autoClearOn) { previousPlaylistItem = currentPlaylistItem; setCurrentPlaylistItem((PlaylistItem*)itemBelow(currentPlaylistItem)); removePlaylistItem(previousPlaylistItem); } else { if (itemBelow(currentPlaylistItem)) { setCurrentPlaylistItem((PlaylistItem*)itemBelow(currentPlaylistItem)); } } handleChanges(); } void Playlist::skipRewind() { if (itemAbove(currentPlaylistItem)) { setCurrentPlaylistItem((PlaylistItem*)itemAbove(currentPlaylistItem)); } handleChanges(); } QString Playlist::defaultPlaylistPath() { #if QT_VERSION >= 0x050000 QString pathName = QStandardPaths::standardLocations(QStandardPaths::DataLocation).at(0); #else QString pathName = QDesktopServices::storageLocation(QDesktopServices::DataLocation); #endif QDir path(pathName); if (!path.exists()) path.mkpath(pathName); return path.absolutePath() + "/" + this->objectName() + ".xspf"; } // Export content as a xspf playlist void Playlist::saveXML(const QString& path) const { qDebug() << Q_FUNC_INFO << "BEGIN "; QFile file(path); if (!file.open(QFile::WriteOnly)) return; QDomDocument newdoc; QDomElement playlistElem = newdoc.createElement("playlist"); playlistElem.setAttribute("version", "1"); playlistElem.setAttribute("xmlns", "http://xspf.org/ns/0/"); newdoc.appendChild(playlistElem); QDomElement elem = newdoc.createElement("creator"); QDomText t = newdoc.createTextNode("Knowthelist"); elem.appendChild(t); playlistElem.appendChild(elem); QDomElement listElem = newdoc.createElement("trackList"); for (PlaylistItem* item = firstChild(); item; item = item->nextSibling()) { if (item) { QDomElement trackElem = newdoc.createElement("track"); QDomElement extElem = newdoc.createElement("extension"); if (currentPlaylistItem && item == currentPlaylistItem) { extElem.setAttribute("current", "1"); } if (item == nextTrack()) { extElem.setAttribute("next", "1"); } if (item->track()->flags().testFlag(Track::isAutoDjSelection)) { extElem.setAttribute("isAutoDjSelection", "1"); } QStringList tag = item->track()->tagList(); for (int x = 0; x < tag.count(); ++x) { if (x == 4 || x == 5) { extElem.setAttribute(Track::tagNameList.at(x), tag.at(x)); } else { QDomElement elem = newdoc.createElement(Track::tagNameList.at(x)); QDomText t = newdoc.createTextNode(tag.at(x)); elem.appendChild(t); trackElem.appendChild(elem); } } trackElem.appendChild(extElem); listElem.appendChild(trackElem); } } playlistElem.appendChild(listElem); QTextStream stream(&file); stream.setCodec("UTF-8"); stream << "\n"; stream << newdoc.toString(); file.close(); qDebug() << Q_FUNC_INFO << "END "; } void Playlist::loadXML(const QString& path) { QFile file(path); if (file.open(QFile::ReadOnly)) { QTextStream stream(&file); stream.setCodec(QTextCodec::codecForName("utf8")); QDomDocument d; if (!d.setContent(stream.readAll())) { qDebug() << "Could not load XML\n"; return; } QDomNode n = d.namedItem("playlist").namedItem("trackList").firstChild(); const QString TRACK( "track"); // so we don't construct the QStrings all the time const QString URL("url"); const QString CURRENT("current"); const QString NEXT("next"); while (!n.isNull()) { if (n.nodeName() == TRACK) { const QDomElement e = n.toElement(); if (e.isNull()) { qDebug() << "Element '" << n.nodeName() << "' is null, skipping."; continue; } // qDebug() << "Add from xml url='" << e.attribute( URL ); Track* track = new Track(); track->setUrl(QUrl::fromLocalFile( e.namedItem("location").firstChild().nodeValue())); track->setArtist(e.namedItem("creator").firstChild().nodeValue()); track->setTitle(e.namedItem("title").firstChild().nodeValue()); track->setAlbum(e.namedItem("album").firstChild().nodeValue()); track->setGenre( e.namedItem("extension").toElement().attribute("genre")); track->setYear(e.namedItem("extension").toElement().attribute("year")); track->setLength(e.namedItem("duration").firstChild().nodeValue()); track->setCounter("0"); if (e.namedItem("extension") .toElement() .attribute("isAutoDjSelection") == "1") track->setFlags(track->flags() | Track::isAutoDjSelection); appendSong(track); if (e.namedItem("extension").toElement().attribute(CURRENT) == "1") this->setCurrentPlaylistItem(newPlaylistItem); if (e.namedItem("extension").toElement().attribute(NEXT) == "1") this->setNextPlaylistItem(newPlaylistItem); } n = n.nextSibling(); } } file.close(); qDebug() << "End " << Q_FUNC_INFO; } void Playlist::removeSelectedItems() { if (m_PlaylistMode == Playlist::Tracklist) return; QListIterator it(selectedItems()); while (it.hasNext()) { PlaylistItem* item = dynamic_cast(it.next()); if (item != currentPlaylistItem || (!m_isPlaying)) removePlaylistItem(item); } if (this->topLevelItemCount() > 1 || !this->isPlaying()) checkCurrentItem(); } void Playlist::fillNoColumn() { int no = 0; int i = 0; for (int ii = 0; ii < this->topLevelItemCount(); ii++) { QTreeWidgetItem* item = this->topLevelItem(ii); // if this item number is less then then alternateMax increment 2 // (alternate) else 1 alternateMax is equal to the count of then other // player+1 i++; // qDebug() << this->name() << ": markNextTrack(): " << markNextTrack(); if (m_PlaylistMode != Playlist::Playlist_Multi) no = i; else if (i > m_alternateMax) no = i + m_alternateMax; else { if (m_isCurrentList) no = i * 2 - 1; else no = i * 2; } // qDebug() << this->name() << ": m_alternateMax: " << m_alternateMax << " // i: " << i << " no: " << no; item->setText(PlaylistItem::Column_No, QString::number(no)); } } void Playlist::onRatingChanged(float rate) { if (RatingWidget* rateWidget = dynamic_cast(QObject::sender())) { QModelIndex modidx = indexAt(QPoint(0, rateWidget->pos().y())); (PlaylistItem*)this->itemFromIndex(modidx); if (PlaylistItem* item = (PlaylistItem*)this->itemFromIndex(modidx)) { Track* track = item->track(); if (track) { track->setRate(rate * 10); qDebug() << Q_FUNC_INFO << item->track()->url(); emit trackPropertyChanged(track); } } } } void Playlist::slotItemChanged(QTreeWidgetItem* current, QTreeWidgetItem* previous) { Q_UNUSED(previous); if ((selectedItems().count() > 1) || (selectedItems().count() == 0)) return; PlaylistItem* item = static_cast(current); if (item && isChangeSignalEnabled) emit trackSelected(item->track()); } void Playlist::slotItemDoubleClicked(QTreeWidgetItem* sender, int column) { Q_UNUSED(column); PlaylistItem* item = static_cast(sender); if (item) emit trackDoubleClicked(item->track()); } void Playlist::slotItemClicked(QTreeWidgetItem* after, int col) { isChangeSignalEnabled = true; PlaylistItem* item = static_cast(after); if (item) emit trackSelected(item->track()); } // avoid multiple drops on quick drags void Playlist::timeoutDragLock() { m_dragLocked = false; timerDragLock->stop(); } // prevent click event if doubleclicked void Playlist::emitClicked() { emit itemClicked(currentItem(), currentColumn()); timer->stop(); } void Playlist::mouseReleaseEvent(QMouseEvent* event) { if (!ignoreNextRelease) { timer->start(QApplication::doubleClickInterval()); blockSignals(true); QTreeWidget::mouseReleaseEvent(event); blockSignals(false); } ignoreNextRelease = false; } void Playlist::mouseDoubleClickEvent(QMouseEvent* event) { ignoreNextRelease = true; timer->stop(); QTreeWidget::mouseDoubleClickEvent(event); } void Playlist::mousePressEvent(QMouseEvent* e) { if (e->button() == Qt::LeftButton) { startPos = e->pos(); } QTreeWidget::mousePressEvent(e); if (e->button() == Qt::RightButton) showContextMenu(dynamic_cast(currentItem()), currentColumn()); } void Playlist::mouseMoveEvent(QMouseEvent* event) { if (event->buttons() & Qt::LeftButton) { int distance = (event->pos() - startPos).manhattanLength(); if (distance >= QApplication::startDragDistance() && !m_dragLocked) { performDrag(); } } } void Playlist::performDrag() { m_dragLocked = true; QByteArray itemData; QDataStream dataStream(&itemData, QIODevice::WriteOnly); QVector tags; QPixmap cover; int i = 0; // iterate selected items QListIterator it(selectedItems()); while (it.hasNext()) { PlaylistItem* item = dynamic_cast(it.next()); if ((item != currentPlaylistItem || (!m_isPlaying)) && item->track()->isValid()) { qDebug() << Q_FUNC_INFO << ": send Data:" << item->track()->url(); QStringList tag = item->track()->tagList(); tags << tag; if (i == 0) { cover = QPixmap::fromImage(item->track()->coverImage()); emit trackSelected(item->track()); } i++; } } dataStream << tags; QMimeData* mimeData = new QMimeData; mimeData->setData("text/playlistitem", itemData); QDrag* drag = new QDrag(this); drag->setMimeData(mimeData); if (!cover.isNull()) drag->setPixmap(cover.scaled(50, 50)); timerDragLock->start(); Qt::DropAction dropAction = (m_PlaylistMode != Playlist::Tracklist) ? Qt::MoveAction : Qt::CopyAction; if (drag->exec(dropAction) == Qt::MoveAction) { // ToDo: before remove, give over current or next Track to newTrack, if // within the same playlist isChangeSignalEnabled = false; removeSelectedItems(); } } void Playlist::dragEnterEvent(QDragEnterEvent* event) { if (m_PlaylistMode == Playlist::Tracklist) { event->ignore(); return; } if (event->mimeData()->hasFormat("text/uri-list") || event->mimeData()->hasFormat("text/playlistitem")) { event->acceptProposedAction(); } } void Playlist::dropEvent(QDropEvent* event) { m_isInternDrop = false; if (event->mimeData()->hasUrls()) { QList urlList = event->mimeData()->urls(); // returns list of QUrls event->accept(); appendList(urlList, m_marker); } else if (event->mimeData()->hasFormat("text/playlistitem")) { // decode playlistitem QByteArray itemData = event->mimeData()->data("text/playlistitem"); QDataStream stream(&itemData, QIODevice::ReadOnly); QVector tags; stream >> tags; // add Tracks to this playlist foreach (QStringList tag, tags) { qDebug() << Q_FUNC_INFO << ": is playlistitem; tags:" << tags; addTrack(new Track(tag), m_marker); m_marker = this->newTrack(); } checkCurrentItem(); event->acceptProposedAction(); if (event->source()->objectName() == this->objectName()) m_isInternDrop = true; } else event->ignore(); showDropHighlighter = false; viewport()->repaint(); } void Playlist::dragMoveEvent(QDragMoveEvent* event) { dropSite = event->answerRect(); showDropHighlighter = true; event->acceptProposedAction(); viewport()->repaint(); } void Playlist::dragLeaveEvent(QDragLeaveEvent* event) { Q_UNUSED(event); showDropHighlighter = false; viewport()->repaint(); } void Playlist::paintEvent(QPaintEvent* event) { QTreeView::paintEvent(event); if (showDropHighlighter) { QPainter painter(viewport()); int x, y, w, h; dropSite.getRect(&x, &y, &w, &h); QPoint point(x, y); QModelIndex modidx = indexAt(point); int addHeight = 0; // if is playing mark as next only if (isPlaying() && modidx.row() == 0) { modidx = model()->index(1, 1); } // Draw drop line after last item if (!modidx.isValid()) { modidx = model()->index(model()->rowCount() - 1, 1, modidx); addHeight = 1; } // bookmark item in case of a drop m_marker = (PlaylistItem*)this->itemFromIndex(modidx); if (addHeight == 0) { if (itemAbove(m_marker)) { // one item above m_marker = (PlaylistItem*)itemAbove(m_marker); } else { // add new item at first row m_marker = nullptr; } } // qDebug() << Q_FUNC_INFO <<": modidx:"<accept(); } void Playlist::keyPressEvent(QKeyEvent* e) { qDebug() << Q_FUNC_INFO << " " << e->key() << "del=" << Qt::Key_Delete; PlaylistItem* item = static_cast(currentItem()); if ((e->key() == Qt::Key_Delete) || (e->key() == 0x1000003)) // also for Mac { this->removeSelectedItems(); } else if (e->key() == Qt::Key_L) { setCurrentPlaylistItem(item); handleChanges(); } else if (e->key() == Qt::Key_N) { setNextPlaylistItem(item); } else if (e->key() == Qt::Key_1) Q_EMIT wantLoad(item->track(), "Left"); else if (e->key() == Qt::Key_2) Q_EMIT wantLoad(item->track(), "Right"); else if (e->key() == Qt::Key_P) Q_EMIT trackDoubleClicked(item->track()); else if (e->key() == Qt::CTRL + Qt::Key_S) Q_EMIT wantSearch(QString::null); else QTreeWidget::keyPressEvent(e); } // needed for showContextMenu actions void Playlist::dummySlot() {} void Playlist::showContextMenu(PlaylistItem* item, int col) { enum Id { LOAD, LOAD_NEXT, VIEW, EDIT, REMOVE, LISTEN, FILTER, LOAD1, LOAD2 }; if (item == nullptr) return; const bool isCurrentPlaylistItem = (item == currentPlaylistItem); QMenu popup(this); popup.setTitle(item->track()->prettyTitle(50)); if (m_PlaylistMode == Playlist::Tracklist) { popup.addAction(style()->standardPixmap(QStyle::SP_MediaPlay), tr("Add to PlayList&1"), this, SLOT(dummySlot()), Qt::Key_1); //, LOAD1 popup.addAction(style()->standardPixmap(QStyle::SP_MediaPlay), tr("Add to PlayList&2"), this, SLOT(dummySlot()), Qt::Key_2); //, LOAD2 } if (!m_isPlaying && !isCurrentPlaylistItem && m_PlaylistMode != Playlist::Tracklist) popup.addAction(style()->standardPixmap(QStyle::SP_MediaPlay), tr("&Load"), this, SLOT(dummySlot()), Qt::Key_L); if (!isCurrentPlaylistItem && m_PlaylistMode != Playlist::Tracklist) popup.addAction(style()->standardPixmap(QStyle::SP_ArrowRight), tr("Load as &Next"), this, SLOT(dummySlot()), Qt::Key_N); popup.addSeparator(); popup.addAction(style()->standardPixmap(QStyle::SP_DriveCDIcon), tr("&Prelisten Track"), this, SLOT(dummySlot()), Qt::Key_P); popup.addSeparator(); popup.addAction(style()->standardPixmap(QStyle::SP_ArrowRight), tr("&Search for: '%1'").arg(item->text(col)), this, SLOT(dummySlot()), Qt::Key_S); popup.addSeparator(); if (!isCurrentPlaylistItem && m_PlaylistMode != Playlist::Tracklist) popup.addAction(style()->standardPixmap(QStyle::SP_TrashIcon), tr("&Remove Selected"), this, SLOT(removeSelectedItems()), Qt::Key_Delete); popup.addSeparator(); popup.addAction(style()->standardPixmap(QStyle::SP_DirOpenIcon), tr("&Open File Location"), this, SLOT(dummySlot()), Qt::Key_O); popup.addAction(style()->standardPixmap(QStyle::SP_MessageBoxInformation), tr("&View Tag Information"), this, SLOT(dummySlot()), Qt::Key_V); QAction* a = popup.exec(QCursor::pos()); if (!a) return; QKeySequence shortcut = a->shortcut(); if (shortcut == QKeySequence(Qt::Key_L)) { setCurrentPlaylistItem(item); handleChanges(); } else if (shortcut == QKeySequence(Qt::Key_N)) { setNextPlaylistItem(item); } else if (shortcut == QKeySequence(Qt::Key_1)) { Q_EMIT wantLoad(item->track(), "Left"); } else if (shortcut == QKeySequence(Qt::Key_2)) { Q_EMIT wantLoad(item->track(), "Right"); } else if (shortcut == QKeySequence(Qt::Key_P)) { Q_EMIT itemDoubleClicked(item, col); } else if (shortcut == QKeySequence(Qt::Key_S)) { Q_EMIT wantSearch(item->text(col)); } else if (shortcut == QKeySequence(Qt::Key_V)) { showTrackInfo(item->track()); } else if (shortcut == QKeySequence(Qt::Key_O)) { if (item->track()) QDesktopServices::openUrl( QUrl(QString("file://%1").arg(item->track()->dirPath()))); } else if (shortcut == QKeySequence(Qt::Key_Delete)) { item = nullptr; } } void Playlist::showTrackInfo(Track* mb) { const QString body = "%1%2"; QString str = " " "width=\"100%\" border=\"1\">"; str += body.arg(tr("Title"), mb->title()); str += body.arg(tr("Artist"), mb->artist()); str += body.arg(tr("Album"), mb->album()); str += body.arg(tr("Genre"), mb->genre()); str += body.arg(tr("Year"), mb->year()); str += body.arg(tr("Location"), mb->url().toString()); str += "
"; QMessageBox::information(nullptr, tr("Meta Information"), str); } knowthelist-2.3.1/src/playlist.h000077500000000000000000000130621342115213400166720ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #ifndef PLAYLIST_H #define PLAYLIST_H #include "track.h" #include class Playlist : public QTreeWidget { Q_OBJECT public: Playlist(QWidget* parent = nullptr); ~Playlist(); //virtual void keyPressEvent ( QKeyEvent* e ); //virtual bool isExecuteArea( const QPoint& point ); enum Mode { Tracklist = 0, Playlist_Single = 1, Playlist_Multi = 2 }; /** Add a songs to the plalist*/ void addTrack(QUrl file, PlaylistItem* after); void appendSong(Track* track); void addTrack(Track* track, PlaylistItem* after); void appendSong(QString songFileName); void appendList(QList, PlaylistItem* after); void appendTracks(const QList tracks, PlaylistItem* after); void saveXML(const QString&) const; void loadXML(const QString&); //---------------- PlaylistItem* firstTrack() const { return firstChild(); } PlaylistItem* nextTrack() const { return nextPlaylistItem; } PlaylistItem* currentTrack() const { return currentPlaylistItem; } PlaylistItem* dragTrack() const { return (PlaylistItem*)this->currentItem(); } PlaylistItem* newTrack() const { return newPlaylistItem; } QList allTracks(); bool isCurrentList() const { return m_isCurrentList; } void setIsCurrentList(bool b) { m_isCurrentList = b; handleChanges(); } bool isEmpty() const { return this->topLevelItemCount() == 0; } bool isFirst() const { return this->topLevelItemCount() == 1; } void setPlaylistMode(Mode); void setAutoClearOn(bool b) { autoClearOn = b; } QString defaultPlaylistPath(); static void showTrackInfo(Track* bundle); PlaylistItem* lastChild() const { return (PlaylistItem*)topLevelItem(topLevelItemCount() - 1); } int countTrack() const { return topLevelItemCount(); } //ToDo: what is for private only? Sort! protected: void keyPressEvent(QKeyEvent* event); void mousePressEvent(QMouseEvent* event); void mouseMoveEvent(QMouseEvent* event); void mouseReleaseEvent(QMouseEvent* event); void mouseDoubleClickEvent(QMouseEvent* event); void dragEnterEvent(QDragEnterEvent* event); void dropEvent(QDropEvent* event); void dragMoveEvent(QDragMoveEvent* event); void dragLeaveEvent(QDragLeaveEvent* event); void paintEvent(QPaintEvent* event); //For better DropTarget QMimeData* mimeData; QDrag* drag; QRect dropSite; Qt::DropAction dropAction; bool showDropHighlighter; public Q_SLOTS: void appendList(QList); void appendTracks(const QList tracks); void changeTracks(const QList tracks); void addCurrentTrack(Track*); void addNextTrack(Track*); void removeSelectedItems(); void setPlaying(bool plays) { m_isPlaying = plays; } bool isPlaying() { return m_isPlaying; } void setAlternateMax(int max) { m_alternateMax = max; fillNoColumn(); } void skipForward(); void skipRewind(); void onRatingChanged(float); Q_SIGNALS: void currentTrackChanged(Track*); void trackDoubleClicked(Track*); void trackPropertyChanged(Track*); void trackSelected(Track*); void wantSearch(QString); void wantLoad(Track*, QString); void countChanged(int); void countChanged(QList); private: void setCurrentPlaylistItem(PlaylistItem*); void setNextPlaylistItem(PlaylistItem*); void removePlaylistItem(PlaylistItem*); void checkCurrentItem(); void updateNextPlaylistItem(); void updateCurrentPlaylistItem(); void updatePlaylistItems(); int m_recursionCount; int mDropVisualizerWidth; int m_alternateMax; void fillNoColumn(); void performDrag(); QTimer* timer; QTimer* timerDragLock; bool ignoreNextRelease; bool m_dragLocked; QPoint startPos; bool m_isPlaying; bool m_isCurrentList; bool m_isInternDrop; bool isChangeSignalEnabled; bool autoClearOn; PlaylistItem* nextPlaylistItem; //the item to be played after the current track PlaylistItem* previousPlaylistItem; PlaylistItem* newPlaylistItem; //the latest item PlaylistItem* currentPlaylistItem; //the item that is playing PlaylistItem* m_marker; //the item that has the drag/drop marker under it QColor m_CurrentTrackColor; QColor m_NextTrackColor; Mode m_PlaylistMode; inline PlaylistItem* firstChild() const { return (PlaylistItem*)topLevelItem(0); } inline PlaylistItem* lastItem() const { return lastChild(); } private Q_SLOTS: void showContextMenu(PlaylistItem*, int); void slotItemClicked(QTreeWidgetItem*, int); void slotItemDoubleClicked(QTreeWidgetItem* sender, int column); void emitClicked(); void timeoutDragLock(); void handleChanges(); void slotItemChanged(QTreeWidgetItem* current, QTreeWidgetItem* previous); void dummySlot(); }; #endif knowthelist-2.3.1/src/playlistbrowser.cpp000077500000000000000000000350631342115213400206360ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "playlistbrowser.h" #include "playlistwidget.h" #include "collectiondb.h" #include "track.h" #include #include #include #include #include class Track; class PlaylistBrowsertPrivate { public: QListWidget* listPlaylists; PlaylistWidget* currentPlaylist; CollectionDB* database; QString directory; }; PlaylistBrowser::PlaylistBrowser(QWidget *parent) : QWidget(parent) { p = new PlaylistBrowsertPrivate; QPushButton* pushSave =new QPushButton(); pushSave->setGeometry(QRect(1,1,60,25)); pushSave->setMaximumWidth(60); pushSave->setMinimumWidth(60); pushSave->setText("+"); QFont pushFont = pushSave->font(); pushFont.setBold(true); pushFont.setPointSize(pushFont.pointSize()+4); pushSave->setFont(pushFont); pushSave->setStyleSheet("QPushButton { border: none; padding-top: -3px; margin-left: 8px;max-height: 20px; margin-right: 28px;}"); pushSave->setToolTip(tr( "Add a new list and store current tracks" )); connect( pushSave,SIGNAL(clicked()),this, SLOT(onPushSave())); QVBoxLayout *mainLayout = new QVBoxLayout; QWidget *headWidget = new QWidget(this); headWidget->setMaximumHeight(35); headWidget->setMinimumHeight(25); QHBoxLayout *headWidgetLayout = new QHBoxLayout; headWidgetLayout->setMargin(0); headWidgetLayout->setSpacing(1); headWidgetLayout->setAlignment(Qt::AlignRight); headWidgetLayout->addWidget(pushSave); headWidget->setLayout(headWidgetLayout); p->listPlaylists = new QListWidget(); p->listPlaylists->setAttribute(Qt::WA_MacShowFocusRect, false); p->database = new CollectionDB(); p->database->executeSql( "PRAGMA synchronous = OFF;" ); updateLists(); headWidget->raise(); mainLayout->addWidget(headWidget); mainLayout->addWidget(p->listPlaylists); mainLayout->setMargin(0); mainLayout->setSpacing(0); setMaximumWidth(400); p->directory = ""; setLayout(mainLayout); } PlaylistBrowser::~PlaylistBrowser() { QSettings settings; //settings.setValue("",p->); delete p; } void PlaylistBrowser::updateLists() { // Read config values QSettings settings; p->directory = settings.value("editPlaylistRoot","").toString(); // Insert dynamic lists PlaylistWidget* list; QListWidgetItem* itm; p->listPlaylists->clear(); //Top Tracks List list = new PlaylistWidget(p->listPlaylists); list->setName(tr("Top Tracks")); list->setObjectName("TopTracks"); list->setDescription(tr("Most played tracks")); list->setRemovable(false); connect(list,SIGNAL(activated()),this,SLOT(loadDatabaseList())); connect(list,SIGNAL(started()),this,SLOT(playDatabaseList())); itm = new QListWidgetItem(p->listPlaylists); itm->setSizeHint(QSize(0,70)); p->listPlaylists->addItem(itm); p->listPlaylists->setItemWidget(itm,list); //Last Tracks List list = new PlaylistWidget(p->listPlaylists); list->setName(tr("Last Tracks")); list->setObjectName("LastTracks"); list->setDescription(tr("Recently played tracks")); list->setRemovable(false); connect(list,SIGNAL(activated()),this,SLOT(loadDatabaseList())); connect(list,SIGNAL(started()),this,SLOT(playDatabaseList())); itm = new QListWidgetItem(p->listPlaylists); itm->setSizeHint(QSize(0,70)); p->listPlaylists->addItem(itm); p->listPlaylists->setItemWidget(itm,list); //Favorites Tracks List list = new PlaylistWidget(p->listPlaylists); list->setName(tr("Favorites Tracks")); list->setObjectName("FavoritesTracks"); list->setDescription(tr("High rated tracks")); list->setRemovable(false); connect(list,SIGNAL(activated()),this,SLOT(loadDatabaseList())); connect(list,SIGNAL(started()),this,SLOT(playDatabaseList())); itm = new QListWidgetItem(p->listPlaylists); itm->setSizeHint(QSize(0,70)); p->listPlaylists->addItem(itm); p->listPlaylists->setItemWidget(itm,list); // read stored lists QList listData = p->database->selectPlaylistData(); foreach ( QStringList data, listData) { QString name = data[0]; int count = data[1].toInt(); int sum = data[2].toInt(); QDateTime date(QDateTime::fromTime_t( data[3].toInt() )); qDebug() << Q_FUNC_INFO << "add playlist: " << name; list = new PlaylistWidget(p->listPlaylists); list->setName( name ); list->setObjectName( name ); list->setDescription( date.toString("yyyy-MM-dd") + " " + QString::number(count) + " " + tr("tracks") + " " + Track::prettyTime( sum ,true) + " " + tr("hours")); connect(list,SIGNAL(activated()),this,SLOT(loadDatabaseList())); connect(list,SIGNAL(started()),this,SLOT(playDatabaseList())); connect(list,SIGNAL(deleted()),this,SLOT(removeDatabaseList())); itm = new QListWidgetItem(p->listPlaylists); itm->setSizeHint(QSize(0,70)); p->listPlaylists->addItem(itm); p->listPlaylists->setItemWidget(itm,list); } //// read saved lists //QDir rDir( p->directory ); //rDir.setFilter(QDir::Files | QDir::NoDotDot | QDir::NoDot | QDir::Readable); //QStringList filters; // filters << "*.xspf"; //rDir.setNameFilters(filters); //QFileInfoList filelist = rDir.entryInfoList(); //Q_FOREACH (const QFileInfo fi, filelist) { // if ( fi.isFile() ) { // qDebug() << Q_FUNC_INFO << "add playlist: " << fi.fileName(); // list = new PlaylistWidget(p->listPlaylists); // list->setName(fi.fileName().replace(".xspf","")); // list->setObjectName(fi.fileName()); // QPair count = readFileValues( p->directory+"/"+fi.fileName()); // list->setDescription( fi.lastModified().toString("yyyy-MM-dd") + " " // + QString::number(count.first) + " " + tr("tracks") + " " // + Track::prettyTime( count.second ,true) + " " + tr("hours")); // connect(list,SIGNAL(activated()),this,SLOT(loadFileList())); // connect(list,SIGNAL(started()),this,SLOT(playFileList())); // connect(list,SIGNAL(deleted()),this,SLOT(removeFileList())); // itm = new QListWidgetItem(p->listPlaylists); // itm->setSizeHint(QSize(0,70)); // p->listPlaylists->addItem(itm); // p->listPlaylists->setItemWidget(itm,list); // } //} } void PlaylistBrowser::playDatabaseList() { qDebug() << Q_FUNC_INFO ; if(PlaylistWidget* item = qobject_cast(QObject::sender())){ onSelectionChanged(item); emit selectionStarted(selectedTracks()); } } void PlaylistBrowser::loadDatabaseList() { qDebug() << Q_FUNC_INFO ; if(PlaylistWidget* item = qobject_cast(QObject::sender())){ onSelectionChanged(item); emit selectionChanged(selectedTracks()); } } void PlaylistBrowser::removeDatabaseList() { qDebug() << Q_FUNC_INFO ; if(PlaylistWidget* item = qobject_cast(QObject::sender())){ QString senderName = item->objectName(); p->database->removePlaylist(senderName); updateLists(); } } QList PlaylistBrowser::selectedTracks() { QString senderName = p->currentPlaylist->objectName(); QList selectedTags; //Retrieve songs from database if (senderName == "TopTracks") selectedTags = p->database->selectHotTracks(); else if (senderName == "FavoritesTracks") selectedTags = p->database->selectFavoritesTracks(); else if (senderName == "LastTracks") selectedTags = p->database->selectLastTracks(); else selectedTags = p->database->selectPlaylistTracks(senderName); QList tracks; tracks.clear(); qDebug() << Q_FUNC_INFO << "Song count: " << selectedTags.count(); //add tags to this track list foreach ( QStringList tag, selectedTags) { tracks.append( new Track(tag)); } return tracks ; } void PlaylistBrowser::onSelectionChanged(PlaylistWidget* item) { p->currentPlaylist = item; for (int d=0;dlistPlaylists->count();d++) ((PlaylistWidget*)p->listPlaylists->itemWidget(p->listPlaylists->item(d)))->deactivate(); item->activate(); } void PlaylistBrowser::onPushSave() { // QFileDialog dialog(this); // dialog.setDefaultSuffix("xspf"); // QString fileName = dialog.getSaveFileName(this, // tr("Save Play List"), p->directory, // tr("Playlists (*.xspf);;All Files (*)")); // // Bad workaround for Linux (Mac and Windows work with defaultSuffix) // if (!fileName.endsWith(".xspf")) // fileName += ".xspf"; // emit savePlaylists(fileName); QInputDialog* dialog = new QInputDialog(this, Qt::Dialog); dialog->setWindowTitle( tr("Save Play List") ); dialog->setLabelText( tr("Enter a name for the new list") ); dialog->resize(350,100); dialog->exec(); QString listName = dialog->textValue(); if ( !listName.isEmpty() ) emit storePlaylists(listName); } // obsolate: save list into files QList PlaylistBrowser::readFileList(QString filename) { QFile file( filename ); QList tracks; tracks.clear(); if( file.open( QFile::ReadOnly ) ) { QTextStream stream( &file ); stream.setCodec( QTextCodec::codecForName("utf8") ); QDomDocument d; if( !d.setContent(stream.readAll()) ) { qDebug() << "Could not load XML\n"; return tracks; } QDomNode n = d.namedItem( "playlist" ).namedItem( "trackList" ).firstChild(); const QString TRACK( "track" ); //so we don't construct the QStrings all the time const QString URL( "url" ); const QString CURRENT( "current" ); const QString NEXT( "next" ); while( !n.isNull() ) { if( n.nodeName() == TRACK ) { const QDomElement e = n.toElement(); if( e.isNull() ) { qDebug() << "Element '" << n.nodeName() << "' is null, skipping."; continue; } //qDebug() << "Add from xml url='" << e.attribute( URL ); Track *track = new Track(); track->setUrl( QUrl::fromLocalFile(e.namedItem("location").firstChild().nodeValue())); track->setArtist( e.namedItem("creator").firstChild().nodeValue()); track->setTitle( e.namedItem("title").firstChild().nodeValue()); track->setAlbum( e.namedItem("album").firstChild().nodeValue()); track->setTracknumber( e.namedItem("trackNum").firstChild().nodeValue()); track->setGenre( e.namedItem("extension").toElement().attribute( "genre" )); track->setYear( e.namedItem("extension").toElement().attribute( "year" )); track->setLength( e.namedItem("duration").firstChild().nodeValue()); track->setCounter("0"); if ( e.namedItem("extension").toElement().attribute( "isAutoDjSelection" ) =="1" ) track->setFlags( track->flags() | Track::isAutoDjSelection ); if ( e.namedItem("extension").toElement().attribute( "isOnFirstPlayer" ) =="1" ) track->setFlags( track->flags() | Track::isOnFirstPlayer ); if ( e.namedItem("extension").toElement().attribute( "isOnSecondPlayer" ) =="1" ) track->setFlags( track->flags() | Track::isOnSecondPlayer ); track->setRate( e.namedItem("extension").toElement().attribute("Rating").toInt() ); tracks.append(track); } n = n.nextSibling(); } } file.close(); qDebug() << "End " << Q_FUNC_INFO; return tracks; } QPair PlaylistBrowser::readFileValues(QString filename) { QFile file( filename ); QPair pair; int duration=0; int count=0; if( file.open( QFile::ReadOnly ) ) { QTextStream stream( &file ); stream.setCodec( QTextCodec::codecForName("utf8") ); QDomDocument d; if( !d.setContent(stream.readAll()) ) { qDebug() << "Could not load XML\n"; return pair; } QDomNode n = d.namedItem( "playlist" ).namedItem( "trackList" ).firstChild(); const QString TRACK( "track" ); while( !n.isNull() ) { if( n.nodeName() == TRACK ) { const QDomElement e = n.toElement(); if( e.isNull() ) { qDebug() << "Element '" << n.nodeName() << "' is null, skipping."; continue; } duration+= e.namedItem("duration").firstChild().nodeValue().toInt(); count++; } n = n.nextSibling(); } } file.close(); pair.first = count; pair.second = duration; qDebug() << "End " << Q_FUNC_INFO; return pair; } void PlaylistBrowser::playFileList() { qDebug() << Q_FUNC_INFO ; if(PlaylistWidget* item = qobject_cast(QObject::sender())){ onSelectionChanged(item); QString senderName = item->objectName(); emit selectionStarted( readFileList( p->directory+"/"+senderName) ); } } void PlaylistBrowser::loadFileList() { qDebug() << Q_FUNC_INFO ; if(PlaylistWidget* item = qobject_cast(QObject::sender())){ onSelectionChanged(item); QString senderName = item->objectName(); //Retrieve songs from file emit selectionChanged( readFileList( p->directory+"/"+senderName) ); } } void PlaylistBrowser::removeFileList() { qDebug() << Q_FUNC_INFO ; if(PlaylistWidget* item = qobject_cast(QObject::sender())){ QString senderName = item->objectName(); QFile::remove( p->directory+"/"+senderName ); updateLists(); } } knowthelist-2.3.1/src/playlistbrowser.h000077500000000000000000000017021342115213400202740ustar00rootroot00000000000000#ifndef PLAYLISTBROWSER_H #define PLAYLISTBROWSER_H #include "playlistwidget.h" #include #include class QPushButton; class Track; class PlaylistBrowser : public QWidget { Q_OBJECT public: explicit PlaylistBrowser(QWidget *parent = 0); ~PlaylistBrowser(); QList readFileList(QString filename); QPair readFileValues(QString filename); QList selectedTracks(); signals: void selectionStarted(QList); void selectionChanged(QList); void savePlaylists(QString); void storePlaylists(QString); public slots: void loadDatabaseList(); void loadFileList(); void playDatabaseList(); void playFileList(); void removeFileList(); void removeDatabaseList(); void onSelectionChanged(PlaylistWidget* item); void onPushSave(); void updateLists(); private: class PlaylistBrowsertPrivate *p; }; #endif // PLAYLISTBROWSER_H knowthelist-2.3.1/src/playlistitem.cpp000077500000000000000000000102641342115213400201050ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "playlistitem.h" #include "playlist.h" #include "ratingwidget.h" #include #include #include PlaylistItem::PlaylistItem(Playlist* parent, QTreeWidgetItem* lvi) : QTreeWidgetItem(parent, lvi) , m_track(new Track()) , m_parent(parent) { //qDebug() << u << " 2."<url(); setText(Column_Url, track->url().toString()); setText(Column_Artist, (track->artist() != "") ? track->artist() : QObject::tr("Unknown")); setText(Column_Title, (track->title() != "") ? track->title() : QObject::tr("Unknown")); setText(Column_Album, track->album()); setText(Column_Year, track->year()); setText(Column_Genre, track->genre()); setText(Column_Length, track->prettyLength()); setText(Column_Tracknumber, track->tracknumber()); setText(Column_Played, QString::number(track->counter())); const QString body = "%1%2"; QString str = " width=\"100%\" border=\"1\">"; str += body.arg(QObject::tr("Title"), track->title()); str += body.arg(QObject::tr("Artist"), track->artist()); str += body.arg(QObject::tr("Album"), track->album()); str += body.arg(QObject::tr("Genre"), track->genre()); str += body.arg(QObject::tr("Year"), track->year()); str += body.arg(QObject::tr("Location"), track->url().toString()); str += "
"; setToolTip(Column_Artist, str); m_track = track; } void PlaylistItem::setText(int c, QString text) { QTreeWidgetItem::setText(c, (text != "") ? text : QObject::tr("Unknown")); switch (c) { case Column_Url: m_track->setUrl(QUrl::fromLocalFile(text)); break; case Column_Artist: m_track->setArtist(text); break; case Column_Title: m_track->setTitle(text); break; case Column_Album: m_track->setAlbum(text); break; case Column_Played: m_track->setCounter(text); break; case Column_Genre: m_track->setGenre(text); break; case Column_Length: m_track->setLength(text); break; } } void PlaylistItem::update() { // paint item in special color for (int i = 0; i <= columnCount() - 1; i++) setForeground(i, QBrush(m_foreColor)); } int PlaylistItem::rate() { return ((RatingWidget*)m_parent->itemWidget(this, Column_Rate))->rating() * 0.1; } bool PlaylistItem::operator<(const QTreeWidgetItem& other) const { bool ok; int sortCol = treeWidget()->sortColumn(); QString otherText = other.text(sortCol).replace(QObject::tr("Unknown"), "0"); if (sortCol == Column_Length) { int otherLength = -1; if (otherText.contains(':')) { QStringList list = otherText.split(':'); otherLength = list.at(0).toInt(&ok) * 60; otherLength += list.at(1).toInt(&ok); if (ok) return m_track->length() < otherLength; } } else { int value = text(sortCol).replace(QObject::tr("Unknown"), "0").toInt(&ok); int otherValue = otherText.toInt(&ok); if (ok) return value < otherValue; } return QTreeWidgetItem::operator<(other); } knowthelist-2.3.1/src/playlistitem.h000077500000000000000000000046431342115213400175560ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #ifndef PLAYLISTITEM_H #define PLAYLISTITEM_H #include #include #include #include "track.h" #include "playlistitem.h" #include "playlist.h" #include "ratingwidget.h" class PlaylistItem : public QTreeWidgetItem { public: PlaylistItem( Playlist *pl, QTreeWidgetItem *lvi ); ~PlaylistItem(); QString urlString() const { return text(Column_Url ); } QString title() const { return text( Column_Title ); } QString artist() const { return text( Column_Artist ); } int rate(); Playlist *listView() const { return (Playlist*)treeWidget(); } PlaylistItem *nextSibling() const { return (PlaylistItem*)treeWidget()->itemBelow(this); } //ratingWidget() Track *track() { return m_track ; } void setTrack( Track*); QColor foreColor() { return m_foreColor ; } void setForeColor( QColor c ) {m_foreColor=c; update();} void update(); void setTexts( Track* ); void setText( int c, QString Text); QString exactText( int col ) const { return text( col ); } QString seconds() const; enum Column { Column_Url = 0, Column_No = 1, Column_Played = 2, Column_Artist = 3, Column_Title = 4, Column_Album = 5, Column_Year = 6, Column_Genre = 7, Column_Tracknumber = 8, Column_Length = 9, Column_Rate = 10}; signals: private: Track *m_track; QColor m_foreColor; RatingWidget *rating; Playlist* m_parent; bool operator< (const QTreeWidgetItem &other) const; }; #endif knowthelist-2.3.1/src/playlistwidget.cpp000077500000000000000000000111741342115213400204330ustar00rootroot00000000000000#include "playlistwidget.h" #include "ui_playlistwidget.h" #include #include #include class PlaylistWidgetPrivate { public: QString name; QString description; bool isActive; QTimer* timerSlide; int targetWidth; bool isRemovable; }; PlaylistWidget::PlaylistWidget(QWidget* parent) : QWidget(parent) , ui(new Ui::PlaylistWidget) { ui->setupUi(this); ui->lblDesciption->setText(QString::null); ui->widgetClose->setMinimumWidth(0); ui->widgetClose->setMaximumWidth(0); setFocusPolicy(Qt::ClickFocus); p = new PlaylistWidgetPrivate; p->isActive = false; p->isRemovable = true; QFont font = ui->lblDesciption->font(); #if defined(Q_OS_DARWIN) int newSize = font.pointSize() - 4; #else int newSize = font.pointSize() - 1; #endif font.setPointSize(newSize); ui->lblDesciption->setFont(font); p->timerSlide = new QTimer(this); p->timerSlide->setInterval(10); connect(p->timerSlide, SIGNAL(timeout()), SLOT(timerSlide_timeOut())); } PlaylistWidget::~PlaylistWidget() { delete ui; delete p; } // auto connect slot void PlaylistWidget::on_lblName_linkActivated(const QString& link) { Q_UNUSED(link); Q_EMIT activated(); } bool PlaylistWidget::isRemovable() { return p->isRemovable; } void PlaylistWidget::setRemovable(bool value) { p->isRemovable = value; ui->pushClose->setVisible(value); // if (!value) // r ui->horizontalSpacer->changeSize(42,0); } QString PlaylistWidget::name() { return p->name; } void PlaylistWidget::setName(QString value) { p->name = value; updateView(); } QString PlaylistWidget::description() { return p->description; } void PlaylistWidget::setDescription(QString value) { p->description = value; updateView(); } void PlaylistWidget::activate() { p->isActive = true; updateView(); } void PlaylistWidget::deactivate() { p->isActive = false; updateView(); } void PlaylistWidget::mousePressEvent(QMouseEvent* event) { if (ui->widgetClose->geometry().contains(event->pos())) { Q_EMIT deleted(); } else { slideCloseWidget(false); Q_EMIT activated(); } } void PlaylistWidget::updateView() { // update Labels ui->lblDesciption->setText(p->description); // active/passive look differentiation QString activeStyle; if (p->isActive) { activeStyle = "color:#ff6464;'>"; ui->framePlaylistWidget->setStyleSheet( "#framePlaylistWidget { background: qlineargradient(" "x1:0, y1:0, x2:0, y2:1," "stop: 0.01 #202020," "stop:0.11 #505050," "stop:1 #505050" ");}"); } else { activeStyle = "color:#eeeeee;'>"; ui->framePlaylistWidget->setStyleSheet( "#framePlaylistWidget { background: qlineargradient(" "x1:0, y1:0, x2:0, y2:1," "stop: 0.01 #202020," "stop:0.11 #404040," "stop:1 #404040" ");}"); } ui->lblName->setText( "" "

" " 0 0 16777215 60 TextLabel true lblDesciption lblName 0 0 80 0 80 16777215 QFrame::NoFrame QFrame::Raised 0 0 0 6 0 0 35 0 16777215 16777215 Load all tracks of this list directly into player playlists :/play.png:/play.png Qt::Horizontal 40 20 Remove this list x 0 0 18 16777215 <html><head/><body><p>Confirm the remove</p></body></html> background-color: rgb(255, 65, 87); Delete knowthelist-2.3.1/src/progressbar.cpp000077500000000000000000000036001342115213400177120ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "progressbar.h" #include #include ProgressBar::ProgressBar(QWidget* parent, const char* name) : QWidget(parent) { QHBoxLayout* mainLayout = new QHBoxLayout; mainLayout->setMargin(0); mainLayout->setSpacing(1); bar = new QProgressBar(this); bar->setMinimumHeight(16); bar->setRange(0, 100); clearButton = new QToolButton(this); QPixmap pixmap(":clear_left.png"); clearButton->setIcon(QIcon(pixmap)); clearButton->setIconSize(QSize(18, 17)); clearButton->setStyleSheet("QToolButton {max-height: 16px;min-height: 16px;margin-top: -2px;}"); clearButton->resize(22, 16); connect(clearButton, SIGNAL(clicked()), this, SIGNAL(stopped())); mainLayout->addWidget(clearButton); mainLayout->addWidget(bar); setLayout(mainLayout); } ProgressBar::~ProgressBar() {} void ProgressBar::setValue(int value) { bar->setValue(value); if (value > 0 && value < 100) this->show(); else this->hide(); } int ProgressBar::value() { return bar->value(); } void ProgressBar::resizeEvent(QResizeEvent* ev) { bar->setGeometry(0, 0, ev->size().width(), 20); } knowthelist-2.3.1/src/progressbar.h000077500000000000000000000023001342115213400173530ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #ifndef PROGRESSBAR_H #define PROGRESSBAR_H #include #include #include class ProgressBar:public QWidget { Q_OBJECT public: ProgressBar(QWidget *parent = 0, const char *name = 0); ~ProgressBar(); QToolButton* clearButton; QProgressBar* bar; int value(); public slots: void setValue(int value); signals: void stopped(); private: void resizeEvent(QResizeEvent *); }; #endif knowthelist-2.3.1/src/qled.cpp000077500000000000000000000171301342115213400163110ustar00rootroot00000000000000/* LED class adapted from KDE to use under QT * Copyright (C) 1998 JУЖrg Habenicht (j.habenicht@europemail.com) Copyright (C) 2010 Christoph Feck Copyright (C) 2011 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "qled.h" #include #include #include #include class QLed::Private { public: Private() : darkFactor(300) , state(On) , look(Raised) , shape(Circular) { } int darkFactor; QColor color; State state; Look look; Shape shape; QPixmap cachedPixmap[2]; // for both states QStyle::ControlElement ce_indicatorLedCircular; QStyle::ControlElement ce_indicatorLedRectangular; }; QLed::QLed(QWidget* parent) : QWidget(parent) , d(new Private) { setColor(Qt::green); } QLed::QLed(const QColor& color, QWidget* parent) : QWidget(parent) , d(new Private) { setColor(color); } QLed::QLed(const QColor& color, State state, Look look, Shape shape, QWidget* parent) : QWidget(parent) , d(new Private) { d->state = (state == Off ? Off : On); d->look = look; d->shape = shape; setColor(color); } QLed::~QLed() { delete d; } void QLed::paintEvent(QPaintEvent*) { switch (d->shape) { case Rectangular: switch (d->look) { case Sunken: paintRectFrame(false); break; case Raised: paintRectFrame(true); break; case Flat: paintRect(); break; } break; case Circular: switch (d->look) { case Flat: paintFlat(); break; case Raised: paintRaised(); break; case Sunken: paintSunken(); break; } break; } } int QLed::ledWidth() const { // Make sure the LED is round! int size = qMin(width(), height()); // leave one pixel border size -= 2; return qMax(0, size); } bool QLed::paintCachedPixmap() { if (d->cachedPixmap[d->state].isNull()) { return false; } QPainter painter(this); painter.drawPixmap(1, 1, d->cachedPixmap[d->state]); return true; } void QLed::paintFlat() { paintLed(Circular, Flat); } void QLed::paintRaised() { paintLed(Circular, Raised); } void QLed::paintSunken() { paintLed(Circular, Sunken); } void QLed::paintRect() { paintLed(Rectangular, Flat); } void QLed::paintRectFrame(bool raised) { paintLed(Rectangular, raised ? Raised : Sunken); } QLed::State QLed::state() const { return d->state; } QLed::Shape QLed::shape() const { return d->shape; } QColor QLed::color() const { return d->color; } QLed::Look QLed::look() const { return d->look; } void QLed::setState(State state) { if (d->state == state) return; d->state = (state == Off ? Off : On); updateCachedPixmap(); } void QLed::setShape(Shape shape) { if (d->shape == shape) return; d->shape = shape; updateCachedPixmap(); } void QLed::setColor(const QColor& color) { if (d->color == color) return; d->color = color; updateCachedPixmap(); } void QLed::setDarkFactor(int darkFactor) { if (d->darkFactor == darkFactor) return; d->darkFactor = darkFactor; updateCachedPixmap(); } int QLed::darkFactor() const { return d->darkFactor; } void QLed::setLook(Look look) { if (d->look == look) return; d->look = look; updateCachedPixmap(); } void QLed::toggle() { d->state = (d->state == On ? Off : On); updateCachedPixmap(); } void QLed::on() { setState(On); } void QLed::off() { setState(Off); } void QLed::resizeEvent(QResizeEvent*) { updateCachedPixmap(); } QSize QLed::sizeHint() const { QStyleOption option; option.initFrom(this); int iconSize = style()->pixelMetric(QStyle::PM_SmallIconSize, &option, this); return QSize(iconSize, iconSize); } QSize QLed::minimumSizeHint() const { return QSize(16, 16); } void QLed::updateCachedPixmap() { d->cachedPixmap[Off] = QPixmap(); d->cachedPixmap[On] = QPixmap(); update(); } void QLed::paintLed(Shape shape, Look look) { if (paintCachedPixmap()) { return; } QSize size(width() - 2, height() - 2); if (shape == Circular) { const int width = ledWidth(); size = QSize(width, width); } QPointF center(size.width() / 2.0, size.height() / 2.0); const int smallestSize = qMin(size.width(), size.height()); QPainter painter; QImage image(size, QImage::Format_ARGB32_Premultiplied); image.fill(0); QRadialGradient fillGradient(center, smallestSize / 2.0, QPointF(center.x(), size.height() / 3.0)); const QColor fillColor = d->state != Off ? d->color : d->color.dark(d->darkFactor); fillGradient.setColorAt(0.0, fillColor.light(250)); fillGradient.setColorAt(0.5, fillColor.light(130)); fillGradient.setColorAt(1.0, fillColor); QConicalGradient borderGradient(center, look == Sunken ? 90 : -90); QColor borderColor = palette().color(QPalette::Dark); if (d->state == On) { QColor glowOverlay = fillColor; glowOverlay.setAlpha(80); borderColor = overlayColors(borderColor, glowOverlay); } borderGradient.setColorAt(0.2, borderColor); borderGradient.setColorAt(0.5, palette().color(QPalette::Light)); borderGradient.setColorAt(0.8, borderColor); painter.begin(&image); painter.setRenderHint(QPainter::Antialiasing); painter.setBrush(look == Flat ? QBrush(fillColor) : QBrush(fillGradient)); const QBrush penBrush = (look == Flat) ? QBrush(borderColor) : QBrush(borderGradient); const qreal penWidth = smallestSize / 8.0; painter.setPen(QPen(penBrush, penWidth)); QRectF r(penWidth / 2.0, penWidth / 2.0, size.width() - penWidth, size.height() - penWidth); if (shape == Rectangular) { painter.drawRect(r); } else { painter.drawEllipse(r); } painter.end(); d->cachedPixmap[d->state] = QPixmap::fromImage(image); painter.begin(this); painter.drawPixmap(1, 1, d->cachedPixmap[d->state]); painter.end(); } QColor QLed::overlayColors(const QColor& base, const QColor& paint, QPainter::CompositionMode comp) { QImage img(1, 1, QImage::Format_ARGB32_Premultiplied); QPainter p(&img); QColor start = base; start.setAlpha(255); // opaque p.fillRect(0, 0, 1, 1, start); p.setCompositionMode(comp); p.fillRect(0, 0, 1, 1, paint); p.end(); return img.pixel(0, 0); } knowthelist-2.3.1/src/qled.h000077500000000000000000000054111342115213400157550ustar00rootroot00000000000000/* LED class adapted from KDE to use under QT * Copyright (C) 1998 JУЖrg Habenicht (j.habenicht@europemail.com) Copyright (C) 2010 Christoph Feck Copyright (C) 2011 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef QLed_H #define QLed_H #include #include class QColor; class QLed : public QWidget { Q_OBJECT Q_ENUMS( State Shape Look ) public: enum State { Off, On }; enum Shape { Rectangular, Circular }; enum Look { Flat, Raised, Sunken }; explicit QLed( QWidget *parent = 0 ); explicit QLed( const QColor &color, QWidget *parent = 0 ); QLed( const QColor& color, QLed::State state, QLed::Look look, QLed::Shape shape, QWidget *parent = 0 ); ~QLed(); QColor color() const; State state() const; Look look() const; Shape shape() const; int darkFactor() const; void setColor( const QColor& color ); void setState( State state ); void setLook( Look look ); void setShape( Shape shape ); void setDarkFactor( int darkFactor ); virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; public Q_SLOTS: void toggle(); void on(); void off(); protected: virtual int ledWidth() const; virtual void paintFlat(); virtual void paintRaised(); virtual void paintSunken(); virtual void paintRect(); virtual void paintRectFrame( bool raised ); void paintEvent( QPaintEvent* ); void resizeEvent( QResizeEvent* ); bool paintCachedPixmap(); void updateCachedPixmap(); void paintLed(Shape shape, Look look); private: class Private; Private * const d; QColor overlayColors(const QColor &base, const QColor &paint, QPainter::CompositionMode comp = QPainter::CompositionMode_SourceOver); }; #endif knowthelist-2.3.1/src/ratingwidget.cpp000077500000000000000000000071241342115213400200560ustar00rootroot00000000000000/* Copyright 2010, David Sansome Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "ratingwidget.h" #include #include #include const int RatingPainter::kStarCount; const int RatingPainter::kStarSize; RatingPainter::RatingPainter() { } QRect RatingPainter::Contents(const QRect& rect) { const int width = kStarSize * kStarCount; return QRect(rect.x(), rect.y(), width, rect.height()); } double RatingPainter::RatingForPos(const QPoint& pos, const QRect& rect) { const QRect contents = Contents(rect); const double raw = double(pos.x() - contents.left()) / contents.width(); // Round to the nearest 0.1 return double(int(raw * kStarCount * 2 + 0.5)) / (kStarCount * 2); } void RatingPainter::Paint(QPainter* painter, const QRect& rect, float rating) const { Q_UNUSED(rect); // save some time here if (rating == 0) return; rating *= kStarCount; QPixmap on(":/star-on.png"); QPixmap off(":/star-off.png"); // Draw the stars int x = kStarSize / 2; for (int i = 0; i < kStarCount; i++, x += kStarSize) { const QRect t_rect(x, 0, kStarSize, kStarSize); if (rating - 0.25 <= i) { // Totally empty painter->drawPixmap(t_rect, off); } else if (rating - 0.75 <= i) { // Half full const QRect target_left(t_rect.x(), t_rect.y(), kStarSize / 2, kStarSize); const QRect target_right(t_rect.x() + kStarSize / 2, t_rect.y(), kStarSize / 2, kStarSize); const QRect source_left(0, 0, kStarSize / 2, kStarSize); const QRect source_right(kStarSize / 2, 0, kStarSize / 2, kStarSize); painter->drawPixmap(target_left, on, source_left); painter->drawPixmap(target_right, off, source_right); } else { // Totally full painter->drawPixmap(t_rect, on); } } } RatingWidget::RatingWidget(QWidget* parent) : QWidget(parent) , rating_(0.0) , hover_rating_(-1.0) { setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); setMouseTracking(true); } QSize RatingWidget::sizeHint() const { return QSize(RatingPainter::kStarSize * (RatingPainter::kStarCount + 2), RatingPainter::kStarSize); } void RatingWidget::setRating(float rating) { rating_ = rating; update(); } void RatingWidget::paintEvent(QPaintEvent* e) { Q_UNUSED(e); QStylePainter p(this); // Draw the stars painter_.Paint(&p, rect(), hover_rating_ == -1.0 ? rating_ : hover_rating_); } void RatingWidget::mousePressEvent(QMouseEvent* e) { rating_ = RatingPainter::RatingForPos(e->pos(), rect()); emit RatingChanged(rating_); } void RatingWidget::mouseMoveEvent(QMouseEvent* e) { hover_rating_ = RatingPainter::RatingForPos(e->pos(), rect()); update(); } void RatingWidget::leaveEvent(QEvent*) { hover_rating_ = -1.0; update(); } knowthelist-2.3.1/src/ratingwidget.h000077500000000000000000000034051342115213400175210ustar00rootroot00000000000000/* Copyright 2010, David Sansome Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #ifndef RATINGWIDGET_H #define RATINGWIDGET_H #include #include class RatingPainter { public: RatingPainter(); static const int kStarCount = 5; static const int kStarSize = 15; static QRect Contents(const QRect& rect); static double RatingForPos(const QPoint& pos, const QRect& rect); void Paint(QPainter* painter, const QRect& rect, float rating) const; private: QPixmap stars_[kStarCount*2+1]; }; class RatingWidget : public QWidget { Q_OBJECT Q_PROPERTY(float rating READ rating WRITE setRating); public: RatingWidget(QWidget* parent = 0); QSize sizeHint() const; float rating() const { return rating_; } void setRating(float rating); signals: void RatingChanged(float rating); protected: void paintEvent(QPaintEvent*); void mousePressEvent(QMouseEvent* e); void mouseMoveEvent(QMouseEvent* e); void leaveEvent(QEvent*); private: RatingPainter painter_; float rating_; float hover_rating_; }; #endif // RATINGWIDGET_H knowthelist-2.3.1/src/settingsdialog.cpp000077500000000000000000000245161342115213400204120ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "settingsdialog.h" #include "collectionsetupmodel.h" #include "djsettings.h" #include "ui_settingsdialog.h" #include #include #include #include #include class SettingsDialogPrivate { public: Ui::SettingsDialog ui; QWidget* parent; CollectionSetupModel* model; }; SettingsDialog::SettingsDialog(QWidget* parent) : QDialog(parent) { p = new SettingsDialogPrivate; p->ui.setupUi(this); p->parent = parent; // set icons in the settings list QTableWidgetItem* item; p->ui.settingsGroupsTable->setIconSize(QSize(32, 32)); item = p->ui.settingsGroupsTable->item(0, 0); item->setIcon(QIcon(":slider.png")); item->setTextAlignment(Qt::AlignCenter); item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); item = p->ui.settingsGroupsTable->item(1, 0); item->setIcon(QIcon(":database.png")); item->setTextAlignment(Qt::AlignCenter); item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); item = p->ui.settingsGroupsTable->item(2, 0); item->setIcon(QIcon(":volume.png")); item->setTextAlignment(Qt::AlignCenter); item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); item = p->ui.settingsGroupsTable->item(3, 0); item->setIcon(QIcon(":DJ.png")); item->setTextAlignment(Qt::AlignCenter); item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); item = p->ui.settingsGroupsTable->item(4, 0); item->setIcon(QIcon(":list.png")); item->setTextAlignment(Qt::AlignCenter); item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); item = p->ui.settingsGroupsTable->item(5, 0); item->setIcon(QIcon(":folder.png")); item->setTextAlignment(Qt::AlignCenter); item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); item = p->ui.settingsGroupsTable->item(6, 0); item->setIcon(QIcon(":settings.png")); item->setTextAlignment(Qt::AlignCenter); item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); int w = p->ui.settingsGroupsTable->width(); p->ui.settingsGroupsTable->setColumnWidth(0, w); // select first item p->ui.settingsGroupsTable->setCurrentCell(0, 0); // select first page p->ui.pages->setCurrentIndex(0); //Collection folder setup p->model = new CollectionSetupModel(); p->ui.collectionsTreeView->setModel(p->model); p->ui.collectionsTreeView->setColumnHidden(1, true); p->ui.collectionsTreeView->setColumnHidden(2, true); p->ui.collectionsTreeView->setColumnHidden(3, true); p->ui.collectionsTreeView->expandToDepth(0); connect(p->ui.settingsGroupsTable, SIGNAL(itemSelectionChanged()), this, SLOT(tableSelectionChanged())); connect(p->ui.faderEndSlider, SIGNAL(sliderMoved(int)), this, SLOT(on_faderEndSlider_sliderMoved(int))); connect(p->ui.faderTimeSlider, SIGNAL(sliderMoved(int)), this, SLOT(on_faderTimeSlider_sliderMoved(int))); connect(p->ui.pushScanNow, SIGNAL(clicked()), this, SLOT(onScanNow())); connect(p->ui.pushResetStats, SIGNAL(clicked()), this, SIGNAL(resetStatsPressed())); connect(p->ui.countDJ, SIGNAL(valueChanged(int)), this, SLOT(loadDjList(int))); } SettingsDialog::~SettingsDialog() { delete p; } void SettingsDialog::setCurrentTab(SettingsDialog::Tab tab) { p->ui.settingsGroupsTable->setCurrentCell(tab, 0); p->ui.pages->setCurrentIndex(tab); } int SettingsDialog::exec() { // load settings if (!loadSettings()) { return QDialog::Rejected; } return QDialog::exec(); } void SettingsDialog::accept() { QSettings settings; settings.setValue("MonitorOutputDevice", p->ui.monitorOutputDevice->currentText()); //Common settings.setValue("language", p->ui.comboLanguage->currentIndex()); //save fade slider settings.setValue("faderTimeSlider", p->ui.faderTimeSlider->value()); settings.setValue("faderEndSlider", p->ui.faderEndSlider->value()); //Playlist settings settings.setValue("checkAutoRemove", p->ui.checkAutoRemove->isChecked()); //Silent settings settings.setValue("checkAutoCue", p->ui.checkAutoCue->isChecked()); settings.setValue("checkSkipSilentEnd", p->ui.checkSkipSilentEnd->isChecked()); //AutoDJ settings.setValue("minTracks", p->ui.minTracks->value()); settings.setValue("countDJ", p->ui.countDJ->value()); settings.setValue("isEnabledAutoDJCount", p->ui.checkAutoDjCountPlayed->isChecked()); settings.beginGroup("AutoDJ"); int maxDj = p->ui.countDJ->value(); for (int d = 0; d < maxDj; d++) { settings.beginGroup(QString::number(d)); QListWidgetItem* item = p->ui.listDjNames->item(d); if (DjSettings* djs = dynamic_cast(p->ui.listDjNames->itemWidget(item))) { settings.setValue("Name", djs->name()); settings.setValue("FilterCount", djs->filterCount()); } settings.endGroup(); } settings.endGroup(); //CollectionFolders settings.setValue("Dirs", p->model->dirsChecked()); settings.setValue("Monitor", p->ui.chkMonitor->isChecked()); //File Browser settings.setValue("editBrowerRoot", p->ui.txtBrowserRoot->text()); QDialog::accept(); } bool SettingsDialog::loadSettings() { QSettings settings; p->ui.monitorOutputDevice->clear(); p->ui.monitorOutputDevice->addItems(settings.value("MonitorOutputDevices").toStringList()); int index = p->ui.monitorOutputDevice->findText(settings.value("MonitorOutputDevice").toString()); p->ui.monitorOutputDevice->setCurrentIndex(index); //Common p->ui.comboLanguage->setCurrentIndex(settings.value("language", 0).toInt()); //fade slider p->ui.faderTimeSlider->setValue(settings.value("faderTimeSlider", "12").toInt()); p->ui.faderTimeLabel->setText(settings.value("faderTimeSlider", "12").toString() + "s"); p->ui.faderEndSlider->setValue(settings.value("faderEndSlider", "12").toInt()); p->ui.faderEndLabel->setText(settings.value("faderEndSlider", "12").toString() + "s"); //Playlist setting p->ui.checkAutoRemove->setChecked(settings.value("checkAutoRemove", true).toBool()); //Silent setting p->ui.checkSkipSilentEnd->setChecked(settings.value("checkSkipSilentEnd", true).toBool()); p->ui.checkAutoCue->setChecked(settings.value("checkAutoCue", true).toBool()); //AutoDJ p->ui.minTracks->setValue(settings.value("minTracks", "6").toInt()); p->ui.countDJ->setValue(settings.value("countDJ", "3").toInt()); p->ui.checkAutoDjCountPlayed->setChecked(settings.value("isEnabledAutoDJCount", false).toBool()); //CollectionFolders p->model->setDirsChecked(settings.value("Dirs").toStringList()); p->ui.chkMonitor->setChecked(settings.value("Monitor").toBool()); //File Browser p->ui.txtBrowserRoot->setText(settings.value("editBrowerRoot", "").toString()); //Load Dj list loadDjList(p->ui.countDJ->value()); return true; } void SettingsDialog::loadDjList(int count) { QSettings settings; QListWidgetItem* itm; DjSettings* djs; p->ui.listDjNames->clear(); settings.beginGroup("AutoDJ"); for (int d = 0; d < count; d++) { settings.beginGroup(QString::number(d)); itm = new QListWidgetItem(p->ui.listDjNames); p->ui.listDjNames->addItem(itm); djs = new DjSettings(p->ui.listDjNames); djs->setID(d + 1); djs->setName(settings.value("Name", "Dj%1").toString().arg(d + 1)); djs->setFilterCount(settings.value("FilterCount", "2").toInt()); p->ui.listDjNames->setItemWidget(itm, djs); settings.endGroup(); } settings.endGroup(); } void SettingsDialog::on_pushButton_clicked() { QFileDialog dialog(this); dialog.setFileMode(QFileDialog::DirectoryOnly); if (dialog.exec()) p->ui.txtBrowserRoot->setText(dialog.selectedFiles().first()); } void SettingsDialog::on_pushAbout_clicked() { QMessageBox msgBox; msgBox.setIconPixmap(QIcon(":knowthelist.png").pixmap(65, 65)); msgBox.setText(QString("%1").arg("

Knowthelist

" " Version " + QApplication::applicationVersion() + "
Copyright (C) 2005-2014 Mario Stephan " "
mstephan@shared-files.de" "

" "http://knowthelist.github.io/knowthelist" "

Thanks to :" "
* Heiko Fischer (for testing and new ideas)" "
* David Geiger and Adrien Daugabel (for French translation and issue reports)" "
* Pavel Fric (for Czech translation)" "
* LУЁszlУГ Farkas (for Hungarian translation)
")); msgBox.setWindowTitle(tr("About Knowthelist")); msgBox.exec(); } void SettingsDialog::onScanNow() { QSettings settings; settings.setValue("Dirs", p->model->dirsChecked()); Q_EMIT scanNowPressed(); } void SettingsDialog::on_faderEndSlider_sliderMoved(int position) { p->ui.faderEndLabel->setText(QString::number(position) + "s"); } void SettingsDialog::on_faderTimeSlider_sliderMoved(int position) { p->ui.faderTimeLabel->setText(QString::number(position) + "s"); } void SettingsDialog::tableSelectionChanged() { QTableWidgetItem* item = p->ui.settingsGroupsTable->selectedItems().first(); p->ui.pages->setCurrentIndex(item->row()); } knowthelist-2.3.1/src/settingsdialog.h000077500000000000000000000031501342115213400200460ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #ifndef SETTINGSDIALOG_H_ #define SETTINGSDIALOG_H_ #include class SettingsDialog : public QDialog { Q_OBJECT public: SettingsDialog(QWidget* parent = 0); ~SettingsDialog(); int exec(); enum Tab { TabFader = 0, TabCollection = 1, TabMonitor = 2 }; void setCurrentTab(Tab tab); public slots: void accept(); void tableSelectionChanged(); signals: void scanNowPressed(); void resetStatsPressed(); protected: bool loadSettings(); private slots: void on_faderEndSlider_sliderMoved(int position); void on_faderTimeSlider_sliderMoved(int position); void on_pushButton_clicked(); void onScanNow(); void loadDjList(int count); void on_pushAbout_clicked(); protected: private: enum ItemRole { ItemRoleId = Qt::UserRole + 1 }; class SettingsDialogPrivate* p; }; #endif /* SETTINGSDIALOG_H_ */ knowthelist-2.3.1/src/settingsdialog.ui000077500000000000000000000654171342115213400202520ustar00rootroot00000000000000 SettingsDialog 0 0 703 512 600 400 Settings true 0 0 200 0 200 16777215 Qt::ScrollBarAlwaysOff Qt::ScrollBarAlwaysOff QAbstractItemView::SingleSelection QAbstractItemView::SelectRows 32 32 false Qt::SolidLine false false false 150 150 false 42 42 Row1 Row2 Row3 Row4 Row5 Row6 Row7 Column1 Fader Collection Audio devices AutoDJ Playlists File browser Common 2 0 3 10 10 251 16 Fader settings 10 80 160 22 30 12 Qt::Horizontal 10 60 371 16 0 0 Start fading before song end 10 40 388 16 QFrame::Plain Qt::Horizontal 190 80 61 16 12s 10 110 361 16 Fader Time 190 130 61 16 12s 10 130 160 22 30 12 Qt::Horizontal 10 170 371 20 Skip silent at start (AutoCue) true 10 200 371 20 Skip silent at the end true 1 0 Scan for new files and update the music collection Watch folders for changes 0 0 16777215 16777215 Qt::LeftToRight Scan Now Scan folders for songs Play Counter Statistics Reset 10 70 251 16 Monitor Player 10 90 201 26 10 10 251 16 Device Settings 10 40 388 16 QFrame::Plain Qt::Horizontal 10 10 251 16 AutoDJ settings 10 40 388 16 QFrame::Plain Qt::Horizontal 6 380 42 22 6 7 360 421 20 Minimum tracks within each playlist 7 90 42 22 1 7 70 131 16 DJ Count 120 90 281 251 QAbstractItemView::NoSelection 0 40 164 70 121 16 DJ Names 279 70 121 16 Filter Count 5 410 461 20 Increment play counter for AutoDj selected tracks 10 40 388 16 QFrame::Plain Qt::Horizontal 7 74 371 20 Auto Remove Played Tracks 10 10 251 16 Playlist Settings 10 88 291 26 10 66 361 16 Browser Root 310 86 50 30 ... 10 10 251 16 File Browser Settings 10 40 388 16 QFrame::Plain Qt::Horizontal 100 70 131 25 English Deutsch ФeХЁtina magyar franУЇais 10 74 91 16 75 true Language 10 10 251 16 Common Settings 10 40 388 16 QFrame::Plain Qt::Horizontal 10 100 411 16 8 Change the language of the application (needs restart) 0 28 0 3 76 32 About 516 -2 164 32 0 0 Qt::RightToLeft Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok false buttonBox accepted() SettingsDialog accept() 248 254 157 274 buttonBox rejected() SettingsDialog reject() 316 260 286 274 knowthelist-2.3.1/src/src.pro000077500000000000000000000125041342115213400161710ustar00rootroot00000000000000# # Knowthelist # Copyright (C) 2011-2019 Mario Stephan # License: LGPL-3.0+ # DEFINES += APP_VERSION="\\\"2.3.1\\\"" QT += core \ gui \ xml \ sql greaterThan(QT_MAJOR_VERSION, 4){ #use qt5 and gstreamer 1.x QT += widgets DEFINES += GST_API_VERSION_1 } #else use qt4 and gstreamer 0.10 TARGET = knowthelist TEMPLATE = app SOURCES += main.cpp \ knowthelist.cpp \ player.cpp \ vumeter.cpp \ playerwidget.cpp \ qled.cpp \ playlistitem.cpp \ playlist.cpp \ progressbar.cpp \ collectiondb.cpp \ settingsdialog.cpp \ track.cpp \ trackanalyser.cpp \ djsession.cpp \ dj.cpp \ filter.cpp \ djwidget.cpp \ djfilterwidget.cpp \ fancytabwidget.cpp \ stylehelper.cpp \ filebrowser.cpp \ collectionwidget.cpp \ collectiontree.cpp \ collectionupdater.cpp \ collectiontreeitem.cpp \ monitorplayer.cpp \ collectionsetupmodel.cpp \ stackdisplay.cpp \ djsettings.cpp \ modeselector.cpp \ playlistbrowser.cpp \ playlistwidget.cpp \ djbrowser.cpp \ ratingwidget.cpp \ customdial.cpp HEADERS += knowthelist.h \ vumeter.h \ playerwidget.h \ qled.h \ playlistitem.h \ playlist.h \ player.h \ progressbar.h \ collectiondb.h \ settingsdialog.h \ track.h \ trackanalyser.h \ djsession.h \ dj.h \ filter.h \ djwidget.h \ djfilterwidget.h \ fancytabwidget.h \ stylehelper.h \ filebrowser.h \ collectionwidget.h \ collectiontree.h \ collectionupdater.h \ collectiontreeitem.h \ monitorplayer.h \ collectionsetupmodel.h \ stackdisplay.h \ djsettings.h \ modeselector.h \ playlistbrowser.h \ playlistwidget.h \ djbrowser.h \ ratingwidget.h \ customdial.h FORMS += \ settingsdialog.ui \ djwidget.ui \ djfilterwidget.ui \ playerwidget.ui \ knowthelist.ui \ djsettings.ui \ modeselector.ui \ playlistwidget.ui TRANSLATIONS += \ ../locale/knowthelist_cs.ts \ ../locale/knowthelist_de.ts \ ../locale/knowthelist_hu.ts \ ../locale/knowthelist_fr.ts \ ../locale/knowthelist_nl.ts \ ../locale/knowthelist_ru.ts \ ../locale/knowthelist_es.ts \ ../locale/knowthelist_tr.ts \ ../locale/knowthelist_it.ts OTHER_FILES += \ knowthelist.rc DESTDIR = ../ win32 { GST_HOME = $$quote($$(GSTREAMER_1_0_ROOT_X86)) isEmpty(GST_HOME) { message(\"GSTREAMER_1_0_ROOT_X86\" not detected ...) } else { message(\"GSTREAMER_1_0_ROOT_X86\" detected in \"$${GST_HOME}\") } #TAGLIB_HOME = $$quote(C:\Program Files (x86)\taglib-1.9.1) INCLUDEPATH += $${GST_HOME}\include\gstreamer-1.0 \ $${GST_HOME}\include\glib-2.0 \ $${GST_HOME}\lib\glib-2.0\include \ $${GST_HOME}\include \ LIBS += $${GST_HOME}\lib\gstreamer-1.0.lib \ $${GST_HOME}\lib\gobject-2.0.lib \ $${GST_HOME}\lib\glib-2.0.lib \ $${GST_HOME}\lib\libtag.dll.a \ -ldsound \ -lwinmm RC_FILE = knowthelist.rc #DEPLOY_COMMAND = $$[QT_INSTALL_BINS]\windeployqt.exe #DEPLOY_TARGET = $$DESTDIR$${TARGET}$${TARGET_EXT}.exe #QMAKE_POST_LINK = $$DEPLOY_COMMAND $$DEPLOY_TARGET $$escape_expand(\\n\\t) #EXTRA_BINFILES += \ #$${GST_HOME}bin\*.dll \ #$${GST_HOME}\bin\*.dll #for(FILE,EXTRA_BINFILES){ # message($$QMAKE_COPY \"$$FILE\" \"$${DESTDIR}\" $$escape_expand(\\n\\t)) # QMAKE_POST_LINK += $$QMAKE_COPY \"$$FILE\" \"$${DESTDIR}\" $$escape_expand(\\n\\t) #} # copy patched version of directsoundsink.dll direct to GStreamer plugin path QMAKE_POST_LINK = $$QMAKE_COPY \"$${DESTDIR}\libgstdirectsoundsink.dll\" \"$${GST_HOME}lib\gstreamer-1.0\" $$escape_expand(\\n\\t) } macx { DEFINES += GST_API_VERSION_1 INCLUDEPATH += /usr/local/include/gstreamer-1.0 \ /usr/local/include/glib-2.0 \ /usr/local/lib/glib-2.0/include \ /usr/local/include LIBS += -L/usr/local/lib \ -lgstreamer-1.0 \ -lglib-2.0 \ -lgobject-2.0 \ -ltag \ -framework CoreAudio \ -framework CoreFoundation } unix:!macx { isEmpty(PREFIX):PREFIX = /usr BINDIR = $$PREFIX/bin DATADIR = $$PREFIX/share target.path = $$BINDIR icon.path = $$DATADIR/pixmaps icon.files += ../dist/knowthelist.png desktop.path = $$DATADIR/applications desktop.files += ../dist/Knowthelist.desktop INSTALLS += target icon desktop contains(DEFINES, GST_API_VERSION_1) { CONFIG += link_pkgconfig \ gstreamer-1.0 PKGCONFIG += gstreamer-1.0 \ taglib alsa } else { CONFIG += link_pkgconfig \ gstreamer PKGCONFIG += gstreamer-0.10 \ taglib alsa } } RESOURCES += ../images/icons.qrc \ ../locale/locale.qrc ICON = ../dist/headset.icns isEmpty(QMAKE_LRELEASE) { win32:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\lrelease.exe else:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease } lrelease.commands = $$QMAKE_LRELEASE ${QMAKE_FILE_IN} lrelease.input = TRANSLATIONS lrelease.output = ../locale/${QMAKE_FILE_BASE}.qm lrelease.CONFIG = no_link target_predeps QMAKE_EXTRA_COMPILERS += lrelease QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-parameter QMAKE_CXXFLAGS_WARN_ON += -Wno-reorder knowthelist-2.3.1/src/stackdisplay.cpp000077500000000000000000000053451342115213400200640ustar00rootroot00000000000000/* Copyright (C) 2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "stackdisplay.h" #include #include #include class StackDisplayPrivate { public: int height; int width; int margin; int count; int indexSelected; int barHeight; QColor colorBars; }; StackDisplay::StackDisplay(QWidget* parent) : QWidget(parent) { p = new StackDisplayPrivate; p->colorBars.setRgb(200, 200, 200); p->count = 6; p->indexSelected = 1; p->barHeight = 3; p->margin = 8; } StackDisplay::~StackDisplay() { delete p; } void StackDisplay::resizeEvent(QResizeEvent* e) { Q_UNUSED(e); p->width = width(); p->height = height(); } void StackDisplay::setBarColor(QColor color) { p->colorBars = color; update(); } void StackDisplay::setCount(int value) { p->count = value; update(); } void StackDisplay::setSelected(int value) { p->indexSelected = value; update(); } void StackDisplay::setMargin(int value) { p->margin = value; } void StackDisplay::paintEvent(QPaintEvent*) { drawBars(); QStyleOption opt; opt.init(this); QPainter p(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); } void StackDisplay::drawBars() { QPainter painter(this); painter.setPen(p->colorBars); if (p->count == 0) return; int space = (int)(p->height / p->count); int posY = 0; for (int i = 0; i < p->count; i++) { posY = posY + space; for (int j = 0; j < p->barHeight; j++) { //draw bars painter.drawLine(p->margin * 2, posY + j - p->barHeight, p->width - p->margin, posY + j - p->barHeight); } if (i == p->indexSelected) { //draw triancle for (int j = p->margin; j < p->margin + 5; j++) { painter.drawLine(j, posY - (p->margin + 5 - j) + 1 - p->barHeight, j, posY + (p->margin + 5 - j) - 1 - p->barHeight); } } } } knowthelist-2.3.1/src/stackdisplay.h000077500000000000000000000023531342115213400175250ustar00rootroot00000000000000/* Copyright (C) 2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #ifndef STACKDISPLAY_H #define STACKDISPLAY_H #include class StackDisplay : public QWidget { Q_OBJECT public: explicit StackDisplay(QWidget* parent = 0); ~StackDisplay(); void setCount(int value); void setSelected(int value); void setMargin(int value); void setBarColor(QColor color); signals: public slots: private: void resizeEvent(QResizeEvent* e); void paintEvent(QPaintEvent*); void drawBars(); class StackDisplayPrivate* p; }; #endif // STACKDISPLAY_H knowthelist-2.3.1/src/stylehelper.cpp000077500000000000000000000172371342115213400177340ustar00rootroot00000000000000/************************************************************************** ** ** This file is part of Qt Creator ** ** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** Commercial Usage ** ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at http://qt.nokia.com/contact. ** **************************************************************************/ #include "stylehelper.h" #include #include #include #include #include #include #include #include // Clamps float color values within (0, 255) static int clamp(float x) { const int val = x > 255 ? 255 : static_cast(x); return val < 0 ? 0 : val; } namespace Utils { qreal StyleHelper::sidebarFontSize() { #if defined(Q_WS_MAC) return 10; #else return 7.5; #endif } QColor StyleHelper::panelTextColor(bool lightColored) { if (!lightColored) return Qt::white; else return Qt::black; } // Invalid by default, setBaseColor needs to be called at least once QColor StyleHelper::m_baseColor; QColor StyleHelper::m_requestedBaseColor; QColor StyleHelper::baseColor(bool lightColored) { if (!lightColored) return m_baseColor; else return m_baseColor.lighter(230); } QColor StyleHelper::highlightColor(bool lightColored) { QColor result = baseColor(lightColored); if (!lightColored) result.setHsv(result.hue(), clamp(result.saturation()), clamp(result.value() * 1.16)); else result.setHsv(result.hue(), clamp(result.saturation()), clamp(result.value() * 1.06)); return result; } QColor StyleHelper::shadowColor(bool lightColored) { QColor result = baseColor(lightColored); result.setHsv(result.hue(), clamp(result.saturation() * 1.1), clamp(result.value() * 0.70)); return result; } QColor StyleHelper::borderColor(bool lightColored) { QColor result = baseColor(lightColored); result.setHsv(result.hue(), result.saturation(), result.value() / 2); return result; } // We try to ensure that the actual color used are within // reasonalbe bounds while generating the actual baseColor // from the users request. void StyleHelper::setBaseColor(const QColor& newcolor) { m_requestedBaseColor = newcolor; QColor color; color.setHsv(newcolor.hue(), newcolor.saturation() * 0.7, 64 + newcolor.value() / 3); if (color.isValid() && color != m_baseColor) { m_baseColor = color; foreach (QWidget* w, QApplication::topLevelWidgets()) w->update(); } } static void verticalGradientHelper(QPainter* p, const QRect& spanRect, const QRect& rect, bool lightColored) { QColor highlight = StyleHelper::highlightColor(lightColored); QColor shadow = StyleHelper::shadowColor(lightColored); QLinearGradient grad(spanRect.topRight(), spanRect.topLeft()); grad.setColorAt(0, highlight.lighter(117)); grad.setColorAt(1, shadow.darker(109)); p->fillRect(rect, grad); QColor light(255, 255, 255, 80); p->setPen(light); p->drawLine(rect.topRight() - QPoint(1, 0), rect.bottomRight() - QPoint(1, 0)); QColor dark(0, 0, 0, 90); p->setPen(dark); p->drawLine(rect.topLeft(), rect.bottomLeft()); } void StyleHelper::verticalGradient(QPainter* painter, const QRect& spanRect, const QRect& clipRect, bool lightColored) { if (StyleHelper::usePixmapCache()) { QString key; QColor keyColor = baseColor(lightColored); key.sprintf("mh_vertical %d %d %d %d %d", spanRect.width(), spanRect.height(), clipRect.width(), clipRect.height(), keyColor.rgb()); ; QPixmap pixmap; if (!QPixmapCache::find(key, pixmap)) { pixmap = QPixmap(clipRect.size()); QPainter p(&pixmap); QRect rect(0, 0, clipRect.width(), clipRect.height()); verticalGradientHelper(&p, spanRect, rect, lightColored); p.end(); QPixmapCache::insert(key, pixmap); } painter->drawPixmap(clipRect.topLeft(), pixmap); } else { verticalGradientHelper(painter, spanRect, clipRect, lightColored); } } // Draws a cached pixmap with shadow void StyleHelper::drawIconWithShadow(const QIcon& icon, const QRect& rect, QPainter* p, QIcon::Mode iconMode, int radius, const QColor& color, const QPoint& offset) { QPixmap cache; QString pixmapName = QString("icon %0 %1 %2").arg(icon.cacheKey()).arg(iconMode).arg(rect.height()); if (!QPixmapCache::find(pixmapName, cache)) { QPixmap px = icon.pixmap(rect.size()); cache = QPixmap(px.size() + QSize(radius * 2, radius * 2)); cache.fill(Qt::transparent); QPainter cachePainter(&cache); if (iconMode == QIcon::Disabled) { QImage im = px.toImage().convertToFormat(QImage::Format_ARGB32); for (int y = 0; y < im.height(); ++y) { QRgb* scanLine = (QRgb*)im.scanLine(y); for (int x = 0; x < im.width(); ++x) { QRgb pixel = *scanLine; char intensity = qGray(pixel); *scanLine = qRgba(intensity, intensity, intensity, qAlpha(pixel)); ++scanLine; } } px = QPixmap::fromImage(im); } // Draw shadow QImage tmp(px.size() + QSize(radius * 2, radius * 2 + 1), QImage::Format_ARGB32_Premultiplied); tmp.fill(Qt::transparent); QPainter tmpPainter(&tmp); tmpPainter.setCompositionMode(QPainter::CompositionMode_Source); tmpPainter.drawPixmap(QPoint(radius, radius), px); tmpPainter.end(); // blur the alpha channel QImage blurred(tmp.size(), QImage::Format_ARGB32_Premultiplied); blurred.fill(Qt::transparent); QPainter blurPainter(&blurred); qt_blurImage(&blurPainter, tmp, radius, false, true); blurPainter.end(); tmp = blurred; // blacken the image... tmpPainter.begin(&tmp); tmpPainter.setCompositionMode(QPainter::CompositionMode_SourceIn); tmpPainter.fillRect(tmp.rect(), color); tmpPainter.end(); tmpPainter.begin(&tmp); tmpPainter.setCompositionMode(QPainter::CompositionMode_SourceIn); tmpPainter.fillRect(tmp.rect(), color); tmpPainter.end(); // draw the blurred drop shadow... cachePainter.drawImage(QRect(0, 0, cache.rect().width(), cache.rect().height()), tmp); // Draw the actual pixmap... cachePainter.drawPixmap(QPoint(radius, radius) + offset, px); QPixmapCache::insert(pixmapName, cache); } QRect targetRect = cache.rect(); targetRect.moveCenter(rect.center()); p->drawPixmap(targetRect.topLeft() - offset, cache); } } // namespace Utils knowthelist-2.3.1/src/stylehelper.h000077500000000000000000000062541342115213400173760ustar00rootroot00000000000000/************************************************************************** ** ** This file is part of Qt Creator ** ** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** Commercial Usage ** ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at http://qt.nokia.com/contact. ** **************************************************************************/ #ifndef STYLEHELPER_H #define STYLEHELPER_H #include #include QT_BEGIN_NAMESPACE class QPalette; class QPainter; class QRect; // Note, this is exported but in a private header as qtopengl depends on it. // We should consider adding this as a public helper function. void qt_blurImage(QPainter *p, QImage &blurImage, qreal radius, bool quality, bool alphaOnly, int transposed = 0); QT_END_NAMESPACE // Helper class holding all custom color values namespace Utils { class StyleHelper { public: static const unsigned int DEFAULT_BASE_COLOR = 0x666666; // Height of the project explorer navigation bar static qreal sidebarFontSize(); // This is our color table, all colors derive from baseColor static QColor requestedBaseColor() { return m_requestedBaseColor; } static QColor baseColor(bool lightColored = false); static QColor panelTextColor(bool lightColored = false); static QColor highlightColor(bool lightColored = false); static QColor shadowColor(bool lightColored = false); static QColor borderColor(bool lightColored = false); static QColor sidebarHighlight() { return QColor(255, 255, 255, 40); } static QColor sidebarShadow() { return QColor(0, 0, 0, 40); } // Sets the base color and makes sure all top level widgets are updated static void setBaseColor(const QColor &color); // Gradients used for panels static void verticalGradient(QPainter *painter, const QRect &spanRect, const QRect &clipRect, bool lightColored = false); static bool usePixmapCache() { return true; } static void drawIconWithShadow(const QIcon &icon, const QRect &rect, QPainter *p, QIcon::Mode iconMode, int radius = 3, const QColor &color = QColor(0, 0, 0, 130), const QPoint &offset = QPoint(1, -2)); private: static QColor m_baseColor; static QColor m_requestedBaseColor; }; } // namespace Utils using Utils::StyleHelper; #endif // STYLEHELPER_H knowthelist-2.3.1/src/track.cpp000077500000000000000000000265021342115213400164730ustar00rootroot00000000000000/* Copyright (C) 2004 Max Howell Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "track.h" #include "playlistitem.h" #include #include #include #include #include #include #include #include #include #include #include #include #include QStringList Track::tagNameList = QStringList() << "location" << "creator" << "title" << "album" << "year" << "genre" << "trackNum" << "duration" << "counter" << "rate"; struct TrackPrivate { QUrl url; QString title; QString artist; QString album; QString year; QString comment; QString genre; QString tracknumber; int counter; int length; int rate; Track::Options flags; }; Track::Track() : p(new TrackPrivate) { p->counter = -1; p->rate = 0; } Track::~Track() { delete p; } Track::Track(const QUrl& u) : p(new TrackPrivate) { p->url = u; readTags(); } Track::Track(const QStringList& list) : p(new TrackPrivate) { if (list.count() > 9) { p->url = QUrl::fromLocalFile(list.at(0)); p->artist = list.at(1); p->title = list.at(2); p->album = list.at(3); p->year = list.at(4); p->genre = list.at(5); p->tracknumber = list.at(6); p->length = QString(list.at(7)).toInt(); p->counter = QString(list.at(8)).toInt(); p->rate = QString(list.at(9)).toInt(); } if (list.count() > 10) p->flags = QFlag(list.at(10).toInt()); } Track::Track(const PlaylistItem* item) : p(new TrackPrivate) { p->url = QUrl::fromLocalFile(item->urlString()); p->title = item->title(); p->artist = item->exactText(2); p->album = item->exactText(4); p->year = item->exactText(5); p->comment = item->exactText(6); p->genre = item->exactText(7); p->tracknumber = item->exactText(8); p->counter = item->exactText(9).toInt(); // p->rate = item->rate(); } void Track::readTags() { QString fileName = p->url.toLocalFile(); #ifdef Q_OS_WIN32 TagLib::FileRef fileref = TagLib::FileRef(fileName.toStdWString().c_str(), true, TagLib::AudioProperties::Fast); #else TagLib::FileRef fileref = TagLib::FileRef(QFile::encodeName(fileName).constData(), true, TagLib::AudioProperties::Fast); #endif if (!fileref.isNull()) { if (fileref.tag()) { TagLib::Tag* tag = fileref.tag(); p->title = !tag->title().isNull() ? TStringToQString(tag->title()).trimmed() : QObject::tr("Unknown"); p->artist = !tag->artist().isNull() ? TStringToQString(tag->artist()).trimmed() : QObject::tr("Unknown"); p->album = !tag->album().isNull() ? TStringToQString(tag->album()).trimmed() : QObject::tr("Unknown"); p->comment = TStringToQString(tag->comment()).trimmed(); p->genre = !tag->genre().isNull() ? TStringToQString(tag->genre()).trimmed() : QObject::tr("Unknown"); p->year = tag->year() ? QString::number(tag->year()) : QString::null; p->tracknumber = tag->track() ? QString::number(tag->track()) : QString::null; p->length = fileref.audioProperties()->length(); p->counter = 0; p->rate = 0; //polish up empty tags if (p->title == QObject::tr("Unknown")) { QFileInfo fileInfo(p->url.toLocalFile()); p->title = fileInfo.fileName().replace('_', ' ').replace('.' + fileInfo.suffix(), ""); } } } } bool Track::operator==(Track* track) { if (!isValid()) return false; return p->artist == track->artist() && p->title == track->title(); } bool Track::containIn(QList list) { foreach (Track* i, list) { if (*i == this) { return true; } } return false; } QImage Track::coverImage() { if (!p->url.isValid()) return QImage(); qDebug() << "image url:" << p->url; if (p->url.path() == "") return QImage(); QByteArray fileName = QFile::encodeName(p->url.toLocalFile()); const char* encodedName = fileName.constData(); TagLib::MPEG::File fileref(encodedName); if (!fileref.isOpen()) return QImage(); TagLib::ID3v2::Tag* tag = fileref.ID3v2Tag(); if (tag) { TagLib::ID3v2::FrameList l = fileref.ID3v2Tag()->frameListMap()["APIC"]; if (!l.isEmpty()) { //qDebug() << "Found APIC frame(s)" << endl; TagLib::ID3v2::Frame* f = l.front(); TagLib::ID3v2::AttachedPictureFrame* ap = (TagLib::ID3v2::AttachedPictureFrame*)f; const TagLib::ByteVector bytes = ap->picture(); QImage image = QImage::fromData(reinterpret_cast(bytes.data()), bytes.size()); if (!image.isNull()) { return image; } } } return defaultImage(); } /* * Create a default cover image: a gray record with diagonal record name as text */ QImage Track::defaultImage() { QImage img(120, 120, QImage::Format_RGB888); img.fill(QColor(Qt::white)); QPainter painter(&img); painter.setPen(QPen(Qt::lightGray)); painter.setBrush(Qt::lightGray); painter.setRenderHint(QPainter::Antialiasing, true); painter.drawEllipse(QPoint(60, 60), 45, 45); painter.setBrush(Qt::white); painter.drawEllipse(QPoint(60, 60), 15, 15); painter.setPen(QPen(QColor(60, 60, 60))); painter.setFont(QFont("Monospace")); painter.translate(QPoint(-26, 62)); painter.rotate(-45); painter.drawText(img.rect(), Qt::AlignCenter, p->artist + '\n' + p->title); return img; } QString Track::prettyTitle() const { QString s = QString::null; if (p->artist != QObject::tr("Unknown")) s += p->artist + " - "; s += p->title; return s; } QString Track::prettyTitle(QString filename) //static { QString& s = filename; s = s.left(s.indexOf('.')); return s; } QString Track::prettyArtist(int maxlen) const { return this->rsqueeze(p->artist, maxlen); } QString Track::prettyTitle(int maxlen) const { return this->rsqueeze(p->title, maxlen); } QString Track::rsqueeze(const QString& str, int maxlen) const { if (str.length() > maxlen) { int part = maxlen - 3; return QString(str.left(part) + "..."); } else return str; } void Track::setLengthFromPretty(QString s) { int i = -1; if (s.contains(':')) { QStringList list = s.split(':'); i = list.at(0).toInt() * 60; i += list.at(1).toInt(); } p->length = i; } QString Track::prettyLength(int seconds) { QString s; if (seconds > 0) s = prettyTime(seconds, false); else if (seconds == -1) s = '?'; return s; } QString Track::prettyTime(int seconds, bool showHours) { QString s = QChar(':'); s.append(zeroPad(seconds % 60)); seconds /= 60; if (showHours) { s.clear(); s.prepend(zeroPad(seconds % 60)); s.prepend(':'); seconds /= 60; } s.prepend(QString::number(seconds)); return s; } bool Track::isValid() { if (p->url.isEmpty() || !p->url.isValid()) return false; if (p->url.toString().contains(".mp3", Qt::CaseInsensitive) || p->url.toString().contains(".ogg", Qt::CaseInsensitive) || p->url.toString().contains(".wav", Qt::CaseInsensitive) || p->url.toString().contains(".m4a", Qt::CaseInsensitive) || p->url.toString().contains(".m4p", Qt::CaseInsensitive) || p->url.toString().contains(".flac", Qt::CaseInsensitive) || p->url.toString().contains(".aiff", Qt::CaseInsensitive) || p->url.toString().contains(".oga", Qt::CaseInsensitive) || p->url.toString().contains(".wma", Qt::CaseInsensitive) || p->url.toString().contains(".au", Qt::CaseInsensitive) || p->url.toString().contains(".tta", Qt::CaseInsensitive) || p->url.toString().contains(".raw", Qt::CaseInsensitive)) return true; else return false; } QString Track::dirPath() { QString localPath = p->url.toLocalFile(); QFileInfo fileInfo(localPath); return fileInfo.absolutePath(); } QStringList Track::tagList() { return (QStringList() << p->url.toLocalFile() << p->artist << p->title << p->album << p->year << p->genre << p->tracknumber << QString().setNum(p->length) << QString().setNum(p->counter) << QString().setNum(p->rate)); } int Track::length() { return p->length > 0 ? p->length : 0; } QUrl Track::url() { return p->url; } QString Track::title() { return p->title; } QString Track::artist() { return p->artist; } QString Track::album() { return p->album; } int Track::rate() { return p->rate; } QString Track::year() { return p->year; } QString Track::comment() { return p->comment; } QString Track::genre() { return p->genre; } QString Track::tracknumber() { return p->tracknumber > 0 ? p->tracknumber : "0"; } int Track::counter() { return p->counter; } QString Track::prettyLength() { return prettyLength(p->length); } Track::Options Track::flags() { return p->flags; } void Track::setUrl(QUrl url) { p->url = url; } void Track::setTitle(QString s) { p->title = s; } void Track::setArtist(QString s) { p->artist = s; } void Track::setAlbum(QString s) { p->album = s; } void Track::setRate(int s) { p->rate = s; } void Track::setYear(QString s) { p->year = s; } void Track::setComment(QString s) { p->comment = s; } void Track::setGenre(QString s) { p->genre = s; } void Track::setTracknumber(QString s) { p->tracknumber = s; } void Track::setLength(QString s) { p->length = s.toInt(); } void Track::setCounter(QString s) { p->counter = s.toInt(); } void Track::setFlags(Track::Options flags) { p->flags = flags; } knowthelist-2.3.1/src/track.h000077500000000000000000000052651342115213400161430ustar00rootroot00000000000000/* Copyright (C) 2005-2014 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #ifndef TRACK_H #define TRACK_H #include #include #include #define TAGLIB_STATIC class PlaylistItem; namespace TagLib { class AudioProperties; class Tag; } class Track { public: enum Option { NoOptions = 0x0, isOnFirstPlayer = 0x1, isOnSecondPlayer = 0x2, isAutoDjSelection = 0x4 }; Q_DECLARE_FLAGS(Options, Option) Track(); Track( const QUrl &u); Track( const QStringList& list ); Track( const PlaylistItem *item ); ~Track(); static QStringList tagNameList; QImage coverImage(); QImage defaultImage(); bool operator==(Track* track); bool containIn(QList list ); QUrl url(); QString title(); QString artist(); QString album(); QString year(); QString comment(); QString genre(); int length(); int counter(); int rate(); QString tracknumber(); QString prettyLength(); QStringList tagList(); QString dirPath(); Track::Options flags(); bool isValid(); void setUrl(QUrl); void setTitle(QString); void setArtist(QString); void setAlbum(QString); void setYear(QString); void setComment(QString); void setGenre(QString); void setTracknumber(QString); void setLength(QString); void setLengthFromPretty(QString); void setCounter(QString); void setRate(int); void setFlags(Track::Options flags); QString prettyTitle() const; QString prettyArtist(int) const; QString prettyTitle(int) const; static QString prettyLength( int ); static QString prettyTime( int, bool showHours = true ); static QString zeroPad( uint i ) { return ( i < 10 ) ? QString( "0%1" ).arg( i ) : QString::number( i ); } static QString prettyTitle( QString ); protected: QString rsqueeze( const QString&, int ) const; void readTags(); private: struct TrackPrivate *p; }; Q_DECLARE_OPERATORS_FOR_FLAGS(Track::Options) #endif knowthelist-2.3.1/src/trackanalyser.cpp000077500000000000000000000400441342115213400202270ustar00rootroot00000000000000/* Copyright (C) 2011 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "trackanalyser.h" #include #if QT_VERSION >= 0x050000 #include #else #include #endif #define AUDIOFREQ 32000 #define SCAN_DURATION 60 static const guint spect_bands = 8; struct TrackAnalyser_Private { QFutureWatcher watcher; QMutex mutex; guint64 fft_res; float lastSpectrum[spect_bands]; QList spectralFlux; int bpm; GstElement *src, *conv, *sink, *cutter, *audio, *analysis, *spectrum; TrackAnalyser::modeType analysisMode; }; TrackAnalyser::TrackAnalyser(QWidget *parent) : QWidget(parent), pipeline(nullptr), m_finished(false) , p( new TrackAnalyser_Private ) { p->fft_res = 435; //sample rate for fft samples in Hz for (int i=0;ilastSpectrum[i]=0.0; gst_init (nullptr, nullptr); prepare(); connect(&p->watcher, SIGNAL(finished()), this, SLOT(loadThreadFinished())); } void TrackAnalyser::sync_set_state(GstElement* element, GstState state) { GstStateChangeReturn res; \ res = gst_element_set_state (GST_ELEMENT (element), state); \ if(res == GST_STATE_CHANGE_FAILURE) return; \ if(res == GST_STATE_CHANGE_ASYNC) { \ GstState state; \ res = gst_element_get_state(GST_ELEMENT (element), &state, NULL, 1000000000/*GST_CLOCK_TIME_NONE*/); \ if(res == GST_STATE_CHANGE_FAILURE || res == GST_STATE_CHANGE_ASYNC) return; \ } } TrackAnalyser::~TrackAnalyser() { cleanup(); delete p; p = nullptr; } void cb_newpad_ta (GstElement *src, GstPad *new_pad, gpointer data) { TrackAnalyser* instance = (TrackAnalyser*)data; instance->newpad(src, new_pad, data); } void TrackAnalyser::newpad (GstElement *src, GstPad *new_pad, gpointer data) { GstCaps *caps; GstStructure *str; GstPad *sink_pad; /* only link once */ GstElement *bin = gst_bin_get_by_name(GST_BIN(pipeline), "convert"); sink_pad = gst_element_get_static_pad (bin, "sink"); if (GST_PAD_IS_LINKED (sink_pad)) { g_object_unref (sink_pad); return; } /* check media type */ #ifdef GST_API_VERSION_1 caps = gst_pad_query_caps (new_pad, nullptr); #else caps = gst_pad_get_caps (new_pad); #endif str = gst_caps_get_structure (caps, 0); if (!g_strrstr (gst_structure_get_name (str), "audio")) { gst_caps_unref (caps); gst_object_unref (sink_pad); return; } gst_caps_unref (caps); /* link'n'play */ gst_pad_link (new_pad, sink_pad); } GstBusSyncReply TrackAnalyser::bus_cb (GstBus *bus, GstMessage *msg, gpointer data) { TrackAnalyser* instance = (TrackAnalyser*)data; instance->messageReceived(msg); return GST_BUS_PASS; } void TrackAnalyser::cleanup() { if(pipeline) sync_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL); if(bus) gst_object_unref (bus); if(pipeline) gst_object_unref(G_OBJECT(pipeline)); } bool TrackAnalyser::prepare() { pipeline = gst_pipeline_new ("pipeline"); bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); p->src = gst_element_factory_make ("uridecodebin", "source"); g_signal_connect (p->src, "pad-added", G_CALLBACK (cb_newpad_ta), this); p->conv = gst_element_factory_make ("audioconvert", "convert"); p->spectrum = gst_element_factory_make ("spectrum", "spectrum"); p->analysis = gst_element_factory_make ("rganalysis", "analysis"); p->cutter = gst_element_factory_make ("cutter", "cutter"); p->sink = gst_element_factory_make ("fakesink", "sink"); g_object_set (p->analysis, "message", TRUE, NULL); g_object_set (p->analysis, "num-tracks", 1, NULL); g_object_set (p->cutter, "threshold-dB", -25.0, NULL); g_object_set (G_OBJECT (p->spectrum), "bands", spect_bands, "threshold", -80, "post-messages", TRUE, "interval", GST_SECOND / p->fft_res, NULL); gst_bin_add_many (GST_BIN (pipeline), p->src, p->conv, p->analysis, p->cutter, p->spectrum, p->sink, NULL); gst_element_link (p->conv, p->analysis); gst_element_link (p->analysis, p->cutter); gst_element_link (p->cutter, p->sink); #ifdef GST_API_VERSION_1 gst_bus_set_sync_handler (bus, bus_cb, this, nullptr); #else gst_bus_set_sync_handler (bus, bus_cb, this); #endif return pipeline; } int TrackAnalyser::bpm() { return p->bpm; } double TrackAnalyser::gainDB() { return m_GainDB; } double TrackAnalyser::gainFactor() { return pow (10, m_GainDB / 20); } QTime TrackAnalyser::startPosition() { return m_StartPosition; } QTime TrackAnalyser::endPosition() { return m_EndPosition; } void TrackAnalyser::setPosition(QTime position) { int time_milliseconds=QTime(0,0).msecsTo(position); gint64 time_nanoseconds=( time_milliseconds * GST_MSECOND ); gst_element_seek (pipeline, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, time_nanoseconds, GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE); qDebug() << Q_FUNC_INFO <<":"<<" position="<analysisMode = mode; sync_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL); //divide in multiple analyser due to different running times switch (p->analysisMode) { case TEMPO: gst_element_unlink (p->conv, p->analysis); gst_element_unlink (p->analysis, p->cutter); gst_element_unlink (p->cutter, p->sink); gst_element_link (p->conv, p->spectrum);//spectrum take too much time gst_element_link (p->spectrum, p->sink); break; default: gst_element_unlink (p->conv, p->spectrum); gst_element_unlink (p->spectrum, p->sink); gst_element_link (p->conv, p->analysis); gst_element_link (p->analysis, p->cutter); gst_element_link (p->cutter, p->sink); m_StartPosition = m_MaxPosition = QTime(0,0); } } void TrackAnalyser::open(QUrl url) { //To avoid delays load track in another thread qDebug() << Q_FUNC_INFO <<":"<objectName()<<" url="< future = QtConcurrent::run( this, &TrackAnalyser::asyncOpen,url); p->watcher.setFuture(future); } void TrackAnalyser::asyncOpen(QUrl url) { p->mutex.lock(); m_GainDB = GAIN_INVALID; //m_StartPosition = QTime(0,0); p->spectralFlux.clear(); sync_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL); GstElement *src = gst_bin_get_by_name(GST_BIN(pipeline), "source"); g_object_set (G_OBJECT (src), "uri", (const char*)url.toString().toUtf8(), nullptr); sync_set_state (GST_ELEMENT (pipeline), GST_STATE_PAUSED); m_finished=false; gst_object_unref(src); p->mutex.unlock(); } void TrackAnalyser::loadThreadFinished() { // async load in player done qDebug() << Q_FUNC_INFO <<":"<objectName()<<" analysisMode="<analysisMode; if ( p->analysisMode == TrackAnalyser::TEMPO ){ //setPosition( m_EndPosition.addSecs(-SCAN_DURATION) ); setPosition(m_StartPosition); } else { m_EndPosition=length(); } start(); } void TrackAnalyser::start() { qDebug() << Q_FUNC_INFO <<":"<objectName(); gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING); } bool TrackAnalyser::close() { gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL); return true; } QTime TrackAnalyser::length() { if (pipeline) { gint64 value=0; #ifdef GST_API_VERSION_1 if(gst_element_query_duration(pipeline, GST_FORMAT_TIME, &value)) { #else GstFormat fmt = GST_FORMAT_TIME; if(gst_element_query_duration(pipeline, &fmt, &value)) { #endif //qDebug() << Q_FUNC_INFO << " new value:" <( ( value / GST_MSECOND ) )); // nanosec -> msec } } //qDebug() << Q_FUNC_INFO << " return:" <code)+" in module "+QString::number(err->domain)+"\n"+QString::fromUtf8(err->message); if(err->code == 6 && err->domain == 851) { str += "\nMay be you should to install gstreamer0.10-plugins-ugly or gstreamer0.10-plugins-bad"; } qDebug()<< "Gstreamer error:"<< str; g_error_free (err); g_free (debug); need_finish(); break; } case GST_MESSAGE_EOS:{ qDebug() << Q_FUNC_INFO <<":"<objectName()<<" End of track reached"; need_finish(); break; } case GST_MESSAGE_ELEMENT:{ const GstStructure *s = gst_message_get_structure (message); const gchar *name = gst_structure_get_name (s); GstClockTime timestamp; gst_structure_get_clock_time (s, "timestamp", ×tamp); // data for tempo detection if (strcmp (name, "spectrum") == 0) { const GValue *magnitudes; const GValue *mag; float mag_value; guint i; magnitudes = gst_structure_get_value (s, "magnitude"); float flux = 0; for (i = 0; i < spect_bands; ++i) { //gdouble freq = (gdouble) ((AUDIOFREQ / 2) * i + AUDIOFREQ / 4) / spect_bands; mag = gst_value_list_get_value (magnitudes, i); mag_value = pow (10.0, g_value_get_float (mag)/ 20.0); float value = (mag_value - p->lastSpectrum[i]); p->lastSpectrum[i] = mag_value; flux += value < 0? 0: value; //qDebug() << Q_FUNC_INFO <<"freq:"<spectralFlux.append( flux ); } // data for Start and End time detection if (strcmp (name, "cutter") == 0) { const GValue *value; value=gst_structure_get_value (s, "above"); bool isSilent=!g_value_get_boolean(value); //if we detect a falling edge, set EndPostion to this if (isSilent) m_EndPosition=QTime(0,0).addMSecs( static_cast( ( timestamp / GST_MSECOND ) )); // nanosec -> msec else { //if this is the first rising edge, set StartPosition if (m_StartPosition==QTime(0,0) && m_EndPosition==m_MaxPosition) m_StartPosition=QTime(0,0).addMSecs( static_cast( ( timestamp / GST_MSECOND ) )); // nanosec -> msec //if we detect a rising edge, set EndPostion to track end m_EndPosition=length(); } //qDebug() << Q_FUNC_INFO <( ( timestamp / GST_MSECOND ) ))<< " silent:" << isSilent; } break; } case GST_MESSAGE_TAG:{ GstTagList *tags = NULL; gst_message_parse_tag (message, &tags); if (gst_tag_list_get_double (tags, GST_TAG_TRACK_GAIN, &m_GainDB)) { qDebug() << Q_FUNC_INFO << ": Gain-db:" << m_GainDB; qDebug() << Q_FUNC_INFO << ": Gain-norm:" << pow (10, m_GainDB / 20); } } default: break; } } void TrackAnalyser::need_finish() { m_finished=true; switch (p->analysisMode) { case TEMPO: detectTempo(); Q_EMIT finishTempo(); break; default: Q_EMIT finishGain(); } } void TrackAnalyser::detectTempo() { int THRESHOLD_WINDOW_SIZE = 10; float MULTIPLIER = 1.5f; QList prunedSpectralFlux; QList threshold; QList peaks; //calculate the running average for spectral flux. for( int i = 0; i < p->spectralFlux.size(); i++ ) { int start = qMax( 0, i - THRESHOLD_WINDOW_SIZE ); int end = qMin( p->spectralFlux.size() - 1, i + THRESHOLD_WINDOW_SIZE ); float mean = 0; for( int j = start; j <= end; j++ ) mean += p->spectralFlux.at(j); mean /= (end - start); threshold.append( mean * MULTIPLIER ); } //take only the signifikat onsets above threshold for( int i = 0; i < threshold.size(); i++ ) { if( threshold.at(i) <= p->spectralFlux.at(i) ) prunedSpectralFlux.append( p->spectralFlux.at(i) - threshold.at(i) ); else prunedSpectralFlux.append( (float)0 ); } //peak detection for( int i = 0; i < prunedSpectralFlux.size() - 1; i++ ) { if( prunedSpectralFlux.at(i) > prunedSpectralFlux.at(i+1) ) peaks.append( prunedSpectralFlux.at(i) ); else peaks.append( (float)0 ); } //use autocorrelation to retrieve time periode of peaks float bpm = AutoCorrelation(peaks, peaks.count(), 60, 240, p->fft_res); qDebug() << Q_FUNC_INFO << "autocorrelation bpm:"< music fits anyway -> factor: 2x or 0.5x p->bpm = qRound(bpm); } float TrackAnalyser::AutoCorrelation( QList buffer, int frames, int minBpm, int maxBpm, int sampleRate) { float maxCorr = 0; int maxLag = 0; float std_bpm = 120.0f; float std_dev = 0.8f; int maxOffset = sampleRate * 60 / minBpm; int minOffset = sampleRate * 60 / maxBpm; if (frames > buffer.count()) frames=buffer.count(); for (int lag = minOffset; lag < maxOffset; lag++) { float corr = 0; for (int i = 0; i < frames-lag; i++) { corr += (buffer.at(i+lag) * buffer.at(i)); } //float bpm = sampleRate * 60.0 / lag; //calculate rating according then common bpm of 120 (log normal distribution) //float rate = (float) qExp( -0.5 * qPow(( log( bpm / std_bpm ) / log(2) / std_dev),2.0)); //corr = corr * rate; //We dont care about tempo-harmonics issue -> music fits anyway -> factor: 2x or 0.5x if (corr > maxCorr) { //qDebug() << Q_FUNC_INFO << "corr: "<0) return sampleRate * 60.0 / maxLag; else return 0.0; } knowthelist-2.3.1/src/trackanalyser.h000077500000000000000000000044311342115213400176740ustar00rootroot00000000000000/* Copyright (C) 2011 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #ifndef TRACKANALYSER_H #define TRACKANALYSER_H #include #include #define GST_DISABLE_LOADSAVE 1 #define GST_DISABLE_REGISTRY 1 #define GST_DISABLE_DEPRECATED 1 #include class TrackAnalyser : public QWidget { Q_OBJECT public: TrackAnalyser(QWidget *parent = 0); ~TrackAnalyser(); enum modeType { STANDARD, TEMPO }; bool prepare(); void open(QUrl url); void start(); bool close(); double gainDB(); double gainFactor(); QTime startPosition(); QTime endPosition(); int bpm(); bool finished() {return m_finished;} void setMode(modeType mode); void setPosition(QTime position); QTime length(); static const int GAIN_INVALID=-99; void need_finish(); void newpad (GstElement *decodebin, GstPad *pad, gpointer data); static GstBusSyncReply bus_cb (GstBus *bus, GstMessage *msg, gpointer data); Q_SIGNALS: void finishGain(); void finishTempo(); private slots: void messageReceived(GstMessage* message); void loadThreadFinished(); private: struct TrackAnalyser_Private *p; GstElement *pipeline; GstBus *bus; double m_GainDB; QTime m_StartPosition; QTime m_EndPosition; QTime m_MaxPosition; bool m_finished; void detectTempo(); float AutoCorrelation( QList buffer, int frames, int minBpm, int maxBpm, int sampleRate); void cleanup(); void asyncOpen(QUrl url); void sync_set_state(GstElement*, GstState); }; #endif // TRACKANALYSER_H knowthelist-2.3.1/src/vumeter.cpp000077500000000000000000000155631342115213400170630ustar00rootroot00000000000000/* Copyright (C) 2005-2019 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #include "vumeter.h" #include #include #include struct VUMeterPrivate { double valueLeft; double valueRight; double peakLeft; double peakRight; Qt::Orientation orientation; QTime peakTime; int linesPerSegment; int ledSize; int spacesInSegments; int segmentsPerPeak; int margin; int maxLevel; int highLevel; int step; int spacesBetweenSegments; QColor colBack; QColor colValue; }; VUMeter::VUMeter(QWidget* parent) : QWidget(parent) , p(new VUMeterPrivate) { setOrientation(Qt::Vertical); BackgroundColor.setRgb(40, 40, 40); LevelColorNormal.setRgb(0, 200, 0); LevelColorHigh.setRgb(200, 0, 0); LevelColorOff.setRgb(80, 120, 120); QPalette pal = palette(); pal.setColor(QPalette::Window, BackgroundColor); setPalette(pal); p->valueLeft = p->valueRight = 0; p->peakLeft = p->peakRight = 0; p->margin = 1; p->linesPerSegment = 1; p->spacesBetweenSegments = 0; p->step = p->linesPerSegment + p->spacesBetweenSegments; p->segmentsPerPeak = 1; p->colBack = QColor(60, 60, 60); p->colValue = Qt::white; } VUMeter::~VUMeter() { } void VUMeter::setOrientation(Qt::Orientation o) { p->orientation = o; } Qt::Orientation VUMeter::orientation() const { return p->orientation; } void VUMeter::reset() { p->peakLeft = p->peakRight = 0; p->valueLeft = p->valueRight = 0; update(); } void VUMeter::resizeEvent(QResizeEvent* e) { Q_UNUSED(e); int size = (orientation() == Qt::Vertical) ? width() : height(); p->ledSize = ((size - p->margin) / 2); p->maxLevel = (((orientation() == Qt::Vertical) ? height() : width()) / (p->linesPerSegment + p->step)) * (p->linesPerSegment + p->step) + p->margin; p->highLevel = static_cast(0.75 * p->maxLevel); } void VUMeter::checkPeakTime() { if (p->peakTime.elapsed() >= 1000) { p->peakLeft = 0; p->peakRight = 0; p->peakTime.restart(); update(); } } void VUMeter::setValueLeft(double f) { double fl = f; if (fl < 0.0) fl = 0.0; if (fl > p->peakLeft) { p->peakLeft = fl; p->peakTime.start(); } if (p->valueLeft != fl) { p->valueLeft = fl; if (p->valueLeft == 0.0) p->peakLeft = 0.0; update(); checkPeakTime(); } } void VUMeter::setPercentage(double f) { //qDebug() << "Level: "<< f; p->valueRight = p->valueLeft = f; update(); } void VUMeter::setValueRight(double f) { double fr = f; if (fr < 0.0) fr = 0.0; if (fr > p->peakRight) { p->peakRight = fr; p->peakTime.start(); } if (p->valueRight != fr) { p->valueRight = fr; if (p->valueRight == 0.0) p->peakRight = 0.0; update(); checkPeakTime(); } } void VUMeter::setLinesPerSegment(int i) { p->linesPerSegment = i; p->step = p->linesPerSegment + p->spacesBetweenSegments; } void VUMeter::setSpacesBetweenSegments(int i) { p->spacesBetweenSegments = i; p->step = p->linesPerSegment + p->spacesBetweenSegments; } void VUMeter::setSegmentsPerPeak(int i) { p->segmentsPerPeak = i; } void VUMeter::setMargin(int i) { p->margin = i; } void VUMeter::paintEvent(QPaintEvent*) { drawMeter(); QStyleOption opt; opt.init(this); QPainter p(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); } void VUMeter::drawMeter() { QPainter painter(this); int valueLeft = 0; int valueRight = 0; int peakLeft = 0; int peakRight = 0; QColor colorLeft; QColor colorRight; valueLeft = static_cast((p->maxLevel / p->step * p->valueLeft) * p->step); peakLeft = static_cast((p->maxLevel / p->step * p->peakLeft) * p->step); valueRight = static_cast((p->maxLevel / p->step * p->valueRight) * p->step); peakRight = static_cast((p->maxLevel / p->step * p->peakRight) * p->step); // segments for (int segment = 0; segment < p->maxLevel; segment += p->step) { // left value & peak colors if ((segment < valueLeft && segment <= p->highLevel) || (peakLeft > 0 && peakLeft >= segment && peakLeft < segment + p->step * p->segmentsPerPeak && segment <= p->highLevel)) { colorLeft = LevelColorNormal; } else if ((segment < valueLeft && segment > p->highLevel) || (peakLeft > 0 && peakLeft >= segment && peakLeft < segment + p->step * p->segmentsPerPeak && segment > p->highLevel)) { colorLeft = LevelColorHigh; } else { colorLeft = LevelColorOff; } // right value & peak colors if ((segment < valueRight && segment <= p->highLevel) || (peakRight > 0 && peakRight >= segment && peakRight < segment + p->step * p->segmentsPerPeak && segment <= p->highLevel)) { colorRight = LevelColorNormal; } else if ((segment < valueRight && segment > p->highLevel) || (peakRight > 0 && peakRight >= segment && peakRight < segment + p->step * p->segmentsPerPeak && segment > p->highLevel)) { colorRight = LevelColorHigh; } else { colorRight = LevelColorOff; } // LEDs for (int led = 0; led < p->linesPerSegment; led++) { int level = segment + led; if (orientation() == Qt::Vertical) { // draw left painter.setPen(colorLeft); painter.drawLine(0, p->maxLevel - level, p->ledSize - 1, p->maxLevel - level); // draw right painter.setPen(colorRight); painter.drawLine(p->margin + p->ledSize, p->maxLevel - level, p->margin + p->ledSize * 2 - 1, p->maxLevel - level); } else { // draw left painter.setPen(colorLeft); painter.drawLine(level, 0, level, p->ledSize - 1); // draw right painter.setPen(colorRight); painter.drawLine(level, p->margin + p->ledSize, level, p->margin + p->ledSize * 2 - 1); } } } } knowthelist-2.3.1/src/vumeter.h000077500000000000000000000037321342115213400165230ustar00rootroot00000000000000/* Copyright (C) 2005-2019 Mario Stephan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This 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 Lesser General Public License along with this program. If not, see . */ #ifndef VUMETER_H #define VUMETER_H #include #include #include #include // helper functions const float LEVEL_MIN = 1.f / (1 << 20); // minimal positive sample for 20 bit resolution inline float levelToDB(float level) { if (level < LEVEL_MIN) level = LEVEL_MIN; // prevent from div by 0 return (25.0f) * log(level); } inline float DBToLevel(float db) { return exp(db / (log(2.f) / 6.f)); } class VUMeter : public QWidget { Q_OBJECT Q_PROPERTY(Qt::Orientation orientation READ orientation WRITE setOrientation) public: VUMeter(QWidget* parent = nullptr); ~VUMeter(); void setValueLeft(double); void setValueRight(double); void setPercentage(double); void checkPeakTime(); void setOrientation(Qt::Orientation); Qt::Orientation orientation() const; void setLinesPerSegment(int); void setSpacesBetweenSegments(int); void setSegmentsPerPeak(int); void setMargin(int); QColor LevelColorNormal; QColor LevelColorHigh; QColor LevelColorOff; QColor BackgroundColor; void reset(); protected: void paintEvent(QPaintEvent*); void resizeEvent(QResizeEvent*); private: struct VUMeterPrivate* p; void drawMeter(); }; #endif