From 2b6108425ba09a68068b69ae9d5ca7114a0d3af9 Mon Sep 17 00:00:00 2001 From: pkali Date: Sun, 23 Oct 2016 20:05:05 +0200 Subject: [PATCH] initial commit --- LICENSE | 674 +++++++++ README | 69 + README.md | 1 + config_class.py | 517 +++++++ config_class.pyc | Bin 0 -> 13017 bytes create_m3u.py | 536 +++++++ display_config.py | 59 + display_current.py | 53 + display_model.py | 97 ++ html/PiRadio16.gif | Bin 0 -> 1017 bytes html/button.php | 9 + html/changeconf.php | 75 + html/config.php | 122 ++ html/icons/PiRadio114.png | Bin 0 -> 31323 bytes html/icons/PiRadio16.gif | Bin 0 -> 1017 bytes html/icons/PiRadio32.png | Bin 0 -> 11013 bytes html/icons/PiRadio57.png | Bin 0 -> 12105 bytes html/icons/PiRadio72.png | Bin 0 -> 16313 bytes html/index.html | 112 ++ html/index_old.html | 368 +++++ html/jquery-1.12.4.min.js | 5 + html/lcd.php | 18 + html/player.php | 10 + html/scripts/reboot.sh | 1 + html/scripts/restart.sh | 1 + html/styles.css | 66 + language/language.en | 14 + language/language.hu | 14 + language/language.nl | 14 + language_class.py | 217 +++ language_class.pyc | Bin 0 -> 5766 bytes lcd_class.py | 359 +++++ lcd_class.pyc | Bin 0 -> 7621 bytes log_class.py | 122 ++ log_class.pyc | Bin 0 -> 2655 bytes menu_switch_class.py | 79 ++ playlists.log | 6 + radio4.py | 1116 +++++++++++++++ radio_class.py | 2762 +++++++++++++++++++++++++++++++++++++ radio_class.pyc | Bin 0 -> 71380 bytes radio_daemon.py | 176 +++ radio_daemon.pyc | Bin 0 -> 4763 bytes rc_daemon.py | 206 +++ rc_daemon.pyc | Bin 0 -> 5490 bytes remote_control.py | 250 ++++ rss_class.py | 179 +++ rss_class.pyc | Bin 0 -> 4710 bytes run_raspi-config.sh | 28 + test_lcd.py | 60 + test_remote_control.py | 56 + test_switches.py | 81 ++ translate_class.py | 420 ++++++ translate_class.pyc | Bin 0 -> 10229 bytes udp_server_class.py | 118 ++ udp_server_class.pyc | Bin 0 -> 3453 bytes voice.dist | 1 + 56 files changed, 9071 insertions(+) create mode 100755 LICENSE create mode 100755 README create mode 100644 README.md create mode 100755 config_class.py create mode 100644 config_class.pyc create mode 100755 create_m3u.py create mode 100755 display_config.py create mode 100755 display_current.py create mode 100755 display_model.py create mode 100755 html/PiRadio16.gif create mode 100755 html/button.php create mode 100755 html/changeconf.php create mode 100755 html/config.php create mode 100755 html/icons/PiRadio114.png create mode 100755 html/icons/PiRadio16.gif create mode 100755 html/icons/PiRadio32.png create mode 100755 html/icons/PiRadio57.png create mode 100755 html/icons/PiRadio72.png create mode 100755 html/index.html create mode 100644 html/index_old.html create mode 100755 html/jquery-1.12.4.min.js create mode 100755 html/lcd.php create mode 100755 html/player.php create mode 100755 html/scripts/reboot.sh create mode 100755 html/scripts/restart.sh create mode 100755 html/styles.css create mode 100755 language/language.en create mode 100755 language/language.hu create mode 100755 language/language.nl create mode 100755 language_class.py create mode 100644 language_class.pyc create mode 100755 lcd_class.py create mode 100644 lcd_class.pyc create mode 100755 log_class.py create mode 100755 log_class.pyc create mode 100755 menu_switch_class.py create mode 100755 playlists.log create mode 100755 radio4.py create mode 100755 radio_class.py create mode 100644 radio_class.pyc create mode 100755 radio_daemon.py create mode 100644 radio_daemon.pyc create mode 100755 rc_daemon.py create mode 100755 rc_daemon.pyc create mode 100755 remote_control.py create mode 100755 rss_class.py create mode 100644 rss_class.pyc create mode 100755 run_raspi-config.sh create mode 100755 test_lcd.py create mode 100755 test_remote_control.py create mode 100755 test_switches.py create mode 100755 translate_class.py create mode 100755 translate_class.pyc create mode 100755 udp_server_class.py create mode 100755 udp_server_class.pyc create mode 100755 voice.dist diff --git a/LICENSE b/LICENSE new file mode 100755 index 0000000..94a9ed0 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU 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. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README b/README new file mode 100755 index 0000000..6187c6c --- /dev/null +++ b/README @@ -0,0 +1,69 @@ +Raspberry Pi Internet Radio +--------------------------- +Author : Bob Rathbone +Site : http://www.bobrathbone.com +Email : bob@bobrathbone.com + +This program uses Music Player Daemon 'mpd', its client 'mpc' and the python-mpd library +See http://www.musicpd.org/ +Use "apt-get install mpd mpc python-mpd" to install the library +Modified to use python-mpd library. See https://pypi.python.org/pypi/python-mpd/ + +Version 5.1 release notes +------------------------- +Version 5.1 addresses issues found in 5.0 (Major release) and general improvements +1) Resolved the radio crashing if a playlist created without a .m3u extension +2) Resolved the radio crashing if invalid RSS file /var/lib/radiod/rss +3) Amended test_i3c_lcd test program to support PCF8475 backpack +4) Amended test_ada_lcd.py test program to gracefully exit with Ctrl-C key +5) Alternative rotary class configurable. New rotary_class=standard/alternative added to radiod.conf +6) Missing nodaemon option added to rradiobp.py +7) Reboot problem solved (systemd bug solved by installing svinit-core) +8) Incorrect status display cured as above + +Version 5.0 release notes +------------------------- +Version 5.0 is a major release of the radio software specifically for Raspian Jessie +Backwards compatibility with Raspian Wheezy is not guaranteed. +Version 4.7 is still available for Raspbian Wheezy but is no longer maintained. + +The following changes have been implemented +1) New language class to handle languages other than English (New language class) +2) Problem with radio station jumping on un-mute solved +3) Espeak implemented for people with impaired vision or blindness (New espeak class) +4) Full IR Remote Control functionality +5) New create_m3u.py program to M3U playlists (pls files are no longer used or supported) +6) MPD version 0.19 now suported (was version 0.16) +7) Version 1 Rasberry Pi boards are no longer supported +8) Due to the very limited and poor functionality Podcasts are no longer supported +9) All programs are now installed in /usr/share/radio instead of /home/pi/radio +10) Volume range now configurable 10, 20, 25 50 and 100 +11) Support for HifFerry DAC and DAC+ +12) Separate option for setting alarm hours and minutes + +Installation +------------ +You are strongly advised to install the latest Debian Jessie on a new SD card and +then to install MPD and the radio software. +Attempting a apt-get dist-upgrade does not do a full Jessie upgrade and may give uncertain results + +Manual +------ +Download from http://www.bobrathbone.com/raspberrypi/Raspberry%20PI%20Radio.pdf + +Github +------ +Source available from Github +See https://github.com/bobrathbone/piradio + +Licenses +-------- +GNU General Public License. See http://www.gnu.org/licenses/gpl.html +GNU AFFERO GENERAL PUBLIC LICENSE. See http://www.gnu.org/licenses/agpl.html + +Disclaimer +---------- +Software is provided as is and absolutly no warranties are implied or given. +The authors shall not be liable for any loss or damage however caused. + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..016e7bc --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# piradio-mini diff --git a/config_class.py b/config_class.py new file mode 100755 index 0000000..cf6bcb3 --- /dev/null +++ b/config_class.py @@ -0,0 +1,517 @@ +#!/usr/bin/env python +# +# Raspberry Pi Internet Radio Class +# $Id: config_class.py,v 1.32 2016/07/23 13:21:28 bob Exp $ +# +# Author : Bob Rathbone +# Site : http://www.bobrathbone.com +# +# This class reads the /etc/radiod.conf file for configuration parameters +# +# License: GNU V3, See https://www.gnu.org/copyleft/gpl.html +# +# Disclaimer: Software is provided as is and absolutly no warranties are implied or given. +# The authors shall not be liable for any loss or damage however caused. +# + +import os +import sys +import ConfigParser +from log_class import Log + +# System files +ConfigFile = "/etc/radiod.conf" + +log = Log() +config = ConfigParser.ConfigParser() + + +class Configuration: + # Input source + RADIO = 0 + PLAYER = 1 + LIST = 0 + STREAM = 1 + + # Rotary class selection + STANDARD = 0 # Select rotary_class.py + ALTERNATIVE = 1 # Select rotary_class_alternative.py + + # Configuration parameters + mpdport = 6600 # MPD port number + dateFormat = "%H:%M %d/%m/%Y" # Date format + volume_range = 100 # Volume range 10 to 100 + volume_increment = 1 # Volume increment 1 to 10 + display_playlist_number = False # Two line displays only, display station(n) + source = RADIO # Source RADIO or Player + stationNamesSource = LIST # Station names from playlist names or STREAM + rotary_class = STANDARD # Rotary class STANDARD or ALTERNATIVE + + # Remote control parameters + remote_led = 0 # Remote Control activity LED 0 = No LED + remote_control_host = 'localhost' # Remote control to radio communication port + remote_listen_host = 'localhost' # Remote control to radio communication port + remote_control_port = 5100 # Remote control to radio communication port + + ADAFRUIT = 1 # I2C backpack type AdaFruit + PCF8574 = 2 # I2C backpack type PCF8574 + i2c_backpack = ADAFRUIT + i2c_address = 0x00 # Use defaults or use setting in radiod.conf + backpack_names = [ 'UNKWOWN','ADAFRUIT','PCF8574'] + speech = False # Speech on for visually impaired or blind persons + isVerbose = False # Extra speech verbosity + speech_volume = 80 # Percentage speech volume + use_playlist_extensions = False # MPD 0.15 requires playlist. + rss = False # RSS in standby mode (Pecus) + bright = True # LCD high brightness (Pecus) + media_update = False # always update media library (Pecus) + pandora_available = False # is Pandora accout available ? (Pecus) + + # Colours for Adafruit LCD + color = { 'OFF': 0x0, 'RED' : 0x1, 'GREEN' : 0x2, 'YELLOW' : 0x3, + 'BLUE' : 0x4, 'VIOLET' : 0x5, 'TEAL' : 0x6, 'WHITE' : 0x7 } + + colorName = { 0: 'Off', 1 : 'Red', 2 : 'Green', 3 : 'Yellow', + 4 : 'Blue', 5 : 'Violet', 6 : 'Teal', 7 : 'White' } + + colors = { 'bg_color' : 0x0, + 'mute_color' : 0x0, + 'shutdown_color' : 0x0, + 'error_color' : 0x0, + 'search_color' : 0x0, + 'source_color' : 0x0, + 'info_color' : 0x0, + 'menu_color' : 0x0, + 'sleep_color': 0x0 } + + # List of loaded options for display + configOptions = {} + + # Other definitions + UP = 0 + DOWN = 1 + + # GPIOs for switches and rotary encoder configuration + switches = { "menu_switch": 25, + "mute_switch": 4, + "left_switch": 14, + "right_switch": 15, + "up_switch": 17, + "down_switch": 18, + } + + # GPIOs for LCD connections + lcdconnects = { + "lcd_enable": 8, + "lcd_select": 7, + "lcd_data4": 27, + "lcd_data5": 22, + "lcd_data6": 23, + "lcd_data7": 24, + "lcd_bri": 10, + } + + # Initialisation routine + def __init__(self): + log.init('radio') + if not os.path.isfile(ConfigFile) or os.path.getsize(ConfigFile) == 0: + log.message("Missing configuration file " + ConfigFile, log.ERROR) + else: + self.getConfig() + + return + + # Get configuration options from /etc/radiod.conf + def getConfig(self): + section = 'RADIOD' + + # Get options + config.read(ConfigFile) + try: + options = config.options(section) + for option in options: + parameter = config.get(section,option) + msg = "Config option: " + option + " = " + parameter + + self.configOptions[option] = parameter + + if option == 'loglevel': + next + + elif option == 'volume_range': + range = int(parameter) + if range < 10: + range = 10 + if range > 100: + range = 100 + self.volume_range = range + self.volume_increment = int(100/range) + + elif option == 'remote_led': + self.remote_led = int(parameter) + + elif option == 'remote_control_host': + self.remote_control_host = parameter + + elif option == 'remote_control_port': + self.remote_control_port = int(parameter) + + elif option == 'remote_listen_host': + self.remote_listen_host = parameter + + elif option == 'mpdport': + self.mpdport = int(parameter) + + elif option == 'dateformat': + self.dateFormat = parameter + + elif option == 'display_playlist_number': + if parameter == 'yes': + self.display_playlist_number = True + + elif option == 'startup': + if parameter == 'MEDIA': + self.source = self.PLAYER + + elif option == 'station_names': + if parameter == 'stream': + self.stationNamesSource = self.STREAM + else: + self.stationNamesSource = self.LIST + + elif option == 'i2c_backpack': + if parameter == 'PCF8574': + self.i2c_backpack = self.PCF8574 + else: + self.i2c_backpack = self.ADAFRUIT + + elif option == 'i2c_address': + value = int(parameter,16) + if parameter > 0x00: + self.i2c_address = value + + elif 'color' in option: + try: + self.colors[option] = self.color[parameter] + except: + log.message("Invalid option " + option + ' ' + parameter, log.ERROR) + + elif option == 'speech': + if parameter == 'yes': + self.speech = True + else: + self.speech = False + + elif option == 'verbose': + if parameter == 'yes': + self.isVerbose = True + else: + self.isVerbose = False + + elif option == 'speech_volume': + self.speech_volume = int(parameter) + + elif option == 'use_playlist_extensions': + if parameter == 'yes': + self.use_playlist_extensions = True + else: + self.use_playlist_extensions = False + + elif '_switch' in option: + switch = int(parameter) + try: + self.switches[option] = switch + except: + msg = "Invalid switch parameter " + option + log.message(msg,log.ERROR) + + elif 'lcd_' in option: + lcdconnect = int(parameter) + try: + self.lcdconnects[option] = lcdconnect + except: + msg = "Invalid LCD connect parameter " + option + log.message(msg,log.ERROR) + + elif option == 'rotary_class': + if parameter == 'standard': + self.rotary_class = self.STANDARD + else: + self.rotary_class = self.ALTERNATIVE + + elif option == 'rss': # option for RSS in standby mode (Pecus) + if parameter == 'yes': # (Pecus) + self.rss = True # (Pecus) + else: # (Pecus) + self.rss = False # (Pecus) + + elif option == 'bright': # option for high brightness of LCD (Pecus) + if parameter == 'yes': # (Pecus) + self.bright = True # (Pecus) + else: # (Pecus) + self.bright = False # (Pecus) + + elif option == 'media_update': # option for update media library (Pecus) + if parameter == 'yes': # (Pecus) + self.media_update = True # (Pecus) + else: # (Pecus) + self.media_update = False # (Pecus) + + elif option == 'pandora_available': # option for Pandora availablity (Pecus) + if parameter == 'yes': # (Pecus) + self.pandora_available = True # (Pecus) + else: # (Pecus) + self.pandora_available = False # (Pecus) + + + else: + msg = "Invalid option " + option + ' in section ' \ + + section + ' in ' + ConfigFile + log.message(msg,log.ERROR) + + except ConfigParser.NoSectionError: + msg = ConfigParser.NoSectionError(section),'in',ConfigFile + log.message(msg,log.ERROR) + return + + # Get routines + + # Get I2C backpack type + def getBackPackType(self): + return self.i2c_backpack + + # Get I2C backpack address + def getI2Caddress(self): + return self.i2c_address + + # Get I2C backpack name + def getBackPackName(self): + return self.backpack_names[self.i2c_backpack] + + # Get the volume range + def getVolumeRange(self): + return self.volume_range + + # Get the volume increment + def getVolumeIncrement(self): + return self.volume_increment + + # Get the remote control activity LED number + def getRemoteLed(self): + return self.remote_led + + # Get the remote Host default localhost + def getRemoteUdpHost(self): + return self.remote_control_host + + # Get the UDP server listener IP Host default localhost + # or 0.0.0.0 for all interfaces + def getRemoteListenHost(self): + return self.remote_listen_host + + # Get the remote Port default 5100 + def getRemoteUdpPort(self): + return self.remote_control_port + + # Get the mpdport + def getMpdPort(self): + return self.mpdport + + # Get the date format + def getDateFormat(self): + return self.dateFormat + + # Get display playlist number (Two line displays only) + def getDisplayPlaylistNumber(self): + return self.display_playlist_number + + # Get the startup source 0=RADIO or 1=MEDIA + def getSource(self): + return self.source + + # Get the startup source name RADIO MEDIA + def getSourceName(self): + source_name = "MEDIA" + if self.getSource() < 1: + source_name = "RADIO" + return source_name + + # Get the background color (Integer) + def getBackColor(self,sColor): + color = 0x0 + # Get the remote Port default 5100 + def getRemoteUdpPort(self): + return self.remote_control_port + + # Get the mpdport + def getMpdPort(self): + return self.mpdport + + # Get the date format + def getDateFormat(self): + return self.dateFormat + + # Get display playlist number (Two line displays only) + def getDisplayPlaylistNumber(self): + return self.display_playlist_number + + # Get the startup source 0=RADIO or 1=MEDIA + def getSource(self): + return self.source + + # Get the startup source name RADIO MEDIA + def getSourceName(self): + source_name = "MEDIA" + if self.getSource() < 1: + source_name = "RADIO" + return source_name + + # Get the background color (Integer) + def getBackColor(self,sColor): + color = 0x0 + try: + color = self.colors[sColor] + except: + log.message("Invalid option " + sColor, log.ERROR) + return color + + # Cycle background colors + def cycleColor(self,direction): + color = self.getBackColor('bg_color') + + if direction == self.UP: + color += 1 + else: + color -= 1 + + if color < 0: + color = 0x7 + elif color > 0x7: + color = 0x0 + + self.colors['bg_color'] = color + return color + + + # Get the background colour string name + def getBackColorName(self,iColor): + sColor = 'None' + try: + sColor = self.colorName[iColor] + except: + log.message("Invalid option " + int(iColor), log.ERROR) + return sColor + + # Get speech + def getSpeech(self): + return self.speech + + # Get verbose + def verbose(self): + return self.isVerbose + + # Get RSS mode (Pecus) + def getRss(self): # (Pecus) + return self.rss # (Pecus) + + # Get LCD brightness mode (Pecus) + def getBright(self): # (Pecus) + return self.bright # (Pecus) + + # Get always media update flag (Pecus) + def getAlwaysUpdate(self): # (Pecus) + return self.media_update # (Pecus) + + # Get pandora flag (Pecus) + def getPandoraAvailable(self): # (Pecus) + return self.pandora_available # (Pecus) + + # Get speech volume % of normal volume level + def getSpeechVolume(self): + return self.speech_volume + + # Get playlist extensions used + def getPlaylistExtensions(self): + return self.use_playlist_extensions + + # Return the station name source (Stream or playlist) + def getStationNamesSource(self): + return self.stationNamesSource + + # Display parameters + def display(self): + for option in self.configOptions: + param = self.configOptions[option] + if option != 'None': + log.message(option + " = " + param, log.DEBUG) + return + + # Return the ID of the rotary class to be used STANDARD or ALTERNATIVE + def getRotaryClass(self): + return self.rotary_class + + # Returns the switch GPIO configuration by label + def getSwitchGpio(self,label): + switch = -1 + try: + switch = self.switches[label] + except: + msg = "Invalid switch label " + label + log.message(msg, log.ERROR) + return switch + + # Returns the LCD GPIO configuration by label + def getLcdGpio(self,label): + switch = -1 + try: + lcdconnect = self.lcdconnects[label] + except: + msg = "Invalid LCD connection label " + label + log.message(msg, log.ERROR) + return lcdconnect + +# End Configuration of class + +# Test Configuration class +if __name__ == '__main__': + + config = Configuration() + print "Configuration file", ConfigFile + print "Volume range:", config.getVolumeRange() + print "Volume increment:", config.getVolumeIncrement() + print "Mpd port:", config.getMpdPort() + print "Remote LED:", config.getRemoteLed() + print "Remote LED port:", config.getRemoteUdpPort() + print "Date format:", config.getDateFormat() + print "Display playlist number:", config.getDisplayPlaylistNumber() + print "Source:", config.getSource(), config.getSourceName() + print "Background colour number:", config.getBackColor('bg_color') + print "Background colour:", config.getBackColorName(config.getBackColor('bg_color')) + print "Speech:", config.getSpeech() + print "Speech volume:", str(config.getSpeechVolume()) + '%' + print "Verbose:", config.verbose() + print "RRS in standby:", config.getRss() # (Pecus) + print "LCD high brightness:", config.getBright() # (Pecus) + print "Always update media library:", config.getAlwaysUpdate() # (Pecus) + print "Pandora account available:", config.getPandoraAvailable() # (Pecus) + if config.getStationNamesSource() is 1: + sSource = "STREAM" + else: + sSource = "LIST" + print "Station names source:",sSource + print "Use playlist extensions:", config.getPlaylistExtensions() + + for switch in config.switches: + print switch, config.getSwitchGpio(switch) + + for lcdconnect in sorted(config.lcdconnects): + print lcdconnect, config.getLcdGpio(lcdconnect) + + rclass = ['Standard', 'Alternative'] + rotary_class = config.getRotaryClass() + print "Rotary class:", rotary_class, rclass[rotary_class] + print "Backpack type:", config.getBackPackType(), config.getBackPackName() + print "I2C address:", hex(config.getI2Caddress()) + +# End of file + diff --git a/config_class.pyc b/config_class.pyc new file mode 100644 index 0000000000000000000000000000000000000000..450fcbda7acfa379eda3825d899a1a99922f9ea7 GIT binary patch literal 13017 zcmb_iO>i8?b?({4-!1_H1PKD*@9+mCC{lz%ks!4aC4#_$00n}`03gIw@&q$-_y4`nY=1ru-jU`h?1zQsow>_o26z4 z2cVSR&+%`1&;l4HkxW&VgD&JlZde@h3)-vbtHnxrDeM4p6o9w9;TJ-$QZ51^|Jdv< zzCZ(V!Jud}^%$C+q&7o|2{#K2F#?9_Vp?qqZE{dpD0*7(2b9~cavfCi+(GJmu2Z=! zD%T}#4^h=~-I792fIlLwdX#QeIVeVt%Jm9mpMs`CyLDPEV~Bp~_L!u{l|Gqz z=_%!&RykW>tQ#0Ot2{J^oZ8he*wr1#!16(4ol18h11sIgz{L?{VBjb+jNPY(bLXUW zKRX!K$H?I@lnEUSLzU3MFcb+L3`3L9!7%g)9Sn1|d(ry5^1wI7J_8)GvnD%dvhyYz zFxdr@T{PLC$u6Oj0p&sN7ep2pMMi_lgXmvT`ZB1%{S{=dDt#5%kkYRq`xT|HA$wiv z>*(Q<@-X8YN)H2viQPnYOX)X|Wt4ss*;`8AM)tPS?;yLQ^az?^fV(`6a+j4J72t}} zV*+5btN>S)9v1)u-xJ_9r6&Xc50e61Q~JIDVCP){t}8ty0C;*Jz_8NO0^C&kp#WfT zMu0bz{#60Mt0TahO3w;_=5qp|`MdyV{zw2cUl0Jz-xC1M9}9ryIRP;1_XW7E^sfm3 z0em39J4$~=0LUUQz=+Zx3UF8Hf&imRFA6ZGbWwn;(prFVrCkB;DZM1Xgwo3bOe(!1 zzlhPBuI3 zu_kOm@;Ey+^>D#!VwuU^srjr&I;nj$`EV*b2knb$=dvSH&@GfmvM@0@mo3&lSs1Td&?_T>>*;gtQ+ewVK-46LZ%gU$yJr< zmx?;?mJ5pz7g=R7a7%76^p2B6Gz2(Z2n*M}qdQSIyxyItVXto|>ZZr8MS0l&qVE-{ zoBXIHqxgakk%UUE;ykrziL4NwOj4~jQ4vsX4{oUl)e@m#B=L0VYyz;V5YgRR4_L5g}?Lpz4e3mN9qETMi z3&Dy~*fi{My%4U5)_DP2h#ZYI9A}ZryzGX7_f-S0xj|3>g8H3xoQIAG83@zHm|OOX zbyylit|SR;KtmgWKNPGKeAn3DA;WOKSSkd;)%8tL?|hyd=JNp>1ms>>9oA**SR$Pe zxf8{~Mebh*1c`51k@PV!N`G^pnSxBJ7qS{#3H7|Q`9%UQNo(^K1dX~T*1bql)LXFO z3BtWtgx(iTs&}hdA*1*KB-LB^bdxOCQ|^1~qbo$iU~>ikow@;X47}B%UceH;M}=bl zH34AYlMvaeo-`@{9|%;D7$M)r=0Jj`2VD@AQqcfyGQj`T24HPEu1!g8hhuvc9-ge_S-JjtXTdVFU$FfXX0i315e+g|ScshsPogHF`*@CoRhVr^IF-t5%P5 z?fVIx5M5aShn8i9C)Fx^pku`K!bK9jA`&h&b~lLLi)3>`xcFRnHzNFxL?l9+!-i*s z1;B>ulR|$YSrd6zGNM0QM-SN0pAz~^a+^Awi)&9y?P^_bUx|A=U)LL8I6HPc`ybbO z+iFvrht!KU5yn8h2;k*$^4Ls97%vR4O#pBKBY}1`RTZmf&>dypNQ9Ff~2u$*YVT!48LSp=c)7S?2n-nC+W zu~2-nj?bax5_g8!g4RCFsmEKXSaa!CoI8=?Wcg{K=J>caVtl#CePxtsG&ce&NSD6R*`oNR+zUlQ8+2fO6^gS zA*})S+g%)fGx+8<*WEsJ9`FXDzC07u^~Rat3m=%6yfzvgxhHmEfgFh(sHjE`OfA(P zi-Q!R#_@4(4*XxPgt+tVUD)G_{C~^D)2eX^an6v?BQeJgt?~H=c=&K%JkV-ad6aaqvXfDcFfk11DQX@CP7hsHUe(W!DUuh%Ew?7Y?h7c@+bb3w1G%EgrU zQDo#s1B}p2HqOXSam>KSd!qp^?(B;TdW;aqgLTdEZ#OW0VPE4%huB!vy%=eL1v(;) zF9hGlAc8UDD9=QG^0c_g*#@}L`{IVq47f2~(&Ucec~)0X^Z^viGm$yhKSmMHZ@46! z;lmrAkIFdm891V2HSJ`P$^*3c7ILpKLi-jf2HCCgTIdG_=J}Ma|6Xllw4!DLJog`P z67XN8w(50&PbZIHBvH#$(kC?AT&N8BrK(IH5? zEuGBmkS`gkGW8PAVPCu6`36QaxOQFv**! zVCX^$w@3vDPo@~?J|EFp-6KdmsN;z>F9$G?=pMxA5A+tE+$ox73_9&FZezlM02sQ( zM9G&!_T>d&enuoz6N%gzwdY4S$_8X37s%pfvE<6}_ccoC2*y*qz*!xLMnsptL`O|p zv>u`q+?Ov?iu2o)0{2uy9x6xTcgnwMfRX8aF%n6`Xur9<|7`V3gtgf2mslp3oG2)w%dW za~XM0jNOYjg&5yUJt_X|FQ88Dh-n~{;FfH&3UEj2R>7D^a%8Sfw5dYvJR>edve#9J zuXgg2n0xD9yoWb!p8^iv#q3$?h334AOPw>|nH-njGotXN?pyZ*a?#F-nzFVh@R zL6P|_QZVA+Y%=*O6C6Lv*<$i_Ccn<)H<pDERFgkl$bmi()3uvr<;=7DVkF0)SsuC>i(MR z;HFe-Dp^-f1SH|y?x-l~o;EH}WEWfx4xbuxAwk1532^iCi zFx3!ZCZHdMw?v!K=uB_`CG+5HPi4n4@E`E_H=$RfDCQuL zlSz*H&sfjPMgS#swIj!soc}x+q{bJSm?MMpF=rT$FX3UueJ%%DBZr7A%UkB$f18^q z;H}BTUAvMk3B+ELhkvgAxgAgn$432MKb}vI1JhrJ#e*si8BihudNgrVVz%vwr}kU_ E2eN;>YXATM literal 0 HcmV?d00001 diff --git a/create_m3u.py b/create_m3u.py new file mode 100755 index 0000000..1e55dc1 --- /dev/null +++ b/create_m3u.py @@ -0,0 +1,536 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Raspberry Pi Internet Radio playlist utility +# $Id: create_m3u.py,v 1.6 2016/04/29 17:22:50 bob Exp $ +# +# Create playlist files from the following url formats +# iPhone stream files (.asx) +# Playlist files (.pls) +# Extended M3U files (.m3u) +# Direct media streams (no extension) +# +# See Raspberry PI Radio constructors manual for instructions +# +# Author : Bob Rathbone +# Web site : http://www.bobrathbone.com +# +# +# License: GNU V3, See https://www.gnu.org/copyleft/gpl.html +# +# Disclaimer: Software is provided as is and absolutly no warranties are implied or given. +# The authors shall not be liable for any loss or damage however caused. +# + +import os +import re +import sys +import urllib2 +from xml.dom.minidom import parseString + +# Output errors to STDERR +stderr = sys.stderr.write; + +# File locations +PlsDirectory = '/var/lib/mpd/playlists/' +RadioDir = '/usr/share/radio/' +RadioLibDir = '/var/lib/radiod/' +StationList = RadioLibDir + 'stationlist' +DistFile = RadioDir + 'station.urls' +TempDir = '/tmp/radio_stream_files/' +PlaylistsDir = RadioDir + 'playlists/' + +duplicateCount = 0 + +# Execute system command +def execCommand(cmd): + p = os.popen(cmd) + return p.readline().rstrip('\n') + +# Create the initial list of files +def createList(): + if not os.path.isfile(StationList): + print 'Creating ' + StationList + '\n' + execCommand ("mkdir -p " + RadioLibDir ) + print ("cp " + DistFile + ' ' + StationList ) + execCommand ("cp " + DistFile + ' ' + StationList) + print + return + +# Create M3U output from the title and URL +def createM3uOutput(title,url,filenumber): + lines = [] + title = title.rstrip() + url = url.rstrip() + lines.append('#EXTM3U') + lines.append('#EXTINF:-1,%s' % title) + lines.append(url + '#' + title) + return lines + +# Create M3U or M3U file +def createM3uFile(filename,output,nlines): + global duplicateCount + uniqueCount = 1 + if len(filename) < 1: + filename = 'unknown' + outfile = TempDir + filename + '.m3u' + + # Create unique files + exists = True + while exists: + if os.path.exists(outfile): + print "Warning: " + outfile + ' already exists' + outfile = TempDir + filename + '[' + str(uniqueCount) + '].m3u' + uniqueCount += 1 + duplicateCount += 1 + else: + exists = False + + try: + print 'Creating ' + outfile + '\n' + outfile = open(outfile,'w') + for item in output: + outstr = item.encode('utf8', 'replace') + outfile.write(outstr + "\n") + + outfile.close() + except: + print "Failed to create",outfile + return + +# Beautify HTML convert tags to lower case +def parseHTML(data): + lcdata = '' + for line in data: + lcline = '' + line = line.rstrip() + line = line.lstrip() + line.replace('href =', 'href=') + length = len(line) + + if length < 1: + continue + tag1right = line.find('>') + + if tag1right > 1: + start_tag = line[0:tag1right+1] + lcline = lcline + start_tag.lower() + + tag2left = line.find('<', tag1right+1) + + if tag2left > 1: + end_tag = line[tag2left:length] + parameter = line[tag1right+1:tag2left] + lcline = lcline + parameter + end_tag.lower() + lcdata = lcdata + lcline + return lcdata + +# Get XML/HTML parameter +def getParameter(line): + tag1right = line.find('>') + tag2left = line.find('<', tag1right+1) + parameter = line[tag1right+1:tag2left] + return parameter + + +# Create a M3U file from an ASX(XML) file +def parseAsx(title,url,data,filenumber): + global errorCount + global warningCount + lcdata = parseHTML(data) + + try: + dom = parseString(lcdata) + except Exception,e: + print "Error:",e + print "Error: Could not parse XML data from,", url + '\n' + errorCount += 1 + return + + try: + # If title undefined in the station list get it from the file + if len(title) < 1: + titleTag = dom.getElementsByTagName('title')[0].toxml() + title = getParameter(titleTag) + + except: + print "Warning: Title not found in", url + pass + + finally: + try: + urlTag = dom.getElementsByTagName('ref')[0].toxml() + url = urlTag.replace('','') + urls = url.split('?') + url = urls[0] + title = title.rstrip() + url = url.rstrip() + print 'Title:',title + m3ufile = title.replace(' ','_') + output = createM3uOutput(title,url,filenumber) + except IndexError,e: + print "Error:",e + print "Error parsing", url + errorCount += 1 + return "# DOM Error" + + return output + +# Create filename from URL +def createFileName(title,url): + if len(title) > 0: + name = title + name = name.replace('.',' ') + name = name.replace(' ','_') + else: + try: + urlparts = url.rsplit('/',1) + site = urlparts[0] + siteparts = site.split('/') + name = siteparts[2] + siteparts = name.split(':') + name = siteparts[0] + except: + name = url + name = name.replace('www.','') + name = name.replace('.com','') + name = name.replace('.','_') + + name = name.replace('__','_') + return name + +# Create default title +def createTitle(url): + urlparts = url.rsplit('/',1) + site = urlparts[0] + siteparts = site.split('/') + name = siteparts[2] + siteparts = name.split(':') + title = siteparts[0] + return title + +# Direct radio stream (MP3 AAC etc) +def parseDirect(title,url,filenumber): + url = url.replace('(stream)', '') + if len(title) < 1: + title = createTitle(url) + print "Title:",title + output = createM3uOutput(title,url,filenumber) + return output + +# Create M3U file from PLS in the temporary directory +def parsePls(title,url,lines,filenumber): + plstitle = '' + plsurl = '' + + for line in lines: + if line.startswith('Title1='): + titleline = line.split('=') + plstitle = titleline[1] + + if line.startswith('File1='): + fileline = line.split('=') + plsurl = fileline[1] + + # If title undefined in the station list get it from the file + if len(title) < 1: + if len(plstitle) > 1: + title = plstitle + else: + title = createTitle(url) + m3ufile = createFileName(title,url) + + print 'Title:',title + m3ufile = title.replace(' ','_') + output = createM3uOutput(title,plsurl,filenumber) + return output + +# Parse M3U file to PLS output +def parseM3u(title,lines,filenumber): + info = 'Unknown' + output = [] + + for line in lines: + line = line.replace('\r','') + line = line.replace('\n','') + if line.startswith('http:'): + url = line + elif line.startswith('#EXTINF:'): + info = line + + if len(title) < 1: + title = info + + if len(title) < 1: + filename = createFileName(title,url) + else: + filename = title.replace(' ','_') + + print 'Title:',title + output.append('#EXTM3U') + output.append('#EXTINF:-1,%s'% title) + output.append('%s#%s'% (url,title)) + return output + +# Usage message +def usage(): + stderr("\nUsage: %s [--delete_old] [--no_delete] [--help]\n" % sys.argv[0]) + stderr("\tWhere: --delete_old Delete old playlists\n") + stderr("\t --no_delete Don't delete old playlists\n") + stderr("\t --help Display help message\n\n") + return + +# Station definition help message +def format(): + stderr ("Start a playlist with the name between brackets. For example:\n") + stderr ("(BBC Radio Stations)\n") + stderr ("This will create a playlist called BBC_Radio_Stations.m3u\n") + stderr ("\nThe above is followed by station definitions which take the following format:\n") + stderr ("\t[title] http://\n") + stderr ("\tExample:\n") + stderr ("\t[BBC Radio 3] http://bbc.co.uk/radio/listen/live/r3.asx\n\n") + stderr ("End a playlist by inserting a blank line at the end of the list of stations\n") + stderr ("or start a new playlist definition.\n\n") + return + +# Start of MAIN script + +if os.getuid() != 0: + print "This program can only be run as root user or using sudo" + sys.exit(1) + +deleteOld = False +noDelete = False + +if len(sys.argv) > 2: + stderr("\nError: you may not define more than one parameter at a time\n") + usage() + sys.exit(1) + +if len(sys.argv) > 1: + param = sys.argv[1] + if param == '--delete_old': + deleteOld = True + + elif param == '--no_delete': + noDelete = True + + elif param == '--help': + usage() + format() + sys.exit(0) + else: + stderr("Invalid parameter %s\n" % param) + usage() + sys.exit(1) + +# Create station URL list +createList() + +# Temporary directory - if it exists then delete all pls files from it +execCommand ("mkdir -p " + TempDir ) +execCommand ("rm -f " + TempDir + '*' ) + +# Open the list of URLs +print "Creating M3U files from", StationList + '\n' + +lineCount = 0 # Line being processed (Including comments) +errorCount = 0 # Errors +duplicateCount = 0 # Duplicate file names +warningCount = 0 # Warnings +processedCount = 0 # Processed station count + +# Copy user stream files to temporary directory + +if os.path.exists(PlaylistsDir + '*.m3u'): + print "Copying user M3U files from " + PlaylistsDir + " to " + TempDir + '\n' + execCommand ("cp -f " + PlaylistsDir + '*.m3u ' + TempDir ) + +# Playlist file name +filename = '' +m3u_output = [] +filenumber = 1 +writeFile = False +url = '' + +# Main processing loop +for line in open(StationList,'r'): + lineCount += 1 + lines = [] + newplaylist = '' + + # Set url types to False + isASX = False + isM3U = False + isPLS = False + + # Skip commented out or blank lines + line = line.rstrip() # Remove line feed + if line[:1] == '#': + continue + + # Handle playlist definition in () brackets + elif line[:1] == '(': + newplaylist = line.strip('(') # Remove left bracket + newplaylist = newplaylist.strip(')') # Remove right bracket + playlistname = newplaylist + newplaylist = newplaylist.replace(' ', '_') + + if len(filename) > 0: + writeFile = True + else: + print "Playlist:", playlistname + filename = newplaylist + filenumber = 1 + continue + + if len(line) < 1 or writeFile: + if len(filename) < 1 and len(url) > 0: + filename = createFileName(title,url) + if len(filename) > 0 and len(m3u_output) > 0: + createM3uFile(filename,m3u_output,filenumber-1) + filenumber = 1 + m3u_output = [] + filename = '' + url = '' + + if len(newplaylist) > 0: + filename = newplaylist + continue + + if writeFile and len(line) > 0: + writeFile = False + else: + continue + + + # Check start of title defined + elif line[:1] != '[': + stderr("Error: Missing left bracket [ in line %s in %s\n" % (lineCount,StationList)) + format() + errorCount += 1 + continue + + processedCount += 1 + line = line.lstrip('[') + + # Get title and URL parts + line = line.strip() + lineparts = line.split(']') + + # Should be 2 parts (title and url) + if len(lineparts) != 2: + stderr("Error: Missing right bracket [ in line %s in %s\n" % (lineCount,StationList)) + format() + errorCount += 1 + continue + + # Get title and URL from station definition + title = lineparts[0].lstrip() + url = lineparts[1].lstrip() + + # Get the published URL and determine its type + print 'Processing line ' + str(lineCount) + ': ' + url + + # Extended M3U (MPEG 3 URL) format + if url.endswith('.m3u'): + isM3U = True + + # Advanced Stream Redirector (ASX) + elif url.endswith('.asx'): + isASX = True + + # Playlist format + elif url.endswith('.pls'): + isPLS = True + + # Advanced Audio Coding stream (Don't retrieve any URL) + else: + # Remove redundant (stream) parameter + url = url.replace('(stream)', '') + m3u_output += parseDirect(title,url,filenumber) + if len(filename) < 1: + filename = createFileName(title,url) + writeFile = True + filenumber += 1 + continue + + # Get the published URL to the stream file + try: + file = urllib2.urlopen(url) + data = file.read() + file.close() + # Creat list from data + lines = data.split('\n') + firstline = lines[0].rstrip() + except: + print "Error: Failed to retrieve ",title, url + errorCount += 1 + continue + + + # process lines accoording to URL type + if isPLS: + m3u_output += parsePls(title,url,lines,filenumber) + elif isM3U: + m3u_output += parseM3u(title,lines,filenumber) + elif isASX: + if firstline.startswith(' 0 and len(m3u_output) > 0: + createM3uFile(filename,m3u_output,filenumber-1) + +print ("Processed %s station URLs from %s" % (processedCount,StationList)) + +# Copy files from temporary directory to playlist directory +oldfiles = len(os.listdir(PlsDirectory)) +if oldfiles > 0: + if not deleteOld and not noDelete: + stderr("There are %s old playlist files in the %s directory.\n" % (oldfiles-2,PlsDirectory)) + stderr("Do you wish to remove the old files y/n: ") + answer = raw_input("") + if answer == 'y': + deleteOld = True + + if deleteOld: + stderr ("\nRemoving old playlists from directory %s\n" % PlsDirectory) + execCommand ("rm -f " + PlsDirectory + "*.pls" ) + execCommand ("rm -f " + PlsDirectory + "*.m3u" ) + else: + print "Old playlist files not removed" + +copiedCount = len(os.listdir(TempDir)) +print "Copying %s new playlist files to directory %s" % (copiedCount,PlsDirectory) +execCommand ("cp -f " + TempDir + '* ' + PlsDirectory ) + +# Create summary report +print "\nNew radio playlist files will be found in " + PlsDirectory + +if errorCount > 0: + print str(errorCount) + " error(s)" + +if duplicateCount > 0: + print str(duplicateCount) + " duplicate file name(s) found and renamed." + +warningCount += duplicateCount +if warningCount > 0: + print str(warningCount) + " warning(s)" + +# End of script + diff --git a/display_config.py b/display_config.py new file mode 100755 index 0000000..70822d9 --- /dev/null +++ b/display_config.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python +# +# Raspberry Pi Internet Radio Configuration dislay +# $Id: display_config.py,v 1.3 2016/06/19 12:23:53 bob Exp $ +# +# Author : Bob Rathbone +# Site : http://www.bobrathbone.com +# + +import os +import sys +import datetime +import commands +from time import strftime +from radio_class import Radio + +# System files +RadioLibDir = "/var/lib/radiod" +CurrentStationFile = RadioLibDir + "/current_station" +CurrentTrackFile = RadioLibDir + "/current_track" +VolumeFile = RadioLibDir + "/volume" +TimerFile = RadioLibDir + "/timer" +AlarmFile = RadioLibDir + "/alarm" +StreamFile = RadioLibDir + "/streaming" +LogLevelFile=RadioLibDir + "/loglevel" +RssFile = "/var/lib/radiod/rss" + +alarmType = ["off", "on", "repeat", "weekdays"] + +radio = Radio() + +# Exec system command +def execCommand(cmd): + return commands.getoutput(cmd) + +# Display flags +def displayConfig(radio): + todaysdate = strftime("%H:%M %d/%m/%Y") + print "Radio Configuration " + todaysdate + print "Volume " + str(radio.getStoredVolume()) + print "Timer " + str(radio.getStoredTimer()) + AlarmString = radio.getStoredAlarm() + print "Alarm " + AlarmString + (sType,sHours,sMins) = AlarmString.split(':') + iAlarmType = int(sType) + print "Alarm " + alarmType[iAlarmType] + " [" + str(iAlarmType) + "]" + print "Streaming " + execCommand( "cat " + StreamFile) + " (" + str(radio.getStoredStreaming()) + ")" + print "Current station " + execCommand( "cat " + CurrentStationFile) + print "Current track " + execCommand( "cat " + CurrentTrackFile) + print "Log level " + execCommand( "cat " + LogLevelFile) + print "RSS " + execCommand( "cat " + RssFile) + print "\nMPC status" + print execCommand("mpc status") + return + +# Main routine +displayConfig(radio) + +# End of script diff --git a/display_current.py b/display_current.py new file mode 100755 index 0000000..4b0b8ff --- /dev/null +++ b/display_current.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python +# +# Diagnostic to Raspberry Pi Display current stream using MPD library +# $Id: display_current.py,v 1.7 2015/01/21 19:44:18 bob Exp $ +# +# Author : Bob Rathbone +# Site : http://www.bobrathbone.com +# +# This program uses Music Player Daemon 'mpd' and the python-mpd library +# Use "apt-get install python-mpd" to install the Python MPD library +# See http://mpd.wikia.com/wiki/Music_Player_Daemon_Wiki +# +# License: GNU V3, See https://www.gnu.org/copyleft/gpl.html +# +# Disclaimer: Software is provided as is and absolutly no warranties are implied or given. +# The authors shall not be liable for any loss or damage however caused. +# + +from mpd import MPDClient +client = MPDClient() # Create the MPD client + +client.timeout = 10 +client.idletimeout = None +client.connect("localhost", 6600) + +currentsong = client.currentsong() + +print "" +if len(currentsong) > 0: + for text in currentsong: + print text + ": " + str(currentsong.get(text)) + + current_id = int(currentsong.get("pos")) + 1 + print "current_id", current_id +else: + print "No current song" + +print "" +print "Status" +status = client.status() +for text in status: + print text + ": " + str(status.get(text)) + +print "" +stats = client.stats() +for text in stats: + print text + ": " + str(stats.get(text)) + +print "Bit rate", status.get('bitrate') + +# End of program + + diff --git a/display_model.py b/display_model.py new file mode 100755 index 0000000..f56e07f --- /dev/null +++ b/display_model.py @@ -0,0 +1,97 @@ +#!/usr/bin/env python +""" +$Id: display_model.py,v 1.7 2016/03/03 16:29:06 bob Exp $ + +Author: Chris Hager +License: MIT +URL: https://github.com/metachris/raspberrypi-utils + +Modified by: Bob Rathbone (bob@bobrathbone.com) +Site : http://www.bobrathbone.com + +License: GNU V3, See https://www.gnu.org/copyleft/gpl.html + +Disclaimer: Software is provided as is and absolutly no warranties are implied or given. + The authors shall not be liable for any loss or damage however caused. + +This script detects a Raspberry Pi's model, manufacturer and mb ram, based +on the cpu revision number. Data source: +http://www.raspberrypi.org/phpBB3/viewtopic.php?f=63&t=32733 + +You can instantiate the ModelInfo class either with a parameter `rev_hex` +(eg. `m = ModelInfo("000f")`), or without a parameter +(eg. `m = ModelInfo()`) in which case it will try to detect it via +`/proc/cpuinfo`. Accessible attributes: + + + class ModelInfo: + model = '' # 'A' or 'B' + revision = '' # '1.0' or '2.0' + ram_mb = 0 # integer value representing ram in mb + maker = '' # manufacturer (eg. 'Qisda') + info = '' # additional info (eg. 'D14' removed) + + +""" +import re + + +model_data = { + '2': ('B', '1.0', 256, 'Cambridge', ''), + '3': ('B', '1.0', 256, 'Cambridge', 'Fuses mod and D14 removed'), + '4': ('B', '2.0', 256, 'Sony', ''), + '5': ('B', '2.0', 256, 'Qisda', ''), + '6': ('B', '2.0', 256, 'Egoman', ''), + '7': ('A', '2.0', 256, 'Egoman', ''), + '8': ('A', '2.0', 256, 'Sony', ''), + '9': ('A', '2.0', 256, 'Qisda', ''), + 'd': ('B', '2.0', 512, 'Egoman', ''), + 'e': ('B', '2.0', 512, 'Sony', ''), + 'f': ('B', '2.0', 512, 'Qisda', ''), + '10': ('B+', '2.0', 512, 'Unknown', ''), + 'a01041': ('2B', '2.0', 512, 'Farnell and others', ''), + '900092': ('Pi Zero', '2.0', 1000, 'Element14', ''), + 'a02082': ('3B', '2.0', 1000, 'Element14', ''), +} + + +class ModelInfo(object): + """ + You can instantiate ModelInfo either with a parameter `rev_hex` + (eg. `m = ModelInfo("000f")`), or without a parameter + (eg. `m = ModelInfo()`) in which case it will try to detect it via + `/proc/cpuinfo` + """ + model = '' + revision = '' + ram_mb = 0 + maker = '' + info = '' + + def __init__(self, rev_hex=None): + if not rev_hex: + with open("/proc/cpuinfo") as f: + cpuinfo = f.read() + rev_hex = re.search(r"(?<=\nRevision)[ |:|\t]*(\w+)", cpuinfo) \ + .group(1) + + self.revision_hex = rev_hex[-4:] if rev_hex[:4] == "1000" else rev_hex + try: + self.model, self.revision, self.ram_mb, self.maker, self.info = \ + model_data[rev_hex.lstrip("0")] + except: + print "Unknown model", rev_hex.lstrip("0") + + def __repr__(self): + s = "%s: Model %s, Revision %s, RAM: %s MB, Maker: %s%s" % ( \ + self.revision_hex, self.model, self.revision, self.ram_mb, \ + self.maker, ", %s" % self.info if self.info else "") + return s + + + + +if __name__ == "__main__": + m = ModelInfo() + print(m) + diff --git a/html/PiRadio16.gif b/html/PiRadio16.gif new file mode 100755 index 0000000000000000000000000000000000000000..6dc0b99ff6ce2b68e4ac274c06ba5a8093b9471e GIT binary patch literal 1017 zcmW+#SxA*p5FRgPK4cn|L>HnW+qCY(Kp7Gwl&u!jLxr?RH7J=@R+kbYjiT^otHo)d z4Wh`TmrSu+pm{|-LPeP=-Y8mag^I|`={x^<8)oL)=Ktp}%u1h?n?yHgAaYz#SnphYEOgpH813l(Ux7-qu+_Yj3yLt=;x!5;E} zOl%_#_=gBMgld36G*n^~IzS9;Km&_ha;}XUk44A@34fqP#Vkz76?UNlO(7OSjz}5- zKo`alG~6Oez z;!=~6564W-j~jpMW>s6HP5ZR0w5(vshc*DlLrO{!r^db zWo0N7!lys(Pizc~QW`Yik4Pel@1Pj^-n{Hm=Kg5a*n2gv{ps6$O{IS$M=#GQ?r&%r zJ|XYG?99?PDH{jvyI5cR?&q_{;J3B+_w==1*s!x=P3_*#k@l;T0%O9v-*m3deI7XW zVCyU2rpCw-e@(%RqX)}dD|)I5v+LTI&p&m&rTFdb{NcxsoQvPmnfD}iec`;?%{_B> ze7Y9beP>s6f$zIi_tX@;sA(#{n~+l diff --git a/html/changeconf.php b/html/changeconf.php new file mode 100755 index 0000000..36b0e15 --- /dev/null +++ b/html/changeconf.php @@ -0,0 +1,75 @@ + + + + + + + PiRadio mini web interface - config page + + +PiRadio
+
+"; + echo "".$rss_link_new.""; + } elseif ($msg == "radio") { + $rss = (isset($_POST['rss'])) ? "rss=yes" : "rss=no"; + $bright = (isset($_POST['bright'])) ? "bright=yes" : "bright=no"; + $media_update = (isset($_POST['media_update'])) ? "media_update=yes" : "media_update=no"; + $pandora_available = (isset($_POST['pandora_available'])) ? "pandora_available=yes" : "pandora_available=no"; + $piradio = file_get_contents( "/etc/radiod.conf" ); + $piradio_new = preg_replace("/\nrss *= *.*/", "\n".$rss, $piradio); + $piradio_new = preg_replace("/\nbright *= *.*/", "\n".$bright, $piradio_new); + $piradio_new = preg_replace("/\nmedia_update *= *.*/", "\n".$media_update, $piradio_new); + $piradio_new = preg_replace("/\npandora_available *= *.*/", "\n".$pandora_available, $piradio_new); + $piradio_array = parse_ini_string($piradio_new); + $rss = ($piradio_array['rss']) ? "yes" : "no"; + $bright = ($piradio_array['bright']) ? "yes" : "no"; + $media_update = ($piradio_array['media_update']) ? "yes" : "no"; + $pandora_available = ($piradio_array['pandora_available']) ? "yes" : "no"; + echo "New Global PiRadio config:
"; + echo ""; + echo "RSS in standby: ".$rss."
"; + echo "LCD high brightness: ".$bright."
"; + echo "Always update library: ".$media_update."
"; + echo "Pandora available: ".$pandora_available."
"; + file_put_contents('/etc/radiod.conf', $piradio_new); + chmod("/etc/radiod.conf", 0755); + } elseif ($msg == "pandora") { + $login = 'user = '.$_POST["login"]; + $password = 'password = '.$_POST["password"]; + $proxy = 'control_proxy = '.$_POST["proxy"]; + /* Folder /home/pi/.config/ musi miec uprawnienia 755 + inaczej nie da sie stad odczytac plik w nim umieszczony */ + $pandora = file_get_contents( "/home/pi/.config/pianobar/config" ); + $pandora_new = preg_replace("/\nuser *= *.*/", "\n".$login, $pandora); + $pandora_new = preg_replace("/\npassword *= *.*/", "\n".$password, $pandora_new); + $pandora_new = preg_replace("/\ncontrol_proxy *= *.*/", "\n".$proxy, $pandora_new); + $pandora_array = parse_ini_string($pandora_new); + echo "New Pandora config:
"; + echo ""; + echo "Login: ".$pandora_array['user']."
"; + echo "Password: ".$pandora_array['password']."
"; + echo "Proxy: ".$pandora_array['control_proxy']."

"; + file_put_contents('/home/pi/.config/pianobar/config', $pandora_new); + chmod("/home/pi/.config/pianobar/config", 0755); + } +} +?> +
+ + + diff --git a/html/config.php b/html/config.php new file mode 100755 index 0000000..972c00b --- /dev/null +++ b/html/config.php @@ -0,0 +1,122 @@ + + + + + + + + PiRadio mini web interface - config page + + +PiRadio
+
+Global PiRadio config
+
+
+";
+echo '';
+  } else {
+  echo '>';
+  }
+echo ' RRS in standby.
'; +echo ''; + } else { + echo '>'; + } +echo ' LCD high brightness.
'; +echo ''; + } else { + echo '>'; + } +echo ' Always update library.
'; +echo ''; + } else { + echo '>'; + } +echo ' Pandora available.'; +echo '

'; +?> + +
+
+
+Media network folder config +
+"; +?> +
+
+
+RSS config +
+"; +?> +
+
+
+Pandora config +
+";
+echo "Login: 
"; +echo "Password:
"; +echo "Proxy:
"; +?> + +
+
+Radio stations config +
+'; +echo $stations; +echo ''; +?> +
+
+
+ + + diff --git a/html/icons/PiRadio114.png b/html/icons/PiRadio114.png new file mode 100755 index 0000000000000000000000000000000000000000..6c6eeb07ad7196a2892e893ccdd82e28757ea501 GIT binary patch literal 31323 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 literal 0 HcmV?d00001 diff --git a/html/icons/PiRadio16.gif b/html/icons/PiRadio16.gif new file mode 100755 index 0000000000000000000000000000000000000000..6dc0b99ff6ce2b68e4ac274c06ba5a8093b9471e GIT binary patch literal 1017 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 literal 0 HcmV?d00001 diff --git a/html/icons/PiRadio57.png b/html/icons/PiRadio57.png new file mode 100755 index 0000000000000000000000000000000000000000..57283cdd4f36f9e4a2b0c4699221d67997b1604d GIT binary patch literal 12105 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 Il=iEZeqi*YE9jeXeuvzn^nG zNB4E^5JhB*l~=QS!ZEe1P+gD4FfqMhV(D;>;)X9zyE#x3QO3Z^$R8?0i4i3fX&!!?{7=NsoL`}XPaB>& z*0Zg5yCbi4b3%KiSLrol@SO-K36dO2Tz)7;A|(H<|Lp7ex3SF(0wYn`0~iQ3Cge^p zlu*FEkAT1@ica`;0LpC&83E{&OYLMO3VuUB6iL>F@(Y0KbdLTkgW!h^fIK2Z@&S-I zlwW!hjS7$j3m6U=f7=2SnE*pt-`y#|Fa18*6AI9YBgcWtiU!EAOn-?17W_czn0n|} zK$8`~Hk0Y$1?HImRw)fLNuaU;=p4mBt_BcL09K`6f%E{ZCt%o5N$CazBm>yuml^^W zpUN@z7$75+TrJQ<#rqYkgTUkfuc5(ALN_Xf_X(TZ2-+wG#N6ecjL#0{L|?xe27s(+ z9LU#Ry||5{m5+{cN7SPkFdcS$c%%6CZR>Ssti&D!02|Ie6R(UcH3WYAAN*`y|4^U8 zTIeHZ{kRJ=t40Ua0a*u&8dvu3WAimTs%c?iXM1~Ix<^FEXi&rZ)x67~Q{(0PgO9-T z-OYOYCKZ@n4=e$Dzuq-`Et^L)7K0e@ZFx6R;<*9&?U{IrqDSgmlO_Z9mJ+5zgjh=W z6?+~tj46O7Or7f@*>1mzjcRH$bRb1OrOq3PVYc?STOEp~sW=@4N2 zEPif`xxSqVzer?J1Ab;wF%AHrFGj_zI#?szhX4R#Szw0BFND{BKQeZHAo>fp{1^Gz zkUKzxs;5f?Lj=jhkI2!GzSLiYE@-5Zn8A=`8br+5sbmopYmdgm|;|81HZ79C}g6!B-xZhRms#Oi7y2m zp?QOK#hat~`vG?U=b%;zwm5LLlHfE-ooG`b4?%$VALMZpXSS3`+^p1b$65lxaPI8A z@e&L4#YiF1KGx3tkMJBl-&vXeb&FJeW<-oN9;%`!MJf45P^n%D(-LxHJXYljiwXYP ziO3D>Dne#N@@$#0HrQkir7M#TAJqn9(q20V`mH2lw_ow z#f-#a!SMVg+QUPI86wI~+Y|*YRh6qci8(1gX{$_mz*v;ZDM>&XJFsYCT@BA0$4K_6 zKX5yJyL+2sn{b=_QU@vh8^|H|US*R`dC*E4e+OfSbLWF;68jgmoD}7i!fe(5xFWSh z%ChT~E0lr@u{eLE@Q(b%m6FLT`x8G!V1Z|GXIZiD-2C54Jc)ebxW?qrfy92|KFqZ% z3ThC}&%R&gboi+s;Xj(=yMC-llFi4T3d8SHW#wTzO4>_CPqtIjWT-WQ7tOYFJ3K1R=ZLgQjILqSMe?vSL0CGDngu2C{Zg;S3FW7R535&FAOd=FSJt? z&h^oH3HhMaE!(XinyZvmWw6!yj||xuzs8M`+#0nc=m(gqho)*|!OMlACFzB@B}}lm zD4SQ5Lz+XQM)@kvOc;JE$>BcDSsrnZt|0NsCv+A2jDC}zFrQPliOp2kx;P;*L9;}% zM5#pLsExb)q#!-N?Q4tH6BzAFpERv5t%P~xC|vrU%7V&D0a5|3oFLy#Ididf9$|Ki zm}`e^!D&)PyS`tBtX;vXd)wY4kvGeW>Wj@|!Hoop=7$;-st-#jqaOu&xg6{Sh*|oU zE|f&|x#c;wH>Y%*7>Aln@KUg}=zTOIb_7e+5nQvGOGuv*z8E7xe@6MGg3sJM$lw%Ij_Fy^YMj;h8t| zmUo}Vw#9lkd;fkBghvftKr12ECiZcvb;RaV=UYt~O*<9#?!8VpU@_Mm!x)?A*s8}G zqVKUxS4o|cFvl}*a{77oD=b9De~39zh&h$;-%5YmwzTt&gWiV6p(xOoKX)Xq#VrDCW zMV@BPX5oL#W?I8Dn(3NS-(`q+nHkEtZNIm#J)c|!Z>Db|Z+YS+vGnWNyJwGfT?ZE6 z7BOQo@+E*|f60H2JO6^gP>35&eTn5t9f9QDMcidh!7{-;@oQdGmw`n7Qj$T=Bjz}| zmCK!~mm`mHrzwE8D5_N!RdywnF9SElh0KOskgtvHXH0aIgGe#CTx`Ahq4}fNj&_3bxl+$oE8&Oy-5DPsy5vm1AMi)sfJm{NXQ^>LP^G_k(1$?!KEmk zw6n~&6U;8mjhOnpAQ=rNV$I#QQY+qS0SEUbq%9n{PeJM*N(CB2>ltij6iQAs63czs zXguVs!TNs({r}cMSsx**A?*ZuA1%+F=qYHjXsy*5JqD!{3gLu=mSZpBCF1zb(=EI0 z5C+=~b|f#y)fScXG?|QIlknyY%P`l!l%I=ND3G9#VX8pYUX(S0-=caMA}e3G)I^iB>&oLmvGP04frWi7h-c_7AujI%M|fcm6Ru) zZ#vBi!$K3YhpQgX5=*4$X`BLD?$TGP1D1;i{!_8$mt*1S@#)?^%n!?kOMmJ;_l!r^ ztkCVwnlYR=CcnOg?eVwrkLq4FI$u^V?OQ~h?jR$ z*zx7yxj=NxWQ-;Q@Ac2?P&pnhi_iVc(cI`n(nNORWnyfHjaS~wVdoKk#nQj7equAYrKn3f>tO)_Ii zWjO%wpauZHp8)Xi28jm%@Picq4h;c-F9`tf>|zXh#Q}hGTT1MUs@vkRo-b%*@6|Uw zlej=NCYM?&hDs_%6;l}!L%6KX#0e~Wp7j&U@tG1hxx2&5Q_CMFzWLNjTT2Z^8dYh^ zFi0I7!Mq1TV9(=N3+ovplhyj`X3U3smZ?YXaxJzYJ!y}3pBQ4Lh<1HeAj2CqQy z8p;o+PIHvIinR`(H$HcpzjbhPxaYhA#*LS!@varEPiG}(A;1jDQw}2Oyn|sMnAoHN zW(CceA0(8Z$v(pbaq<9qQ&RLUdQ`rlo)lb!XpSFKNzLb$v!TF2f0wCtQrGut54G50 zd=}Bhug!mXqDv-s%EQU}9)twL?7PL;pdID6txi*2+wxU`y9~1pYKZb7R)T4mF;ua5zcq>cv#xp5AZqH4bs5` z&D_p5`_gE?h%xxd)K8G-f3M81+=kts_o5p-pZD%@^pV2hRH(J8Ul1I)OCGQlB~F2cd&pas@~Z=*>#NhWWESpZafEHk&eEh7OWS;sKFO!yn=nt&wmD!3Ow^5 zjW3z63SHge*9FaYliZfMfAJ^#5(S!FEosy6JUh5{VP0zbzE@q~T02qj4(H73?vrm@ ziYQHl%zjfDczNRK#k1uxYDmtwO#M5Ra8tGG4Vb0h34OFJw$88gso8cq$8<~|KuYj= z=??sB^3NZujiV*zQ)?ozR$GGXz0XyAnO#)KUA^qmD|_ZQgK#kg zga`-ehaglG!jIxYs{hv}7=0<}o~z3tSOuO3eFx2=my&7WMj&J&RtCe!N={&At8U79oH$3OQ&D>I5vJZsxi@#d z@SR{&a?dnS*>pV-Eb&B3#Wu91JwJ40RT8?I_QxmoM|+A>MM_b6c6K)2ovy7hyC>DE z--%9gESRPn@bQk1Y5Vr8DH}4d;v_{S1zQBfoCoo=&Rh%VtF+~NynGOxcs_iXxf+oF zkdDHKZ(-ZF_}3b~g7_H)&f;c%##kd#twa-nJfO@yb%DFa#w=DYEESiB$;V^nXAC?w zy0m%@UWENH6`X@Vm%rS}4^@)a&p7-rxnrYEtGn*oC|mI)Xift={OIM^anVk8)T+FR zQ7YSP(J;?acS%uX9LAHJOG2RK(W0J0DdBELF)O*b5fd!3J&$;RWScbM22!cQ=!%b?z(pCe?6 zF5<^}nzrlFkya5UDPLkKem_1$``OocylAmx3dWvH)vvfzL&e_?>8u@P9_g3h$uj>~ z<{8cjl6`G<6EQ@6_#39d`~fa%;CHWYG9xW|$BX?!SkN|m>dTr3K}?Q$&`519mFRQA zw{fD&bg(&Yc!&6_vC>Nq-dU8Lu6*)tb1+J6h;;Q2T7x8W{9@ALf28K0yNkHiB(YQ2v-YK+nw;sw@JQ+;}kUVeg{F;35vlkM+k;LiK<0$-8MC_Fw zCQEq#^fJlOpi!MT?sh%1fdRrVGOYSEy!#5u27%#|qcf0grYa}Hc+9imLHyH~n*PZ0 zIA>IO8h$1oOz7PDHmc&1*1DB5giUX51-rbrX79}nqosb)oRWBsu7O-)Ja3wGYOH^I zrHDkI3_>%X%7~}!$ z&>)-n|4nSrc+$CGi;_h8J;gCeG>k=qM3-!@ zq~8S38hX?uO^Y_3QPv@01$`c2#k&hE7qS2SnDu?t^`pUkde|E`cm~cSjCxP|UBYSb7mgllC*TU1#oqV}mW6 zVu?y}`DeIgVO3^}aj5MXzPf5cs~7Yj9)`^4dbswa7pY6v+0JMOow9O%fN4~&2nBAi zL}tpW0qWJK9Y0nS{NQjkH*A2u&N#Zs2+-$76(dgG|J*{4m=hp*WcN;PM>%)8gs{?i z1wBKc5QPY1`cl0bu$t<6Zyge9tc?rYpxqIj@-D}IKU|ouDKdxuH#2wF-hTIE#F-{v zK{hjK^|4(*mAj#a+R~|~yD^NKcf!YZ8FWx_P9(W6f-p3@_xA|5+lRc#Lv+zq->Kh6 zCXE6`Ml$%m3X0`p^hK-!$t@SP@Js#kU+1XQc7E42JIbbwBiTn?nmgaSt%PwL6U}*@ zI<$XQsWR}!pNeoEUhnXPkZP$LS`%yLNVkKGlh>ZMqv^w#J2;wtE%V%rB2UQzr+ zr)*5&_ls9&a*K(#6GV=g&#lwR-s0HJL6|~{K17BYANh}WZ(Sr7W9x!H?@(rS|H>XE z&vKM;#o9K_IachD9MpAL2hJglIIj|4pJutj*KG#62dR&#E=^0#N>TRKOrHyE_?^$T z*1X&&=qqi%;tR{CxcDu~n9p_@Cp``kzzqhwW^cyNW}GxdZBqY+x4W#B(S>FvBJzGm~OwH zos}MjvYSknL$>x>Z3gsjxwRf821vMZOZX}%C{@;kIVgTD?>QA*af-74@QF8kly|&A zwzP}zruYbb<3rpFWn#TMrI7Wgc~f<0T&?k~qDMa@Wo?Wgor}-9cK4#`b>U{L+&3S8 zjlL7Yuhg^dbf#J34H1eUlU2yb%YPRMt;75Nq}$HgHj6M!N<;Y@fU^y+(Vi~g z4%g)Kw5Q^AJP@GNr1LB~(4nSQkzphu&a!-ieuscr0INJq<0*m0c&aRQs{3*ho@K@U zF!ZgVQ+iUeZ}@9Vp^fLuUK@!WCAGq_V*A^rh@<+g0q*Bw`sX0*2o5ju)Mtxp*BAf2 zs201`G`5-8@H1D(s*1Q}x69%F3!3eAqXr4t5*k_@aWgc5b7U@Y)<280gajY?_-lz{ zyJzWj3cjcRargR@{*I5;f6cCO%|7#b`T}A?c5nH?X>Tn3jTV+}niWEkW8>3MIb+Kt z*o>z@MZO?SKDS3_lj*`X?96Nv;t#%WPtkt`;)SWwmr+o4^xm?^wOy}p+q9(5tgOz$ zO&7nXP}|+N|24?_@~x&W&+j-lTsS(4UJd*wG_$>m)gTeP9esAzY;PCCZ;5GWS!yjp zaCVSBw-9}Nx>%wq;SKa+h%VQ!yzuZ95ES8m5;aahK1qxUW?m8Ip^W!BvtJDg*)@6Y ziG}x;>;LV`>;0{jR~NfmHbb<;Y0mbOf9uCSg)%_+v8O{2*Fn>| z{UwURACRM>?+hrvT9`w#5Lm6u9l%rcs87qs0rWnKAd%t1uOt3a|Fw(w6TFnIA!0r3 z$9($_F`WoJ!;j|6#*IXW-g0owO4^uu(`K`>>%vD7^l@|cIDUUQD^#{~h@>Q`5OsGv{0%rwuKsf~rcq>+}{3C`ck_fDmAAGgvXef}CXb&<;L@}H$ z!*CkvLc8C0?B9wKUD{)2$4d@F*{?W+u+s4{y^CMbaDj;w^19y0LFbyXW43@8*Uj*z zdXl`2UUNVyVXuIIFYZy>WN^?4VB_c;CgQ;Q826dZLGh1SS6kwZ{;X&6u4B!DS=bKgf+QP+k z0SfFp*@TDcxK~WenmzM|xkFv%skGs!lc|LOL}^87yIt;0Fy6sBtG%-z30^Q5e*Jcf zmooI`@?_Tl>0A+_YPGeQ%4Wk2qrO2vBUHm``Ipx36sN!IT;MPtOB2jVmVem29N9VX zx~Lw3aLGWXfQ$B*%({r{DtzFK!fv-WEJw6AJPOiZ(}Xf07H~NkB?1X&KV8V1g4PH{ zH&GR!R?Hwve8>kY#!tG02{1ag?T=q(G1p0t>eJh*|D*@KXxsaw3xPfH8<0tNDeD_RvT!o0F0HBc0Kr7GVTk?y3&GkSgn)nkSgh8qIaA6!CyG&#S28Sq3tfM&Ge( zvh}0FVYB29zx*OsY-xQz9y6$Duw$nh$#cx-_ zGw#*0CfzYjh5~n8Er$P`W zzuG)D9IVy%3NO0VURZecO?%G=dv8Opz%?TWYM?_K*^*A}nYa<;b!*2KbIXO5 z7?Xbl10DW6ptMlMUnV1&vjf9@$k)(5H<#ZqPZKWidAoDv=UEIcJ;ce!kaTQ$B-%hT zpC^+?lSk*QqKcOV7k|_1^8ZK0|7=<$10`KtP>?ebNFSw_h3u4AquM1ilgR(n{Eu-<>VKp zmjRl^p)oZ;AM1wpGnmFL$;mKaC>p`O?pjw=yf6Ff`m{s*0CQDkyvZQv2IU5=a9MTC3!YNjq zNnmo4ALeD-gSAKLvoCGK-%eU(YcnPeH>a0YTKv*P&1h8A)K~@xPGDH4Rn0mO&sj2S z%oH7}{^%6l5Z&l@xn7QpA*B|U{yT!0Mf&-Ihyj*oMtexpUd&v zOWEC8(DGZ*`jX+r9Q8wQla(Ez(MC>f1$F(e^gRzPH1(RIW(T??X_2 zIykGE4AvX!7lT;dA0$9rQiDgS6B@U2eE6(JXUtZxr4FXxiPJQNy$lBGA!N;9Q^spS z-d*T28r_ge{M)u2o9TN>i1>TTEb<)koHg^Dc14}OwVgy=SuebOCTn72SeIM&TX#=<&`{uGm{8Ty3_vWRfEX7!q~s> zjFg4a{uvGh4J-E`9!AQ#m-=Tlm>8=!;in^%)I}_qTRDaPHvmhC@Z~TSe>z*9qa(73 z#7S^>5ez)gdB+J6hZnRf8WgU9{fPS4lMaDeKZO0CJV0&7UFqlhvNCHJ}PUort87YP?C z0bH1ZtHyCL46u?Aj=|;e{+gCTemEFiNcYyc(k?k@ng%)Fn@(Y`Z?LB=#$Zn4jit6c z$i`Bh&ME+X?ylF2$IfqI@_a8PP@wC^cpk-2owAcM=0fJe)AgjX^dg9b+a>`;5;}C) ze8%)@=RxI>`}DgXt8?y|yO#;g@7Bmc{up0=k>&oRpE@d?(_&d4t><4lbv7(h>!JIG z%|`t32I(64ddW!kY=3p4Ee9;`o_@*qqTJ~WtXCrAuKtFv&V!yK_|(ZJXRpmd8kH7Q zWKWJ!UD`zEOKLx_I-|NeO8<#V^2e40KI_wO+?uc!sDLkl&{=PM+46g`S(!X3wF)r1 zfpl@1a2{t8Rk}#m2Fy{A{p$J(7vYC9c*wHUlMcq8nX|xW2f+|kwQ*Kk;h58OGTzzn z1bgSV^$?V`4!G8dY}}Mmo2sc(5B-Z?EH8k(@qNQs$W#DrTZH6N=KzKAqb6%53{*^` zv@Z3@FenB=Du7C)CS!k(>1_8U_0I0paHu+MsOi}?tt&->JMue;RD=uZiO{0n)u}*( zgl*(939(z}jrNSSS_K+pQ!|1{xj5N8hVTK?`lccM1RS6Ao3^6TO%^1T7Bx90Y4rR? ztJlty8Ki@vJLA$aD6V<9Xy(E(A8tyhc}TE&(JQI9p28BA0%C{$i0yh;M3?{P@Ak8? z-g&rhJ!m;%TIR2=gU`}s(NkbM4N|pj;`~}cP-*i#y+tdFrDaik!CY>Wcjoi`KxF3g ze8kyJt-mGQl%!2yy@<|4M5cN;qd2apdS-=?fww+KrZ=S*1n1n_LReuB?fX&suJSeZCn;5IWlZoS(>!({+~ATs0p!!)wf(#95{A zEJ0y64--4wmBb~9yLS(W;eDZ2=7C{%Zz=pft~*H%TF=8PT4gqpopayzG_Y(!XP|~E z1tj+=NFK}14#f5$q7rZQ7dJ!ze{-_+Qo$UlRT=y z;(arz!SaFy&8hVnqA>Yf`2wP9H;A5;4kAhqvxUmVvd@Z+TORJ zwYST=j%Pj8F(99noDGjVl9HKvvhTWfmm=j@8{yYp3}WzCC!4VtH3KOouK*J{g`$Wt z`OBv<>fnETF|MPMqaIo@p{dFW!oJn_rc(2C9MyIthjk4$Cf2uSObkR=Nq0`3MB@sDn?cL`E3t;YQiOuvqQ1jEAq7kMz~ z50^U7N6Uygk%Y>XxRF6FXnu<_HM}-Xoh>86e-F&Iw(jn5u~`4>5Zu4bTKXyZf(zjy zK;xNzCwrDGzv}h2`^2;Me*0=;fPg`~TRCf4bA6k7k@w&Fx%G2KPyM$cY|iYn&edwl z-E8aZ-I%Y}YtMsk)MTNpoZf8F+$T-AsKy|XxI$q(Bq;V%-2&Ve&6v3P58_dKEs`iJ zx3LDNI1P<7vAmhmxwi5qqb4EKBXI(*3c4r73abWWI8Vdm3T4=Mjl<;pHUYtv%{IPs zOc;S$w9zBBlbwj)*sY5j|IK6!yMLwlQA6hBNX5>B&c0VEw!15m(L!79JVRX}hvVsS z7;|$rg!fnwbK93U@WI+=qpQSi6CL~Nvw*bWAN{jGSzl}LMy!T3-f!49E>=X)>K5X!xEkBKB)*7A9_LTnlk+MK^d8eczvLS8{ z>syn#pHM&)w7-Ys2Kq;Jc0Ek=?=^VenMdH6;kvSKFY@OwNa)lE(?so?WIj~Msj*Letw2$L836UQ3|k4tKY z!E^SQI7UQi3WJNNkz->8=x;}~i9FxCY%%Krl7=%hP(&K#0DFq4zOPQ}AP4yQF&C1$ z1uvpRQ%1MA*YDQ&#v$nG^gkKrDQB`?{$}eU#KkW=sp4n0pGKvzL!e3(?~8iyrb;-K zG8ug^n0UIBdMpz=-Tk`ircv#1Eq^(s&_f@Qk$YI>NQX899{kH{MfNzg z$S0&P)T8hWuu1Wg6$pZ0HeH?r)}hedYQ0}0_1@-hBK3&xEl<=SsBMhjaYY_g@kF+{ zACLGNeZVYz2c55%OEN3}uF%ya9}^S{J*PV1SNWmY-^OORqO1r}H3}+- z3n8W+z~5>-Sw&rsM$J;z7#HtCh{P#Eh9Yx}883Gw0Qut9knGc9=N_a%*Pq6ek}j{Z zwGhlGPR(h(XN;#|d^X;t^lfPO)cvyl59FW=!B3N8E7Qz$P!Ibtn_t8=;Iw01^$kl_ zi_3H-PAz4HM5yI?VP}jPhG)b!WrcG}*1XjVf~az^4nmCwz8jV%62}v;cVo1R=Lc|_ zuGL^+JTkhPCQY)aYZq#$p#W7VAj_DA4!Z#GTgO}cb6_6mo?ivJ6Zt502X#aKIWMlR zsExRPM&M1T62B?)zHYgC^L3!>6ioJOOyHbNlG z+Qk0H83?>y#lz|Gzy#U2(b4@UR3G^jsuMXwuJ@Z~7CpGP7zY%KhRuKua#W9EQG|l_ z-Vpl22pBR0SqNVbZ|ry*c9s*I6iCl+DCZ(|g_WHilA4TnBa)GwBTk5xcyA3fyA~T8 zX(AMeG7BH-gNsI0(hK;6z3KU9-AXSsjrmg#1)+@#n<_`oF%wdEV{@lD6vb&c5yHOj z)hEDzsU6?uY>J<}|5CR-Nv5Q-#&|iXIv}LLf4TVyQwAN2U584&iG&)m7Ao_&*5%1k z{MU>)U?(mGEjSu8*B)DnZzG-}zSVfFx(#^XkrXT zgYxB2MWD6rNPil+-%lL(-+n5vQn&NME8)ZUv!Bc&n3Jb1>XtuchL^)OpIYX<;gKqR zdy|ccqk`{=l32r|(+xY zGWMIzz%V>!eT#xkgRg}?JclhxYrj1_W_-%uSviL~AVeCU{>&UVfQ}+8v|*!*)#VZ? ztz4add__f(U09huo$ROlQ^5YA$SW*+7|g`xVDt% z0oea-w{LvYfrl${lQ=xslQg66MVebMamf)orlE4Wl{T>*-A)w#rK77dP|++oywVpX zXD9jcayc-q(VHDH=hFf`!G|~AEUT`6Y(umuqrY~D`*MhRSrN9JpioWWy=}`cxJ}iw z+w|`y<-lzu?GUFn)fwSN8edDI-2!md`zntkT`dPA39@+Gu2lTxg^B!M_NnukMSOcxqaUEyG8Hoj3pRRS>HuyLr z*GxfqjrK7E7q;GeO_B5{mwWqwWYd}%$0Szl@T?(|@lDLpSQo?n>8sT4{FcdY$>Ob8 zF?EGFByW^~T&6#SF77r5H>iNvu1UWc$W9pFto+E@Rs_wpDvYEx;`nGk+p(Oi?YqR{ z?^fAcwuX_~hbY+GBYuLcRk=2tHk{n2(&!`c#aMk$FOgQBSQfo>Vb5}5%e3AKvbm98>~lFSYHRo${tx@#Vc<4!I+*x?yU!+KiHMzy90GjJa0x*XtcF%X zq%I{blS>VGmMdTxRVPP`SQXvT&UTQ%WY2>@{@dkSd2P^is6 z*$6`(px+(cpd6934DHRw<73@HxC(IZ5^&5~1FeC5auwPkgz&L3u?euHBO*wNh50f# zi+GB74h-p$|MTn#zoPPl+b2C#mgMV&NyqB1J=xTf|Cei8O{SozU4mM-uT`D$u zOku=yc|2HGCFE8@Te@Gz)uFofGMe9%KpuIJ^d9l!3A8cEd`sz_h@(hPrL+c?qqhcL zQ3u`vOUW9PwJ+v46Q(PMq4}W+gjhs;Wc=^==r7e|mQiun=Vmh{{uup^cZf9qQo6I+bnY z$WHf=HH40xeXi^@0(V18sj)y*yg@@fE;J?*rw}jdTa;5X&KS=dtGtt%QGZuwy!+=& z-fM0d*SB8)T(PQEefzbj$POrKq`0{aBmcA~bJ(U4^_IjEK}bV$a*A;5JY&Ydq>@~s zPWRw=D^pjK5EU`;E>}LPZzjEW`}}-kqq}>+VW_V+LP!1sBjPW_U*vix zdMCOkk}rXeN{>n@2a^6&uQ7mQ1Mtkl8Uk#U;^$}Hl}tZtGnS-t5bBlgrJ3O#vX;dW8F6)41>h7>&s9$=Pvu+- zFTP2>QEt2aym;I~?e7!?2ScMr>;HXcQn9SR&{mx(6lcZtM1&_Ky;c)PWbj$Y z*9!`NlVFo%Q{LnBV)>-0AiXfeWG)|(p31V;)&tZ1p34nIYv#5MYem6Xc%qG|qg3V{ z=h;_Z=|~IW3BEr!5^D$#D6spq_7M=Lol2GxTM_?=f7@K(2DcuN#Fm@E`KmP5bbQj{ zRZ~79mfJ;%|FweBpEj1E+2+(UQ?7g|jyLdcLZ+Ye8n{z4F;uEBr`~jX$(IyY zz=*QRajbIPAvxF1v2ZJn(qzv7XCjJi-wTCVU`dgIpcFxfsPq7bH1_8+ zjV0?MzLM?#avj4UWORIzyNPy*5pJXFBxXq-y5Ba}*T_Jw!K=g`u5`S&2`9zKOYC@c|ktj@jiOO`a8RicjCCFUjkaUAX0|5AOoY*sXxx(s!nLSHCVc8Kd?J%{4mULp0uzQnf-rB@BpeA z>MrUoXeWEHc90V=UWa1=M3mxKu|K-aQuH&xBt4cXNp>h3hPO_r7QpU58TV!+@PmF1 z^$v$RXI(K8sBuCyiG!Tj&kyvoW{LKd=y(oGfYXN%xzj#q)&HL9oBy;E7u>MU2*o1- zuzx34I(J6;i=_Y`q-^}Tft%(2Cjh9pz2|bC8CMh4fYNZdahU$wfgf;N_E ziqAo_z&`7+k;=e>DCyd1!%oYIzV6aQJH3@EFyj$5aa$p~Rt z@DB19ivmd5BB;R6J`POeY!G!Pit47g=YLTh;XmN*lN*5MS50L-q}qTv(!$>`*P*$% zADaD6l?Ke3IPAqTLmhPtudPQO7aTfy*gpzP!#_4cYZF2(0gs0Oh%r>{9}s}?HoW8V zhti`Cfuq(2oNk_a)jk6+jR{WpY&cp3XS}-vh*zyJgLi_R!j!X_Fpvo_T30iEz@AH2V&@BaX z1r5;3mXPPTAm_(sZ2Jo6c6sRMH5(T`UsU_G@$Yevw??m(d4+~(_D-~nM+zmp<|Z)y zd?0Gvk^mB*Gp^4X8+(8KEGfbVbt#mxbBOYcbf6B}W0Y;`KnuN9cq4s`ho#$B@YmZC zVdJu~rO2^B*7ALDhN&yK3}45%eiZtdAz~ z^p(|3Ys8)Ba)y)<^!bTbDFw6>xygwH+m%C6o^s=5G$G0Q!0O7vJ^NZTxwK>6vmrnH zMpP*9RR~)7P2V{?x~b;E44ObQycb#@ZrGgsPpK0zbShW|>|GHm8YBixpou{C_w_&+ zU=*6uTci(^wip8x9>ymO3V@QBhH=ecBDtnE_t@JJ=#q7>S9gLzk?w-uJQ#a2 zKLp&zesR-pv~1*2yptQ?as2=-Go|6iQUQ;x@S)O;Trm;FD}CPa@D&xLN<)V+{D2zq z!;eW6YHP?Jq(yG14fLY`-Gcts+P5Hu7F=H`64vHQ(~g8s=W`YA3p6B+X~vd>+;|`L z%$yd!knSrP;jb(av9_4G%p5b=-(9avxhlZ44iB|1*RM`gMEclVTl*P?L!i7mll5d` z*E-cffEy7@BFj!-)82+2I?~>d4Gl~nVCixOcV^@}U)*N`@6tuj0FLcdqSG>D3bTN^ z6Hd1i4tNSaCav~GsAP9DJs&iz)3GL6N03;r`a#h7A5pIofZ^6jgb|3q0Ba0vkb{z; zK8l4*)iHueH}$Kpf5EOcx(;k#nPi>YmkW5p0i4ON!$Z331*XOK->aM)5Ha`#T|ADR z$*c`$J4?Yfy2)UI>8#zcAy@KO334i72+~TqTDe-amZ505@87Vpkd)y{{C&aSHU1sHywTEY_EOU+4b4=U-TlY(Vr?S)S`T#Uxp~+8G&Cb>g2;q z2%PRPuC~Bs<>4Z8UFTeC&2Q2=;E%})0x@AH%Q$T>WZnspwNtmlElah0CxXTZkrWfc%X({Xi>a!ws$Zmz9;7mjVMoN!MqmoC;_m^OIm9qM;} zqO}m5iq@JC2%Np#z1&5;f-C7-MU5Iju5U`rl><8H$Hmj#S%_bYT{@}qHTQVKq`)La z&drOsLr$X-it3I!#Or3PS1a$E8bSk2toVsc9m`DnHLclmP4z$Ft2df-CDt6n4-Xy# zN7NOGQTfPncqz=&-}Oip`Ldir^i9{ZlR7eX(QTrh!MC=3HaXj|F$&T`mO7c{;CCt3 zMTxPAv3QogBd;khb!c9ZTzLf!1O)?v{t(cwQXBZ%TbVds4(-7E=-Z!^1OB!H!C(>bW)`lMn*H;-ujoA=Pg6_ov zY8l11S%`8L&|?2D$JnJl+#`OpJzAM<0au&!shcwxQR{VWcL zKw0F^d{Zh{i+Y7aK^6tbqIa z>ak|<^tyOA2fefUt}~DeZ&p_m#sbF*$Es-J===OaWeqtijtU!2C)EH1;yQn~YtR`A zz`+W`@fysX>|0NLJQ~lhajI+CLN!d6uEduU=j`ADK~wh)g0InAWJ=k|av{$&(WiUu zXI~q^oz-&5cH`DoL?pj_yXWOf>{$j?NwfNovcthQ+H({^%uF1ww~ISc-!}(-DDaGT z$&-34!WRUQ*AT&h*jhK|i~Y?BFSHINzgMq + + + + + + PiRadio mini web interface + + + + +PiRadio
+
+



+
+
+
+ + +
+ +
+
+ + +
+ + +
+ + + +
+
+
+
+ + + +
+ + diff --git a/html/index_old.html b/html/index_old.html new file mode 100644 index 0000000..6782988 --- /dev/null +++ b/html/index_old.html @@ -0,0 +1,368 @@ + + + + + + Apache2 Debian Default Page: It works + + + +
+ + +
+ + +
+
+ It works! +
+
+

+ This is the default welcome page used to test the correct + operation of the Apache2 server after installation on Debian systems. + If you can read this page, it means that the Apache HTTP server installed at + this site is working properly. You should replace this file (located at + /var/www/html/index.html) before continuing to operate your HTTP server. +

+ + +

+ If you are a normal user of this web site and don't know what this page is + about, this probably means that the site is currently unavailable due to + maintenance. + If the problem persists, please contact the site's administrator. +

+ +
+
+
+ Configuration Overview +
+
+

+ Debian's Apache2 default configuration is different from the + upstream default configuration, and split into several files optimized for + interaction with Debian tools. The configuration system is + fully documented in + /usr/share/doc/apache2/README.Debian.gz. Refer to this for the full + documentation. Documentation for the web server itself can be + found by accessing the manual if the apache2-doc + package was installed on this server. + +

+

+ The configuration layout for an Apache2 web server installation on Debian systems is as follows: +

+
+/etc/apache2/
+|-- apache2.conf
+|       `--  ports.conf
+|-- mods-enabled
+|       |-- *.load
+|       `-- *.conf
+|-- conf-enabled
+|       `-- *.conf
+|-- sites-enabled
+|       `-- *.conf
+          
+
    +
  • + apache2.conf is the main configuration + file. It puts the pieces together by including all remaining configuration + files when starting up the web server. +
  • + +
  • + ports.conf is always included from the + main configuration file. It is used to determine the listening ports for + incoming connections, and this file can be customized anytime. +
  • + +
  • + Configuration files in the mods-enabled/, + conf-enabled/ and sites-enabled/ directories contain + particular configuration snippets which manage modules, global configuration + fragments, or virtual host configurations, respectively. +
  • + +
  • + They are activated by symlinking available + configuration files from their respective + *-available/ counterparts. These should be managed + by using our helpers + + a2enmod, + a2dismod, + + + a2ensite, + a2dissite, + + and + + a2enconf, + a2disconf + . See their respective man pages for detailed information. +
  • + +
  • + The binary is called apache2. Due to the use of + environment variables, in the default configuration, apache2 needs to be + started/stopped with /etc/init.d/apache2 or apache2ctl. + Calling /usr/bin/apache2 directly will not work with the + default configuration. +
  • +
+
+ +
+
+ Document Roots +
+ +
+

+ By default, Debian does not allow access through the web browser to + any file apart of those located in /var/www, + public_html + directories (when enabled) and /usr/share (for web + applications). If your site is using a web document root + located elsewhere (such as in /srv) you may need to whitelist your + document root directory in /etc/apache2/apache2.conf. +

+

+ The default Debian document root is /var/www/html. You + can make your own virtual hosts under /var/www. This is different + to previous releases which provides better security out of the box. +

+
+ +
+
+ Reporting Problems +
+
+

+ Please use the reportbug tool to report bugs in the + Apache2 package with Debian. However, check existing + bug reports before reporting a new bug. +

+

+ Please report bugs specific to modules (such as PHP and others) + to respective packages, not to the web server itself. +

+
+ + + + +
+
+
+
+ + + diff --git a/html/jquery-1.12.4.min.js b/html/jquery-1.12.4.min.js new file mode 100755 index 0000000..e836475 --- /dev/null +++ b/html/jquery-1.12.4.min.js @@ -0,0 +1,5 @@ +/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0; +}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML="
a",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:l.htmlSerialize?[0,"",""]:[1,"X
","
"]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|&#?\w+;/,ha=/r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?""!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/\s*$/g,Aa=ca(d),Ba=Aa.appendChild(d.createElement("div"));function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(Da(b).text=a.text,Ea(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&Z.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}}function Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&xa.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(o&&(k=ja(b,a[0].ownerDocument,!1,a,d),e=k.firstChild,1===k.childNodes.length&&(k=e),e||d)){for(i=n.map(ea(k,"script"),Da),h=i.length;o>m;m++)g=k,m!==p&&(g=n.clone(g,!0,!0),h&&n.merge(i,ea(g,"script"))),c.call(a[m],g,m);if(h)for(j=i[i.length-1].ownerDocument,n.map(i,Ea),m=0;h>m;m++)g=i[m],_.test(g.type||"")&&!n._data(g,"globalEval")&&n.contains(j,g)&&(g.src?n._evalUrl&&n._evalUrl(g.src):n.globalEval((g.text||g.textContent||g.innerHTML||"").replace(za,"")));k=e=null}return a}function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(ea(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&fa(ea(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(va,"<$1>")},clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!ua.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(Ba.innerHTML=a.outerHTML,Ba.removeChild(f=Ba.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=ea(f),h=ea(a),g=0;null!=(e=h[g]);++g)d[g]&&Ga(e,d[g]);if(b)if(c)for(h=h||ea(a),d=d||ea(f),g=0;null!=(e=h[g]);g++)Fa(e,d[g]);else Fa(a,f);return d=ea(f,"script"),d.length>0&&fa(d,!i&&ea(a,"script")),d=h=e=null,f},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.attributes,m=n.event.special;null!=(d=a[h]);h++)if((b||M(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k||"undefined"==typeof d.removeAttribute?d[i]=void 0:d.removeAttribute(i),c.push(f))}}}),n.fn.extend({domManip:Ha,detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return Y(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||d).createTextNode(a))},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(ea(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return Y(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(ta,""):void 0;if("string"==typeof a&&!wa.test(a)&&(l.htmlSerialize||!ua.test(a))&&(l.leadingWhitespace||!aa.test(a))&&!da[($.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ea(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(ea(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],f=n(a),h=f.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(f[d])[b](c),g.apply(e,c.get());return this.pushStack(e)}});var Ja,Ka={HTML:"block",BODY:"block"};function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(Ja||n("